unplugin-jsx-source
Version:
[](https://www.npmjs.com/package/unplugin-jsx-source)
67 lines (64 loc) • 2.43 kB
JavaScript
import {
__spreadValues
} from "./chunk-5JBD5THX.js";
// src/transform.ts
import { parse } from "@babel/parser";
import _traverse from "@babel/traverse";
import _generate from "@babel/generator";
import * as t from "@babel/types";
var traverse = _traverse.default || _traverse;
var generate = _generate.default || _generate;
var transform = (code, id, opt) => {
const ast = parse(code, __spreadValues({
sourceType: "module",
plugins: ["jsx", "typescript"]
}, opt.parserOptions));
traverse(ast, {
JSXOpeningElement(path) {
if (path.node.name.type === "JSXIdentifier" && path.node.loc && !path.isJSXFragment() && path.node.name.name !== "Fragment") {
const newAttributes = [];
if (opt.attributes.at && !path.node.attributes.some(
(a) => a.type === "JSXAttribute" && a.name.name === opt.attributes.at
)) {
const fileName = opt.transformFileName(id, path.node.loc);
const dataAtAttr = t.jsxAttribute(
t.jsxIdentifier(opt.attributes.at),
t.stringLiteral(fileName)
);
newAttributes.push(dataAtAttr);
}
if (opt.attributes.in && !path.node.attributes.some(
(a) => a.type === "JSXAttribute" && a.name.name === opt.attributes.in
)) {
const assertHasName = (p) => p.isVariableDeclarator() || p.isFunctionDeclaration();
const parent = path.findParent(assertHasName);
if (parent && assertHasName(parent) && parent.node.id && "name" in parent.node.id) {
const dataInAttr = t.jsxAttribute(
t.jsxIdentifier(opt.attributes.in),
t.stringLiteral(parent.node.id.name)
);
newAttributes.push(dataInAttr);
}
}
if (opt.attributes.kind && !path.node.attributes.some(
(a) => a.type === "JSXAttribute" && a.name.name === opt.attributes.kind
) && path.node.name.name[0].toUpperCase() === path.node.name.name[0]) {
const dataKindAttr = t.jsxAttribute(
t.jsxIdentifier(opt.attributes.kind),
t.stringLiteral(path.node.name.name)
);
newAttributes.push(dataKindAttr);
}
path.node.attributes.push(...newAttributes);
}
}
});
const { code: transformedCode } = generate(ast, { filename: id }, code);
return {
code: transformedCode,
map: null
};
};
export {
transform
};