@jsverse/transloco-keys-manager
Version:
Extract translatable keys from projects that uses Transloco
61 lines • 2.24 kB
JavaScript
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