diff --git a/Makefile b/Makefile index 6537e089b8f7..61abe0e1fcde 100644 --- a/Makefile +++ b/Makefile @@ -220,6 +220,14 @@ prepublish: # --exclude-dependents support is added by .yarn-patches/@lerna/version new-version: + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!! Enable the check in proposal-class-static-block !!!!!!" + @echo "!!!!!! !!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" + @exit 1 git pull --rebase $(YARN) lerna version --exclude-dependents --force-publish=$(FORCE_PUBLISH) diff --git a/packages/babel-core/src/parser/util/missing-plugin-helper.js b/packages/babel-core/src/parser/util/missing-plugin-helper.js index 5a5f7082f253..aabc8c075d5b 100644 --- a/packages/babel-core/src/parser/util/missing-plugin-helper.js +++ b/packages/babel-core/src/parser/util/missing-plugin-helper.js @@ -31,6 +31,16 @@ const pluginNameMap = { url: "https://git.io/JvpRG", }, }, + classStaticBlock: { + syntax: { + name: "@babel/plugin-syntax-class-static-block", + url: "https://git.io/JTLB6", + }, + transform: { + name: "@babel/plugin-proposal-class-static-block", + url: "https://git.io/JTLBP", + }, + }, decimal: { syntax: { name: "@babel/plugin-syntax-decimal", 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 d23c12cefdc1..fef48ee705b5 100644 --- a/packages/babel-helper-create-class-features-plugin/src/index.js +++ b/packages/babel-helper-create-class-features-plugin/src/index.js @@ -120,6 +120,18 @@ export function createClassFeaturePlugin({ } if (!isDecorated) isDecorated = hasOwnDecorators(path.node); + + if (path.isStaticBlock?.()) { + throw path.buildCodeFrameError(`Incorrect plugin order, \`@babel/plugin-proposal-class-static-block\` should be placed before class features plugins +{ + "plugins": [ + "@babel/plugin-proposal-class-static-block", + "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-proposal-private-methods", + "@babel/plugin-proposal-class-properties", + ] +}`); + } } if (!props.length && !isDecorated) return; @@ -188,7 +200,12 @@ export function createClassFeaturePlugin({ }, PrivateName(path) { - if (this.file.get(versionKey) !== version) return; + if ( + this.file.get(versionKey) !== version || + path.parentPath.isPrivate({ key: path.node }) + ) { + return; + } throw path.buildCodeFrameError(`Unknown PrivateName "${path}"`); }, diff --git a/packages/babel-helper-module-transforms/package.json b/packages/babel-helper-module-transforms/package.json index d94542bd7116..1d529e108ed4 100644 --- a/packages/babel-helper-module-transforms/package.json +++ b/packages/babel-helper-module-transforms/package.json @@ -20,6 +20,7 @@ "@babel/helper-simple-access": "workspace:^7.10.4", "@babel/helper-split-export-declaration": "workspace:^7.11.0", "@babel/template": "workspace:^7.10.4", + "@babel/traverse": "workspace:^7.11.5", "@babel/types": "workspace:^7.11.0", "lodash": "^4.17.19" } diff --git a/packages/babel-helper-module-transforms/src/rewrite-this.js b/packages/babel-helper-module-transforms/src/rewrite-this.js index cf03366b0ae6..02d96f930ebd 100644 --- a/packages/babel-helper-module-transforms/src/rewrite-this.js +++ b/packages/babel-helper-module-transforms/src/rewrite-this.js @@ -1,25 +1,21 @@ -import { skipAllButComputedKey } from "@babel/helper-replace-supers"; +import { environmentVisitor } from "@babel/helper-replace-supers"; +import traverse from "@babel/traverse"; +import * as t from "@babel/types"; + export default function rewriteThis(programPath: NodePath) { // Rewrite "this" to be "undefined". - programPath.traverse(rewriteThisVisitor); + traverse(programPath.node, { ...rewriteThisVisitor, noScope: true }); } /** * A visitor to walk the tree, rewriting all `this` references in the top-level scope to be - * `undefined`. + * `void 0` (undefined). */ -const rewriteThisVisitor = { - ThisExpression(path) { - path.replaceWith(path.scope.buildUndefinedNode()); - }, - Function(path) { - if (path.isMethod()) skipAllButComputedKey(path); - else if (!path.isArrowFunctionExpression()) path.skip(); - }, - ClassProperty(path) { - skipAllButComputedKey(path); - }, - ClassPrivateProperty(path) { - path.skip(); +const rewriteThisVisitor = traverse.visitors.merge([ + environmentVisitor, + { + ThisExpression(path) { + path.replaceWith(t.unaryExpression("void", t.numericLiteral(0), true)); + }, }, -}; +]); diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 0bf1d50c3d35..32e752de2ffb 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -42,8 +42,13 @@ export function skipAllButComputedKey(path: NodePath) { } // environmentVisitor should be used when traversing the whole class and not for specific class elements/methods. +// For perf reasons, the environmentVisitor will be traversed with `{ noScope: true }`, which means `path.scope` is undefined. +// Avoid using `path.scope` here export const environmentVisitor = { - TypeAnnotation(path: NodePath) { + // todo (Babel 8): remove StaticBlock brand checks + [`${t.StaticBlock ? "StaticBlock|" : ""}ClassPrivateProperty|TypeAnnotation`]( + path: NodePath, + ) { path.skip(); }, @@ -55,7 +60,7 @@ export const environmentVisitor = { path.skip(); }, - "Method|ClassProperty|ClassPrivateProperty"(path: NodePath) { + "Method|ClassProperty"(path: NodePath) { skipAllButComputedKey(path); }, }; diff --git a/packages/babel-plugin-proposal-class-static-block/.npmignore b/packages/babel-plugin-proposal-class-static-block/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-plugin-proposal-class-static-block/README.md b/packages/babel-plugin-proposal-class-static-block/README.md new file mode 100644 index 000000000000..f1dbec97118c --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/README.md @@ -0,0 +1,19 @@ +# @babel/plugin-proposal-class-static-block + +> Allow transforming of class static blocks + +See our website [@babel/plugin-proposal-class-static-block](https://babeljs.io/docs/en/next/babel-plugin-proposal-class-static-block.html) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/plugin-proposal-class-static-block +``` + +or using yarn: + +```sh +yarn add @babel/plugin-proposal-class-static-block --dev +``` diff --git a/packages/babel-plugin-proposal-class-static-block/package.json b/packages/babel-plugin-proposal-class-static-block/package.json new file mode 100644 index 000000000000..4ba6e6b1a6d6 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/package.json @@ -0,0 +1,28 @@ +{ + "name": "@babel/plugin-proposal-class-static-block", + "version": "7.11.0", + "description": "Allow parsing of class static blocks", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-plugin-proposal-class-static-block" + }, + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "./lib/index.js", + "exports": { + ".": "./lib/index.js" + }, + "keywords": [ + "babel-plugin" + ], + "dependencies": { + "@babel/helper-plugin-utils": "workspace:^7.10.1", + "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0" + }, + "peerDependencies": { + "@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 new file mode 100644 index 000000000000..886bee2dd8b3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/src/index.js @@ -0,0 +1,61 @@ +import { declare } from "@babel/helper-plugin-utils"; +import syntaxClassStaticBlock from "@babel/plugin-syntax-class-static-block"; + +/** + * Generate a uid that is not in `denyList` + * + * @param {*} scope + * @param {Set} a deny list that the generated uid should avoid + * @returns + */ +function generateUid(scope, denyList: Set) { + const name = ""; + let uid; + let i = 1; + do { + uid = scope._generateUid(name, i); + i++; + } while (denyList.has(uid)); + return uid; +} + +export default declare(({ types: t, template, assertVersion }) => { + // todo: change to ^7.12.0 when it is published + assertVersion("^7.11.6"); + + return { + name: "proposal-class-static-block", + inherits: syntaxClassStaticBlock, + visitor: { + Class(path: NodePath) { + const { scope } = path; + const classBody = path.get("body"); + const privateNames = new Set(); + let staticBlockPath; + for (const path of classBody.get("body")) { + if (path.isPrivate()) { + privateNames.add(path.get("key.id").node.name); + } else if (path.isStaticBlock()) { + staticBlockPath = path; + } + } + if (!staticBlockPath) { + return; + } + const staticBlockRef = t.privateName( + t.identifier(generateUid(scope, privateNames)), + ); + classBody.pushContainer( + "body", + t.classPrivateProperty( + staticBlockRef, + template.expression.ast`(() => { ${staticBlockPath.node.body} })()`, + [], + /* static */ true, + ), + ); + staticBlockPath.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 new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/exec.js @@ -0,0 +1,7 @@ +class Foo { + static { + 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 new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/input.js @@ -0,0 +1,7 @@ +class Foo { + static { + 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 new file mode 100644 index 000000000000..49139ba432a1 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-declaration/output.js @@ -0,0 +1,8 @@ +class Foo { + static bar = 42; + static #_ = (() => { + this.foo = this.bar; + })(); +} + +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/exec.js new file mode 100644 index 000000000000..719d9f22eb77 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/class-expression/exec.js @@ -0,0 +1,6 @@ +class Foo { + static { + this.foo = 42; + } +} +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 new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/exec.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + 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 new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/input.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + 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 new file mode 100644 index 000000000000..ef844d07c994 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/in-class-heritage/output.js @@ -0,0 +1,15 @@ +class Foo extends class extends class Base { + static #_ = (() => { + this.qux = 21; + })(); +} { + static #_ = (() => { + this.bar = 21; + })(); +} { + static #_ = (() => { + 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/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/name-conflict/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/exec.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/exec.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/input.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/input.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/output.js new file mode 100644 index 000000000000..9f73880d1fc7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/name-conflict/output.js @@ -0,0 +1,9 @@ +class Foo { + static #_ = 42; // static block can not be tranformed as `#_` here + + static #_2 = (() => { + this.foo = this.#_; + })(); +} + +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/non-static/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/non-static/exec.js new file mode 100644 index 000000000000..1d8845c283de --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/non-static/exec.js @@ -0,0 +1,7 @@ +class Foo { + bar = 21; + static { + this.foo = this.bar; + } +} +expect(Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/options.json new file mode 100644 index 000000000000..635f1e993525 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-class-static-block", "syntax-class-properties"], + "minNodeVersion": "12.0.0" +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/private-elements-access/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/private-elements-access/exec.js new file mode 100644 index 000000000000..07e589d487dc --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/private-elements-access/exec.js @@ -0,0 +1,8 @@ +let getFoo; +class Foo { + static #foo = 42; + static { + getFoo = () => this.#foo; + } +} +expect(getFoo()).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/exec.js new file mode 100644 index 000000000000..637fc8c5f248 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-property/exec.js @@ -0,0 +1,9 @@ +class Foo extends class { + static bar = 42; +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-static-block/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-static-block/exec.js new file mode 100644 index 000000000000..866e400fc377 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/class-static-block/super-static-block/exec.js @@ -0,0 +1,11 @@ +class Foo extends class { + static { + this.bar = 42; + } +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/exec.js new file mode 100644 index 000000000000..aea35fe5c6ec --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/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/integration-loose/class-binding/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.js new file mode 100644 index 000000000000..aea35fe5c6ec --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/input.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/integration-loose/class-binding/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/output.js new file mode 100644 index 000000000000..1c8b0fc717a1 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-binding/output.js @@ -0,0 +1,12 @@ +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +class Foo {} + +Foo.bar = 42; +Object.defineProperty(Foo, _, { + writable: true, + value: (() => { + Foo.foo = Foo.bar; + })() +}); +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/exec.js @@ -0,0 +1,7 @@ +class Foo { + static { + this.foo = this.bar; + } + static bar = 42; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/input.js @@ -0,0 +1,7 @@ +class Foo { + static { + this.foo = this.bar; + } + static bar = 42; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/output.js new file mode 100644 index 000000000000..1c8b0fc717a1 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-declaration/output.js @@ -0,0 +1,12 @@ +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +class Foo {} + +Foo.bar = 42; +Object.defineProperty(Foo, _, { + writable: true, + value: (() => { + Foo.foo = Foo.bar; + })() +}); +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-expression/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-expression/exec.js new file mode 100644 index 000000000000..719d9f22eb77 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/class-expression/exec.js @@ -0,0 +1,6 @@ +class Foo { + static { + this.foo = 42; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/exec.js new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/exec.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + this.foo = this.bar + this.qux; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/input.js new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/input.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + this.foo = this.bar + this.qux; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/output.js new file mode 100644 index 000000000000..790f057648d3 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/in-class-heritage/output.js @@ -0,0 +1,23 @@ +var _class, _2, _temp, _class2, _3, _temp2; + +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +class Foo extends (_temp = (_2 = babelHelpers.classPrivateFieldLooseKey("_"), _class = class extends (_temp2 = (_3 = babelHelpers.classPrivateFieldLooseKey("_"), _class2 = class Base {}), Object.defineProperty(_class2, _3, { + writable: true, + value: (() => { + _class2.qux = 21; + })() +}), _temp2) {}), Object.defineProperty(_class, _2, { + writable: true, + value: (() => { + _class.bar = 21; + })() +}), _temp) {} + +Object.defineProperty(Foo, _, { + writable: true, + value: (() => { + Foo.foo = Foo.bar + Foo.qux; + })() +}); +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/multiple-static-initializers/exec.js new file mode 100644 index 000000000000..657be074147c --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/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/integration-loose/name-conflict/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/exec.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/exec.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/input.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/input.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/output.js new file mode 100644 index 000000000000..9782eba3fab9 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/name-conflict/output.js @@ -0,0 +1,17 @@ +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +var _2 = babelHelpers.classPrivateFieldLooseKey("_2"); + +class Foo {} + +Object.defineProperty(Foo, _, { + writable: true, + value: 42 +}); +Object.defineProperty(Foo, _2, { + writable: true, + value: (() => { + Foo.foo = babelHelpers.classPrivateFieldLooseBase(Foo, _)[_]; + })() +}); +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/non-static/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/non-static/exec.js new file mode 100644 index 000000000000..1d8845c283de --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/non-static/exec.js @@ -0,0 +1,7 @@ +class Foo { + bar = 21; + static { + this.foo = this.bar; + } +} +expect(Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/options.json new file mode 100644 index 000000000000..0c80ad46dc94 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/options.json @@ -0,0 +1,9 @@ +{ + "plugins": [ + "proposal-class-static-block", + ["proposal-private-property-in-object", { "loose": true }], + ["proposal-private-methods", { "loose": true }], + ["proposal-class-properties", { "loose": true }], + "external-helpers" + ] +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-elements-access/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-elements-access/exec.js new file mode 100644 index 000000000000..07e589d487dc --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-elements-access/exec.js @@ -0,0 +1,8 @@ +let getFoo; +class Foo { + static #foo = 42; + static { + getFoo = () => this.#foo; + } +} +expect(getFoo()).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-in/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-in/exec.js new file mode 100644 index 000000000000..10cd0427cd2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-in/exec.js @@ -0,0 +1,7 @@ +class Foo { + static #bar = 21; + static { + this.foo = #bar in this; + } +} +expect(Foo.foo).toBe(true); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-methods-access/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-methods-access/exec.js new file mode 100644 index 000000000000..8981afcf541e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/private-methods-access/exec.js @@ -0,0 +1,8 @@ +let getFoo; +class Foo { + static #foo() { return 42 }; + static { + getFoo = () => this.#foo(); + } +} +expect(getFoo()).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-property/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-property/exec.js new file mode 100644 index 000000000000..637fc8c5f248 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-property/exec.js @@ -0,0 +1,9 @@ +class Foo extends class { + static bar = 42; +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/exec.js new file mode 100644 index 000000000000..866e400fc377 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/exec.js @@ -0,0 +1,11 @@ +class Foo extends class { + static { + this.bar = 42; + } +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/input.js new file mode 100644 index 000000000000..866e400fc377 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/input.js @@ -0,0 +1,11 @@ +class Foo extends class { + static { + this.bar = 42; + } +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/output.js new file mode 100644 index 000000000000..384a75d00dbe --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration-loose/super-static-block/output.js @@ -0,0 +1,26 @@ +var _class, _2, _temp; + +var _ = babelHelpers.classPrivateFieldLooseKey("_"); + +class Foo extends (_temp = (_2 = babelHelpers.classPrivateFieldLooseKey("_"), _class = class {}), Object.defineProperty(_class, _2, { + writable: true, + value: (() => { + _class.bar = 42; + })() +}), _temp) {} + +Foo.bar = 21; +Object.defineProperty(Foo, _, { + writable: true, + value: (() => { + var _class2, _3, _temp2; + + Foo.foo = (_temp2 = (_3 = babelHelpers.classPrivateFieldLooseKey("_"), _class2 = class {}), Object.defineProperty(_class2, _3, { + writable: true, + value: (() => { + _class2.bar = 42; + })() + }), _temp2).bar; + })() +}); +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/exec.js new file mode 100644 index 000000000000..aea35fe5c6ec --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/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/integration/class-binding/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.js new file mode 100644 index 000000000000..aea35fe5c6ec --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/input.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/integration/class-binding/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/output.js new file mode 100644 index 000000000000..810eeba965a4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-binding/output.js @@ -0,0 +1,10 @@ +class Foo {} + +babelHelpers.defineProperty(Foo, "bar", 42); +var _ = { + writable: true, + value: (() => { + Foo.foo = Foo.bar; + })() +}; +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/exec.js @@ -0,0 +1,7 @@ +class Foo { + static { + this.foo = this.bar; + } + static bar = 42; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js new file mode 100644 index 000000000000..a748d4ad1f2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/input.js @@ -0,0 +1,7 @@ +class Foo { + static { + this.foo = this.bar; + } + static bar = 42; +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/output.js new file mode 100644 index 000000000000..810eeba965a4 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-declaration/output.js @@ -0,0 +1,10 @@ +class Foo {} + +babelHelpers.defineProperty(Foo, "bar", 42); +var _ = { + writable: true, + value: (() => { + Foo.foo = Foo.bar; + })() +}; +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-expression/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-expression/exec.js new file mode 100644 index 000000000000..719d9f22eb77 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/class-expression/exec.js @@ -0,0 +1,6 @@ +class Foo { + static { + this.foo = 42; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/exec.js new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/exec.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + this.foo = this.bar + this.qux; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/input.js new file mode 100644 index 000000000000..be708dae2b0d --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/input.js @@ -0,0 +1,14 @@ +class Foo extends class extends class Base { + static { + this.qux = 21; + } +} { + static { + this.bar = 21; + } +} { + static { + this.foo = this.bar + this.qux; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/output.js new file mode 100644 index 000000000000..ed5682822e11 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/in-class-heritage/output.js @@ -0,0 +1,21 @@ +var _class, _temp, _2, _class2, _temp2, _3; + +class Foo extends (_temp = _class = class extends (_temp2 = _class2 = class Base {}, _3 = { + writable: true, + value: (() => { + _class2.qux = 21; + })() +}, _temp2) {}, _2 = { + writable: true, + value: (() => { + _class.bar = 21; + })() +}, _temp) {} + +var _ = { + writable: true, + value: (() => { + Foo.foo = Foo.bar + Foo.qux; + })() +}; +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/multiple-static-initializers/exec.js new file mode 100644 index 000000000000..657be074147c --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/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/integration/name-conflict/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/exec.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/exec.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/input.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/input.js new file mode 100644 index 000000000000..0de932f8d73a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/input.js @@ -0,0 +1,8 @@ +class Foo { + static #_ = 42; + // static block can not be tranformed as `#_` here + static { + this.foo = this.#_; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/output.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/output.js new file mode 100644 index 000000000000..afd334165910 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/name-conflict/output.js @@ -0,0 +1,15 @@ +function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class Foo {} + +var _ = { + writable: true, + value: 42 +}; +var _2 = { + writable: true, + value: (() => { + Foo.foo = _classStaticPrivateFieldSpecGet(Foo, Foo, _); + })() +}; +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/non-static/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/non-static/exec.js new file mode 100644 index 000000000000..1d8845c283de --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/non-static/exec.js @@ -0,0 +1,7 @@ +class Foo { + bar = 21; + static { + this.foo = this.bar; + } +} +expect(Foo.foo).toBe(undefined); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/options.json new file mode 100644 index 000000000000..6acec4a94e0a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/options.json @@ -0,0 +1,9 @@ +{ + "plugins": [ + "proposal-class-static-block", + "proposal-private-property-in-object", + "proposal-private-methods", + "proposal-class-properties", + "external-helpers" + ] +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-elements-access/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-elements-access/exec.js new file mode 100644 index 000000000000..07e589d487dc --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-elements-access/exec.js @@ -0,0 +1,8 @@ +let getFoo; +class Foo { + static #foo = 42; + static { + getFoo = () => this.#foo; + } +} +expect(getFoo()).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-in/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-in/exec.js new file mode 100644 index 000000000000..10cd0427cd2e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-in/exec.js @@ -0,0 +1,7 @@ +class Foo { + static #bar = 21; + static { + this.foo = #bar in this; + } +} +expect(Foo.foo).toBe(true); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-methods-access/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-methods-access/exec.js new file mode 100644 index 000000000000..8981afcf541e --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/private-methods-access/exec.js @@ -0,0 +1,8 @@ +let getFoo; +class Foo { + static #foo() { return 42 }; + static { + getFoo = () => this.#foo(); + } +} +expect(getFoo()).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-property/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-property/exec.js new file mode 100644 index 000000000000..637fc8c5f248 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-property/exec.js @@ -0,0 +1,9 @@ +class Foo extends class { + static bar = 42; +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-static-block/exec.js b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-static-block/exec.js new file mode 100644 index 000000000000..866e400fc377 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/integration/super-static-block/exec.js @@ -0,0 +1,11 @@ +class Foo extends class { + static { + this.bar = 42; + } +} { + static bar = 21; + static { + this.foo = super.bar; + } +} +expect(Foo.foo).toBe(42); diff --git a/packages/babel-plugin-proposal-class-static-block/test/fixtures/options.json b/packages/babel-plugin-proposal-class-static-block/test/fixtures/options.json new file mode 100644 index 000000000000..34b2bd61b0d7 --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/fixtures/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-class-static-block"] +} diff --git a/packages/babel-plugin-proposal-class-static-block/test/index.js b/packages/babel-plugin-proposal-class-static-block/test/index.js new file mode 100644 index 000000000000..1b534b8fc64a --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/index.js @@ -0,0 +1,3 @@ +import runner from "@babel/helper-plugin-test-runner"; + +runner(__dirname); diff --git a/packages/babel-plugin-proposal-class-static-block/test/plugin-ordering.test.js b/packages/babel-plugin-proposal-class-static-block/test/plugin-ordering.test.js new file mode 100644 index 000000000000..675e970382ac --- /dev/null +++ b/packages/babel-plugin-proposal-class-static-block/test/plugin-ordering.test.js @@ -0,0 +1,41 @@ +import * as babel from "@babel/core"; +import proposalClassStaticBlock from "../lib/index.js"; + +describe("plugin ordering", () => { + it("should throw when @babel/plugin-proposal-class-static-block is after class features plugin", () => { + const source = `class Foo { + static { + this.foo = Foo.bar; + } + static bar = 42; +} +`; + expect(() => { + babel.transform(source, { + filename: "example.js", + highlightCode: false, + configFile: false, + babelrc: false, + plugins: [ + "@babel/plugin-proposal-class-properties", + proposalClassStaticBlock, + ], + }); + }) + .toThrow(`Incorrect plugin order, \`@babel/plugin-proposal-class-static-block\` should be placed before class features plugins +{ + "plugins": [ + "@babel/plugin-proposal-class-static-block", + "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-proposal-private-methods", + "@babel/plugin-proposal-class-properties", + ] +} + 1 | class Foo { +> 2 | static { + | ^ + 3 | this.foo = Foo.bar; + 4 | } + 5 | static bar = 42;`); + }); +}); diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/input.mjs b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/input.mjs new file mode 100644 index 000000000000..eace310e6dfa --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/input.mjs @@ -0,0 +1,5 @@ +class foo { + static { + this // should not be replaced by undefined + } +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/options.json b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/options.json new file mode 100644 index 000000000000..b14a64139e69 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-modules-commonjs", "syntax-class-static-block"] +} diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/output.js new file mode 100644 index 000000000000..cdee4cf680f2 --- /dev/null +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/class-static-block/output.js @@ -0,0 +1,8 @@ +"use strict"; + +class foo { + static { + this; // should not be replaced by undefined + + } +} diff --git a/packages/babel-standalone/package.json b/packages/babel-standalone/package.json index e70f848f058d..ce211b9a3931 100644 --- a/packages/babel-standalone/package.json +++ b/packages/babel-standalone/package.json @@ -13,6 +13,7 @@ "@babel/plugin-external-helpers": "workspace:^7.10.4", "@babel/plugin-proposal-async-generator-functions": "workspace:^7.10.5", "@babel/plugin-proposal-class-properties": "workspace:^7.10.4", + "@babel/plugin-proposal-class-static-block": "workspace:^7.11.0", "@babel/plugin-proposal-decorators": "workspace:^7.10.5", "@babel/plugin-proposal-do-expressions": "workspace:^7.10.4", "@babel/plugin-proposal-dynamic-import": "workspace:^7.10.4", @@ -34,6 +35,7 @@ "@babel/plugin-proposal-unicode-property-regex": "workspace:^7.10.4", "@babel/plugin-syntax-async-generators": "^7.8.0", "@babel/plugin-syntax-class-properties": "workspace:^7.10.4", + "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0", "@babel/plugin-syntax-decimal": "workspace:^7.11.0", "@babel/plugin-syntax-decorators": "workspace:^7.10.4", "@babel/plugin-syntax-do-expressions": "workspace:^7.10.4", diff --git a/packages/babel-standalone/scripts/pluginConfig.json b/packages/babel-standalone/scripts/pluginConfig.json index 2b2c3f3a4219..326d74c0c335 100644 --- a/packages/babel-standalone/scripts/pluginConfig.json +++ b/packages/babel-standalone/scripts/pluginConfig.json @@ -2,6 +2,7 @@ "external-helpers", "syntax-async-generators", "syntax-class-properties", + "syntax-class-static-block", "syntax-decimal", "syntax-decorators", "syntax-do-expressions", @@ -20,6 +21,7 @@ "syntax-typescript", "proposal-async-generator-functions", "proposal-class-properties", + "proposal-class-static-block", "proposal-decorators", "proposal-do-expressions", "proposal-dynamic-import", diff --git a/packages/babel-standalone/src/generated/plugins.js b/packages/babel-standalone/src/generated/plugins.js index 757d39e53cc9..90d61b6b8139 100644 --- a/packages/babel-standalone/src/generated/plugins.js +++ b/packages/babel-standalone/src/generated/plugins.js @@ -6,6 +6,7 @@ import externalHelpers from "@babel/plugin-external-helpers"; import syntaxAsyncGenerators from "@babel/plugin-syntax-async-generators"; import syntaxClassProperties from "@babel/plugin-syntax-class-properties"; +import syntaxClassStaticBlock from "@babel/plugin-syntax-class-static-block"; import syntaxDecimal from "@babel/plugin-syntax-decimal"; import syntaxDecorators from "@babel/plugin-syntax-decorators"; import syntaxDoExpressions from "@babel/plugin-syntax-do-expressions"; @@ -24,6 +25,7 @@ import syntaxTopLevelAwait from "@babel/plugin-syntax-top-level-await"; import syntaxTypescript from "@babel/plugin-syntax-typescript"; import proposalAsyncGeneratorFunctions from "@babel/plugin-proposal-async-generator-functions"; import proposalClassProperties from "@babel/plugin-proposal-class-properties"; +import proposalClassStaticBlock from "@babel/plugin-proposal-class-static-block"; import proposalDecorators from "@babel/plugin-proposal-decorators"; import proposalDoExpressions from "@babel/plugin-proposal-do-expressions"; import proposalDynamicImport from "@babel/plugin-proposal-dynamic-import"; @@ -99,6 +101,7 @@ export { externalHelpers, syntaxAsyncGenerators, syntaxClassProperties, + syntaxClassStaticBlock, syntaxDecimal, syntaxDecorators, syntaxDoExpressions, @@ -117,6 +120,7 @@ export { syntaxTypescript, proposalAsyncGeneratorFunctions, proposalClassProperties, + proposalClassStaticBlock, proposalDecorators, proposalDoExpressions, proposalDynamicImport, @@ -193,6 +197,7 @@ export const all = { "external-helpers": externalHelpers, "syntax-async-generators": syntaxAsyncGenerators, "syntax-class-properties": syntaxClassProperties, + "syntax-class-static-block": syntaxClassStaticBlock, "syntax-decimal": syntaxDecimal, "syntax-decorators": syntaxDecorators, "syntax-do-expressions": syntaxDoExpressions, @@ -211,6 +216,7 @@ export const all = { "syntax-typescript": syntaxTypescript, "proposal-async-generator-functions": proposalAsyncGeneratorFunctions, "proposal-class-properties": proposalClassProperties, + "proposal-class-static-block": proposalClassStaticBlock, "proposal-decorators": proposalDecorators, "proposal-do-expressions": proposalDoExpressions, "proposal-dynamic-import": proposalDynamicImport, diff --git a/packages/babel-standalone/src/preset-stage-1.js b/packages/babel-standalone/src/preset-stage-1.js index 0e0cd18c138c..4b40aaf96f79 100644 --- a/packages/babel-standalone/src/preset-stage-1.js +++ b/packages/babel-standalone/src/preset-stage-1.js @@ -29,7 +29,6 @@ export default (_: any, opts: Object = {}) => { [babelPlugins.syntaxRecordAndTuple, { syntaxType: recordAndTupleSyntax }], babelPlugins.proposalExportDefaultFrom, [babelPlugins.proposalPipelineOperator, { proposal: pipelineProposal }], - babelPlugins.proposalPrivatePropertyInObject, babelPlugins.proposalDoExpressions, ], }; diff --git a/packages/babel-standalone/src/preset-stage-2.js b/packages/babel-standalone/src/preset-stage-2.js index 7df7c1492346..f0eff5756e0a 100644 --- a/packages/babel-standalone/src/preset-stage-2.js +++ b/packages/babel-standalone/src/preset-stage-2.js @@ -13,11 +13,13 @@ export default (_: any, opts: Object = {}) => { return { presets: [[presetStage3, { loose, useBuiltIns }]], plugins: [ + babelPlugins.proposalClassStaticBlock, [ babelPlugins.proposalDecorators, { legacy: decoratorsLegacy, decoratorsBeforeExport }, ], babelPlugins.proposalFunctionSent, + babelPlugins.proposalPrivatePropertyInObject, babelPlugins.proposalThrowExpressions, ], }; diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 321db204ccc4..671f1b34751a 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -368,7 +368,7 @@ export default class Scope { .replace(/[0-9]+$/g, ""); let uid; - let i = 0; + let i = 1; do { uid = this._generateUid(name, i); i++; 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 b3bec718c577..20531c4a3cc6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -601,6 +601,7 @@ __metadata: "@babel/helper-simple-access": "workspace:^7.10.4" "@babel/helper-split-export-declaration": "workspace:^7.11.0" "@babel/template": "workspace:^7.10.4" + "@babel/traverse": "workspace:^7.11.5" "@babel/types": "workspace:^7.11.0" lodash: ^4.17.19 languageName: unknown @@ -1004,6 +1005,17 @@ __metadata: languageName: unknown linkType: soft +"@babel/plugin-proposal-class-static-block@workspace:^7.11.0, @babel/plugin-proposal-class-static-block@workspace:packages/babel-plugin-proposal-class-static-block": + version: 0.0.0-use.local + resolution: "@babel/plugin-proposal-class-static-block@workspace:packages/babel-plugin-proposal-class-static-block" + dependencies: + "@babel/helper-plugin-utils": "workspace:^7.10.1" + "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0" + peerDependencies: + "@babel/core": ^7.12.0 + languageName: unknown + linkType: soft + "@babel/plugin-proposal-decorators@workspace:^7.10.4, @babel/plugin-proposal-decorators@workspace:^7.10.5, @babel/plugin-proposal-decorators@workspace:packages/babel-plugin-proposal-decorators": version: 0.0.0-use.local resolution: "@babel/plugin-proposal-decorators@workspace:packages/babel-plugin-proposal-decorators" @@ -1449,7 +1461,7 @@ __metadata: languageName: unknown linkType: soft -"@babel/plugin-syntax-class-static-block@workspace:packages/babel-plugin-syntax-class-static-block": +"@babel/plugin-syntax-class-static-block@workspace:^7.11.0, @babel/plugin-syntax-class-static-block@workspace:packages/babel-plugin-syntax-class-static-block": version: 0.0.0-use.local resolution: "@babel/plugin-syntax-class-static-block@workspace:packages/babel-plugin-syntax-class-static-block" dependencies: @@ -3204,6 +3216,7 @@ __metadata: "@babel/plugin-external-helpers": "workspace:^7.10.4" "@babel/plugin-proposal-async-generator-functions": "workspace:^7.10.5" "@babel/plugin-proposal-class-properties": "workspace:^7.10.4" + "@babel/plugin-proposal-class-static-block": "workspace:^7.11.0" "@babel/plugin-proposal-decorators": "workspace:^7.10.5" "@babel/plugin-proposal-do-expressions": "workspace:^7.10.4" "@babel/plugin-proposal-dynamic-import": "workspace:^7.10.4" @@ -3225,6 +3238,7 @@ __metadata: "@babel/plugin-proposal-unicode-property-regex": "workspace:^7.10.4" "@babel/plugin-syntax-async-generators": ^7.8.0 "@babel/plugin-syntax-class-properties": "workspace:^7.10.4" + "@babel/plugin-syntax-class-static-block": "workspace:^7.11.0" "@babel/plugin-syntax-decimal": "workspace:^7.11.0" "@babel/plugin-syntax-decorators": "workspace:^7.10.4" "@babel/plugin-syntax-do-expressions": "workspace:^7.10.4"