diff --git a/packages/babel-core/src/config/validation/options.js b/packages/babel-core/src/config/validation/options.js index 0e962a333dc5..ecaab92cb908 100644 --- a/packages/babel-core/src/config/validation/options.js +++ b/packages/babel-core/src/config/validation/options.js @@ -340,6 +340,7 @@ export const assumptionsNames = new Set([ "newableArrowFunctions", "noDocumentAll", "objectRestNoSymbols", + "privateFieldsAsProperties", "pureGetters", "setClassMethods", "setComputedProperties", diff --git a/packages/babel-helper-create-class-features-plugin/src/fields.js b/packages/babel-helper-create-class-features-plugin/src/fields.js index aca3cfa75527..f3fefa5089da 100644 --- a/packages/babel-helper-create-class-features-plugin/src/fields.js +++ b/packages/babel-helper-create-class-features-plugin/src/fields.js @@ -35,11 +35,16 @@ export function buildPrivateNamesMap(props) { return privateNamesMap; } -export function buildPrivateNamesNodes(privateNamesMap, loose, state) { +export function buildPrivateNamesNodes( + privateNamesMap, + privateFieldsAsProperties, + state, +) { const initNodes = []; for (const [name, value] of privateNamesMap) { - // In loose mode, both static and instance fields are transpiled using a + // When the privateFieldsAsProperties assumption is enabled, + // both static and instance fields are transpiled using a // secret non-enumerable property. Hence, we also need to generate that // key (using the classPrivateFieldLooseKey helper). // In spec mode, only instance fields need a "private name" initializer @@ -48,7 +53,7 @@ export function buildPrivateNamesNodes(privateNamesMap, loose, state) { const { static: isStatic, method: isMethod, getId, setId } = value; const isAccessor = getId || setId; const id = t.cloneNode(value.id); - if (loose) { + if (privateFieldsAsProperties) { initNodes.push( template.statement.ast` var ${id} = ${state.addHelper("classPrivateFieldLooseKey")}("${name}") @@ -149,13 +154,13 @@ const privateInVisitor = privateNameVisitorFactory({ if (operator !== "in") return; if (!path.get("left").isPrivateName()) return; - const { loose, privateNamesMap, redeclared } = this; + const { privateFieldsAsProperties, privateNamesMap, redeclared } = this; const { name } = left.id; if (!privateNamesMap.has(name)) return; if (redeclared && redeclared.includes(name)) return; - if (loose) { + if (privateFieldsAsProperties) { const { id } = privateNamesMap.get(name); path.replaceWith(template.expression.ast` Object.prototype.hasOwnProperty.call(${right}, ${t.cloneNode(id)}) @@ -371,13 +376,15 @@ export function transformPrivateNamesUsage( ref, path, privateNamesMap, - loose, + { privateFieldsAsProperties }, state, ) { if (!privateNamesMap.size) return; const body = path.get("body"); - const handler = loose ? privateNameHandlerLoose : privateNameHandlerSpec; + const handler = privateFieldsAsProperties + ? privateNameHandlerLoose + : privateNameHandlerSpec; memberExpressionToFunctions(body, privateNameVisitor, { privateNamesMap, @@ -389,7 +396,7 @@ export function transformPrivateNamesUsage( privateNamesMap, classRef: ref, file: state, - loose, + privateFieldsAsProperties, }); } @@ -571,7 +578,11 @@ function buildPrivateStaticMethodInitLoose(ref, prop, state, privateNamesMap) { `; } -function buildPrivateMethodDeclaration(prop, privateNamesMap, loose = false) { +function buildPrivateMethodDeclaration( + prop, + privateNamesMap, + privateFieldsAsProperties = false, +) { const privateName = privateNamesMap.get(prop.node.key.id.name); const { id, @@ -611,7 +622,7 @@ function buildPrivateMethodDeclaration(prop, privateNamesMap, loose = false) { t.variableDeclarator(setId, methodValue), ]); } - if (isStatic && !loose) { + if (isStatic && !privateFieldsAsProperties) { return t.variableDeclaration("var", [ t.variableDeclarator( t.cloneNode(id), @@ -664,6 +675,8 @@ export function buildFieldsInitNodes( props, privateNamesMap, state, + setPublicClassFields, + privateFieldsAsProperties, loose, ) { const staticNodes = []; @@ -686,34 +699,34 @@ export function buildFieldsInitNodes( } switch (true) { - case isStatic && isPrivate && isField && loose: + case isStatic && isPrivate && isField && privateFieldsAsProperties: needsClassRef = true; staticNodes.push( buildPrivateFieldInitLoose(t.cloneNode(ref), prop, privateNamesMap), ); break; - case isStatic && isPrivate && isField && !loose: + case isStatic && isPrivate && isField && !privateFieldsAsProperties: needsClassRef = true; staticNodes.push( buildPrivateStaticFieldInitSpec(prop, privateNamesMap), ); break; - case isStatic && isPublic && isField && loose: + case isStatic && isPublic && isField && setPublicClassFields: needsClassRef = true; staticNodes.push(buildPublicFieldInitLoose(t.cloneNode(ref), prop)); break; - case isStatic && isPublic && isField && !loose: + case isStatic && isPublic && isField && !setPublicClassFields: needsClassRef = true; staticNodes.push( buildPublicFieldInitSpec(t.cloneNode(ref), prop, state), ); break; - case isInstance && isPrivate && isField && loose: + case isInstance && isPrivate && isField && privateFieldsAsProperties: instanceNodes.push( buildPrivateFieldInitLoose(t.thisExpression(), prop, privateNamesMap), ); break; - case isInstance && isPrivate && isField && !loose: + case isInstance && isPrivate && isField && !privateFieldsAsProperties: instanceNodes.push( buildPrivateInstanceFieldInitSpec( t.thisExpression(), @@ -722,7 +735,7 @@ export function buildFieldsInitNodes( ), ); break; - case isInstance && isPrivate && isMethod && loose: + case isInstance && isPrivate && isMethod && privateFieldsAsProperties: instanceNodes.unshift( buildPrivateMethodInitLoose( t.thisExpression(), @@ -731,10 +744,14 @@ export function buildFieldsInitNodes( ), ); staticNodes.push( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), + buildPrivateMethodDeclaration( + prop, + privateNamesMap, + privateFieldsAsProperties, + ), ); break; - case isInstance && isPrivate && isMethod && !loose: + case isInstance && isPrivate && isMethod && !privateFieldsAsProperties: instanceNodes.unshift( buildPrivateInstanceMethodInitSpec( t.thisExpression(), @@ -743,19 +760,27 @@ export function buildFieldsInitNodes( ), ); staticNodes.push( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), + buildPrivateMethodDeclaration( + prop, + privateNamesMap, + privateFieldsAsProperties, + ), ); break; - case isStatic && isPrivate && isMethod && !loose: + case isStatic && isPrivate && isMethod && !privateFieldsAsProperties: needsClassRef = true; staticNodes.push( buildPrivateStaticFieldInitSpec(prop, privateNamesMap), ); staticNodes.unshift( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), + buildPrivateMethodDeclaration( + prop, + privateNamesMap, + privateFieldsAsProperties, + ), ); break; - case isStatic && isPrivate && isMethod && loose: + case isStatic && isPrivate && isMethod && privateFieldsAsProperties: needsClassRef = true; staticNodes.push( buildPrivateStaticMethodInitLoose( @@ -766,13 +791,17 @@ export function buildFieldsInitNodes( ), ); staticNodes.unshift( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), + buildPrivateMethodDeclaration( + prop, + privateNamesMap, + privateFieldsAsProperties, + ), ); break; - case isInstance && isPublic && isField && loose: + case isInstance && isPublic && isField && setPublicClassFields: instanceNodes.push(buildPublicFieldInitLoose(t.thisExpression(), prop)); break; - case isInstance && isPublic && isField && !loose: + case isInstance && isPublic && isField && !setPublicClassFields: instanceNodes.push( buildPublicFieldInitSpec(t.thisExpression(), prop, state), ); diff --git a/packages/babel-helper-create-class-features-plugin/src/index.js b/packages/babel-helper-create-class-features-plugin/src/index.js index 66cfb83fb082..cbed9dde85a0 100644 --- a/packages/babel-helper-create-class-features-plugin/src/index.js +++ b/packages/babel-helper-create-class-features-plugin/src/index.js @@ -36,7 +36,37 @@ export function createClassFeaturePlugin({ feature, loose, manipulateOptions, + // TODO(Babel 8): Remove the default falue + api = { assumption: () => {} }, }) { + const setPublicClassFields = api.assumption("setPublicClassFields"); + const privateFieldsAsProperties = api.assumption("privateFieldsAsProperties"); + + if (loose) { + const explicit = []; + + if (setPublicClassFields !== undefined) { + explicit.push(`"setPublicClassFields"`); + } + if (privateFieldsAsProperties !== undefined) { + explicit.push(`"privateFieldsAsProperties"`); + } + if (explicit.length !== 0) { + console.warn( + `[${name}]: You are using the "loose: true" option and you are` + + ` explicitly setting a value for the ${explicit.join(" and ")}` + + ` assumption${explicit.length > 1 ? "s" : ""}. The "loose" option` + + ` can cause incompatibilities with the other class features` + + ` plugins, so it's recommended that you replace it with the` + + ` following top-level option:\n` + + `\t"assumptions": {\n` + + `\t\t"setPublicClassFields": true,\n` + + `\t\t"privateFieldsAsProperties": true\n` + + `\t}`, + ); + } + } + return { name, manipulateOptions, @@ -151,11 +181,17 @@ export function createClassFeaturePlugin({ const privateNamesMap = buildPrivateNamesMap(props); const privateNamesNodes = buildPrivateNamesNodes( privateNamesMap, - loose, + privateFieldsAsProperties ?? loose, state, ); - transformPrivateNamesUsage(ref, path, privateNamesMap, loose, state); + transformPrivateNamesUsage( + ref, + path, + privateNamesMap, + { privateFieldsAsProperties: privateFieldsAsProperties ?? loose }, + state, + ); let keysNodes, staticNodes, instanceNodes, wrapClass; @@ -175,6 +211,8 @@ export function createClassFeaturePlugin({ props, privateNamesMap, state, + setPublicClassFields ?? loose, + privateFieldsAsProperties ?? loose, loose, )); } diff --git a/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/input.js b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/input.js new file mode 100644 index 000000000000..eb0eb350654f --- /dev/null +++ b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/input.js @@ -0,0 +1,3 @@ +class A { + foo; +} diff --git a/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/options.json b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/options.json new file mode 100644 index 000000000000..3fae40ed0d43 --- /dev/null +++ b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/options.json @@ -0,0 +1,9 @@ +{ + "validateLogs": true, + "plugins": [ + ["proposal-class-properties", { "loose": true }] + ], + "assumptions": { + "setPublicClassFields": true + } +} diff --git a/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/output.js b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/output.js new file mode 100644 index 000000000000..063a057f52c0 --- /dev/null +++ b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/output.js @@ -0,0 +1,6 @@ +class A { + constructor() { + this.foo = void 0; + } + +} diff --git a/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/stderr.txt b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/stderr.txt new file mode 100644 index 000000000000..2d6c3d02acff --- /dev/null +++ b/packages/babel-helper-create-class-features-plugin/test/fixtures/plugin-proposal-class-properties/warn-loose-and-assumptions/stderr.txt @@ -0,0 +1,5 @@ +[proposal-class-properties]: You are using the "loose: true" option and you are explicitly setting a value for the "setPublicClassFields" assumption. The "loose" option can cause incompatibilities with the other class features plugins, so it's recommended that you replace it with the following top-level option: + "assumptions": { + "setPublicClassFields": true, + "privateFieldsAsProperties": true + } diff --git a/packages/babel-plugin-proposal-class-properties/src/index.js b/packages/babel-plugin-proposal-class-properties/src/index.js index 89c016dbca54..f8a6058a181f 100644 --- a/packages/babel-plugin-proposal-class-properties/src/index.js +++ b/packages/babel-plugin-proposal-class-properties/src/index.js @@ -12,6 +12,7 @@ export default declare((api, options) => { return createClassFeaturePlugin({ name: "proposal-class-properties", + api, feature: FEATURES.fields, loose: options.loose, diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed-initialization-order/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed-initialization-order/exec.js new file mode 100644 index 000000000000..339de138c781 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed-initialization-order/exec.js @@ -0,0 +1,38 @@ +const actualOrder = []; + +const track = i => { + actualOrder.push(i); + return i; +}; + +class MyClass { + static [track(1)] = track(10); + [track(2)] = track(13); + get [track(3)]() { + return "foo"; + } + set [track(4)](value) { + this.bar = value; + } + [track(5)] = track(14); + static [track(6)] = track(11); + static [track(7)] = track(12); + [track(8)]() {} + [track(9)] = track(15); +} + +const inst = new MyClass(); + +const expectedOrder = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]; +expect(actualOrder).toEqual(expectedOrder); + +expect(MyClass[1]).toBe(10); +expect(inst[2]).toBe(13); +expect(inst[3]).toBe("foo"); +inst[4] = "baz"; +expect(inst.bar).toBe("baz"); +expect(inst[5]).toBe(14); +expect(MyClass[6]).toBe(11); +expect(MyClass[7]).toBe(12); +expect(typeof inst[8]).toBe("function"); +expect(inst[9]).toBe(15); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/input.js new file mode 100644 index 000000000000..0e777063a283 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/input.js @@ -0,0 +1,25 @@ +const foo = "foo"; +const bar = () => {}; +const four = 4; + +class MyClass { + static [one()] = "test"; + static [2 * 4 + 7] = "247"; + static [2 * four + 7] = "247"; + static [2 * four + seven] = "247"; + [null] = "null"; + [undefined] = "undefined"; + [void 0] = "void 0"; + get ["whatever"]() {} + set ["whatever"](value) {} + get [computed()]() {} + set [computed()](value) {} + ["test" + one]() {} + static [10]() {} + [/regex/] = "regex"; + [foo] = "foo"; + [bar] = "bar"; + [baz] = "baz"; + [`template`] = "template"; + [`template${expression}`] = "template-with-expression"; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/output.js new file mode 100644 index 000000000000..a13d0420c8a7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/computed/output.js @@ -0,0 +1,48 @@ +let _one, _ref, _undefined, _computed, _computed2, _ref2, _ref3, _baz, _ref4; + +const foo = "foo"; + +const bar = () => {}; + +const four = 4; +_one = one(); +_ref = 2 * four + seven; +_undefined = undefined; +_computed = computed(); +_computed2 = computed(); +_ref2 = "test" + one; +_ref3 = /regex/; +_baz = baz; +_ref4 = `template${expression}`; + +class MyClass { + constructor() { + this[null] = "null"; + this[_undefined] = "undefined"; + this[void 0] = "void 0"; + this[_ref3] = "regex"; + this[foo] = "foo"; + this[bar] = "bar"; + this[_baz] = "baz"; + this[`template`] = "template"; + this[_ref4] = "template-with-expression"; + } + + get ["whatever"]() {} + + set ["whatever"](value) {} + + get [_computed]() {} + + set [_computed2](value) {} + + [_ref2]() {} + + static [10]() {} + +} + +MyClass[_one] = "test"; +MyClass[2 * 4 + 7] = "247"; +MyClass[2 * four + 7] = "247"; +MyClass[_ref] = "247"; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/input.js new file mode 100644 index 000000000000..3071b5edb87b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/input.js @@ -0,0 +1,11 @@ +var foo = "bar"; + +class Foo { + bar = foo; + static bar = baz; + + constructor() { + var foo = "foo"; + var baz = "baz"; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/output.js new file mode 100644 index 000000000000..58b6d55bfdb6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/constructor-collision/output.js @@ -0,0 +1,12 @@ +var foo = "bar"; + +class Foo { + constructor() { + this.bar = foo; + var _foo = "foo"; + var baz = "baz"; + } + +} + +Foo.bar = baz; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/input.js new file mode 100644 index 000000000000..cd8e3fdd8031 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/input.js @@ -0,0 +1,3 @@ +class Foo extends Bar { + bar = "foo"; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/output.js new file mode 100644 index 000000000000..5399e29d2d87 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/derived/output.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor(...args) { + super(...args); + this.bar = "foo"; + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/input.js new file mode 100644 index 000000000000..60a1c5e823cd --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/input.js @@ -0,0 +1,9 @@ +class Child extends Parent { + constructor() { + super(); + } + + scopedFunctionWithThis = () => { + this.name = {}; + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/options.json new file mode 100644 index 000000000000..a56954a5e7ea --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "proposal-class-properties" + ], + "presets": ["env"], + "assumptions": { + "setPublicClassFields": true + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/output.js new file mode 100644 index 000000000000..86a6067497dc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/foobar/output.js @@ -0,0 +1,22 @@ +var Child = /*#__PURE__*/function (_Parent) { + "use strict"; + + babelHelpers.inherits(Child, _Parent); + + var _super = babelHelpers.createSuper(Child); + + function Child() { + var _this; + + babelHelpers.classCallCheck(this, Child); + _this = _super.call(this); + + _this.scopedFunctionWithThis = function () { + _this.name = {}; + }; + + return _this; + } + + return Child; +}(Parent); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/exec.js new file mode 100644 index 000000000000..3f619174beb4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/exec.js @@ -0,0 +1,13 @@ +function test(x) { + class F { + [x] = 1; + constructor() {} + } + + x = 'deadbeef'; + expect(new F().foo).toBe(1); + x = 'wrong'; + expect(new F().foo).toBe(1); +} + +test('foo'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/input.js new file mode 100644 index 000000000000..3f619174beb4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/input.js @@ -0,0 +1,13 @@ +function test(x) { + class F { + [x] = 1; + constructor() {} + } + + x = 'deadbeef'; + expect(new F().foo).toBe(1); + x = 'wrong'; + expect(new F().foo).toBe(1); +} + +test('foo'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/output.js new file mode 100644 index 000000000000..4216994effe0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-computed/output.js @@ -0,0 +1,19 @@ +function test(x) { + let _x; + + _x = x; + + class F { + constructor() { + this[_x] = 1; + } + + } + + x = 'deadbeef'; + expect(new F().foo).toBe(1); + x = 'wrong'; + expect(new F().foo).toBe(1); +} + +test('foo'); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/input.js new file mode 100644 index 000000000000..a36cdd975c82 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/input.js @@ -0,0 +1,3 @@ +class Foo { + bar; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/output.js new file mode 100644 index 000000000000..8cd3e63f7fcf --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance-undefined/output.js @@ -0,0 +1,6 @@ +class Foo { + constructor() { + this.bar = void 0; + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/input.js new file mode 100644 index 000000000000..9cecfe8a3013 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/input.js @@ -0,0 +1,3 @@ +class Foo { + bar = "foo"; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/output.js new file mode 100644 index 000000000000..f2bdaefe6a7c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/instance/output.js @@ -0,0 +1,6 @@ +class Foo { + constructor() { + this.bar = "foo"; + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/input.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/input.mjs new file mode 100644 index 000000000000..4b67e0e158f6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/input.mjs @@ -0,0 +1,11 @@ +export default param => + class App { + static props = { + prop1: 'prop1', + prop2: 'prop2' + } + + getParam() { + return param; + } + } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/output.mjs new file mode 100644 index 000000000000..4bacda92aa9c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/non-block-arrow-func/output.mjs @@ -0,0 +1,13 @@ +export default (param => { + var _class, _temp; + + return _temp = _class = class App { + getParam() { + return param; + } + + }, _class.props = { + prop1: 'prop1', + prop2: 'prop2' + }, _temp; +}); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/options.json new file mode 100644 index 000000000000..018ebbb8d5a8 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "proposal-class-properties", + "syntax-class-properties" + ], + "assumptions": { + "setPublicClassFields": true + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/input.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/input.mjs new file mode 100644 index 000000000000..2961c9a40366 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/input.mjs @@ -0,0 +1,7 @@ +call(class { + static test = true +}); + +export default class { + static test = true +}; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/output.mjs new file mode 100644 index 000000000000..b962b2bfb723 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T2983/output.mjs @@ -0,0 +1,6 @@ +var _class, _temp; + +call((_temp = _class = class {}, _class.test = true, _temp)); +export default class _class2 {} +_class2.test = true; +; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/input.js new file mode 100644 index 000000000000..38b9e80baecc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/input.js @@ -0,0 +1,14 @@ +function withContext(ComposedComponent) { + return class WithContext extends Component { + + static propTypes = { + context: PropTypes.shape( + { + addCss: PropTypes.func, + setTitle: PropTypes.func, + setMeta: PropTypes.func, + } + ), + }; + }; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/output.js new file mode 100644 index 000000000000..7e9c64e86abe --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T6719/output.js @@ -0,0 +1,11 @@ +function withContext(ComposedComponent) { + var _class, _temp; + + return _temp = _class = class WithContext extends Component {}, _class.propTypes = { + context: PropTypes.shape({ + addCss: PropTypes.func, + setTitle: PropTypes.func, + setMeta: PropTypes.func + }) + }, _temp; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/input.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/input.mjs new file mode 100644 index 000000000000..1ddb4a1e7887 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/input.mjs @@ -0,0 +1,17 @@ +class MyClass { + myAsyncMethod = async () => { + console.log(this); + } +} + +(class MyClass2 { + myAsyncMethod = async () => { + console.log(this); + } +}) + +export default class MyClass3 { + myAsyncMethod = async () => { + console.log(this); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/options.json new file mode 100644 index 000000000000..7e57d1f03f2b --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "external-helpers", + "transform-async-to-generator", + "proposal-class-properties" + ], + "assumptions": { + "setPublicClassFields": true + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/output.mjs new file mode 100644 index 000000000000..24c39cad22bd --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/regression-T7364/output.mjs @@ -0,0 +1,32 @@ +class MyClass { + constructor() { + var _this = this; + + this.myAsyncMethod = /*#__PURE__*/babelHelpers.asyncToGenerator(function* () { + console.log(_this); + }); + } + +} + +(class MyClass2 { + constructor() { + var _this2 = this; + + this.myAsyncMethod = /*#__PURE__*/babelHelpers.asyncToGenerator(function* () { + console.log(_this2); + }); + } + +}); + +export default class MyClass3 { + constructor() { + var _this3 = this; + + this.myAsyncMethod = /*#__PURE__*/babelHelpers.asyncToGenerator(function* () { + console.log(_this3); + }); + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/input.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/input.mjs new file mode 100644 index 000000000000..729475cc52ff --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/input.mjs @@ -0,0 +1,7 @@ +export class MyClass { + static property = value; +} + +export default class MyClass2 { + static property = value; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/output.mjs b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/output.mjs new file mode 100644 index 000000000000..0664f082e29c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-export/output.mjs @@ -0,0 +1,4 @@ +export class MyClass {} +MyClass.property = value; +export default class MyClass2 {} +MyClass2.property = value; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/exec.js new file mode 100644 index 000000000000..bc62d48d907f --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/exec.js @@ -0,0 +1,7 @@ +var Foo = class { + static num = 0; +} + +expect(Foo.num).toBe(0); +expect(Foo.num = 1).toBe(1); +expect(Foo.name).toBe("Foo"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/input.js new file mode 100644 index 000000000000..96f03df576a0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/input.js @@ -0,0 +1,3 @@ +var Foo = class { + static num = 0; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/output.js new file mode 100644 index 000000000000..812b9613442d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-infer-name/output.js @@ -0,0 +1,3 @@ +var _class, _temp; + +var Foo = (_temp = _class = class Foo {}, _class.num = 0, _temp); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/input.js new file mode 100644 index 000000000000..9f649ab392bc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/input.js @@ -0,0 +1,9 @@ +class A { + static prop = 1; +} + +class B extends A { + static prop = 2; + static propA = super.prop; + static getPropA = () => super.prop; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/options.json b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/options.json new file mode 100644 index 000000000000..755819446903 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/options.json @@ -0,0 +1,11 @@ +{ + "validateLogs": true, + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["proposal-class-properties", { "loose": true }], + "syntax-class-properties" + ], + "assumptions": { + "setPublicClassFields": true + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/output.js new file mode 100644 index 000000000000..269e97147e8a --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/output.js @@ -0,0 +1,10 @@ +class A {} + +A.prop = 1; + +class B extends A {} + +B.prop = 2; +B.propA = A.prop; + +B.getPropA = () => A.prop; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/stderr.txt b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/stderr.txt new file mode 100644 index 000000000000..2d6c3d02acff --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super-loose/stderr.txt @@ -0,0 +1,5 @@ +[proposal-class-properties]: You are using the "loose: true" option and you are explicitly setting a value for the "setPublicClassFields" assumption. The "loose" option can cause incompatibilities with the other class features plugins, so it's recommended that you replace it with the following top-level option: + "assumptions": { + "setPublicClassFields": true, + "privateFieldsAsProperties": true + } diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/exec.js new file mode 100644 index 000000000000..4b4e3fcf1a36 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/exec.js @@ -0,0 +1,15 @@ +class A { + static prop = 1; +} + +class B extends A { + static prop = 2; + static propA = super.prop; + static getPropA = () => super.prop; +} + +const { prop, propA, getPropA } = B; + +expect(prop).toBe(2); +expect(propA).toBe(1); +expect(getPropA()).toBe(1); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/input.js new file mode 100644 index 000000000000..9f649ab392bc --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/input.js @@ -0,0 +1,9 @@ +class A { + static prop = 1; +} + +class B extends A { + static prop = 2; + static propA = super.prop; + static getPropA = () => super.prop; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/output.js new file mode 100644 index 000000000000..2d4da1550419 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-super/output.js @@ -0,0 +1,10 @@ +class A {} + +A.prop = 1; + +class B extends A {} + +B.prop = 2; +B.propA = babelHelpers.get(babelHelpers.getPrototypeOf(B), "prop", B); + +B.getPropA = () => babelHelpers.get(babelHelpers.getPrototypeOf(B), "prop", B); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/exec.js new file mode 100644 index 000000000000..0dbdf7491878 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/exec.js @@ -0,0 +1,9 @@ +class A { + static self = this; + static getA = () => this; +} + +const { self, getA } = A; + +expect(self).toBe(A); +expect(getA()).toBe(A); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/input.js new file mode 100644 index 000000000000..59f5c38c2c3e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/input.js @@ -0,0 +1,4 @@ +class A { + static self = this; + static getA = () => this; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/output.js new file mode 100644 index 000000000000..b51f4e90407e --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-this/output.js @@ -0,0 +1,5 @@ +class A {} + +A.self = A; + +A.getA = () => A; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/exec.js new file mode 100644 index 000000000000..fa1152511452 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/exec.js @@ -0,0 +1,6 @@ +class Foo { + static num; +} + +expect("num" in Foo).toBe(true); +expect(Foo.num).toBeUndefined(); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/input.js new file mode 100644 index 000000000000..4ee31b9c3541 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/input.js @@ -0,0 +1,3 @@ +class Foo { + static bar; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/output.js new file mode 100644 index 000000000000..d31c6a0733da --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static-undefined/output.js @@ -0,0 +1,3 @@ +class Foo {} + +Foo.bar = void 0; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/exec.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/exec.js new file mode 100644 index 000000000000..c7d613dd53d9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/exec.js @@ -0,0 +1,9 @@ +class Foo { + static num = 0; + static str = "foo"; +} + +expect(Foo.num).toBe(0); +expect(Foo.num = 1).toBe(1); +expect(Foo.str).toBe("foo"); +expect(Foo.str = "bar").toBe("bar"); diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/input.js new file mode 100644 index 000000000000..ddc637ec2391 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/input.js @@ -0,0 +1,3 @@ +class Foo { + static bar = "foo"; +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/output.js new file mode 100644 index 000000000000..d48d8c76676d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/static/output.js @@ -0,0 +1,3 @@ +class Foo {} + +Foo.bar = "foo"; diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/input.js new file mode 100644 index 000000000000..175fc704e7e0 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/input.js @@ -0,0 +1,9 @@ +class A { + foo() { + return "bar"; + } +} + +class B extends A { + foo = super.foo(); +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/output.js new file mode 100644 index 000000000000..7d557cdf90e3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-call/output.js @@ -0,0 +1,14 @@ +class A { + foo() { + return "bar"; + } + +} + +class B extends A { + constructor(...args) { + super(...args); + this.foo = super.foo(); + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/input.js new file mode 100644 index 000000000000..222dec81a60c --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/input.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + bar = "foo"; + + constructor() { + foo(super()); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/output.js new file mode 100644 index 000000000000..6896211d2e9d --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-expression/output.js @@ -0,0 +1,8 @@ +class Foo extends Bar { + constructor() { + var _temp; + + foo((_temp = super(), this.bar = "foo", _temp)); + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/input.js new file mode 100644 index 000000000000..0af8843375d4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/input.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + bar = "foo"; + + constructor() { + super(); + } +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/output.js new file mode 100644 index 000000000000..73e8f7eb4971 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-statement/output.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor() { + super(); + this.bar = "foo"; + } + +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/input.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/input.js new file mode 100644 index 000000000000..a9552f3068e1 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/input.js @@ -0,0 +1,6 @@ +class A { + force = force; + foo = super.method(); + + constructor(force) {} +} diff --git a/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/output.js b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/output.js new file mode 100644 index 000000000000..19d410990a03 --- /dev/null +++ b/packages/babel-plugin-proposal-class-properties/test/fixtures/assumption-setPublicClassFields/super-with-collision/output.js @@ -0,0 +1,7 @@ +class A { + constructor(_force) { + this.force = force; + this.foo = super.method(); + } + +} diff --git a/packages/babel-plugin-proposal-decorators/src/index.js b/packages/babel-plugin-proposal-decorators/src/index.js index 879de5f04703..a7e142769038 100644 --- a/packages/babel-plugin-proposal-decorators/src/index.js +++ b/packages/babel-plugin-proposal-decorators/src/index.js @@ -50,6 +50,7 @@ export default declare((api, options) => { return createClassFeaturePlugin({ name: "proposal-decorators", + api, feature: FEATURES.decorators, // loose: options.loose, Not supported diff --git a/packages/babel-plugin-proposal-private-methods/src/index.js b/packages/babel-plugin-proposal-private-methods/src/index.js index 0efbf93682a6..31652dfcfacb 100644 --- a/packages/babel-plugin-proposal-private-methods/src/index.js +++ b/packages/babel-plugin-proposal-private-methods/src/index.js @@ -12,6 +12,7 @@ export default declare((api, options) => { return createClassFeaturePlugin({ name: "proposal-private-methods", + api, feature: FEATURES.privateMethods, loose: options.loose, diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/exec.js new file mode 100644 index 000000000000..3cdb24863398 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/exec.js @@ -0,0 +1,31 @@ +class Cl { + #privateField = "top secret string"; + + constructor() { + this.publicField = "not secret string"; + } + + get #privateFieldValue() { + return this.#privateField; + } + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + publicGetPrivateField() { + return this.#privateFieldValue; + } + + publicSetPrivateField(newValue) { + this.#privateFieldValue = newValue; + } +} + +const cl = new Cl(); + +expect(cl.publicGetPrivateField()).toEqual("top secret string"); + +cl.publicSetPrivateField("new secret string"); +expect(cl.publicGetPrivateField()).toEqual("new secret string"); + diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/input.js new file mode 100644 index 000000000000..53e77128c0bd --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/input.js @@ -0,0 +1,23 @@ +class Cl { + #privateField = "top secret string"; + + constructor() { + this.publicField = "not secret string"; + } + + get #privateFieldValue() { + return this.#privateField; + } + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + publicGetPrivateField() { + return this.#privateFieldValue; + } + + publicSetPrivateField(newValue) { + this.#privateFieldValue = newValue; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/output.js new file mode 100644 index 000000000000..e450d62cb5e8 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/basic/output.js @@ -0,0 +1,34 @@ +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); + +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); + +class Cl { + constructor() { + Object.defineProperty(this, _privateFieldValue, { + get: _get_privateFieldValue, + set: _set_privateFieldValue + }); + Object.defineProperty(this, _privateField, { + writable: true, + value: "top secret string" + }); + this.publicField = "not secret string"; + } + + publicGetPrivateField() { + return babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]; + } + + publicSetPrivateField(newValue) { + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = newValue; + } + +} + +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; +}; + +var _set_privateFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField] = newValue; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/exec.js new file mode 100644 index 000000000000..92e8197700c0 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/exec.js @@ -0,0 +1,13 @@ +class Cl { + #privateField = 0; + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + constructor() { + expect(this.#privateFieldValue).toBeUndefined(); + } +} + +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/input.js new file mode 100644 index 000000000000..d676919b85eb --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/input.js @@ -0,0 +1,11 @@ +class Cl { + #privateField = 0; + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + constructor() { + this.publicField = this.#privateFieldValue; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/output.js new file mode 100644 index 000000000000..b68476be9665 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/get-only-setter/output.js @@ -0,0 +1,22 @@ +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); + +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); + +class Cl { + constructor() { + Object.defineProperty(this, _privateFieldValue, { + get: void 0, + set: _set_privateFieldValue + }); + Object.defineProperty(this, _privateField, { + writable: true, + value: 0 + }); + this.publicField = babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]; + } + +} + +var _set_privateFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField] = newValue; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/helper/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/helper/exec.js new file mode 100644 index 000000000000..59d4b47896ae --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/helper/exec.js @@ -0,0 +1,11 @@ +let foo; +class Cl { + set #foo(v) { return 1 } + test() { + foo = this.#foo = 2; + } +} + +new Cl().test(); + +expect(foo).toBe(2); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..8db8526496b9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js new file mode 100644 index 000000000000..64dd9738fd4f --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/exec.js @@ -0,0 +1,13 @@ +class Cl { + #privateField = 0; + + get #privateFieldValue() { + return this.#privateField; + } + + constructor() { + expect(() => this.#privateFieldValue = 1).toThrow(TypeError); + } +} + +const cl = new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js new file mode 100644 index 000000000000..a3385ef16034 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/input.js @@ -0,0 +1,11 @@ +class Cl { + #privateField = 0; + + get #privateFieldValue() { + return this.#privateField; + } + + constructor() { + this.#privateFieldValue = 1; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js new file mode 100644 index 000000000000..3ae50780168c --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/set-only-getter/output.js @@ -0,0 +1,22 @@ +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); + +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); + +class Cl { + constructor() { + Object.defineProperty(this, _privateFieldValue, { + get: _get_privateFieldValue, + set: void 0 + }); + Object.defineProperty(this, _privateField, { + writable: true, + value: 0 + }); + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = 1; + } + +} + +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/exec.js new file mode 100644 index 000000000000..2e0c58ef2785 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/exec.js @@ -0,0 +1,50 @@ +class Cl { + #privateField = "top secret string"; + + constructor() { + this.publicField = "not secret string"; + } + + get #privateFieldValue() { + return this.#privateField; + } + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + publicGetPrivateField() { + return this.#privateFieldValue; + } + + publicSetPrivateField(newValue) { + this.#privateFieldValue = newValue; + } + + get publicFieldValue() { + return this.publicField; + } + + set publicFieldValue(newValue) { + this.publicField = newValue; + } + + testUpdates() { + this.#privateField = 0; + this.publicField = 0; + this.#privateFieldValue = this.#privateFieldValue++; + this.publicFieldValue = this.publicFieldValue++; + expect(this.#privateField).toEqual(this.publicField); + + ++this.#privateFieldValue; + ++this.publicFieldValue; + expect(this.#privateField).toEqual(this.publicField); + + this.#privateFieldValue += 1; + this.publicFieldValue += 1; + expect(this.#privateField).toEqual(this.publicField); + } +} + +const cl = new Cl(); +cl.testUpdates(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/input.js new file mode 100644 index 000000000000..587f09e0aa93 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/input.js @@ -0,0 +1,47 @@ +class Cl { + #privateField = "top secret string"; + + constructor() { + this.publicField = "not secret string"; + } + + get #privateFieldValue() { + return this.#privateField; + } + + set #privateFieldValue(newValue) { + this.#privateField = newValue; + } + + publicGetPrivateField() { + return this.#privateFieldValue; + } + + publicSetPrivateField(newValue) { + this.#privateFieldValue = newValue; + } + + get publicFieldValue() { + return this.publicField; + } + + set publicFieldValue(newValue) { + this.publicField = newValue; + } + + testUpdates() { + this.#privateField = 0; + this.publicField = 0; + this.#privateFieldValue = this.#privateFieldValue++; + this.publicFieldValue = this.publicFieldValue++; + + ++this.#privateFieldValue; + ++this.publicFieldValue; + + this.#privateFieldValue += 1; + this.publicFieldValue += 1; + + this.#privateFieldValue = -(this.#privateFieldValue ** this.#privateFieldValue); + this.publicFieldValue = -(this.publicFieldValue ** this.publicFieldValue); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/output.js new file mode 100644 index 000000000000..b9fb372f9ba5 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/accessors-privateFieldsAsProperties/updates/output.js @@ -0,0 +1,55 @@ +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); + +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); + +class Cl { + constructor() { + Object.defineProperty(this, _privateFieldValue, { + get: _get_privateFieldValue, + set: _set_privateFieldValue + }); + Object.defineProperty(this, _privateField, { + writable: true, + value: "top secret string" + }); + this.publicField = "not secret string"; + } + + publicGetPrivateField() { + return babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]; + } + + publicSetPrivateField(newValue) { + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = newValue; + } + + get publicFieldValue() { + return this.publicField; + } + + set publicFieldValue(newValue) { + this.publicField = newValue; + } + + testUpdates() { + babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField] = 0; + this.publicField = 0; + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]++; + this.publicFieldValue = this.publicFieldValue++; + ++babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]; + ++this.publicFieldValue; + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] += 1; + this.publicFieldValue += 1; + babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] = -(babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue] ** babelHelpers.classPrivateFieldLooseBase(this, _privateFieldValue)[_privateFieldValue]); + this.publicFieldValue = -(this.publicFieldValue ** this.publicFieldValue); + } + +} + +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField]; +}; + +var _set_privateFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(this, _privateField)[_privateField] = newValue; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/exec.js new file mode 100644 index 000000000000..4c1324aeeb62 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/exec.js @@ -0,0 +1,11 @@ +class Foo { + constructor() { + this.publicField = this.#privateMethod(); + } + + #privateMethod() { + return 42; + } + } + + expect((new Foo).publicField).toEqual(42); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/input.js new file mode 100644 index 000000000000..e55a8afdd3ad --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/input.js @@ -0,0 +1,9 @@ +class Foo { + constructor() { + this.publicField = this.#privateMethod(); + } + + #privateMethod() { + return 42; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/output.js new file mode 100644 index 000000000000..e85cf49ca0e1 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/assignment/output.js @@ -0,0 +1,15 @@ +var _privateMethod = babelHelpers.classPrivateFieldLooseKey("privateMethod"); + +class Foo { + constructor() { + Object.defineProperty(this, _privateMethod, { + value: _privateMethod2 + }); + this.publicField = babelHelpers.classPrivateFieldLooseBase(this, _privateMethod)[_privateMethod](); + } + +} + +var _privateMethod2 = function _privateMethod2() { + return 42; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/exec.js new file mode 100644 index 000000000000..168eb945dd14 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/exec.js @@ -0,0 +1,13 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} + +return new Cl().test().then(val => { + expect(val).toBe(2); +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/input.js new file mode 100644 index 000000000000..aed36e25613f --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/input.js @@ -0,0 +1,9 @@ +class Cl { + async #foo() { + return 2; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/options.json new file mode 100644 index 000000000000..95ab365853e8 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/options.json @@ -0,0 +1,14 @@ +{ + "minNodeVersion": "8.0.0", + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + }, + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/output.js new file mode 100644 index 000000000000..2b437a303f1a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/async/output.js @@ -0,0 +1,18 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Cl { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test() { + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo](); + } + +} + +var _foo2 = async function _foo2() { + return 2; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/exec.js new file mode 100644 index 000000000000..26caf2d02c1f --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/exec.js @@ -0,0 +1,16 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} + +expect(new Cl().prop).toBe(1); +expect(new Cl().getPriv()).toBe(2); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/input.js new file mode 100644 index 000000000000..2fcb7857468f --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/input.js @@ -0,0 +1,13 @@ +class Cl { + prop = this.#method(1); + + #priv = this.#method(2); + + #method(x) { + return x; + } + + getPriv() { + return this.#priv; + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/output.js new file mode 100644 index 000000000000..2618032e6669 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/before-fields/output.js @@ -0,0 +1,25 @@ +var _priv = babelHelpers.classPrivateFieldLooseKey("priv"); + +var _method = babelHelpers.classPrivateFieldLooseKey("method"); + +class Cl { + constructor() { + Object.defineProperty(this, _method, { + value: _method2 + }); + babelHelpers.defineProperty(this, "prop", babelHelpers.classPrivateFieldLooseBase(this, _method)[_method](1)); + Object.defineProperty(this, _priv, { + writable: true, + value: babelHelpers.classPrivateFieldLooseBase(this, _method)[_method](2) + }); + } + + getPriv() { + return babelHelpers.classPrivateFieldLooseBase(this, _priv)[_priv]; + } + +} + +var _method2 = function _method2(x) { + return x; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/exec.js new file mode 100644 index 000000000000..6c18bf53c193 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/exec.js @@ -0,0 +1,41 @@ +class Foo { + constructor(status) { + this.status = status; + expect(() => this.#getStatus = null).toThrow(TypeError); + } + + #getStatus() { + return this.status; + } + + getCurrentStatus() { + return this.#getStatus(); + } + + setCurrentStatus(newStatus) { + this.status = newStatus; + } + + getFakeStatus(fakeStatus) { + const getStatus = this.#getStatus; + return function () { + return getStatus.call({ status: fakeStatus }); + }; + } + + getFakeStatusFunc() { + return { + status: 'fake-status', + getFakeStatus: this.#getStatus, + }; + } + } + + const f = new Foo('inactive'); + expect(f.getCurrentStatus()).toBe('inactive'); + + f.setCurrentStatus('new-status'); + expect(f.getCurrentStatus()).toBe('new-status'); + + expect(f.getFakeStatus('fake')()).toBe('fake'); + expect(f.getFakeStatusFunc().getFakeStatus()).toBe('fake-status'); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/input.js new file mode 100644 index 000000000000..67a8ab68a682 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/input.js @@ -0,0 +1,31 @@ +class Foo { + constructor(status) { + this.status = status; + } + + #getStatus() { + return this.status; + } + + getCurrentStatus() { + return this.#getStatus(); + } + + setCurrentStatus(newStatus) { + this.status = newStatus; + } + + getFakeStatus(fakeStatus) { + const fakeGetStatus = this.#getStatus; + return function() { + return fakeGetStatus.call({ status: fakeStatus }); + }; + } + + getFakeStatusFunc() { + return { + status: 'fake-status', + getFakeStatus: this.#getStatus, + }; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/output.js new file mode 100644 index 000000000000..b1c396755f7e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/context/output.js @@ -0,0 +1,40 @@ +var _getStatus = babelHelpers.classPrivateFieldLooseKey("getStatus"); + +class Foo { + constructor(status) { + Object.defineProperty(this, _getStatus, { + value: _getStatus2 + }); + this.status = status; + } + + getCurrentStatus() { + return babelHelpers.classPrivateFieldLooseBase(this, _getStatus)[_getStatus](); + } + + setCurrentStatus(newStatus) { + this.status = newStatus; + } + + getFakeStatus(fakeStatus) { + const fakeGetStatus = babelHelpers.classPrivateFieldLooseBase(this, _getStatus)[_getStatus]; + + return function () { + return fakeGetStatus.call({ + status: fakeStatus + }); + }; + } + + getFakeStatusFunc() { + return { + status: 'fake-status', + getFakeStatus: babelHelpers.classPrivateFieldLooseBase(this, _getStatus)[_getStatus] + }; + } + +} + +var _getStatus2 = function _getStatus2() { + return this.status; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/exec.js new file mode 100644 index 000000000000..659a3e891085 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/exec.js @@ -0,0 +1,15 @@ +let exfiltrated; +class Foo { + #privateMethod() {} + + constructor() { + if (exfiltrated === undefined) { + exfiltrated = this.#privateMethod; + } + expect(exfiltrated).toStrictEqual(this.#privateMethod); + } +} + +new Foo(); +// check for private method function object equality +new Foo(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/input.js new file mode 100644 index 000000000000..91bf8510d814 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/input.js @@ -0,0 +1,10 @@ +let exfiltrated; +class Foo { + #privateMethod() {} + + constructor() { + if (exfiltrated === undefined) { + exfiltrated = this.#privateMethod; + } + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/output.js new file mode 100644 index 000000000000..100562baf534 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/exfiltrated/output.js @@ -0,0 +1,18 @@ +let exfiltrated; + +var _privateMethod = babelHelpers.classPrivateFieldLooseKey("privateMethod"); + +class Foo { + constructor() { + Object.defineProperty(this, _privateMethod, { + value: _privateMethod2 + }); + + if (exfiltrated === undefined) { + exfiltrated = babelHelpers.classPrivateFieldLooseBase(this, _privateMethod)[_privateMethod]; + } + } + +} + +var _privateMethod2 = function _privateMethod2() {}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/exec.js new file mode 100644 index 000000000000..472eadeabff6 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/exec.js @@ -0,0 +1,14 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} + +const val = new Cl().test(); +expect(val.next()).toEqual({ value: 2, done: false }); +expect(val.next()).toEqual({ value: 3, done: true }); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/input.js new file mode 100644 index 000000000000..39aace6dc402 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/input.js @@ -0,0 +1,10 @@ +class Cl { + *#foo() { + yield 2; + return 3; + } + + test() { + return this.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/output.js new file mode 100644 index 000000000000..ead1fffcb593 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/generator/output.js @@ -0,0 +1,19 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Cl { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test() { + return babelHelpers.classPrivateFieldLooseBase(this, _foo)[_foo](); + } + +} + +var _foo2 = function* _foo2() { + yield 2; + return 3; +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..8db8526496b9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/exec.js new file mode 100644 index 000000000000..63d8fe8cdfe3 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/exec.js @@ -0,0 +1,21 @@ +class Base { + superMethod() { + return 'good'; + } +} + +class Sub extends Base { + superMethod() { + return 'bad'; + } + + #privateMethod() { + return super.superMethod(); + } + + publicMethod() { + return this.#privateMethod(); + } +} + +expect((new Sub()).publicMethod()).toEqual('good'); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/input.js new file mode 100644 index 000000000000..d85e01133ac1 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/input.js @@ -0,0 +1,19 @@ +class Base { + superMethod() { + return 'good'; + } +} + +class Sub extends Base { + superMethod() { + return 'bad'; + } + + #privateMethod() { + return super.superMethod(); + } + + publicMethod() { + return this.#privateMethod(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/output.js new file mode 100644 index 000000000000..1a0d87d98e0c --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-method-privateFieldsAsProperties/super/output.js @@ -0,0 +1,30 @@ +class Base { + superMethod() { + return 'good'; + } + +} + +var _privateMethod = babelHelpers.classPrivateFieldLooseKey("privateMethod"); + +class Sub extends Base { + constructor(...args) { + super(...args); + Object.defineProperty(this, _privateMethod, { + value: _privateMethod2 + }); + } + + superMethod() { + return 'bad'; + } + + publicMethod() { + return babelHelpers.classPrivateFieldLooseBase(this, _privateMethod)[_privateMethod](); + } + +} + +var _privateMethod2 = function _privateMethod2() { + return babelHelpers.get(babelHelpers.getPrototypeOf(Sub.prototype), "superMethod", this).call(this); +}; diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/input.js new file mode 100644 index 000000000000..99125b6f24c4 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/input.js @@ -0,0 +1,13 @@ +class Cl { + static async #privateStaticMethod() { + return 2; + } + + test() { + return Cl.#privateStaticMethod(); + } +} + +return new Cl().test().then(val => { + expect(val).toBe(2); +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/options.json new file mode 100644 index 000000000000..95ab365853e8 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/options.json @@ -0,0 +1,14 @@ +{ + "minNodeVersion": "8.0.0", + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + }, + "parserOpts": { + "allowReturnOutsideFunction": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/output.js new file mode 100644 index 000000000000..9d5595eaafa9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/async/output.js @@ -0,0 +1,19 @@ +var _privateStaticMethod = babelHelpers.classPrivateFieldLooseKey("privateStaticMethod"); + +class Cl { + test() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + +} + +var _privateStaticMethod2 = async function _privateStaticMethod2() { + return 2; +}; + +Object.defineProperty(Cl, _privateStaticMethod, { + value: _privateStaticMethod2 +}); +return new Cl().test().then(val => { + expect(val).toBe(2); +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/exec.js new file mode 100644 index 000000000000..d5577057caa9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/exec.js @@ -0,0 +1,33 @@ +const privateStaticValue = 1017; + +class Cl { + static staticMethod2() { + return Cl.#privateStaticMethod(); + } + + static #privateStaticMethod() { + return privateStaticValue; + } + + static staticMethod() { + return Cl.#privateStaticMethod(); + } + + static privateStaticMethod() { + return Cl.#privateStaticMethod(); + } + + publicMethod() { + return Cl.#privateStaticMethod(); + } + + constructor() { + this.instanceField = Cl.#privateStaticMethod(); + } +} + +expect((new Cl).publicMethod()).toEqual(privateStaticValue); +// expect((new Cl).instanceField).toEqual(privateStaticValue); +// expect(Cl.privateStaticMethod()).toEqual(privateStaticValue); +// expect(Cl.staticMethod()).toEqual(privateStaticValue); +// expect(Cl.staticMethod2()).toEqual(privateStaticValue); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/input.js new file mode 100644 index 000000000000..ad0ee3d44814 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/input.js @@ -0,0 +1,25 @@ +class Cl { + static staticMethod2() { + return Cl.#privateStaticMethod(); + } + + static #privateStaticMethod() { + return 1017; + } + + static staticMethod() { + return Cl.#privateStaticMethod(); + } + + static privateStaticMethod() { + return Cl.#privateStaticMethod(); + } + + publicMethod() { + return Cl.#privateStaticMethod(); + } + + constructor() { + this.instanceField = Cl.#privateStaticMethod(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/output.js new file mode 100644 index 000000000000..c62177365e9a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/basic/output.js @@ -0,0 +1,32 @@ +var _privateStaticMethod = babelHelpers.classPrivateFieldLooseKey("privateStaticMethod"); + +class Cl { + static staticMethod2() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + + static staticMethod() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + + static privateStaticMethod() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + + publicMethod() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + + constructor() { + this.instanceField = babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod](); + } + +} + +var _privateStaticMethod2 = function _privateStaticMethod2() { + return 1017; +}; + +Object.defineProperty(Cl, _privateStaticMethod, { + value: _privateStaticMethod2 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/exec.js new file mode 100644 index 000000000000..940b62801e26 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/exec.js @@ -0,0 +1,12 @@ +class Cl { + static #privateStaticMethod() { + return 1017; + } + + publicMethod(checked) { + return checked.#privateStaticMethod(); + } +} + +const cl = new Cl(); +expect(cl.publicMethod(Cl)).toBe(1017); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/input.js new file mode 100644 index 000000000000..fd8c6c331e4e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/input.js @@ -0,0 +1,7 @@ +class Cl { + static #privateStaticMethod() { } + + publicMethod(checked) { + return checked.#privateStaticMethod(); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/output.js new file mode 100644 index 000000000000..353da8ad4fac --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/class-check/output.js @@ -0,0 +1,14 @@ +var _privateStaticMethod = babelHelpers.classPrivateFieldLooseKey("privateStaticMethod"); + +class Cl { + publicMethod(checked) { + return babelHelpers.classPrivateFieldLooseBase(checked, _privateStaticMethod)[_privateStaticMethod](); + } + +} + +var _privateStaticMethod2 = function _privateStaticMethod2() {}; + +Object.defineProperty(Cl, _privateStaticMethod, { + value: _privateStaticMethod2 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/exec.js new file mode 100644 index 000000000000..14a7b5edd830 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/exec.js @@ -0,0 +1,20 @@ +let exfiltrated; + +class Cl { + static #privateStaticMethod() { + return 1017; + } + + constructor() { + if (exfiltrated === undefined) { + exfiltrated = Cl.#privateStaticMethod; + } + expect(exfiltrated).toStrictEqual(Cl.#privateStaticMethod); + } +} + +new Cl(); +// check for private method function object equality +new Cl(); + +expect(exfiltrated()).toEqual(1017); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/input.js new file mode 100644 index 000000000000..fdc78e57981a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/input.js @@ -0,0 +1,13 @@ +let exfiltrated; + +class Cl { + static #privateStaticMethod() { + return 1017; + } + + constructor() { + if (exfiltrated === undefined) { + exfiltrated = Cl.#privateStaticMethod; + } + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/output.js new file mode 100644 index 000000000000..c6a5a2dc8000 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/exfiltrated/output.js @@ -0,0 +1,20 @@ +let exfiltrated; + +var _privateStaticMethod = babelHelpers.classPrivateFieldLooseKey("privateStaticMethod"); + +class Cl { + constructor() { + if (exfiltrated === undefined) { + exfiltrated = babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod]; + } + } + +} + +var _privateStaticMethod2 = function _privateStaticMethod2() { + return 1017; +}; + +Object.defineProperty(Cl, _privateStaticMethod, { + value: _privateStaticMethod2 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/exec.js new file mode 100644 index 000000000000..97a6a708fc63 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/exec.js @@ -0,0 +1,14 @@ +class Cl { + static *#foo() { + yield 2; + return 3; + } + + test() { + return Cl.#foo(); + } +} + +const val = new Cl().test(); +expect(val.next()).toEqual({ value: 2, done: false }); +expect(val.next()).toEqual({ value: 3, done: true }); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/input.js new file mode 100644 index 000000000000..2b8727d64cfa --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/input.js @@ -0,0 +1,10 @@ +class Cl { + static *#foo() { + yield 2; + return 3; + } + + test() { + return Cl.#foo(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/output.js new file mode 100644 index 000000000000..464971ea7944 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/generator/output.js @@ -0,0 +1,17 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Cl { + test() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _foo)[_foo](); + } + +} + +var _foo2 = function* _foo2() { + yield 2; + return 3; +}; + +Object.defineProperty(Cl, _foo, { + value: _foo2 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..8db8526496b9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/exec.js new file mode 100644 index 000000000000..d55af8ba71d7 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/exec.js @@ -0,0 +1,9 @@ +class Cl { + static #privateStaticMethod() { } + + constructor() { + expect(() => Cl.#privateStaticMethod = null).toThrow(TypeError); + } +} + +new Cl(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/input.js new file mode 100644 index 000000000000..865ddea4ccf1 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/input.js @@ -0,0 +1,9 @@ +class Cl { + static #privateStaticMethod() { } + + constructor() { + Cl.#privateStaticMethod = null; + } +} + +new Cl(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/output.js new file mode 100644 index 000000000000..5b3fae07d026 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/reassignment/output.js @@ -0,0 +1,15 @@ +var _privateStaticMethod = babelHelpers.classPrivateFieldLooseKey("privateStaticMethod"); + +class Cl { + constructor() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticMethod)[_privateStaticMethod] = null; + } + +} + +var _privateStaticMethod2 = function _privateStaticMethod2() {}; + +Object.defineProperty(Cl, _privateStaticMethod, { + value: _privateStaticMethod2 +}); +new Cl(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/scopable/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/scopable/exec.js new file mode 100644 index 000000000000..f94e5c495f9a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/scopable/exec.js @@ -0,0 +1,17 @@ +class Cl { + static #privateMethodA() { + const i = 40; + return i; + } + + static #privateMethodB() { + const i = 2; + return i; + } + + publicMethod() { + return Cl.#privateMethodA() + Cl.#privateMethodB(); + } +} + +expect((new Cl).publicMethod()).toEqual(42); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/exec.js new file mode 100644 index 000000000000..1d6f0c63559a --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/exec.js @@ -0,0 +1,21 @@ +class Base { + static basePublicStaticMethod() { + return 'good'; + } +} + +class Sub extends Base { + static basePublicStaticMethod() { + return 'bad'; + } + + static #subStaticPrivateMethod() { + return super.basePublicStaticMethod(); + } + + static check() { + return Sub.#subStaticPrivateMethod(); + } +} + +expect(Sub.check()).toEqual('good'); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/input.js new file mode 100644 index 000000000000..e5fb0ecd5eec --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/input.js @@ -0,0 +1,19 @@ +class Base { + static basePublicStaticMethod() { + return 'good'; + } +} + +class Sub extends Base { + static basePublicStaticMethod() { + return 'bad'; + } + + static #subStaticPrivateMethod() { + return super.basePublicStaticMethod(); + } + + static check() { + Sub.#subStaticPrivateMethod(); + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/output.js new file mode 100644 index 000000000000..ae589469caf6 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/super/output.js @@ -0,0 +1,27 @@ +class Base { + static basePublicStaticMethod() { + return 'good'; + } + +} + +var _subStaticPrivateMethod = babelHelpers.classPrivateFieldLooseKey("subStaticPrivateMethod"); + +class Sub extends Base { + static basePublicStaticMethod() { + return 'bad'; + } + + static check() { + babelHelpers.classPrivateFieldLooseBase(Sub, _subStaticPrivateMethod)[_subStaticPrivateMethod](); + } + +} + +var _subStaticPrivateMethod2 = function _subStaticPrivateMethod2() { + return babelHelpers.get(babelHelpers.getPrototypeOf(Sub), "basePublicStaticMethod", this).call(this); +}; + +Object.defineProperty(Sub, _subStaticPrivateMethod, { + value: _subStaticPrivateMethod2 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/exec.js new file mode 100644 index 000000000000..3262c36845be --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/exec.js @@ -0,0 +1,18 @@ +class A { + static get a() { return 1 } +} + +class B extends A { + static get b() { return 2 } + + static #getA() { return super.a } + static #getB() { return this.b } + + static extract() { + return [this.#getA, this.#getB]; + } +} + +const [getA, getB] = B.extract(); +expect(getA.call({ a: 3 })).toBe(1); +expect(getB.call({ b: 4 })).toBe(4); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/input.js new file mode 100644 index 000000000000..3c8639776d62 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/input.js @@ -0,0 +1,16 @@ +class A { + static get a() { return 1 } +} + +class B extends A { + static get b() { return 2 } + + static #getA() { return super.a } + static #getB() { return this.b } + + static extract() { + return [this.#getA, this.#getB]; + } +} + +const [getA, getB] = B.extract(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/output.js new file mode 100644 index 000000000000..0d39c5bf1282 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/private-static-method-privateFieldsAsProperties/this/output.js @@ -0,0 +1,37 @@ +class A { + static get a() { + return 1; + } + +} + +var _getA = babelHelpers.classPrivateFieldLooseKey("getA"); + +var _getB = babelHelpers.classPrivateFieldLooseKey("getB"); + +class B extends A { + static get b() { + return 2; + } + + static extract() { + return [babelHelpers.classPrivateFieldLooseBase(this, _getA)[_getA], babelHelpers.classPrivateFieldLooseBase(this, _getB)[_getB]]; + } + +} + +var _getB2 = function _getB2() { + return this.b; +}; + +var _getA2 = function _getA2() { + return babelHelpers.get(babelHelpers.getPrototypeOf(B), "a", this); +}; + +Object.defineProperty(B, _getA, { + value: _getA2 +}); +Object.defineProperty(B, _getB, { + value: _getB2 +}); +const [getA, getB] = B.extract(); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/exec.js new file mode 100644 index 000000000000..791a59034af9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/exec.js @@ -0,0 +1,23 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = "top secret string"; + + static get #privateStaticFieldValue() { + return Cl.#PRIVATE_STATIC_FIELD; + } + + static set #privateStaticFieldValue(newValue) { + Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`; + } + + static getValue() { + return Cl.#privateStaticFieldValue; + } + + static setValue() { + Cl.#privateStaticFieldValue = "dank"; + } +} + +expect(Cl.getValue()).toEqual("top secret string"); +Cl.setValue(); +expect(Cl.getValue()).toEqual("Updated: dank"); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/input.js new file mode 100644 index 000000000000..c79cdbe5ff0e --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/input.js @@ -0,0 +1,19 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = "top secret string"; + + static get #privateStaticFieldValue() { + return Cl.#PRIVATE_STATIC_FIELD; + } + + static set #privateStaticFieldValue(newValue) { + Cl.#PRIVATE_STATIC_FIELD = `Updated: ${newValue}`; + } + + static getValue() { + return Cl.#privateStaticFieldValue; + } + + static setValue() { + Cl.#privateStaticFieldValue = "dank"; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/output.js new file mode 100644 index 000000000000..f9b15a52fad0 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/basic/output.js @@ -0,0 +1,31 @@ +var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD"); + +var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue"); + +class Cl { + static getValue() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue]; + } + + static setValue() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = "dank"; + } + +} + +var _set_privateStaticFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = `Updated: ${newValue}`; +}; + +var _get_privateStaticFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; +}; + +Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, { + writable: true, + value: "top secret string" +}); +Object.defineProperty(Cl, _privateStaticFieldValue, { + get: _get_privateStaticFieldValue, + set: _set_privateStaticFieldValue +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/exec.js new file mode 100644 index 000000000000..0c14f25c0938 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/exec.js @@ -0,0 +1,13 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = 0; + + static set #privateStaticFieldValue(newValue) { + Cl.#PRIVATE_STATIC_FIELD = newValue; + } + + static getPrivateStaticFieldValue() { + return Cl.#privateStaticFieldValue; + } +} + +expect(Cl.getPrivateStaticFieldValue()).toBeUndefined(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/input.js new file mode 100644 index 000000000000..ab8771074ec7 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/input.js @@ -0,0 +1,11 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = 0; + + static set #privateStaticFieldValue(newValue) { + Cl.#PRIVATE_STATIC_FIELD = newValue; + } + + static getPrivateStaticFieldValue() { + return Cl.#privateStaticFieldValue; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/output.js new file mode 100644 index 000000000000..9fc34593fd65 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/get-only-setter/output.js @@ -0,0 +1,23 @@ +var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD"); + +var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue"); + +class Cl { + static getPrivateStaticFieldValue() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue]; + } + +} + +var _set_privateStaticFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD] = newValue; +}; + +Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, { + writable: true, + value: 0 +}); +Object.defineProperty(Cl, _privateStaticFieldValue, { + get: void 0, + set: _set_privateStaticFieldValue +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..8db8526496b9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js new file mode 100644 index 000000000000..7069abfadc9d --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/exec.js @@ -0,0 +1,13 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = 0; + + static get #privateStaticFieldValue() { + return Cl.#PRIVATE_STATIC_FIELD; + } + + static setPrivateStaticFieldValue() { + Cl.#privateStaticFieldValue = 1; + } +} + +expect(() => Cl.setPrivateStaticFieldValue()).toThrow(TypeError); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js new file mode 100644 index 000000000000..d54ce4e2c2d0 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/input.js @@ -0,0 +1,11 @@ +class Cl { + static #PRIVATE_STATIC_FIELD = 0; + + static get #privateStaticFieldValue() { + return Cl.#PRIVATE_STATIC_FIELD; + } + + static setPrivateStaticFieldValue() { + Cl.#privateStaticFieldValue = 1; + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js new file mode 100644 index 000000000000..2dfa44c30302 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/set-only-getter/output.js @@ -0,0 +1,23 @@ +var _PRIVATE_STATIC_FIELD = babelHelpers.classPrivateFieldLooseKey("PRIVATE_STATIC_FIELD"); + +var _privateStaticFieldValue = babelHelpers.classPrivateFieldLooseKey("privateStaticFieldValue"); + +class Cl { + static setPrivateStaticFieldValue() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateStaticFieldValue)[_privateStaticFieldValue] = 1; + } + +} + +var _get_privateStaticFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(Cl, _PRIVATE_STATIC_FIELD)[_PRIVATE_STATIC_FIELD]; +}; + +Object.defineProperty(Cl, _PRIVATE_STATIC_FIELD, { + writable: true, + value: 0 +}); +Object.defineProperty(Cl, _privateStaticFieldValue, { + get: _get_privateStaticFieldValue, + set: void 0 +}); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/exec.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/exec.js new file mode 100644 index 000000000000..05f70aecceec --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/exec.js @@ -0,0 +1,46 @@ +class Cl { + static #privateField = "top secret string"; + static publicField = "not secret string"; + + static get #privateFieldValue() { + return Cl.#privateField; + } + + static set #privateFieldValue(newValue) { + Cl.#privateField = newValue; + } + + static publicGetPrivateField() { + return Cl.#privateFieldValue; + } + + static publicSetPrivateField(newValue) { + Cl.#privateFieldValue = newValue; + } + + static get publicFieldValue() { + return Cl.publicField; + } + + static set publicFieldValue(newValue) { + Cl.publicField = newValue; + } + + static testUpdates() { + Cl.#privateField = 0; + Cl.publicField = 0; + Cl.#privateFieldValue = Cl.#privateFieldValue++; + Cl.publicFieldValue = Cl.publicFieldValue++; + expect(Cl.#privateField).toEqual(Cl.publicField); + + ++Cl.#privateFieldValue; + ++Cl.publicFieldValue; + expect(Cl.#privateField).toEqual(Cl.publicField); + + Cl.#privateFieldValue += 1; + Cl.publicFieldValue += 1; + expect(Cl.#privateField).toEqual(Cl.publicField); + } +} + +Cl.testUpdates(); \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/input.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/input.js new file mode 100644 index 000000000000..33c7b39d9cb4 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/input.js @@ -0,0 +1,44 @@ +class Cl { + static #privateField = "top secret string"; + static publicField = "not secret string"; + + static get #privateFieldValue() { + return Cl.#privateField; + } + + static set #privateFieldValue(newValue) { + Cl.#privateField = newValue; + } + + static publicGetPrivateField() { + return Cl.#privateFieldValue; + } + + static publicSetPrivateField(newValue) { + Cl.#privateFieldValue = newValue; + } + + static get publicFieldValue() { + return Cl.publicField; + } + + static set publicFieldValue(newValue) { + Cl.publicField = newValue; + } + + static testUpdates() { + Cl.#privateField = 0; + Cl.publicField = 0; + Cl.#privateFieldValue = Cl.#privateFieldValue++; + Cl.publicFieldValue = Cl.publicFieldValue++; + + ++Cl.#privateFieldValue; + ++Cl.publicFieldValue; + + Cl.#privateFieldValue += 1; + Cl.publicFieldValue += 1; + + Cl.#privateFieldValue = -(Cl.#privateFieldValue ** Cl.#privateFieldValue); + Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue); + } +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/output.js new file mode 100644 index 000000000000..d9d601bd2297 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/static-accessors-privateFieldsAsProperties/updates/output.js @@ -0,0 +1,53 @@ +var _privateField = babelHelpers.classPrivateFieldLooseKey("privateField"); + +var _privateFieldValue = babelHelpers.classPrivateFieldLooseKey("privateFieldValue"); + +class Cl { + static publicGetPrivateField() { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]; + } + + static publicSetPrivateField(newValue) { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = newValue; + } + + static get publicFieldValue() { + return Cl.publicField; + } + + static set publicFieldValue(newValue) { + Cl.publicField = newValue; + } + + static testUpdates() { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField] = 0; + Cl.publicField = 0; + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]++; + Cl.publicFieldValue = Cl.publicFieldValue++; + ++babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]; + ++Cl.publicFieldValue; + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] += 1; + Cl.publicFieldValue += 1; + babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] = -(babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue] ** babelHelpers.classPrivateFieldLooseBase(Cl, _privateFieldValue)[_privateFieldValue]); + Cl.publicFieldValue = -(Cl.publicFieldValue ** Cl.publicFieldValue); + } + +} + +var _set_privateFieldValue = function (newValue) { + babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField] = newValue; +}; + +var _get_privateFieldValue = function () { + return babelHelpers.classPrivateFieldLooseBase(Cl, _privateField)[_privateField]; +}; + +Object.defineProperty(Cl, _privateField, { + writable: true, + value: "top secret string" +}); +babelHelpers.defineProperty(Cl, "publicField", "not secret string"); +Object.defineProperty(Cl, _privateFieldValue, { + get: _get_privateFieldValue, + set: _set_privateFieldValue +}); diff --git a/packages/babel-plugin-proposal-private-property-in-object/src/index.js b/packages/babel-plugin-proposal-private-property-in-object/src/index.js index 70dbf3e4c737..c8c5c7bddcc0 100644 --- a/packages/babel-plugin-proposal-private-property-in-object/src/index.js +++ b/packages/babel-plugin-proposal-private-property-in-object/src/index.js @@ -12,6 +12,7 @@ export default declare((api, options) => { return createClassFeaturePlugin({ name: "proposal-class-properties", + api, feature: FEATURES.privateIn, loose: options.loose, diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/input.js new file mode 100644 index 000000000000..c0e9000615fd --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/output.js new file mode 100644 index 000000000000..9d2a42925dfe --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/accessor/output.js @@ -0,0 +1,17 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + get: _get_foo, + set: void 0 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +var _get_foo = function () {}; diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/input.js new file mode 100644 index 000000000000..23c266018025 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/input.js @@ -0,0 +1,12 @@ +class Foo { + static #foo = "foo"; + #bar = "bar"; + + static test() { + return #foo in Foo; + } + + test() { + return #bar in this; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/options.json b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/options.json new file mode 100644 index 000000000000..9d27af601e04 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/options.json @@ -0,0 +1,9 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "proposal-private-property-in-object", + "proposal-class-properties", + "proposal-private-methods", + "transform-classes" + ] +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/output.js new file mode 100644 index 000000000000..1889def268b8 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/compiled-classes/output.js @@ -0,0 +1,33 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); + +let Foo = /*#__PURE__*/function () { + "use strict"; + + function Foo() { + babelHelpers.classCallCheck(this, Foo); + Object.defineProperty(this, _bar, { + writable: true, + value: "bar" + }); + } + + babelHelpers.createClass(Foo, [{ + key: "test", + value: function test() { + return Object.prototype.hasOwnProperty.call(this, _bar); + } + }], [{ + key: "test", + value: function test() { + return Object.prototype.hasOwnProperty.call(Foo, _foo); + } + }]); + return Foo; +}(); + +Object.defineProperty(Foo, _foo, { + writable: true, + value: "foo" +}); diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/input.js new file mode 100644 index 000000000000..a682a1a15c5b --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/output.js new file mode 100644 index 000000000000..df6a89c95c78 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/field/output.js @@ -0,0 +1,15 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/input.js new file mode 100644 index 000000000000..365843c59708 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/input.js @@ -0,0 +1,7 @@ +class Foo { + #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/output.js new file mode 100644 index 000000000000..aebc5e5ffad0 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/method/output.js @@ -0,0 +1,16 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + value: _foo2 + }); + } + + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +var _foo2 = function _foo2() {}; diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js new file mode 100644 index 000000000000..a084dd06afd6 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/input.js @@ -0,0 +1,18 @@ +class Foo { + #foo = 1; + #bar = 1; + + test() { + class Nested { + #bar = 2; + + test() { + #foo in this; + #bar in this; + } + } + + #foo in this; + #bar in this; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js new file mode 100644 index 000000000000..42541d45123f --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-other-redeclared/output.js @@ -0,0 +1,39 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +var _bar = babelHelpers.classPrivateFieldLooseKey("bar"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + Object.defineProperty(this, _bar, { + writable: true, + value: 1 + }); + } + + test() { + var _bar2 = babelHelpers.classPrivateFieldLooseKey("bar"); + + class Nested { + constructor() { + Object.defineProperty(this, _bar2, { + writable: true, + value: 2 + }); + } + + test() { + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar2); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + Object.prototype.hasOwnProperty.call(this, _bar); + } + +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js new file mode 100644 index 000000000000..2258be35c5fd --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/input.js @@ -0,0 +1,15 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + #foo = 2; + + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js new file mode 100644 index 000000000000..e20e475ad96f --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class-redeclared/output.js @@ -0,0 +1,31 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test() { + var _foo2 = babelHelpers.classPrivateFieldLooseKey("foo"); + + class Nested { + constructor() { + Object.defineProperty(this, _foo2, { + writable: true, + value: 2 + }); + } + + test() { + Object.prototype.hasOwnProperty.call(this, _foo2); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + } + +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/input.js new file mode 100644 index 000000000000..e17e438b314d --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/input.js @@ -0,0 +1,13 @@ +class Foo { + #foo = 1; + + test() { + class Nested { + test() { + #foo in this; + } + } + + #foo in this; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/output.js new file mode 100644 index 000000000000..b87aa8205365 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/nested-class/output.js @@ -0,0 +1,22 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + constructor() { + Object.defineProperty(this, _foo, { + writable: true, + value: 1 + }); + } + + test() { + class Nested { + test() { + Object.prototype.hasOwnProperty.call(this, _foo); + } + + } + + Object.prototype.hasOwnProperty.call(this, _foo); + } + +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/options.json b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/options.json new file mode 100644 index 000000000000..27edc061ba5a --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + ["external-helpers",{ "helperVersion": "7.1000.0" }], + "proposal-private-property-in-object", + "proposal-private-methods", + "proposal-class-properties" + ], + "assumptions": { + "privateFieldsAsProperties": true + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/input.js new file mode 100644 index 000000000000..e74333f2055f --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/input.js @@ -0,0 +1,7 @@ +class Foo { + static get #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/output.js new file mode 100644 index 000000000000..3f5bbb4c847f --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-accessor/output.js @@ -0,0 +1,15 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +var _get_foo = function () {}; + +Object.defineProperty(Foo, _foo, { + get: _get_foo, + set: void 0 +}); diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/input.js new file mode 100644 index 000000000000..a4f771844fe9 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo = 1; + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/output.js new file mode 100644 index 000000000000..b69ce320b78f --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-field/output.js @@ -0,0 +1,13 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +Object.defineProperty(Foo, _foo, { + writable: true, + value: 1 +}); diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/input.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/input.js new file mode 100644 index 000000000000..9fffe7a01622 --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/input.js @@ -0,0 +1,7 @@ +class Foo { + static #foo() {} + + test(other) { + return #foo in other; + } +} diff --git a/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/output.js b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/output.js new file mode 100644 index 000000000000..e6af49be3aff --- /dev/null +++ b/packages/babel-plugin-proposal-private-property-in-object/test/fixtures/assumption-privateFieldsAsProperties/static-method/output.js @@ -0,0 +1,14 @@ +var _foo = babelHelpers.classPrivateFieldLooseKey("foo"); + +class Foo { + test(other) { + return Object.prototype.hasOwnProperty.call(other, _foo); + } + +} + +var _foo2 = function _foo2() {}; + +Object.defineProperty(Foo, _foo, { + value: _foo2 +});