@ibyar/cli
Version:
The Ibyar/Aurora CLI tool
102 lines • 5.6 kB
JavaScript
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