UNPKG

@lingui/extractor-vue

Version:

Vue single-file component extractor for the Lingui CLI

104 lines (100 loc) 2.73 kB
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 };