@vue-macros/volar
Version:
Volar plugin for Vue Macros.
46 lines (44 loc) • 1.98 kB
JavaScript
import { getText } from "ts-macro";
import { createFilter } from "@vue-macros/common";
import { replace as replace$1, replaceSourceRange } from "muggle-string";
//#region src/define-generic.ts
function getDefineGenerics(ts, sfc, codes) {
const result = [];
const ast = sfc.scriptSetup.ast;
ts.forEachChild(ast, (node) => {
if (ts.isTypeAliasDeclaration(node) && ts.isTypeReferenceNode(node.type) && ts.isIdentifier(node.type.typeName) && node.type.typeName.escapedText === "DefineGeneric") {
if (!node.type.typeArguments?.length) {
replaceSourceRange(codes, "scriptSetup", node.name.pos, node.name.end, ` _${node.name.escapedText}`);
replaceSourceRange(codes, "scriptSetup", node.type.end, node.type.end, `<${node.name.escapedText}>`);
}
const typeArgument = node.type.typeArguments?.[0] ? ` extends ${getText(node.type.typeArguments[0], ast, ts)}` : "";
const defaultType = node.type.typeArguments?.[1] ? ` = ${getText(node.type.typeArguments[1], ast, ts)}` : "";
result.push(`${node.name.escapedText}${typeArgument}${defaultType}`);
}
});
return result;
}
const plugin = (ctx, options = {}) => {
if (!options) return [];
const filter = createFilter(options);
return [{
name: "vue-macros-define-generic-pre",
version: 2.1,
order: -1,
resolveEmbeddedCode(fileName, sfc) {
if (filter(fileName) && !sfc.scriptSetup?.attrs.generic && sfc.scriptSetup?.content.includes("DefineGeneric")) sfc.scriptSetup.attrs.generic = "T";
}
}, {
name: "vue-macros-define-generic",
version: 2.1,
resolveEmbeddedCode(fileName, sfc, embeddedFile) {
if (!filter(fileName) || !sfc.scriptSetup?.ast) return;
const defineGenerics = getDefineGenerics(ctx.modules.typescript, sfc, embeddedFile.content);
if (!defineGenerics.length) return;
replace$1(embeddedFile.content, /(?<=export\sdefault\s\(<).*(?=,>)/, defineGenerics.join(", "));
}
}];
};
var define_generic_default = plugin;
//#endregion
export { define_generic_default, plugin };