diff --git a/packages/babel-plugin-proposal-class-static-block/package.json b/packages/babel-plugin-proposal-class-static-block/package.json index 08d2357fcc14..4ba6e6b1a6d6 100644 --- a/packages/babel-plugin-proposal-class-static-block/package.json +++ b/packages/babel-plugin-proposal-class-static-block/package.json @@ -23,6 +23,6 @@ "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } } diff --git a/packages/babel-plugin-proposal-class-static-block/src/index.js b/packages/babel-plugin-proposal-class-static-block/src/index.js index 82589b3a5caa..2ff1361c289a 100644 --- a/packages/babel-plugin-proposal-class-static-block/src/index.js +++ b/packages/babel-plugin-proposal-class-static-block/src/index.js @@ -2,50 +2,28 @@ import { declare } from "@babel/helper-plugin-utils"; import syntaxClassStaticBlock from "@babel/plugin-syntax-class-static-block"; export default declare(({ types: t, template, assertVersion }) => { - assertVersion(7); + // todo remove this check after Babel 7.12.0 is published + if (process.env.NODE_ENV !== "test") { + assertVersion("^7.12.0"); + } return { name: "proposal-class-static-block", inherits: syntaxClassStaticBlock, visitor: { StaticBlock(path) { - const staticBlockRef = path.scope.generateUidIdentifier("init"); - const classPath = path.parentPath.parentPath; - path.replaceWith( - t.classMethod( - "method", - staticBlockRef, + const staticBlockRef = path.scope.generateUidIdentifier(""); + const classBody = path.parentPath; + classBody.pushContainer( + "body", + t.classPrivateProperty( + t.privateName(staticBlockRef), + template.expression.ast`(() => { ${path.node.body} })()`, [], - t.BlockStatement( - // Add completion record. A static block can not contain directly - // `return`, `break`, `continue`. So `return this` must be executed. - path.node.body.concat([ - template.ast`delete this.${t.cloneNode(staticBlockRef)};`, - template.ast`return this;`, - ]), - ), - /* computed */ false, /* static */ true, ), ); - const classId = classPath.node.id; - if (!classId) { - // If `classId` is not defined, we don't have to preserve the class binding - // `class { }` transformed as `(class { })._init()` - classPath.replaceWith( - template.ast`(${classPath.node}).${t.cloneNode(staticBlockRef)}()`, - ); - } else { - // If `classId` is defined, preserve the class binding. - // `class Foo { }` transformed as `(Foo = (class Foo { })._init())` - classPath.node.type = "ClassExpression"; - classPath.replaceWith( - template.ast`${t.cloneNode(classId)} = (${ - classPath.node - }).${t.cloneNode(staticBlockRef)}()`, - ); - classPath.insertBefore(template.ast`let ${t.cloneNode(classId)};`); - } + path.remove(); }, }, }; diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js new file mode 100644 index 000000000000..aea35fe5c6ec --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-binding/exec.js @@ -0,0 +1,7 @@ +class Foo { + static { + this.foo = Foo.bar; + } + static bar = 42; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js index 719d9f22eb77..a748d4ad1f2e 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js @@ -1,6 +1,7 @@ class Foo { static { - this.foo = 42; + this.foo = this.bar; } + static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js index 719d9f22eb77..a748d4ad1f2e 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js @@ -1,6 +1,7 @@ class Foo { static { - this.foo = 42; + this.foo = this.bar; } + static bar = 42; } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/output.js index d63d3c46db77..49139ba432a1 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/output.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/output.js @@ -1,10 +1,8 @@ -let Foo; -Foo = class Foo { - static _init() { - this.foo = 42; - delete this._init; - return this; - } +class Foo { + static bar = 42; + static #_ = (() => { + this.foo = this.bar; + })(); +} -}._init(); expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/options.json deleted file mode 100644 index 7d950d213e02..000000000000 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["proposal-class-static-block", "syntax-class-properties"] -} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/exec.js deleted file mode 100644 index 9bc06b9a8017..000000000000 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/exec.js +++ /dev/null @@ -1,10 +0,0 @@ -class Foo extends class { - static { - this.bar = 21; - } -} { - static { - this.foo = 2 * this.bar; - } -} -expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/input.js deleted file mode 100644 index 27c55d931eca..000000000000 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/input.js +++ /dev/null @@ -1,10 +0,0 @@ -class Foo extends class Bar { - static { - this.bar = 21; - } -} { - static { - this.foo = 2 * this.bar; - } -} -expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/output.js deleted file mode 100644 index 89f4839a0171..000000000000 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage-named/output.js +++ /dev/null @@ -1,18 +0,0 @@ -let Foo; -let Bar; -Foo = class Foo extends (Bar = class Bar { - static _init2() { - this.bar = 21; - delete this._init2; - return this; - } - -}._init2()) { - static _init() { - this.foo = 2 * this.bar; - delete this._init; - return this; - } - -}._init(); -expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/exec.js index 9bc06b9a8017..be708dae2b0d 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/exec.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/exec.js @@ -1,10 +1,14 @@ -class Foo extends class { +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { static { this.bar = 21; } } { static { - this.foo = 2 * this.bar; + this.foo = this.bar + this.qux; } } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/input.js index 9bc06b9a8017..be708dae2b0d 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/input.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/input.js @@ -1,10 +1,14 @@ -class Foo extends class { +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { static { this.bar = 21; } } { static { - this.foo = 2 * this.bar; + this.foo = this.bar + this.qux; } } expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/output.js index 24eb243c9155..256b0f546814 100644 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/output.js +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/output.js @@ -1,17 +1,15 @@ -let Foo; -Foo = class Foo extends class { - static _init2() { +class Foo extends class extends class Base { + static #_3 = (() => { + this.qux = 21; + })(); +} { + static #_2 = (() => { this.bar = 21; - delete this._init2; - return this; - } + })(); +} { + static #_ = (() => { + this.foo = this.bar + this.qux; + })(); +} -}._init2() { - static _init() { - this.foo = 2 * this.bar; - delete this._init; - return this; - } - -}._init(); expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js new file mode 100644 index 000000000000..657be074147c --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/multiple-static-initializers/exec.js @@ -0,0 +1,8 @@ +class Foo { + static #bar = 21; + static { + this.foo = this.#bar + this.qux; + } + static qux = 21; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/private-elements-access/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/options.json similarity index 100% rename from packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/private-elements-access/options.json rename to packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/options.json diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/options.json deleted file mode 100644 index 7d950d213e02..000000000000 --- a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["proposal-class-static-block", "syntax-class-properties"] -} diff --git a/packages/babel-types/src/definitions/experimental.js b/packages/babel-types/src/definitions/experimental.js index d9e0b9879a8b..e11581704963 100644 --- a/packages/babel-types/src/definitions/experimental.js +++ b/packages/babel-types/src/definitions/experimental.js @@ -108,7 +108,7 @@ defineType("PipelinePrimaryTopicReference", { defineType("ClassPrivateProperty", { visitor: ["key", "value", "decorators"], - builder: ["key", "value", "decorators"], + builder: ["key", "value", "decorators", "static"], aliases: ["Property", "Private"], fields: { key: { diff --git a/yarn.lock b/yarn.lock index 034aa2850fbd..32c403f647a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1011,7 +1011,7 @@ __metadata: "@babel/helper-plugin-utils": "workspace:^7.10.1" "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0" peerDependencies: - "@babel/core": ^7.0.0-0 + "@babel/core": ^7.12.0 languageName: unknown linkType: soft