@lingui/extractor-vue
Version:
Custom Vue.js extractor to be used with the CLI tool
58 lines (55 loc) • 1.52 kB
JavaScript
import { parse, compileTemplate } from '@vue/compiler-sfc';
import { extractor } from '@lingui/cli/api';
const vueExtractor = {
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 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 = [
[
descriptor.script?.content,
descriptor.script?.map,
isTsBlock(descriptor.script)
],
[
descriptor.scriptSetup?.content,
descriptor.scriptSetup?.map,
isTsBlock(descriptor.scriptSetup)
],
[
compiledTemplate?.code,
compiledTemplate?.map,
isTsBlock(descriptor.script) || isTsBlock(descriptor.scriptSetup)
]
];
await Promise.all(
targets.filter(([source]) => Boolean(source)).map(
([source, map, isTs]) => extractor.extract(
filename + (isTs ? ".ts" : ""),
source,
onMessageExtracted,
{
sourceMaps: map,
...ctx
}
)
)
);
}
};
export { vueExtractor };