@vue-macros/volar
Version:
Volar plugin for Vue Macros.
76 lines (73 loc) • 2.32 kB
JavaScript
import {
getText
} from "./chunk-DCLIBDVT.js";
// src/define-generic.ts
import { createFilter } from "@vue-macros/common";
import { replace, replaceSourceRange } from "muggle-string";
function getDefineGenerics(ts, sfc, codes) {
const result = [];
const sourceFile = sfc.scriptSetup.ast;
ts.forEachChild(sourceFile, (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], { ts, sfc })}` : "";
const defaultType = node.type.typeArguments?.[1] ? ` = ${getText(node.type.typeArguments[1], { ts, sfc })}` : "";
result.push(`${node.name.escapedText}${typeArgument}${defaultType}`);
}
});
return result;
}
var 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(
embeddedFile.content,
/(?<=export\sdefault\s\(<).*(?=,>)/,
defineGenerics.join(", ")
);
}
}
];
};
var define_generic_default = plugin;
export {
plugin,
define_generic_default
};