@boostercloud/metadata-booster
Version:
Emits detailed metadata of your types. You can then get it in runtime to deal with schema-aware operation, like defining GraphQL schemas, ORM operations, etc.
52 lines (51 loc) • 2.86 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts = require("typescript");
const metadata_extractors_1 = require("./metadata-extractors");
const statement_creators_1 = require("./statement-creators");
const transformer = (program) => {
const checker = program.getTypeChecker();
const transformerFactory = (context) => {
const f = context.factory;
const filterInterfaceFunctionName = f.createUniqueName('filterInterface');
return (sourceFile) => {
const importedTypes = {};
function visitor(node) {
var _a, _b;
if (ts.isImportDeclaration(node)) {
// To ensure we import 'reflect-metadata', delete it from the file in case it is already there.
// Later we will add it.
const quotedModuleName = node.moduleSpecifier.getText();
const moduleName = quotedModuleName.replace(/['']/g, '');
if (moduleName == 'reflect-metadata') {
return undefined;
}
const namedBindings = (_a = node.importClause) === null || _a === void 0 ? void 0 : _a.namedBindings;
if (namedBindings && 'elements' in namedBindings) {
const setImportedType = (elem) => (importedTypes[elem.name.getText()] = moduleName);
namedBindings.elements.forEach(setImportedType);
}
}
if (ts.isClassDeclaration(node)) {
const classInfo = (0, metadata_extractors_1.getClassInfo)(node, checker);
if (classInfo) {
const metadataDecorator = (0, statement_creators_1.createClassMetadataDecorator)(f, classInfo, filterInterfaceFunctionName, importedTypes);
const newModifiers = [...((_b = node.modifiers) !== null && _b !== void 0 ? _b : []), metadataDecorator];
return f.updateClassDeclaration(node, newModifiers, node.name, node.typeParameters, node.heritageClauses, node.members);
}
}
return ts.visitEachChild(node, visitor, context);
}
const modifiedSourceFile = ts.visitNode(sourceFile, visitor);
return f.updateSourceFile(modifiedSourceFile, [
f.createImportDeclaration(undefined, undefined, f.createStringLiteral('reflect-metadata')),
...modifiedSourceFile.statements,
(0, statement_creators_1.createFilterInterfaceFunction)(f, filterInterfaceFunctionName),
]);
};
};
return transformerFactory;
};
exports.default = transformer;
tslib_1.__exportStar(require("./metadata-types"), exports);
;