UNPKG

typia

Version:

Superfast runtime validators with only one line

555 lines (522 loc) 26.7 kB
import path from "path"; import ts from "typescript"; import { FunctionalAssertFunctionProgrammer } from "../programmers/functional/FunctionalAssertFunctionProgrammer"; import { FunctionalAssertParametersProgrammer } from "../programmers/functional/FunctionalAssertParametersProgrammer"; import { FunctionAssertReturnProgrammer } from "../programmers/functional/FunctionalAssertReturnProgrammer"; import { FunctionalIsFunctionProgrammer } from "../programmers/functional/FunctionalIsFunctionProgrammer"; import { FunctionalIsParametersProgrammer } from "../programmers/functional/FunctionalIsParametersProgrammer"; import { FunctionalIsReturnProgrammer } from "../programmers/functional/FunctionalIsReturnProgrammer"; import { FunctionalValidateFunctionProgrammer } from "../programmers/functional/FunctionalValidateFunctionProgrammer"; import { FunctionalValidateParametersProgrammer } from "../programmers/functional/FunctionalValidateParametersProgrammer"; import { FunctionalValidateReturnProgrammer } from "../programmers/functional/FunctionalValidateReturnProgrammer"; import { FunctionalGenericTransformer } from "./features/functional/FunctionalGenericTransformer"; import { NamingConvention } from "../utils/NamingConvention"; import { ITransformProps } from "./ITransformProps"; import { ITypiaContext } from "./ITypiaContext"; import { AssertTransformer } from "./features/AssertTransformer"; import { CreateAssertTransformer } from "./features/CreateAssertTransformer"; import { CreateIsTransformer } from "./features/CreateIsTransformer"; import { CreateRandomTransformer } from "./features/CreateRandomTransformer"; import { CreateValidateTransformer } from "./features/CreateValidateTransformer"; import { IsTransformer } from "./features/IsTransformer"; import { RandomTransformer } from "./features/RandomTransformer"; import { ValidateTransformer } from "./features/ValidateTransformer"; import { CreateHttpAssertFormDataTransformer } from "./features/http/CreateHttpAssertFormDataTransformer"; import { CreateHttpAssertHeadersTransformer } from "./features/http/CreateHttpAssertHeadersTransformer"; import { CreateHttpAssertQueryTransformer } from "./features/http/CreateHttpAssertQueryTransformer"; import { CreateHttpFormDataTransformer } from "./features/http/CreateHttpFormDataTransformer"; import { CreateHttpHeadersTransformer } from "./features/http/CreateHttpHeadersTransformer"; import { CreateHttpIsFormDataTransformer } from "./features/http/CreateHttpIsFormDataTransformer"; import { CreateHttpIsHeadersTransformer } from "./features/http/CreateHttpIsHeadersTransformer"; import { CreateHttpIsQueryTransformer } from "./features/http/CreateHttpIsQueryTransformer"; import { CreateHttpParameterTransformer } from "./features/http/CreateHttpParameterTransformer"; import { CreateHttpQueryTransformer } from "./features/http/CreateHttpQueryTransformer"; import { CreateHttpValidateFormDataTransformer } from "./features/http/CreateHttpValidateFormDataTransformer"; import { CreateHttpValidateHeadersTransformer } from "./features/http/CreateHttpValidateHeadersTransformer"; import { CreateHttpValidateQueryTransformer } from "./features/http/CreateHttpValidateQueryTransformer"; import { HttpAssertFormDataTransformer } from "./features/http/HttpAssertFormDataTransformer"; import { HttpAssertHeadersTransformer } from "./features/http/HttpAssertHeadersTransformer"; import { HttpAssertQueryTransformer } from "./features/http/HttpAssertQueryTransformer"; import { HttpFormDataTransformer } from "./features/http/HttpFormDataTransformer"; import { HttpHeadersTransformer } from "./features/http/HttpHeadersTransformer"; import { HttpIsFormDataTransformer } from "./features/http/HttpIsFormDataTransformer"; import { HttpIsHeadersTransformer } from "./features/http/HttpIsHeadersTransformer"; import { HttpIsQueryTransformer } from "./features/http/HttpIsQueryTransformer"; import { HttpParameterTransformer } from "./features/http/HttpParameterTransformer"; import { HttpQueryTransformer } from "./features/http/HttpQueryTransformer"; import { HttpValidateFormDataTransformer } from "./features/http/HttpValidateFormDataTransformer"; import { HttpValidateHeadersTransformer } from "./features/http/HttpValidateHeadersTransformer"; import { HttpValidateQueryTransformer } from "./features/http/HttpValidateQueryTransformer"; // import { JsonApplicationTransformer } from "./features/json/JsonApplicationTransformer"; import { JsonAssertParseTransformer } from "./features/json/JsonAssertParseTransformer"; import { JsonAssertStringifyTransformer } from "./features/json/JsonAssertStringifyTransformer"; import { JsonCreateAssertParseTransformer } from "./features/json/JsonCreateAssertParseTransformer"; import { JsonCreateAssertStringifyTransformer } from "./features/json/JsonCreateAssertStringifyTransformer"; import { JsonCreateIsParseTransformer } from "./features/json/JsonCreateIsParseTransformer"; import { JsonCreateIsStringifyTransformer } from "./features/json/JsonCreateIsStringifyTransformer"; import { JsonCreateStringifyTransformer } from "./features/json/JsonCreateStringifyTransformer"; import { JsonCreateValidateParseTransformer } from "./features/json/JsonCreateValidateParseTransformer"; import { JsonCreateValidateStringifyTransformer } from "./features/json/JsonCreateValidateStringifyProgrammer"; import { JsonIsParseTransformer } from "./features/json/JsonIsParseTransformer"; import { JsonIsStringifyTransformer } from "./features/json/JsonIsStringifyTransformer"; import { JsonSchemaTransformer } from "./features/json/JsonSchemaTransformer"; import { JsonSchemasTransformer } from "./features/json/JsonSchemasTransformer"; import { JsonStringifyTransformer } from "./features/json/JsonStringifyTransformer"; import { JsonValidateParseTransformer } from "./features/json/JsonValidateParseTransformer"; import { JsonValidateStringifyTransformer } from "./features/json/JsonValidateStringifyTransformer"; import { LlmApplicationTransformer } from "./features/llm/LlmApplicationTransformer"; import { LlmControllerTransformer } from "./features/llm/LlmControllerTransformer"; import { LlmParametersTransformer } from "./features/llm/LlmParametersTransformer"; import { LlmSchemaTransformer } from "./features/llm/LlmSchemaTransformer"; import { MiscAssertCloneTransformer } from "./features/misc/MiscAssertCloneTransformer"; import { MiscAssertPruneTransformer } from "./features/misc/MiscAssertPruneTransformer"; import { MiscCloneTransformer } from "./features/misc/MiscCloneTransformer"; import { MiscCreateAssertCloneTransformer } from "./features/misc/MiscCreateAssertCloneTransformer"; import { MiscCreateAssertPruneTransformer } from "./features/misc/MiscCreateAssertPruneTransformer"; import { MiscCreateCloneTransformer } from "./features/misc/MiscCreateCloneTransformer"; import { MiscCreateIsCloneTransformer } from "./features/misc/MiscCreateIsCloneTransformer"; import { MiscCreateIsPruneTransformer } from "./features/misc/MiscCreateIsPruneTransformer"; import { MiscCreatePruneTransformer } from "./features/misc/MiscCreatePruneTransformer"; import { MiscCreateValidateCloneTransformer } from "./features/misc/MiscCreateValidateCloneTransformer"; import { MiscCreateValidatePruneTransformer } from "./features/misc/MiscCreateValidatePruneTransformer"; import { MiscIsCloneTransformer } from "./features/misc/MiscIsCloneTransformer"; import { MiscIsPruneTransformer } from "./features/misc/MiscIsPruneTransformer"; import { MiscLiteralsTransformer } from "./features/misc/MiscLiteralsTransformer"; import { MiscPruneTransformer } from "./features/misc/MiscPruneTransformer"; import { MiscValidateCloneTransformer } from "./features/misc/MiscValidateCloneTransformer"; import { MiscValidatePruneTransformer } from "./features/misc/MiscValidatePruneTransformer"; import { NotationAssertGeneralTransformer } from "./features/notations/NotationAssertGeneralTransformer"; import { NotationCreateAssertGeneralTransformer } from "./features/notations/NotationCreateAssertGeneralTransformer"; import { NotationCreateGeneralTransformer } from "./features/notations/NotationCreateGeneralTransformer"; import { NotationCreateIsGeneralTransformer } from "./features/notations/NotationCreateIsGeneralTransformer"; import { NotationCreateValidateGeneralTransformer } from "./features/notations/NotationCreateValidateGeneralTransformer"; import { NotationGeneralTransformer } from "./features/notations/NotationGeneralTransformer"; import { NotationIsGeneralTransformer } from "./features/notations/NotationIsGeneralTransformer"; import { NotationValidateGeneralTransformer } from "./features/notations/NotationValidateGeneralTransformer"; import { ProtobufAssertDecodeTransformer } from "./features/protobuf/ProtobufAssertDecodeTransformer"; import { ProtobufAssertEncodeTransformer } from "./features/protobuf/ProtobufAssertEncodeTransformer"; import { ProtobufCreateAssertDecodeTransformer } from "./features/protobuf/ProtobufCreateAssertDecodeTransformer"; import { ProtobufCreateAssertEncodeTransformer } from "./features/protobuf/ProtobufCreateAssertEncodeTransformer"; import { ProtobufCreateDecodeTransformer } from "./features/protobuf/ProtobufCreateDecodeTransformer"; import { ProtobufCreateEncodeTransformer } from "./features/protobuf/ProtobufCreateEncodeTransformer"; import { ProtobufCreateIsDecodeTransformer } from "./features/protobuf/ProtobufCreateIsDecodeTransformer"; import { ProtobufCreateIsEncodeTransformer } from "./features/protobuf/ProtobufCreateIsEncodeTransformer"; import { ProtobufCreateValidateDecodeTransformer } from "./features/protobuf/ProtobufCreateValidateDecodeTransformer"; import { ProtobufCreateValidateEncodeTransformer } from "./features/protobuf/ProtobufCreateValidateEncodeTransformer"; import { ProtobufDecodeTransformer } from "./features/protobuf/ProtobufDecodeTransformer"; import { ProtobufEncodeTransformer } from "./features/protobuf/ProtobufEncodeTransformer"; import { ProtobufIsDecodeTransformer } from "./features/protobuf/ProtobufIsDecodeTransformer"; import { ProtobufIsEncodeTransformer } from "./features/protobuf/ProtobufIsEncodeTransformer"; import { ProtobufMessageTransformer } from "./features/protobuf/ProtobufMessageTransformer"; import { ProtobufValidateDecodeTransformer } from "./features/protobuf/ProtobufValidateDecodeTransformer"; import { ProtobufValidateEncodeTransformer } from "./features/protobuf/ProtobufValidateEncodeTransformer"; import { ReflectMetadataTransformer } from "./features/reflect/ReflectMetadataTransformer"; import { ReflectNameTransformer } from "./features/reflect/ReflectNameTransformer"; export namespace CallExpressionTransformer { export const transform = (props: { context: ITypiaContext; expression: ts.CallExpression; }): ts.Expression | null => { //---- // VALIDATIONS //---- // SIGNATURE DECLARATION const declaration: ts.Declaration | undefined = props.context.checker.getResolvedSignature(props.expression)?.declaration; if (!declaration) return props.expression; // FILE PATH const location: string = path.resolve(declaration.getSourceFile().fileName); if (isTarget(location) === false) return props.expression; //---- // TRANSFORMATION //---- // FUNCTION NAME const module: string = location.split(path.sep).at(-1)!.split(".")[0]!; const { name } = props.context.checker.getTypeAtLocation(declaration).symbol; // FIND TRANSFORMER const functor: (() => Task) | undefined = FUNCTORS[module]?.[name]; if (functor === undefined) return props.expression; // RETURNS WITH TRANSFORMATION const result: ts.Expression | null = functor()({ context: props.context, modulo: props.expression.expression, expression: props.expression, }); return result ?? props.expression; }; const isTarget = (location: string): boolean => { const files: string[] = Object.keys(FUNCTORS); return files.some((f) => location.includes(path.join("typia", "lib", `${f}.d.ts`)), ); }; } type Task = (props: ITransformProps) => ts.Expression | null; const FUNCTORS: Record<string, Record<string, () => Task>> = { module: { // BASIC assert: () => AssertTransformer.transform({ equals: false, guard: false }), assertGuard: () => AssertTransformer.transform({ equals: false, guard: true }), assertType: () => AssertTransformer.transform({ equals: false, guard: false }), is: () => IsTransformer.transform({ equals: false }), validate: () => ValidateTransformer.transform({ equals: false }), // STRICT assertEquals: () => AssertTransformer.transform({ equals: true, guard: false }), assertGuardEquals: () => AssertTransformer.transform({ equals: true, guard: true }), equals: () => IsTransformer.transform({ equals: true }), validateEquals: () => ValidateTransformer.transform({ equals: true }), // RANDOM + INTERNAL random: () => RandomTransformer.transform, metadata: () => ReflectMetadataTransformer.transform, // FACTORIES createAssert: () => CreateAssertTransformer.transform({ equals: false, guard: false }), createAssertGuard: () => CreateAssertTransformer.transform({ equals: false, guard: true }), createAssertType: () => CreateAssertTransformer.transform({ equals: false, guard: false }), createIs: () => CreateIsTransformer.transform({ equals: false }), createValidate: () => CreateValidateTransformer.transform({ equals: false, standardSchema: true, }), createAssertEquals: () => CreateAssertTransformer.transform({ equals: true, guard: false }), createAssertGuardEquals: () => CreateAssertTransformer.transform({ equals: true, guard: true }), createEquals: () => CreateIsTransformer.transform({ equals: true }), createValidateEquals: () => CreateValidateTransformer.transform({ equals: true, standardSchema: true, }), createRandom: () => CreateRandomTransformer.transform, }, functional: { // ASSERTIONS assertFunction: () => FunctionalGenericTransformer.transform({ method: "assertFunction", config: { equals: false, }, programmer: FunctionalAssertFunctionProgrammer.write, }), assertParameters: () => FunctionalGenericTransformer.transform({ method: "assertParameters", config: { equals: false, }, programmer: FunctionalAssertParametersProgrammer.write, }), assertReturn: () => FunctionalGenericTransformer.transform({ method: "assertReturn", config: { equals: false, }, programmer: FunctionAssertReturnProgrammer.write, }), assertEqualsFunction: () => FunctionalGenericTransformer.transform({ method: "assertEqualsFunction", config: { equals: true, }, programmer: FunctionalAssertFunctionProgrammer.write, }), assertEqualsParameters: () => FunctionalGenericTransformer.transform({ method: "assertEqualsParameters", config: { equals: true, }, programmer: FunctionalAssertParametersProgrammer.write, }), assertEqualsReturn: () => FunctionalGenericTransformer.transform({ method: "assertEqualsReturn", config: { equals: true, }, programmer: FunctionAssertReturnProgrammer.write, }), // IS isFunction: () => FunctionalGenericTransformer.transform({ method: "isFunction", config: { equals: false, }, programmer: FunctionalIsFunctionProgrammer.write, }), isParameters: () => FunctionalGenericTransformer.transform({ method: "isParameters", config: { equals: false, }, programmer: FunctionalIsParametersProgrammer.write, }), isReturn: () => FunctionalGenericTransformer.transform({ method: "isReturn", config: { equals: false, }, programmer: FunctionalIsReturnProgrammer.write, }), equalsFunction: () => FunctionalGenericTransformer.transform({ method: "equalsFunction", config: { equals: true, }, programmer: FunctionalIsFunctionProgrammer.write, }), equalsParameters: () => FunctionalGenericTransformer.transform({ method: "equalsParameters", config: { equals: true, }, programmer: FunctionalIsParametersProgrammer.write, }), equalsReturn: () => FunctionalGenericTransformer.transform({ method: "equalsReturn", config: { equals: true, }, programmer: FunctionalIsReturnProgrammer.write, }), // VALIDATIONS validateFunction: () => FunctionalGenericTransformer.transform({ method: "validateFunction", config: { equals: false, }, programmer: FunctionalValidateFunctionProgrammer.write, }), validateParameters: () => FunctionalGenericTransformer.transform({ method: "validateParameters", config: { equals: false, }, programmer: FunctionalValidateParametersProgrammer.write, }), validateReturn: () => FunctionalGenericTransformer.transform({ method: "validateReturn", config: { equals: false, }, programmer: FunctionalValidateReturnProgrammer.write, }), validateEqualsFunction: () => FunctionalGenericTransformer.transform({ method: "validateEqualsFunction", config: { equals: true, }, programmer: FunctionalValidateFunctionProgrammer.write, }), validateEqualsParameters: () => FunctionalGenericTransformer.transform({ method: "validateEqualsParameters", config: { equals: true, }, programmer: FunctionalValidateParametersProgrammer.write, }), validateEqualsReturn: () => FunctionalGenericTransformer.transform({ method: "validateEqualsReturn", config: { equals: true, }, programmer: FunctionalValidateReturnProgrammer.write, }), }, http: { // FORM-DATA formData: () => HttpFormDataTransformer.transform, isFormData: () => HttpIsFormDataTransformer.transform, assertFormData: () => HttpAssertFormDataTransformer.transform, validateFormData: () => HttpValidateFormDataTransformer.transform, // HEADERS headers: () => HttpHeadersTransformer.transform, isHeaders: () => HttpIsHeadersTransformer.transform, assertHeaders: () => HttpAssertHeadersTransformer.transform, validateHeaders: () => HttpValidateHeadersTransformer.transform, // PARAMETER parameter: () => HttpParameterTransformer.transform, // QUERY query: () => HttpQueryTransformer.transform, isQuery: () => HttpIsQueryTransformer.transform, assertQuery: () => HttpAssertQueryTransformer.transform, validateQuery: () => HttpValidateQueryTransformer.transform, // FACTORIES createFormData: () => CreateHttpFormDataTransformer.transform, createIsFormData: () => CreateHttpIsFormDataTransformer.transform, createAssertFormData: () => CreateHttpAssertFormDataTransformer.transform, createValidateFormData: () => CreateHttpValidateFormDataTransformer.transform, createHeaders: () => CreateHttpHeadersTransformer.transform, createIsHeaders: () => CreateHttpIsHeadersTransformer.transform, createAssertHeaders: () => CreateHttpAssertHeadersTransformer.transform, createValidateHeaders: () => CreateHttpValidateHeadersTransformer.transform, createParameter: () => CreateHttpParameterTransformer.transform, createQuery: () => CreateHttpQueryTransformer.transform, createIsQuery: () => CreateHttpIsQueryTransformer.transform, createAssertQuery: () => CreateHttpAssertQueryTransformer.transform, createValidateQuery: () => CreateHttpValidateQueryTransformer.transform, }, llm: { controller: () => LlmControllerTransformer.transform, applicationOfValidate: () => LlmApplicationTransformer.transform, application: () => LlmApplicationTransformer.transform, parameters: () => LlmParametersTransformer.transform, schema: () => LlmSchemaTransformer.transform, }, json: { // METADATA schemas: () => JsonSchemasTransformer.transform, schema: () => JsonSchemaTransformer.transform, // PARSER isParse: () => JsonIsParseTransformer.transform, assertParse: () => JsonAssertParseTransformer.transform, validateParse: () => JsonValidateParseTransformer.transform, // STRINGIFY stringify: () => JsonStringifyTransformer.transform, assertStringify: () => JsonAssertStringifyTransformer.transform, isStringify: () => JsonIsStringifyTransformer.transform, validateStringify: () => JsonValidateStringifyTransformer.transform, // FACTORIES createIsParse: () => JsonCreateIsParseTransformer.transform, createAssertParse: () => JsonCreateAssertParseTransformer.transform, createValidateParse: () => JsonCreateValidateParseTransformer.transform, createStringify: () => JsonCreateStringifyTransformer.transform, createAssertStringify: () => JsonCreateAssertStringifyTransformer.transform, createIsStringify: () => JsonCreateIsStringifyTransformer.transform, createValidateStringify: () => JsonCreateValidateStringifyTransformer.transform, }, protobuf: { // SCHEMA message: () => ProtobufMessageTransformer.transform, // ENCODE encode: () => ProtobufEncodeTransformer.transform, assertEncode: () => ProtobufAssertEncodeTransformer.transform, isEncode: () => ProtobufIsEncodeTransformer.transform, validateEncode: () => ProtobufValidateEncodeTransformer.transform, // DECODE decode: () => ProtobufDecodeTransformer.transform, assertDecode: () => ProtobufAssertDecodeTransformer.transform, isDecode: () => ProtobufIsDecodeTransformer.transform, validateDecode: () => ProtobufValidateDecodeTransformer.transform, // FACTORIES createEncode: () => ProtobufCreateEncodeTransformer.transform, createAssertEncode: () => ProtobufCreateAssertEncodeTransformer.transform, createIsEncode: () => ProtobufCreateIsEncodeTransformer.transform, createValidateEncode: () => ProtobufCreateValidateEncodeTransformer.transform, createDecode: () => ProtobufCreateDecodeTransformer.transform, createAssertDecode: () => ProtobufCreateAssertDecodeTransformer.transform, createIsDecode: () => ProtobufCreateIsDecodeTransformer.transform, createValidateDecode: () => ProtobufCreateValidateDecodeTransformer.transform, }, reflect: { metadata: () => ReflectMetadataTransformer.transform, name: () => ReflectNameTransformer.transform, }, misc: { literals: () => MiscLiteralsTransformer.transform, // CLONE clone: () => MiscCloneTransformer.transform, assertClone: () => MiscAssertCloneTransformer.transform, isClone: () => MiscIsCloneTransformer.transform, validateClone: () => MiscValidateCloneTransformer.transform, // PRUNE prune: () => MiscPruneTransformer.transform, assertPrune: () => MiscAssertPruneTransformer.transform, isPrune: () => MiscIsPruneTransformer.transform, validatePrune: () => MiscValidatePruneTransformer.transform, // FACTORIES createClone: () => MiscCreateCloneTransformer.transform, createAssertClone: () => MiscCreateAssertCloneTransformer.transform, createIsClone: () => MiscCreateIsCloneTransformer.transform, createValidateClone: () => MiscCreateValidateCloneTransformer.transform, createPrune: () => MiscCreatePruneTransformer.transform, createAssertPrune: () => MiscCreateAssertPruneTransformer.transform, createIsPrune: () => MiscCreateIsPruneTransformer.transform, createValidatePrune: () => MiscCreateValidatePruneTransformer.transform, }, notations: { // CAMEL camel: () => NotationGeneralTransformer.transform(NamingConvention.camel), assertCamel: () => NotationAssertGeneralTransformer.transform(NamingConvention.camel), isCamel: () => NotationIsGeneralTransformer.transform(NamingConvention.camel), validateCamel: () => NotationValidateGeneralTransformer.transform(NamingConvention.camel), // PASCAL pascal: () => NotationGeneralTransformer.transform(NamingConvention.pascal), assertPascal: () => NotationAssertGeneralTransformer.transform(NamingConvention.pascal), isPascal: () => NotationIsGeneralTransformer.transform(NamingConvention.pascal), validatePascal: () => NotationValidateGeneralTransformer.transform(NamingConvention.pascal), // SNAKE snake: () => NotationGeneralTransformer.transform(NamingConvention.snake), assertSnake: () => NotationAssertGeneralTransformer.transform(NamingConvention.snake), isSnake: () => NotationIsGeneralTransformer.transform(NamingConvention.snake), validateSnake: () => NotationValidateGeneralTransformer.transform(NamingConvention.snake), // FACTORIES createCamel: () => NotationCreateGeneralTransformer.transform(NamingConvention.camel), createAssertCamel: () => NotationCreateAssertGeneralTransformer.transform(NamingConvention.camel), createIsCamel: () => NotationCreateIsGeneralTransformer.transform(NamingConvention.camel), createValidateCamel: () => NotationCreateValidateGeneralTransformer.transform( NamingConvention.camel, ), createPascal: () => NotationCreateGeneralTransformer.transform(NamingConvention.pascal), createAssertPascal: () => NotationCreateAssertGeneralTransformer.transform(NamingConvention.pascal), createIsPascal: () => NotationCreateIsGeneralTransformer.transform(NamingConvention.pascal), createValidatePascal: () => NotationCreateValidateGeneralTransformer.transform( NamingConvention.pascal, ), createSnake: () => NotationCreateGeneralTransformer.transform(NamingConvention.snake), createAssertSnake: () => NotationCreateAssertGeneralTransformer.transform(NamingConvention.snake), createIsSnake: () => NotationCreateIsGeneralTransformer.transform(NamingConvention.snake), createValidateSnake: () => NotationCreateValidateGeneralTransformer.transform( NamingConvention.snake, ), }, };