@babel/plugin-transform-class-static-block
Advanced tools
+3
-3
| import { declare } from '@babel/helper-plugin-utils'; | ||
| import { buildNamedEvaluationVisitor, enableFeature, FEATURES } from '@babel/helper-create-class-features-plugin'; | ||
| function generateUid(scope, denyList) { | ||
| function generateUid(denyList) { | ||
| const name = ""; | ||
@@ -25,3 +25,3 @@ let uid; | ||
| }) => { | ||
| assertVersion("^7.12.0 || ^8.0.0 || 8.0.0-rc.4"); | ||
| assertVersion("^7.12.0 || ^8.0.0 || 8.0.0-rc.5"); | ||
| const rawNamedEvaluationVisitor = buildNamedEvaluationVisitor(path => { | ||
@@ -129,3 +129,3 @@ if (!path.isClassExpression()) return false; | ||
| } | ||
| const staticBlockPrivateId = generateUid(scope, privateNames); | ||
| const staticBlockPrivateId = generateUid(privateNames); | ||
| const staticBlockRef = t.privateName(t.identifier(staticBlockPrivateId)); | ||
@@ -132,0 +132,0 @@ classBody.pushContainer("body", [t.classPrivateProperty(staticBlockRef, init, [], true)]); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { declare } from \"@babel/helper-plugin-utils\";\nimport type { NodePath, Scope, types as t } from \"@babel/core\";\n\nimport {\n buildNamedEvaluationVisitor,\n enableFeature,\n FEATURES,\n} from \"@babel/helper-create-class-features-plugin\";\n\n/**\n * Generate a uid that is not in `denyList`\n *\n * @param {Scope} scope\n * @param {Set<string>} denyList a deny list that the generated uid should avoid\n * @returns\n */\nfunction generateUid(scope: Scope, denyList: Set<string>) {\n const name = \"\";\n let uid;\n let i = 1;\n do {\n uid = `_${name}`;\n if (i > 1) uid += i;\n i++;\n } while (denyList.has(uid));\n return uid;\n}\n\nfunction mapLast<T>(arr: T[], fn: (value: T) => T): T[] {\n if (arr.length === 0) return arr;\n return [...arr.slice(0, -1), fn(arr[arr.length - 1])];\n}\n\nexport default declare(({ types: t, template, traverse, assertVersion }) => {\n assertVersion(REQUIRED_VERSION(\"^7.12.0 || ^8.0.0\"));\n\n const rawNamedEvaluationVisitor = buildNamedEvaluationVisitor(\n (path: NodePath) => {\n if (!path.isClassExpression()) return false;\n for (let i = path.node.body.body.length - 1; i >= 0; i--) {\n const el = path.node.body.body[i];\n if (t.isStaticBlock(el)) {\n return true;\n }\n if (\n (t.isClassProperty(el) || t.isClassPrivateProperty(el)) &&\n el.static\n ) {\n break;\n }\n }\n return false;\n },\n (classPath: NodePath<t.ClassExpression>, state, name) => {\n const nameNode = typeof name === \"string\" ? t.stringLiteral(name) : name;\n\n classPath.get(\"body\").unshiftContainer(\n \"body\",\n t.staticBlock([\n template.statement.ast`\n ${state.addHelper(\"setFunctionName\")}(this, ${nameNode});\n `,\n ]),\n );\n },\n );\n\n const namedEvaluationVisitor = traverse.visitors.explode(\n rawNamedEvaluationVisitor,\n );\n\n const maybeSequenceExpression = (\n expressions: t.Expression[],\n ): t.Expression => {\n if (expressions.length === 1) {\n return expressions[0];\n } else {\n return t.sequenceExpression(expressions);\n }\n };\n\n const blocksToExpressions = (blocks: t.StaticBlock[]) =>\n blocks.map(block => {\n const { body } = block;\n if (body.length === 1 && t.isExpressionStatement(body[0])) {\n // We special-case the single expression case to avoid the iife, since\n // it's common.\n return t.inheritsComments(\n t.inheritsComments(body[0].expression, body[0]),\n block,\n );\n }\n return t.inheritsComments(\n template.expression.ast`(() => { ${body} })()`,\n block,\n );\n });\n\n const prependToInitializer = (\n prop: t.ClassProperty | t.ClassPrivateProperty,\n expressions: t.Expression[],\n ) => {\n prop.value = prop.value\n ? t.sequenceExpression([...expressions, prop.value])\n : maybeSequenceExpression(\n mapLast(expressions, expr => t.unaryExpression(\"void\", expr)),\n );\n };\n\n return {\n name: \"transform-class-static-block\",\n manipulateOptions: undefined,\n pre() {\n // Enable this in @babel/helper-create-class-features-plugin, so that it\n // can be handled by the private fields and methods transform.\n enableFeature(this.file, FEATURES.staticBlocks, /* loose */ false);\n },\n\n visitor: {\n // Run on ClassBody and not on class so that if @babel/helper-create-class-features-plugin\n // is enabled it can generate optimized output without passing from the intermediate\n // private fields representation.\n ClassBody(classBody) {\n const { scope } = classBody;\n\n // If needed, add the name to the class\n let parentPath: NodePath<t.Node> = classBody.parentPath;\n if (parentPath.isClassExpression() && !parentPath.node.id) {\n do ({ parentPath } = parentPath);\n while (\n parentPath &&\n !namedEvaluationVisitor[parentPath.type] &&\n !parentPath.isStatement()\n );\n if (parentPath) {\n namedEvaluationVisitor[parentPath.type]?.enter!.forEach(f =>\n f.call(this, parentPath, this),\n );\n }\n }\n\n const pendingStaticBlocks: t.StaticBlock[] = [];\n let lastStaticProp:\n | null\n | NodePath<t.ClassProperty>\n | NodePath<t.ClassPrivateProperty> = null;\n\n for (const path of classBody.get(\"body\")) {\n if (path.isStaticBlock()) {\n pendingStaticBlocks.push(path.node);\n path.remove();\n } else if (\n path.isClassProperty({ static: true }) ||\n path.isClassPrivateProperty({ static: true })\n ) {\n lastStaticProp = path;\n\n if (pendingStaticBlocks.length > 0) {\n // push static blocks right before the initializer of the next\n // static field in the class.\n\n prependToInitializer(\n path.node,\n blocksToExpressions(pendingStaticBlocks),\n );\n pendingStaticBlocks.length = 0;\n }\n }\n }\n\n if (pendingStaticBlocks.length > 0) {\n // if there are static blocks not followed by a static field where\n // we can inject them, wrap them in a function and push it in the\n // last static field in the class (or create a new one, if needed).\n // After the class body runs, call the function to run the remaining\n // static blocks bodies.\n\n const tmp = scope.generateDeclaredUidIdentifier(\"staticBlock\");\n let arrowBody;\n const needsCompletionValue = classBody.parentPath.isExpression();\n if (\n pendingStaticBlocks.length > 1 ||\n (pendingStaticBlocks[0].body.length === 1 &&\n t.isExpressionStatement(pendingStaticBlocks[0].body[0]))\n ) {\n const expressions = blocksToExpressions(pendingStaticBlocks);\n if (needsCompletionValue) {\n expressions.push(t.thisExpression());\n }\n arrowBody = maybeSequenceExpression(expressions);\n } else {\n arrowBody = t.blockStatement(pendingStaticBlocks[0].body);\n if (needsCompletionValue) {\n arrowBody.body.push(t.returnStatement(t.thisExpression()));\n }\n }\n const init = template.expression.ast`${tmp} = () => ${arrowBody}`;\n\n if (lastStaticProp) {\n prependToInitializer(lastStaticProp.node, [init]);\n } else {\n // If there are no static fields at all, it's safe to inject a\n // new private properties before running the static blocks because\n // there is no code that could have already made the class\n // non-extensible.\n\n const privateNames = new Set<string>();\n for (const path of classBody.get(\"body\")) {\n if (path.isPrivate()) {\n privateNames.add(path.get(\"key.id\").node.name);\n }\n }\n const staticBlockPrivateId = generateUid(scope, privateNames);\n const staticBlockRef = t.privateName(\n t.identifier(staticBlockPrivateId),\n );\n classBody.pushContainer(\"body\", [\n t.classPrivateProperty(staticBlockRef, init, [], true),\n ]);\n }\n\n const staticBlockClosureCall = t.callExpression(t.cloneNode(tmp), []);\n if (classBody.parentPath.isClassExpression()) {\n // We don't use .insertAfter() because we don't need to insert the\n // tmp variable to preserve the class as the result value, because\n // the call will already return the class itself.\n classBody.parentPath.replaceWith(\n t.sequenceExpression([\n classBody.parent as t.ClassExpression,\n staticBlockClosureCall,\n ]),\n );\n } else {\n classBody.parentPath.insertAfter(\n t.expressionStatement(staticBlockClosureCall),\n );\n }\n }\n },\n },\n };\n});\n"],"names":["generateUid","scope","denyList","name","uid","i","has","mapLast","arr","fn","length","slice","declare","types","t","template","traverse","assertVersion","rawNamedEvaluationVisitor","buildNamedEvaluationVisitor","path","isClassExpression","node","body","el","isStaticBlock","isClassProperty","isClassPrivateProperty","static","classPath","state","nameNode","stringLiteral","get","unshiftContainer","staticBlock","statement","ast","addHelper","namedEvaluationVisitor","visitors","explode","maybeSequenceExpression","expressions","sequenceExpression","blocksToExpressions","blocks","map","block","isExpressionStatement","inheritsComments","expression","prependToInitializer","prop","value","expr","unaryExpression","manipulateOptions","undefined","pre","enableFeature","file","FEATURES","staticBlocks","visitor","ClassBody","classBody","parentPath","id","type","isStatement","enter","forEach","f","call","pendingStaticBlocks","lastStaticProp","push","remove","tmp","generateDeclaredUidIdentifier","arrowBody","needsCompletionValue","isExpression","thisExpression","blockStatement","returnStatement","init","privateNames","Set","isPrivate","add","staticBlockPrivateId","staticBlockRef","privateName","identifier","pushContainer","classPrivateProperty","staticBlockClosureCall","callExpression","cloneNode","replaceWith","parent","insertAfter","expressionStatement"],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { declare } from \"@babel/helper-plugin-utils\";\nimport type { NodePath, types as t } from \"@babel/core\";\n\nimport {\n buildNamedEvaluationVisitor,\n enableFeature,\n FEATURES,\n} from \"@babel/helper-create-class-features-plugin\";\n\n/**\n * Generate a uid that is not in `denyList`\n *\n * @param {Set<string>} denyList a deny list that the generated uid should avoid\n * @returns\n */\nfunction generateUid(denyList: Set<string>) {\n const name = \"\";\n let uid;\n let i = 1;\n do {\n uid = `_${name}`;\n if (i > 1) uid += i;\n i++;\n } while (denyList.has(uid));\n return uid;\n}\n\nfunction mapLast<T>(arr: T[], fn: (value: T) => T): T[] {\n if (arr.length === 0) return arr;\n return [...arr.slice(0, -1), fn(arr[arr.length - 1])];\n}\n\nexport default declare(({ types: t, template, traverse, assertVersion }) => {\n assertVersion(REQUIRED_VERSION(\"^7.12.0 || ^8.0.0\"));\n\n const rawNamedEvaluationVisitor = buildNamedEvaluationVisitor(\n (path: NodePath) => {\n if (!path.isClassExpression()) return false;\n for (let i = path.node.body.body.length - 1; i >= 0; i--) {\n const el = path.node.body.body[i];\n if (t.isStaticBlock(el)) {\n return true;\n }\n if (\n (t.isClassProperty(el) || t.isClassPrivateProperty(el)) &&\n el.static\n ) {\n break;\n }\n }\n return false;\n },\n (classPath: NodePath<t.ClassExpression>, state, name) => {\n const nameNode = typeof name === \"string\" ? t.stringLiteral(name) : name;\n\n classPath.get(\"body\").unshiftContainer(\n \"body\",\n t.staticBlock([\n template.statement.ast`\n ${state.addHelper(\"setFunctionName\")}(this, ${nameNode});\n `,\n ]),\n );\n },\n );\n\n const namedEvaluationVisitor = traverse.visitors.explode(\n rawNamedEvaluationVisitor,\n );\n\n const maybeSequenceExpression = (\n expressions: t.Expression[],\n ): t.Expression => {\n if (expressions.length === 1) {\n return expressions[0];\n } else {\n return t.sequenceExpression(expressions);\n }\n };\n\n const blocksToExpressions = (blocks: t.StaticBlock[]) =>\n blocks.map(block => {\n const { body } = block;\n if (body.length === 1 && t.isExpressionStatement(body[0])) {\n // We special-case the single expression case to avoid the iife, since\n // it's common.\n return t.inheritsComments(\n t.inheritsComments(body[0].expression, body[0]),\n block,\n );\n }\n return t.inheritsComments(\n template.expression.ast`(() => { ${body} })()`,\n block,\n );\n });\n\n const prependToInitializer = (\n prop: t.ClassProperty | t.ClassPrivateProperty,\n expressions: t.Expression[],\n ) => {\n prop.value = prop.value\n ? t.sequenceExpression([...expressions, prop.value])\n : maybeSequenceExpression(\n mapLast(expressions, expr => t.unaryExpression(\"void\", expr)),\n );\n };\n\n return {\n name: \"transform-class-static-block\",\n manipulateOptions: undefined,\n pre() {\n // Enable this in @babel/helper-create-class-features-plugin, so that it\n // can be handled by the private fields and methods transform.\n enableFeature(this.file, FEATURES.staticBlocks, /* loose */ false);\n },\n\n visitor: {\n // Run on ClassBody and not on class so that if @babel/helper-create-class-features-plugin\n // is enabled it can generate optimized output without passing from the intermediate\n // private fields representation.\n ClassBody(classBody) {\n const { scope } = classBody;\n\n // If needed, add the name to the class\n let parentPath: NodePath<t.Node> = classBody.parentPath;\n if (parentPath.isClassExpression() && !parentPath.node.id) {\n do ({ parentPath } = parentPath);\n while (\n parentPath &&\n !namedEvaluationVisitor[parentPath.type] &&\n !parentPath.isStatement()\n );\n if (parentPath) {\n namedEvaluationVisitor[parentPath.type]?.enter!.forEach(f =>\n f.call(this, parentPath, this),\n );\n }\n }\n\n const pendingStaticBlocks: t.StaticBlock[] = [];\n let lastStaticProp:\n | null\n | NodePath<t.ClassProperty>\n | NodePath<t.ClassPrivateProperty> = null;\n\n for (const path of classBody.get(\"body\")) {\n if (path.isStaticBlock()) {\n pendingStaticBlocks.push(path.node);\n path.remove();\n } else if (\n path.isClassProperty({ static: true }) ||\n path.isClassPrivateProperty({ static: true })\n ) {\n lastStaticProp = path;\n\n if (pendingStaticBlocks.length > 0) {\n // push static blocks right before the initializer of the next\n // static field in the class.\n\n prependToInitializer(\n path.node,\n blocksToExpressions(pendingStaticBlocks),\n );\n pendingStaticBlocks.length = 0;\n }\n }\n }\n\n if (pendingStaticBlocks.length > 0) {\n // if there are static blocks not followed by a static field where\n // we can inject them, wrap them in a function and push it in the\n // last static field in the class (or create a new one, if needed).\n // After the class body runs, call the function to run the remaining\n // static blocks bodies.\n\n const tmp = scope.generateDeclaredUidIdentifier(\"staticBlock\");\n let arrowBody;\n const needsCompletionValue = classBody.parentPath.isExpression();\n if (\n pendingStaticBlocks.length > 1 ||\n (pendingStaticBlocks[0].body.length === 1 &&\n t.isExpressionStatement(pendingStaticBlocks[0].body[0]))\n ) {\n const expressions = blocksToExpressions(pendingStaticBlocks);\n if (needsCompletionValue) {\n expressions.push(t.thisExpression());\n }\n arrowBody = maybeSequenceExpression(expressions);\n } else {\n arrowBody = t.blockStatement(pendingStaticBlocks[0].body);\n if (needsCompletionValue) {\n arrowBody.body.push(t.returnStatement(t.thisExpression()));\n }\n }\n const init = template.expression.ast`${tmp} = () => ${arrowBody}`;\n\n if (lastStaticProp) {\n prependToInitializer(lastStaticProp.node, [init]);\n } else {\n // If there are no static fields at all, it's safe to inject a\n // new private properties before running the static blocks because\n // there is no code that could have already made the class\n // non-extensible.\n\n const privateNames = new Set<string>();\n for (const path of classBody.get(\"body\")) {\n if (path.isPrivate()) {\n privateNames.add(path.get(\"key.id\").node.name);\n }\n }\n const staticBlockPrivateId = generateUid(privateNames);\n const staticBlockRef = t.privateName(\n t.identifier(staticBlockPrivateId),\n );\n classBody.pushContainer(\"body\", [\n t.classPrivateProperty(staticBlockRef, init, [], true),\n ]);\n }\n\n const staticBlockClosureCall = t.callExpression(t.cloneNode(tmp), []);\n if (classBody.parentPath.isClassExpression()) {\n // We don't use .insertAfter() because we don't need to insert the\n // tmp variable to preserve the class as the result value, because\n // the call will already return the class itself.\n classBody.parentPath.replaceWith(\n t.sequenceExpression([\n classBody.parent as t.ClassExpression,\n staticBlockClosureCall,\n ]),\n );\n } else {\n classBody.parentPath.insertAfter(\n t.expressionStatement(staticBlockClosureCall),\n );\n }\n }\n },\n },\n };\n});\n"],"names":["generateUid","denyList","name","uid","i","has","mapLast","arr","fn","length","slice","declare","types","t","template","traverse","assertVersion","rawNamedEvaluationVisitor","buildNamedEvaluationVisitor","path","isClassExpression","node","body","el","isStaticBlock","isClassProperty","isClassPrivateProperty","static","classPath","state","nameNode","stringLiteral","get","unshiftContainer","staticBlock","statement","ast","addHelper","namedEvaluationVisitor","visitors","explode","maybeSequenceExpression","expressions","sequenceExpression","blocksToExpressions","blocks","map","block","isExpressionStatement","inheritsComments","expression","prependToInitializer","prop","value","expr","unaryExpression","manipulateOptions","undefined","pre","enableFeature","file","FEATURES","staticBlocks","visitor","ClassBody","classBody","scope","parentPath","id","type","isStatement","enter","forEach","f","call","pendingStaticBlocks","lastStaticProp","push","remove","tmp","generateDeclaredUidIdentifier","arrowBody","needsCompletionValue","isExpression","thisExpression","blockStatement","returnStatement","init","privateNames","Set","isPrivate","add","staticBlockPrivateId","staticBlockRef","privateName","identifier","pushContainer","classPrivateProperty","staticBlockClosureCall","callExpression","cloneNode","replaceWith","parent","insertAfter","expressionStatement"],"mappings":"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"} |
+11
-11
| { | ||
| "name": "@babel/plugin-transform-class-static-block", | ||
| "version": "8.0.0-rc.4", | ||
| "version": "8.0.0-rc.5", | ||
| "description": "Transform class static blocks", | ||
@@ -26,19 +26,19 @@ "repository": { | ||
| "dependencies": { | ||
| "@babel/helper-create-class-features-plugin": "^8.0.0-rc.4", | ||
| "@babel/helper-plugin-utils": "^8.0.0-rc.4" | ||
| "@babel/helper-create-class-features-plugin": "^8.0.0-rc.5", | ||
| "@babel/helper-plugin-utils": "^8.0.0-rc.5" | ||
| }, | ||
| "peerDependencies": { | ||
| "@babel/core": "^8.0.0-rc.4" | ||
| "@babel/core": "^8.0.0-rc.5" | ||
| }, | ||
| "devDependencies": { | ||
| "@babel/core": "^8.0.0-rc.4", | ||
| "@babel/helper-plugin-test-runner": "^8.0.0-rc.4", | ||
| "@babel/plugin-external-helpers": "^8.0.0-rc.4", | ||
| "@babel/plugin-transform-class-properties": "^8.0.0-rc.4", | ||
| "@babel/traverse": "^8.0.0-rc.4", | ||
| "@babel/types": "^8.0.0-rc.4" | ||
| "@babel/core": "^8.0.0-rc.5", | ||
| "@babel/helper-plugin-test-runner": "^8.0.0-rc.5", | ||
| "@babel/plugin-external-helpers": "^8.0.0-rc.5", | ||
| "@babel/plugin-transform-class-properties": "^8.0.0-rc.5", | ||
| "@babel/traverse": "^8.0.0-rc.5", | ||
| "@babel/types": "^8.0.0-rc.5" | ||
| }, | ||
| "homepage": "https://babel.dev/docs/en/next/babel-plugin-transform-class-static-block", | ||
| "engines": { | ||
| "node": "^20.19.0 || >=22.12.0" | ||
| "node": "^22.18.0 || >=24.11.0" | ||
| }, | ||
@@ -45,0 +45,0 @@ "author": "The Babel Team (https://babel.dev/team)", |
24752
-0.38%