UNPKG

@ibyar/cli

Version:

The Ibyar/Aurora CLI tool

51 lines 3.08 kB
import ts from 'typescript/lib/tsserverlibrary.js'; import { createStaticPropertyViewType, updateModuleTypeWithComponentView } from './factory.js'; import { moduleManger } from './modules.js'; /** * search for `@Component({})` and update definition files * @param program a ts program * @returns a transformer factory of source file */ export function afterDeclarationsCompileComponentOptions(program) { const typeChecker = program.getTypeChecker(); return (context) => { return sourceFile => { const moduleInfo = moduleManger.get(sourceFile.fileName); if (!moduleInfo?.classes?.length) { return sourceFile; } const classes = moduleInfo.classes.filter(c => c.type === 'component'); const sourceViewInfos = classes.flatMap(c => c.views); const updateSourceFile = ts.visitNode(sourceFile, (node) => { return ts.visitEachChild(node, (childNode) => { if (!ts.isClassDeclaration(childNode)) { return childNode; } const info = classes.find(c => c.name === childNode.name?.getText()); if (!info) { return childNode; } const viewInfos = info.views; const staticMembers = viewInfos.map(viewInfo => ts.factory.createPropertyDeclaration([ ts.factory.createModifier(ts.SyntaxKind.StaticKeyword), ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword) ], viewInfo.viewName, undefined, createStaticPropertyViewType(viewInfo.viewName), undefined)).map(staticMember => ts.setTextRange(staticMember, childNode)); return ts.factory.updateClassDeclaration(childNode, childNode.modifiers, childNode.name, childNode.typeParameters, childNode.heritageClauses, [...staticMembers, ...childNode.members.slice()]); }, context); }); if (sourceViewInfos.length) { const statements = updateSourceFile.statements?.slice() ?? []; // statements.push(createConstructorOfViewInterfaceDeclaration()); // const interfaces = sourceViewInfos.map(info => { // return ts.setTextRange(info.interFaceType, updateSourceFile); // }); // statements.push(...interfaces); // statements.push(...updateGlobalHTMLElementTagNameMap(sourceViewInfos.map(v => ({ tagName: v.selector, viewName: v.viewName })))); statements.push(...updateModuleTypeWithComponentView(classes)); return ts.factory.updateSourceFile(sourceFile, statements, updateSourceFile.isDeclarationFile, updateSourceFile.typeReferenceDirectives, updateSourceFile.referencedFiles, updateSourceFile.hasNoDefaultLib, updateSourceFile.libReferenceDirectives); } return updateSourceFile; }; }; } //# sourceMappingURL=after-declarations-component.js.map