UNPKG

@jsverse/transloco-keys-manager

Version:

Extract translatable keys from projects that uses Transloco

61 lines 2.24 kB
import { tmplAstVisitAll } from '@angular/compiler'; import { addKey } from '../add-key.js'; import { resolveAliasAndKey } from '../utils/resolvers.utils.js'; import { parseTemplate, resolveKeysFromLiteralMap } from './utils.js'; import { notNil } from '../../utils/validators.utils.js'; import { AstPipeCollector, isBindingPipe, isConditionalExpression, isLiteralExpression, isLiteralMap, TmplPipeCollector } from '@jsverse/utils'; export function pipeExtractor(config) { const parsedTemplate = parseTemplate(config); const tmplVisitor = new TmplPipeCollector('transloco'); tmplAstVisitAll(tmplVisitor, parsedTemplate.nodes); const astVisitor = new AstPipeCollector(); astVisitor.visitAll([...tmplVisitor.astTrees], {}); const keysWithParams = astVisitor.pipes.get('transloco')?.map((p) => resolveKeyAndParam(p.node)) .flat() .filter(notNil); if (keysWithParams) { addKeysFromAst(keysWithParams, config); } } function resolveKeyAndParam(pipe, paramsNode) { const resolvedParams = paramsNode ?? pipe.args[0]; if (isConditionalExpression(pipe.exp)) { return [pipe.exp.trueExp, pipe.exp.falseExp] .filter(isLiteralExpression) .map((keyNode) => { return { keyNode, paramsNode: resolvedParams, }; }); } else if (isLiteralExpression(pipe.exp)) { return { keyNode: pipe.exp, paramsNode: resolvedParams, }; } else if (isBindingPipe(pipe.exp)) { let nestedPipe = pipe; while (isBindingPipe(nestedPipe.exp)) { nestedPipe = nestedPipe.exp; } return resolveKeyAndParam(nestedPipe, resolvedParams); } return null; } function addKeysFromAst(keys, config) { for (const { keyNode, paramsNode } of keys) { const [key, scopeAlias] = resolveAliasAndKey(keyNode.value, config.scopes); const params = isLiteralMap(paramsNode) ? resolveKeysFromLiteralMap(paramsNode) : []; addKey({ ...config, keyWithoutScope: key, scopeAlias, params, }); } } //# sourceMappingURL=pipe.extractor.js.map