UNPKG

@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
"use strict"; 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);