@lingui/extractor-vue
Version:
Vue single-file component extractor for the Lingui CLI
104 lines (100 loc) • 2.73 kB
JavaScript
import { compileScript, parse, compileTemplate } from '@vue/compiler-sfc';
import { extractor } from '@lingui/cli/api';
function compileScriptSetup(descriptor, filename, reactivityTransform) {
const isTsScript = descriptor.script?.lang === "ts";
const isTsScriptSetup = descriptor.scriptSetup?.lang === "ts";
if (!reactivityTransform || !descriptor.scriptSetup) {
return [
{
source: descriptor.script?.content ?? "",
map: descriptor.script?.map,
isTs: isTsScript
},
{
source: descriptor.scriptSetup?.content ?? "",
map: descriptor.scriptSetup?.map,
isTs: isTsScriptSetup
}
];
}
try {
const compiled = compileScript(descriptor, {
id: filename,
sourceMap: true,
reactivityTransform
});
return [
{
source: compiled.content,
map: compiled.map,
isTs: isTsScriptSetup
}
];
} catch (e) {
return [
{
source: descriptor.script?.content ?? "",
map: descriptor.script?.map,
isTs: isTsScript
},
{
source: descriptor.scriptSetup.content,
map: descriptor.scriptSetup.map,
isTs: isTsScriptSetup
}
];
}
}
const createVueExtractor = (config = {}) => ({
match(filename) {
return filename.endsWith(".vue");
},
async extract(filename, code, onMessageExtracted, ctx) {
const { descriptor } = parse(code, {
sourceMap: true,
filename,
ignoreEmpty: true
});
const isTsBlock = (block) => block?.lang === "ts";
const { reactivityTransform = false } = config;
const compiledScripts = compileScriptSetup(
descriptor,
filename,
reactivityTransform
);
const compiledTemplate = descriptor.template && compileTemplate({
source: descriptor.template.content,
filename,
inMap: descriptor.template.map,
id: filename,
compilerOptions: {
isTS: isTsBlock(descriptor.script) || isTsBlock(descriptor.scriptSetup)
}
});
const targets = [
...compiledScripts,
{
source: compiledTemplate?.code ?? "",
map: compiledTemplate?.map,
isTs: isTsBlock(descriptor.script) || isTsBlock(descriptor.scriptSetup)
}
];
await Promise.all(
targets.filter(
(target) => target != null && target.source !== ""
).map(
({ source, map, isTs }) => extractor.extract(
filename + (isTs ? ".ts" : ""),
source,
onMessageExtracted,
{
sourceMaps: map,
...ctx
}
)
)
);
}
});
const vueExtractor = createVueExtractor();
export { createVueExtractor, vueExtractor };