38 lines
1.1 KiB
TypeScript
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)),
|
|
)
|
|
}
|
|
},
|
|
},
|
|
})
|