UNPKG

@nestia/core

Version:

Super-fast validation decorators of NestJS

80 lines 3.42 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FileTransformer = void 0; const typescript_1 = __importDefault(require("typescript")); const ImportProgrammer_1 = require("typia/lib/programmers/ImportProgrammer"); const NodeTransformer_1 = require("./NodeTransformer"); var FileTransformer; (function (FileTransformer) { FileTransformer.transform = (context) => (transformer) => (file) => { if (file.isDeclarationFile) return file; const importer = new ImportProgrammer_1.ImportProgrammer({ internalPrefix: "nestia_core_transform", }); file = typescript_1.default.visitEachChild(file, (node) => iterate_node({ context: Object.assign(Object.assign({}, context), { transformer, importer }), file, node, }), transformer); const index = find_import_injection_index(file); return typescript_1.default.factory.updateSourceFile(file, [ ...file.statements.slice(0, index), ...importer.toStatements(), ...file.statements.slice(index), ], false, file.referencedFiles, file.typeReferenceDirectives, file.hasNoDefaultLib, file.libReferenceDirectives); }; const iterate_node = (props) => { var _a; return typescript_1.default.visitEachChild((_a = try_transform_node(props)) !== null && _a !== void 0 ? _a : props.node, (child) => iterate_node({ context: props.context, file: props.file, node: child, }), props.context.transformer); }; const try_transform_node = (props) => { var _a; var _b; try { return NodeTransformer_1.NodeTransformer.transform(props); } catch (exp) { // ONLY ACCEPT TRANSFORMER-ERROR if (!isTransformerError(exp)) throw exp; // AVOID SPECIAL BUG OF TYPESCRIPT COMPILER API (_a = (_b = props.node).parent) !== null && _a !== void 0 ? _a : (_b.parent = props.file); // REPORT DIAGNOSTIC const diagnostic = typescript_1.default.createDiagnosticForNode(props.node, { key: exp.code, category: typescript_1.default.DiagnosticCategory.Error, message: exp.message, code: `(${exp.code})`, }); props.context.extras.addDiagnostic(diagnostic); return null; } }; const find_import_injection_index = (file) => { let i = 0; for (; i < file.statements.length; ++i) { const stmt = file.statements[i]; if (typescript_1.default.isExpressionStatement(stmt) && typescript_1.default.isStringLiteralLike(stmt.expression) && stmt.expression.text.startsWith("use ")) continue; break; } return i; }; })(FileTransformer || (exports.FileTransformer = FileTransformer = {})); const isTransformerError = (error) => typeof error === "object" && error !== null && error.constructor.name === "TransformerError" && typeof error.code === "string" && typeof error.message === "string"; //# sourceMappingURL=FileTransformer.js.map