UNPKG

@matatbread/typia

Version:

Superfast runtime validators with only one line

108 lines 6.12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.LlmSchemaTransformer = void 0; const typescript_1 = __importDefault(require("typescript")); const IdentifierFactory_1 = require("../../../factories/IdentifierFactory"); const LiteralFactory_1 = require("../../../factories/LiteralFactory"); const MetadataCollection_1 = require("../../../factories/MetadataCollection"); const MetadataFactory_1 = require("../../../factories/MetadataFactory"); const LlmModelPredicator_1 = require("../../../programmers/llm/LlmModelPredicator"); const LlmSchemaProgrammer_1 = require("../../../programmers/llm/LlmSchemaProgrammer"); const TransformerError_1 = require("../../TransformerError"); var LlmSchemaTransformer; (function (LlmSchemaTransformer) { LlmSchemaTransformer.transform = (props) => { var _a; // GET GENERIC ARGUMENT if (!((_a = props.expression.typeArguments) === null || _a === void 0 ? void 0 : _a.length)) throw new TransformerError_1.TransformerError({ code: "typia.llm.schema", message: "no generic argument.", }); const top = props.expression.typeArguments[0]; if (typescript_1.default.isTypeNode(top) === false) return props.expression; // GET TYPE const model = LlmModelPredicator_1.LlmModelPredicator.getModel({ checker: props.context.checker, method: "schema", node: props.expression.typeArguments[1], }); const config = LlmModelPredicator_1.LlmModelPredicator.getConfig({ context: props.context, method: "schema", model, node: props.expression.typeArguments[2], }); const type = props.context.checker.getTypeFromTypeNode(top); // VALIDATE TYPE const analyze = (validate) => { const result = MetadataFactory_1.MetadataFactory.analyze({ checker: props.context.checker, transformer: props.context.transformer, options: { absorb: validate, constant: true, escape: true, validate: validate === true ? LlmSchemaProgrammer_1.LlmSchemaProgrammer.validate({ model, config, }) : undefined, }, collection: new MetadataCollection_1.MetadataCollection({ replace: MetadataCollection_1.MetadataCollection.replace, }), type, }); if (result.success === false) throw TransformerError_1.TransformerError.from({ code: "typia.llm.schema", errors: result.errors, }); return result.data; }; analyze(true); // GENERATE LLM SCHEMA const out = LlmSchemaProgrammer_1.LlmSchemaProgrammer.write({ model, metadata: analyze(false), config, }); const schemaTypeNode = props.context.importer.type({ file: "@samchon/openapi", name: "ILlmSchema", arguments: [ typescript_1.default.factory.createLiteralTypeNode(typescript_1.default.factory.createStringLiteral(model)), ], }); const literal = typescript_1.default.factory.createAsExpression(LiteralFactory_1.LiteralFactory.write(out.schema), schemaTypeNode); if (Object.keys(out.$defs).length === 0) return literal; return typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createArrowFunction(undefined, undefined, [ IdentifierFactory_1.IdentifierFactory.parameter("props", typescript_1.default.factory.createTypeLiteralNode([ typescript_1.default.factory.createPropertySignature(undefined, typescript_1.default.factory.createIdentifier("$defs"), typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionToken), typescript_1.default.factory.createUnionTypeNode([ typescript_1.default.factory.createTypeReferenceNode("Record", [ typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), schemaTypeNode, ]), typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.UndefinedKeyword), ])), ]), undefined), ], undefined, undefined, typescript_1.default.factory.createBlock([ typescript_1.default.factory.createIfStatement(typescript_1.default.factory.createStrictInequality(typescript_1.default.factory.createIdentifier("undefined"), IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createIdentifier("props"), "$defs", true)), typescript_1.default.factory.createExpressionStatement(typescript_1.default.factory.createCallExpression(typescript_1.default.factory.createIdentifier("Object.assign"), undefined, [ IdentifierFactory_1.IdentifierFactory.access(typescript_1.default.factory.createIdentifier("props"), "$defs"), typescript_1.default.factory.createAsExpression(LiteralFactory_1.LiteralFactory.write(out.$defs), typescript_1.default.factory.createTypeReferenceNode("Record", [ typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword), schemaTypeNode, ])), ]))), typescript_1.default.factory.createReturnStatement(literal), ], true)), undefined, [props.expression.arguments[0]]); }; })(LlmSchemaTransformer || (exports.LlmSchemaTransformer = LlmSchemaTransformer = {})); //# sourceMappingURL=LlmSchemaTransformer.js.map