UNPKG

@sontrx/typia

Version:

Superfast runtime validators with only one line

105 lines (96 loc) 3.47 kB
import { ILlmApplication, ILlmSchema } from "@samchon/openapi"; import ts from "typescript"; import { TypeFactory } from "../../factories/TypeFactory"; import { ILlmApplicationOfValidate } from "../../schemas/llm/ILlmApplicationOfValidate"; import { Metadata } from "../../schemas/metadata/Metadata"; import { MetadataParameter } from "../../schemas/metadata/MetadataParameter"; import { ITypiaContext } from "../../transformers/ITypiaContext"; import { IValidation } from "../../IValidation"; import { ValidateProgrammer } from "../ValidateProgrammer"; import { LlmApplicationProgrammer } from "./LlmApplicationProgrammer"; export namespace LlmApplicationOfValidateProgrammer { export const validate = <Model extends ILlmSchema.Model>(props: { model: Model; config?: Partial<ILlmSchema.ModelConfig[Model]>; }) => LlmApplicationProgrammer.validate(props); export const write = <Model extends ILlmSchema.Model>(props: { context: ITypiaContext; modulo: ts.LeftHandSideExpression; model: Model; metadata: Metadata; config?: Partial<ILlmSchema.ModelConfig[Model]>; name?: string; }): ILlmApplicationOfValidate<Model> => { const app: ILlmApplication<Model> = LlmApplicationProgrammer.write(props); const parameters: Record<string, MetadataParameter> = Object.fromEntries( props.metadata.objects[0]!.type.properties.filter( (p) => p.key.isSoleLiteral() && p.value.size() === 1 && p.value.nullable === false && p.value.isRequired() === true && p.value.functions.length === 1, ) .filter( (p) => p.jsDocTags.find( (tag) => tag.name === "hidden" || tag.name === "internal", ) === undefined, ) .map((p) => [ p.key.getSoleLiteral()!, p.value.functions[0]!.parameters[0]!, ]), ); return { ...app, functions: app.functions.map((func) => ({ ...func, validate: writeValidadtor({ context: props.context, modulo: props.modulo, className: props.name, name: func.name, parameter: parameters[func.name] ?? null, }), })), }; }; const writeValidadtor = (props: { context: ITypiaContext; modulo: ts.LeftHandSideExpression; parameter: MetadataParameter | null; name: string; className?: string; }): ((props: object) => IValidation<unknown>) => { if (props.parameter === null) return ValidateProgrammer.write({ ...props, type: props.context.checker.getTypeFromTypeNode( TypeFactory.keyword("any"), ), config: { equals: false, }, name: undefined, }) as any; const type = props.parameter.tsType; if (type === undefined) // unreachable throw new Error( "Failed to write LLM application's function validator. You don't have to call `LlmApplicationOfValidator.write()` function by yourself, but only by the `typia.llm.applicationOfValidate()` function.", ); return ValidateProgrammer.write({ ...props, type: props.parameter.tsType!, config: { equals: false, }, name: props.className ? `Parameters<${props.className}[${JSON.stringify(props.name)}]>[0]` : undefined, }) satisfies ts.CallExpression as any as ( props: object, ) => IValidation<unknown>; }; }