UNPKG

@ibyar/cli

Version:

The Ibyar/Aurora CLI tool

102 lines 5.6 kB
import ts from 'typescript/lib/tsserverlibrary.js'; import { moduleManger } from './modules.js'; import { getInputs, getOutputs, scanSignals, getTextValueFormArrayLiteralProperty, getTextValueFormLiteralProperty, isDirectiveDecorator } from './helpers.js'; import { registerDirectiveCall } from '../directives/register.js'; import { SIGNAL_NAMES } from './signals.js'; import { createSignalsAssignment } from './factory.js'; /** * search for `@Directive({})` and to register with the html parser * @param program a ts program * @returns a transformer factory of source file */ export function beforeCompileDirectiveOptions(program) { const typeChecker = program.getTypeChecker(); return (context) => { return sourceFile => { let visitSourceFile = false; let directivePropertyName; const signals = {}; for (const statement of sourceFile.statements) { if (ts.isImportDeclaration(statement)) { const modulePath = statement.moduleSpecifier.getText(); if (statement.importClause && modulePath.includes('@ibyar/aurora') || modulePath.includes('@ibyar/core')) { statement.importClause?.namedBindings?.forEachChild(importSpecifier => { if (ts.isImportSpecifier(importSpecifier)) { const importName = importSpecifier.propertyName?.getText() ?? importSpecifier.name.getText(); if (importName === 'Directive') { visitSourceFile = true; directivePropertyName = importSpecifier.name.getText(); } else if (SIGNAL_NAMES.includes(importName)) { signals[importName] = importSpecifier.name.getText(); } } }); } } if (visitSourceFile) { break; } } if (!visitSourceFile) { return sourceFile; } const classes = []; ts.visitNode(sourceFile, (node) => { return ts.visitEachChild(node, (childNode) => { if (ts.isClassDeclaration(childNode)) { const decorators = ts.getDecorators(childNode); if (!decorators || decorators.length === 0) { return childNode; } const hasDecorator = decorators.some(decorator => isDirectiveDecorator(decorator, directivePropertyName)); if (!hasDecorator) { return childNode; } childNode.modifiers?.forEach(modifier => { if (ts.isDecorator(modifier) && isDirectiveDecorator(modifier, directivePropertyName)) { const options = modifier.expression.arguments[0]; if (ts.isObjectLiteralExpression(options)) { const selector = getTextValueFormLiteralProperty(options, 'selector'); if (selector) { const successors = getTextValueFormArrayLiteralProperty(options, 'successors'); const inputs = getInputs(childNode, typeChecker); const outputs = getOutputs(childNode, typeChecker); const signalDetails = scanSignals(childNode, signals); const signalsOption = createSignalsAssignment(signalDetails); const allInputs = (inputs ?? []) .concat(signalDetails.input ?? []) .concat(signalDetails.formValue ?? []); const allOutputs = (outputs ?? []). concat(signalDetails.output ?? []); registerDirectiveCall({ selector, successors, inputs: allInputs, outputs: allOutputs, }); classes.push({ type: 'directive', name: selector, successors, inputs: allInputs, outputs: allOutputs, views: [], signals: signalDetails }); } } } }); } return childNode; }, context); }); if (classes.length) { moduleManger.add({ path: sourceFile.fileName, classes }); } return sourceFile; }; }; } //# sourceMappingURL=before-directive.js.map