stylebot-harmony/scripts/plugins/babel-component-name.ts
2023-08-03 20:09:32 -04:00

38 lines
1.1 KiB
TypeScript

import type { BabelPlugin } from "./esbuild-babel"
export const componentName =
(): BabelPlugin =>
({ types: t }) => ({
name: "babel-plugin-component-name",
visitor: {
ReturnStatement(path) {
if (!t.isJSXElement(path.node.argument)) return
const funcParent = path.getFunctionParent()
if (funcParent == null || !t.isArrowFunctionExpression(funcParent.node)) return
let id: string | undefined
if (
t.isCallExpression(funcParent.parent) &&
t.isIdentifier(funcParent.parent.callee) &&
t.isVariableDeclarator(funcParent.parentPath.parent) &&
t.isIdentifier(funcParent.parentPath.parent.id)
) {
id = funcParent.parentPath.parent.id.name
} else if (
t.isVariableDeclarator(funcParent.parent) &&
t.isIdentifier(funcParent.parent.id)
) {
id = funcParent.parent.id.name
}
if (id != null) {
path.node.argument.openingElement.attributes.unshift(
t.jsxAttribute(t.jsxIdentifier("data-component"), t.stringLiteral(id)),
)
}
},
},
})