diff --git a/src/programmers/AssertProgrammer.ts b/src/programmers/AssertProgrammer.ts index 0c32e87a87..14034d3c72 100644 --- a/src/programmers/AssertProgrammer.ts +++ b/src/programmers/AssertProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../factories/IdentifierFactory"; import { StatementFactory } from "../factories/StatementFactory"; import { TypeFactory } from "../factories/TypeFactory"; -import { IProject } from "../transformers/IProject"; +import { IProgrammerProps } from "../transformers/IProgrammerProps"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { CheckerProgrammer } from "./CheckerProgrammer"; import { FeatureProgrammer } from "./FeatureProgrammer"; @@ -14,24 +15,34 @@ import { OptionPredicator } from "./helpers/OptionPredicator"; import { check_object } from "./internal/check_object"; export namespace AssertProgrammer { - export const decompose = (props: { - project: IProject; + export interface IConfig { equals: boolean; guard: boolean; + } + export interface IProps extends IProgrammerProps { + config: IConfig; + } + + export const decompose = (props: { + context: ITypiaContext; + config: IConfig; importer: FunctionImporter; type: ts.Type; name: string | undefined; - init: ts.Expression | undefined; + init?: ts.Expression | undefined; }): FeatureProgrammer.IDecomposed => { - const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose(props); + const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ + ...props, + equals: props.config.equals, + }); const composed: FeatureProgrammer.IComposed = CheckerProgrammer.compose({ ...props, config: { prefix: "$a", path: true, trace: true, - numeric: OptionPredicator.numeric(props.project.options), - equals: props.equals, + numeric: OptionPredicator.numeric(props.context.options), + equals: props.config.equals, atomist: (explore) => (entry) => (input) => [ ...(entry.expression ? [entry.expression] : []), @@ -83,8 +94,8 @@ export namespace AssertProgrammer { ), ]), ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)), - combiner: combiner(props.equals)(props.project)(props.importer), - joiner: joiner(props.equals)(props.project)(props.importer), + combiner: combiner(props.config.equals)(props.context)(props.importer), + joiner: joiner(props.config.equals)(props.context)(props.importer), success: ts.factory.createTrue(), }, }); @@ -95,18 +106,18 @@ export namespace AssertProgrammer { IdentifierFactory.parameter("input", TypeFactory.keyword("any")), Guardian.parameter(props.init), ], - props.guard + props.config.guard ? ts.factory.createTypePredicateNode( ts.factory.createToken(ts.SyntaxKind.AssertsKeyword), ts.factory.createIdentifier("input"), ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ) : ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), undefined, ts.factory.createBlock( @@ -152,7 +163,7 @@ export namespace AssertProgrammer { ), undefined, ), - ...(props.guard === false + ...(props.config.guard === false ? [ ts.factory.createReturnStatement( ts.factory.createIdentifier(`input`), @@ -179,31 +190,24 @@ export namespace AssertProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (props: boolean | { equals: boolean; guard: boolean }) => - (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { - if (typeof props === "boolean") props = { equals: props, guard: false }; - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - ...props, - project, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; const combiner = (equals: boolean) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner => (explore: CheckerProgrammer.IExplore) => { if (explore.tracable === false) @@ -268,7 +272,9 @@ export namespace AssertProgrammer { }; const assert_object = - (equals: boolean) => (project: IProject) => (importer: FunctionImporter) => + (equals: boolean) => + (project: ITypiaContext) => + (importer: FunctionImporter) => check_object({ equals, assert: true, @@ -298,7 +304,7 @@ export namespace AssertProgrammer { const joiner = (equals: boolean) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({ object: assert_object(equals)(project)(importer), array: (input, arrow) => diff --git a/src/programmers/CheckerProgrammer.ts b/src/programmers/CheckerProgrammer.ts index df1a9af508..7ad1d1d57b 100644 --- a/src/programmers/CheckerProgrammer.ts +++ b/src/programmers/CheckerProgrammer.ts @@ -15,7 +15,7 @@ import { MetadataObject } from "../schemas/metadata/MetadataObject"; import { MetadataTuple } from "../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType"; -import { IProject } from "../transformers/IProject"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { TransformerError } from "../transformers/TransformerError"; import { FeatureProgrammer } from "./FeatureProgrammer"; @@ -98,7 +98,7 @@ export namespace CheckerProgrammer { WRITERS ----------------------------------------------------------- */ export const compose = (props: { - project: IProject; + context: ITypiaContext; config: IConfig; importer: FunctionImporter; type: ts.Type; @@ -106,29 +106,35 @@ export namespace CheckerProgrammer { }) => FeatureProgrammer.compose({ ...props, - config: configure(props.project)(props.config)(props.importer), + config: configure(props.context)(props.config)(props.importer), }); export const write = - (project: IProject) => (config: IConfig) => (importer: FunctionImporter) => + (project: ITypiaContext) => + (config: IConfig) => + (importer: FunctionImporter) => FeatureProgrammer.write(project)(configure(project)(config)(importer))( importer, ); export const write_object_functions = - (project: IProject) => (config: IConfig) => (importer: FunctionImporter) => + (project: ITypiaContext) => + (config: IConfig) => + (importer: FunctionImporter) => FeatureProgrammer.write_object_functions( configure(project)(config)(importer), )(importer); export const write_union_functions = - (project: IProject) => (config: IConfig) => (importer: FunctionImporter) => + (project: ITypiaContext) => + (config: IConfig) => + (importer: FunctionImporter) => FeatureProgrammer.write_union_functions( configure(project)({ ...config, numeric: false })(importer), ); export const write_array_functions = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -164,7 +170,7 @@ export namespace CheckerProgrammer { ); export const write_tuple_functions = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -197,7 +203,7 @@ export namespace CheckerProgrammer { ); const configure = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter): FeatureProgrammer.IConfig => ({ types: { @@ -218,7 +224,7 @@ export namespace CheckerProgrammer { const collection: MetadataCollection = new MetadataCollection(); const result = MetadataFactory.analyze( project.checker, - project.context, + project.transformer, )({ escape: false, constant: true, @@ -289,7 +295,7 @@ export namespace CheckerProgrammer { * @internal */ export const decode = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -669,7 +675,7 @@ export namespace CheckerProgrammer { }; const decode_array = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => (input: ts.Expression, array: MetadataArray, explore: IExplore) => { @@ -702,7 +708,7 @@ export namespace CheckerProgrammer { }; const decode_array_inline = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -726,7 +732,7 @@ export namespace CheckerProgrammer { }; const decode_tuple = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -761,7 +767,7 @@ export namespace CheckerProgrammer { }; const decode_tuple_inline = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -862,7 +868,7 @@ export namespace CheckerProgrammer { }; const decode_escaped = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => (input: ts.Expression, meta: Metadata, explore: IExplore): ts.Expression => @@ -895,7 +901,7 @@ export namespace CheckerProgrammer { UNION TYPE EXPLORERS ----------------------------------------------------------- */ const explore_sets = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -919,7 +925,7 @@ export namespace CheckerProgrammer { ); const explore_maps = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -963,7 +969,7 @@ export namespace CheckerProgrammer { ); const explore_tuples = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -985,7 +991,7 @@ export namespace CheckerProgrammer { )(input, tuples, explore); const explore_arrays = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( @@ -1007,7 +1013,7 @@ export namespace CheckerProgrammer { )(input, arrays, explore); const explore_arrays_and_tuples = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => ( diff --git a/src/programmers/FeatureProgrammer.ts b/src/programmers/FeatureProgrammer.ts index a840d1fb65..240fda5de5 100644 --- a/src/programmers/FeatureProgrammer.ts +++ b/src/programmers/FeatureProgrammer.ts @@ -10,7 +10,7 @@ import { Metadata } from "../schemas/metadata/Metadata"; import { MetadataArray } from "../schemas/metadata/MetadataArray"; import { MetadataObject } from "../schemas/metadata/MetadataObject"; -import { IProject } from "../transformers/IProject"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { CheckerProgrammer } from "./CheckerProgrammer"; import { FunctionImporter } from "./helpers/FunctionImporter"; @@ -46,7 +46,7 @@ export namespace FeatureProgrammer { * Initializer of metadata. */ initializer: ( - project: IProject, + project: ITypiaContext, ) => ( importer: FunctionImporter, ) => (type: ts.Type) => [MetadataCollection, Metadata]; @@ -212,13 +212,13 @@ export namespace FeatureProgrammer { } export const compose = (props: { - project: IProject; + context: ITypiaContext; config: IConfig; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): IComposed => { - const [collection, meta] = props.config.initializer(props.project)( + const [collection, meta] = props.config.initializer(props.context)( props.importer, )(props.type); return { @@ -288,7 +288,7 @@ export namespace FeatureProgrammer { ); export const write = - (project: IProject) => + (project: ITypiaContext) => (config: IConfig) => (importer: FunctionImporter) => (type: ts.Type, name?: string): ts.ArrowFunction => { diff --git a/src/programmers/IsProgrammer.ts b/src/programmers/IsProgrammer.ts index ec8c3a5a9a..1fb8563c03 100644 --- a/src/programmers/IsProgrammer.ts +++ b/src/programmers/IsProgrammer.ts @@ -5,7 +5,8 @@ import { IdentifierFactory } from "../factories/IdentifierFactory"; import { MetadataCollection } from "../factories/MetadataCollection"; import { ValueFactory } from "../factories/ValueFactory"; -import { IProject } from "../transformers/IProject"; +import { IProgrammerProps } from "../transformers/IProgrammerProps"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { CheckerProgrammer } from "./CheckerProgrammer"; import { FeatureProgrammer } from "./FeatureProgrammer"; @@ -17,7 +18,7 @@ import { check_object } from "./internal/check_object"; export namespace IsProgrammer { export const configure = (options?: Partial) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): CheckerProgrammer.IConfig => ({ prefix: "$i", equals: !!options?.object, @@ -96,10 +97,17 @@ export namespace IsProgrammer { /* ----------------------------------------------------------- WRITERS ----------------------------------------------------------- */ + export interface IConfig { + equals: boolean; + } + export interface IProps extends IProgrammerProps { + config: IConfig; + } + export const decompose = (props: { - project: IProject; + context: ITypiaContext; importer: FunctionImporter; - equals: boolean; + config: IConfig; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { @@ -107,16 +115,16 @@ export namespace IsProgrammer { const config: CheckerProgrammer.IConfig = { ...configure({ object: check_object({ - equals: props.equals, - undefined: OptionPredicator.undefined(props.project.options), + equals: props.config.equals, + undefined: OptionPredicator.undefined(props.context.options), assert: true, reduce: ts.factory.createLogicalAnd, positive: ts.factory.createTrue(), superfluous: () => ts.factory.createFalse(), - })(props.project)(props.importer), - numeric: OptionPredicator.numeric(props.project.options), - })(props.project)(props.importer), - trace: props.equals, + })(props.context)(props.importer), + numeric: OptionPredicator.numeric(props.context.options), + })(props.context)(props.importer), + trace: props.config.equals, }; // COMPOSITION @@ -138,28 +146,26 @@ export namespace IsProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (equals: boolean) => - (type: ts.Type, name?: string) => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - equals, - project, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProps) => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + config: props.config, + context: props.context, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; export const write_function_statements = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (collection: MetadataCollection) => { const config = configure()(project)(importer); @@ -191,11 +197,14 @@ export namespace IsProgrammer { /* ----------------------------------------------------------- DECODERS ----------------------------------------------------------- */ - export const decode = (project: IProject) => (importer: FunctionImporter) => - CheckerProgrammer.decode(project)(configure()(project)(importer))(importer); + export const decode = + (project: ITypiaContext) => (importer: FunctionImporter) => + CheckerProgrammer.decode(project)(configure()(project)(importer))( + importer, + ); export const decode_object = - (project: IProject) => (importer: FunctionImporter) => + (project: ITypiaContext) => (importer: FunctionImporter) => CheckerProgrammer.decode_object(configure()(project)(importer))(importer); export const decode_to_json = diff --git a/src/programmers/RandomProgrammer.ts b/src/programmers/RandomProgrammer.ts index ef04f49b0d..dbf56d779b 100644 --- a/src/programmers/RandomProgrammer.ts +++ b/src/programmers/RandomProgrammer.ts @@ -17,7 +17,7 @@ import { MetadataTemplate } from "../schemas/metadata/MetadataTemplate"; import { MetadataTuple } from "../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType"; -import { IProject } from "../transformers/IProject"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { TransformerError } from "../transformers/TransformerError"; import { Escaper } from "../utils/Escaper"; @@ -30,17 +30,28 @@ import { RandomRanger } from "./helpers/RandomRanger"; import { random_custom } from "./internal/random_custom"; export namespace RandomProgrammer { - export const decompose = (props: { - project: IProject; + export interface IProps { + context: ITypiaContext; + modulo: ts.LeftHandSideExpression; + type: ts.Type; + name: string | undefined; + init: ts.Expression | undefined; + } + export interface IDecomposeProps { + context: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; init: ts.Expression | undefined; - }): FeatureProgrammer.IDecomposed => { + } + + export const decompose = ( + props: IDecomposeProps, + ): FeatureProgrammer.IDecomposed => { const collection: MetadataCollection = new MetadataCollection(); const result = MetadataFactory.analyze( - props.project.checker, - props.project.context, + props.context.checker, + props.context.transformer, )({ escape: false, constant: true, @@ -93,7 +104,7 @@ export namespace RandomProgrammer { [ ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ], false, @@ -125,25 +136,20 @@ export namespace RandomProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (init?: ts.Expression) => - (type: ts.Type, name?: string) => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProps) => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; const write_object_functions = (importer: FunctionImporter) => diff --git a/src/programmers/ValidateProgrammer.ts b/src/programmers/ValidateProgrammer.ts index 62b10c76e4..c3c136b4a5 100644 --- a/src/programmers/ValidateProgrammer.ts +++ b/src/programmers/ValidateProgrammer.ts @@ -5,7 +5,8 @@ import { IdentifierFactory } from "../factories/IdentifierFactory"; import { StatementFactory } from "../factories/StatementFactory"; import { TypeFactory } from "../factories/TypeFactory"; -import { IProject } from "../transformers/IProject"; +import { IProgrammerProps } from "../transformers/IProgrammerProps"; +import { ITypiaContext } from "../transformers/ITypiaContext"; import { CheckerProgrammer } from "./CheckerProgrammer"; import { FeatureProgrammer } from "./FeatureProgrammer"; @@ -16,11 +17,18 @@ import { check_everything } from "./internal/check_everything"; import { check_object } from "./internal/check_object"; export namespace ValidateProgrammer { + export interface IConfig { + equals: boolean; + } + export interface IProps extends IProgrammerProps { + config: IConfig; + } + export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; - equals: boolean; + config: IConfig; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { @@ -31,8 +39,8 @@ export namespace ValidateProgrammer { prefix: "$v", path: true, trace: true, - numeric: OptionPredicator.numeric(props.project.options), - equals: props.equals, + numeric: OptionPredicator.numeric(props.context.options), + equals: props.config.equals, atomist: (explore) => (entry) => (input) => [ ...(entry.expression ? [entry.expression] : []), @@ -84,8 +92,8 @@ export namespace ValidateProgrammer { ), ]), ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)), - combiner: combine(props.equals)(props.project)(props.importer), - joiner: joiner(props.equals)(props.project)(props.importer), + combiner: combine(props.config.equals)(props.context)(props.importer), + joiner: joiner(props.config.equals)(props.context)(props.importer), success: ts.factory.createTrue(), }, }); @@ -96,7 +104,7 @@ export namespace ValidateProgrammer { ts.factory.createTypeReferenceNode( `typia.IValidation<${ props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type) + TypeFactory.getFullName(props.context.checker)(props.type) }>`, ), undefined, @@ -214,31 +222,29 @@ export namespace ValidateProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (equals: boolean) => - (type: ts.Type, name?: string) => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - equals, - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProps) => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + config: props.config, + context: props.context, + modulo: props.modulo, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } const combine = (equals: boolean) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): CheckerProgrammer.IConfig.Combiner => (explore: CheckerProgrammer.IExplore) => { if (explore.tracable === false) @@ -279,7 +285,9 @@ const combine = }; const validate_object = - (equals: boolean) => (project: IProject) => (importer: FunctionImporter) => + (equals: boolean) => + (project: ITypiaContext) => + (importer: FunctionImporter) => check_object({ equals, undefined: true, @@ -309,7 +317,7 @@ const validate_object = const joiner = (equals: boolean) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): CheckerProgrammer.IConfig.IJoiner => ({ object: validate_object(equals)(project)(importer), array: (input, arrow) => diff --git a/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts b/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts index fbf60276dc..dc6aa8af88 100644 --- a/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { StringUtil } from "../../utils/StringUtil"; @@ -14,7 +14,7 @@ import { FunctionAssertReturnProgrammer } from "./FunctionalAssertReturnProgramm export namespace FunctionalAssertFunctionProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalAssertParametersProgrammer.ts b/src/programmers/functional/FunctionalAssertParametersProgrammer.ts index dd6e454935..ea1ffaed61 100644 --- a/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertParametersProgrammer.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FunctionalAssertFunctionProgrammer } from "./FunctionalAssertFunctionProgrammer"; @@ -12,7 +12,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionalAssertParametersProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -70,7 +70,7 @@ export namespace FunctionalAssertParametersProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalAssertReturnProgrammer.ts b/src/programmers/functional/FunctionalAssertReturnProgrammer.ts index 4d6d5fd958..13476365c5 100644 --- a/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalAssertReturnProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { StatementFactory } from "../../factories/StatementFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FunctionalAssertFunctionProgrammer } from "./FunctionalAssertFunctionProgrammer"; @@ -11,7 +11,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionAssertReturnProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -51,7 +51,7 @@ export namespace FunctionAssertReturnProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalIsFunctionProgrammer.ts b/src/programmers/functional/FunctionalIsFunctionProgrammer.ts index 66aef151f4..3f78288a5f 100644 --- a/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +++ b/src/programmers/functional/FunctionalIsFunctionProgrammer.ts @@ -2,14 +2,14 @@ import ts from "typescript"; import { ExpressionFactory } from "../../factories/ExpressionFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FunctionalIsParametersProgrammer } from "./FunctionalIsParametersProgrammer"; import { FunctionalIsReturnProgrammer } from "./FunctionalIsReturnProgrammer"; export namespace FunctionalIsFunctionProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalIsParametersProgrammer.ts b/src/programmers/functional/FunctionalIsParametersProgrammer.ts index 2ed0650166..ca8a29867d 100644 --- a/src/programmers/functional/FunctionalIsParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalIsParametersProgrammer.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { IsProgrammer } from "../IsProgrammer"; import { FunctionalIsFunctionProgrammer } from "./FunctionalIsFunctionProgrammer"; @@ -12,7 +12,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionalIsParametersProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -63,7 +63,7 @@ export namespace FunctionalIsParametersProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalIsReturnProgrammer.ts b/src/programmers/functional/FunctionalIsReturnProgrammer.ts index d68f8737cb..01d73face4 100644 --- a/src/programmers/functional/FunctionalIsReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalIsReturnProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { StatementFactory } from "../../factories/StatementFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { StringUtil } from "../../utils/StringUtil"; @@ -13,7 +13,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionalIsReturnProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -50,7 +50,7 @@ export namespace FunctionalIsReturnProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts b/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts index cbf4a38ed0..724260b09b 100644 --- a/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +++ b/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts @@ -3,14 +3,14 @@ import ts from "typescript"; import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { IdentifierFactory } from "../../factories/IdentifierFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FunctionalValidateParametersProgrammer } from "./FunctionalValidateParametersProgrammer"; import { FunctionalValidateReturnProgrammer } from "./FunctionalValidateReturnProgrammer"; export namespace FunctionalValidateFunctionProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalValidateParametersProgrammer.ts b/src/programmers/functional/FunctionalValidateParametersProgrammer.ts index 316b9dbeab..90419824ef 100644 --- a/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +++ b/src/programmers/functional/FunctionalValidateParametersProgrammer.ts @@ -5,7 +5,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { StringUtil } from "../../utils/StringUtil"; @@ -15,7 +15,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionalValidateParametersProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -85,7 +85,7 @@ export namespace FunctionalValidateParametersProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/functional/FunctionalValidateReturnProgrammer.ts b/src/programmers/functional/FunctionalValidateReturnProgrammer.ts index 6f33d8d453..18dfbc4406 100644 --- a/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +++ b/src/programmers/functional/FunctionalValidateReturnProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { StatementFactory } from "../../factories/StatementFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { StringUtil } from "../../utils/StringUtil"; @@ -13,7 +13,7 @@ import { FunctionalGeneralProgrammer } from "./internal/FunctionalGeneralProgram export namespace FunctionalValidateReturnProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( @@ -50,7 +50,7 @@ export namespace FunctionalValidateReturnProgrammer { }; export const decompose = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (equals: boolean) => ( diff --git a/src/programmers/http/HttpAssertFormDataProgrammer.ts b/src/programmers/http/HttpAssertFormDataProgrammer.ts index a68060d634..144a3e2276 100644 --- a/src/programmers/http/HttpAssertFormDataProgrammer.ts +++ b/src/programmers/http/HttpAssertFormDataProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +13,7 @@ import { HttpFormDataProgrammer } from "./HttpFormDataProgrammer"; export namespace HttpAssertFormDataProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -21,7 +21,7 @@ export namespace HttpAssertFormDataProgrammer { }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -71,7 +71,7 @@ export namespace HttpAssertFormDataProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpAssertHeadersProgrammer.ts b/src/programmers/http/HttpAssertHeadersProgrammer.ts index 66f40f54a7..8d9cda3b49 100644 --- a/src/programmers/http/HttpAssertHeadersProgrammer.ts +++ b/src/programmers/http/HttpAssertHeadersProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +13,7 @@ import { HttpHeadersProgrammer } from "./HttpHeadersProgrammer"; export namespace HttpAssertHeadersProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -21,7 +21,7 @@ export namespace HttpAssertHeadersProgrammer { }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -71,7 +71,7 @@ export namespace HttpAssertHeadersProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpAssertQueryProgrammer.ts b/src/programmers/http/HttpAssertQueryProgrammer.ts index 8b3ee25e4c..70e0028e7a 100644 --- a/src/programmers/http/HttpAssertQueryProgrammer.ts +++ b/src/programmers/http/HttpAssertQueryProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +13,7 @@ import { HttpQueryProgrammer } from "./HttpQueryProgrammer"; export namespace HttpAssertQueryProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -22,7 +22,7 @@ export namespace HttpAssertQueryProgrammer { }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -72,7 +72,7 @@ export namespace HttpAssertQueryProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression, allowOptional: boolean = false) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpFormDataProgrammer.ts b/src/programmers/http/HttpFormDataProgrammer.ts index cbdd66f75e..cb775b74d9 100644 --- a/src/programmers/http/HttpFormDataProgrammer.ts +++ b/src/programmers/http/HttpFormDataProgrammer.ts @@ -11,7 +11,7 @@ import { MetadataArrayType } from "../../schemas/metadata/MetadataArrayType"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { Atomic } from "../../typings/Atomic"; @@ -24,7 +24,7 @@ import { HttpMetadataUtil } from "../helpers/HttpMetadataUtil"; export namespace HttpFormDataProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -33,7 +33,7 @@ export namespace HttpFormDataProgrammer { const collection: MetadataCollection = new MetadataCollection(); const result = MetadataFactory.analyze( props.project.checker, - props.project.context, + props.project.transformer, )({ escape: false, constant: true, @@ -81,7 +81,7 @@ export namespace HttpFormDataProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpHeadersProgrammer.ts b/src/programmers/http/HttpHeadersProgrammer.ts index a167223bfe..56b852504c 100644 --- a/src/programmers/http/HttpHeadersProgrammer.ts +++ b/src/programmers/http/HttpHeadersProgrammer.ts @@ -12,7 +12,7 @@ import { MetadataArrayType } from "../../schemas/metadata/MetadataArrayType"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { Atomic } from "../../typings/Atomic"; @@ -28,7 +28,7 @@ export namespace HttpHeadersProgrammer { export const INPUT_TYPE = "Record"; export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -37,7 +37,7 @@ export namespace HttpHeadersProgrammer { const collection: MetadataCollection = new MetadataCollection(); const result = MetadataFactory.analyze( props.project.checker, - props.project.context, + props.project.transformer, )({ escape: false, constant: true, @@ -85,7 +85,7 @@ export namespace HttpHeadersProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpIsFormDataProgrammer.ts b/src/programmers/http/HttpIsFormDataProgrammer.ts index 4de53ea2ba..202358aa19 100644 --- a/src/programmers/http/HttpIsFormDataProgrammer.ts +++ b/src/programmers/http/HttpIsFormDataProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -12,14 +12,14 @@ import { HttpFormDataProgrammer } from "./HttpFormDataProgrammer"; export namespace HttpIsFormDataProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -83,7 +83,7 @@ export namespace HttpIsFormDataProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpIsHeadersProgrammer.ts b/src/programmers/http/HttpIsHeadersProgrammer.ts index 2318c7a78d..73f8edb40e 100644 --- a/src/programmers/http/HttpIsHeadersProgrammer.ts +++ b/src/programmers/http/HttpIsHeadersProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -12,14 +12,14 @@ import { HttpHeadersProgrammer } from "./HttpHeadersProgrammer"; export namespace HttpIsHeadersProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -83,7 +83,7 @@ export namespace HttpIsHeadersProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpIsQueryProgrammer.ts b/src/programmers/http/HttpIsQueryProgrammer.ts index 111bb27290..53b1e1ed7d 100644 --- a/src/programmers/http/HttpIsQueryProgrammer.ts +++ b/src/programmers/http/HttpIsQueryProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -12,7 +12,7 @@ import { HttpQueryProgrammer } from "./HttpQueryProgrammer"; export namespace HttpIsQueryProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -20,7 +20,7 @@ export namespace HttpIsQueryProgrammer { }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -84,7 +84,7 @@ export namespace HttpIsQueryProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression, allowOptional: boolean = false) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpParameterProgrammer.ts b/src/programmers/http/HttpParameterProgrammer.ts index 0582a90060..5260deaa44 100644 --- a/src/programmers/http/HttpParameterProgrammer.ts +++ b/src/programmers/http/HttpParameterProgrammer.ts @@ -8,7 +8,7 @@ import { TypeFactory } from "../../factories/TypeFactory"; import { Metadata } from "../../schemas/metadata/Metadata"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { AssertProgrammer } from "../AssertProgrammer"; @@ -17,12 +17,12 @@ import { HttpMetadataUtil } from "../helpers/HttpMetadataUtil"; export namespace HttpParameterProgrammer { export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.ArrowFunction => { const result = MetadataFactory.analyze( project.checker, - project.context, + project.transformer, )({ escape: false, constant: true, diff --git a/src/programmers/http/HttpQueryProgrammer.ts b/src/programmers/http/HttpQueryProgrammer.ts index 25bacedb00..bd40bf0c19 100644 --- a/src/programmers/http/HttpQueryProgrammer.ts +++ b/src/programmers/http/HttpQueryProgrammer.ts @@ -11,7 +11,7 @@ import { MetadataArrayType } from "../../schemas/metadata/MetadataArrayType"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { Atomic } from "../../typings/Atomic"; @@ -26,7 +26,7 @@ export namespace HttpQueryProgrammer { export const INPUT_TYPE = "string | URLSearchParams"; export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; allowOptional: boolean; type: ts.Type; @@ -36,7 +36,7 @@ export namespace HttpQueryProgrammer { const collection: MetadataCollection = new MetadataCollection(); const result = MetadataFactory.analyze( props.project.checker, - props.project.context, + props.project.transformer, )({ escape: false, constant: true, @@ -84,7 +84,7 @@ export namespace HttpQueryProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression, allowOptional: boolean = false) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpValidateFormDataProgrammer.ts b/src/programmers/http/HttpValidateFormDataProgrammer.ts index 58b5aa3b12..015ce06250 100644 --- a/src/programmers/http/HttpValidateFormDataProgrammer.ts +++ b/src/programmers/http/HttpValidateFormDataProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -12,7 +12,7 @@ import { HttpFormDataProgrammer } from "./HttpFormDataProgrammer"; export namespace HttpValidateFormDataProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -20,7 +20,7 @@ export namespace HttpValidateFormDataProgrammer { }): FeatureProgrammer.IDecomposed => { const validate = ValidateProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -65,7 +65,7 @@ export namespace HttpValidateFormDataProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpValidateHeadersProgrammer.ts b/src/programmers/http/HttpValidateHeadersProgrammer.ts index 59fa69fc3f..0cd55822ac 100644 --- a/src/programmers/http/HttpValidateHeadersProgrammer.ts +++ b/src/programmers/http/HttpValidateHeadersProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -12,7 +12,7 @@ import { HttpHeadersProgrammer } from "./HttpHeadersProgrammer"; export namespace HttpValidateHeadersProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -20,7 +20,7 @@ export namespace HttpValidateHeadersProgrammer { }): FeatureProgrammer.IDecomposed => { const validate = ValidateProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -65,7 +65,7 @@ export namespace HttpValidateHeadersProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/http/HttpValidateQueryProgrammer.ts b/src/programmers/http/HttpValidateQueryProgrammer.ts index f82b90cd16..c730568abe 100644 --- a/src/programmers/http/HttpValidateQueryProgrammer.ts +++ b/src/programmers/http/HttpValidateQueryProgrammer.ts @@ -3,7 +3,7 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -12,7 +12,7 @@ import { HttpQueryProgrammer } from "./HttpQueryProgrammer"; export namespace HttpValidateQueryProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -21,7 +21,7 @@ export namespace HttpValidateQueryProgrammer { }): FeatureProgrammer.IDecomposed => { const validate = ValidateProgrammer.decompose({ ...props, - project: { + context: { ...props.project, options: { ...props.project.options, @@ -66,7 +66,7 @@ export namespace HttpValidateQueryProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression, allowOptional: boolean = false) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/internal/check_array_length.ts b/src/programmers/internal/check_array_length.ts index d07177e962..126c099b8e 100644 --- a/src/programmers/internal/check_array_length.ts +++ b/src/programmers/internal/check_array_length.ts @@ -5,7 +5,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { IMetadataTypeTag } from "../../schemas/metadata/IMetadataTypeTag"; import { MetadataArray } from "../../schemas/metadata/MetadataArray"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ICheckEntry } from "../helpers/ICheckEntry"; @@ -13,7 +13,7 @@ import { ICheckEntry } from "../helpers/ICheckEntry"; * @internal */ export const check_array_length = - (project: IProject) => + (project: ITypiaContext) => (array: MetadataArray) => (input: ts.Expression): ICheckEntry => { const conditions: ICheckEntry.ICondition[][] = check_string_type_tags( @@ -28,7 +28,7 @@ export const check_array_length = }; const check_string_type_tags = - (project: IProject) => + (project: ITypiaContext) => (matrix: IMetadataTypeTag[][]) => (input: ts.Expression): ICheckEntry.ICondition[][] => matrix @@ -39,7 +39,7 @@ const check_string_type_tags = expected: `Array<> & ${tag.name}`, expression: ( tag.predicate ?? - ExpressionFactory.transpile(project.context)(tag.validate!) + ExpressionFactory.transpile(project.transformer)(tag.validate!) )(input), })), ); diff --git a/src/programmers/internal/check_bigint.ts b/src/programmers/internal/check_bigint.ts index 69ebd5dcfc..dd718766d8 100644 --- a/src/programmers/internal/check_bigint.ts +++ b/src/programmers/internal/check_bigint.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ICheckEntry } from "../helpers/ICheckEntry"; @@ -12,7 +12,7 @@ import { ICheckEntry } from "../helpers/ICheckEntry"; * @internal */ export const check_bigint = - (project: IProject) => + (project: ITypiaContext) => (atomic: MetadataAtomic) => (input: ts.Expression): ICheckEntry => { const conditions: ICheckEntry.ICondition[][] = @@ -32,7 +32,7 @@ export const check_bigint = * @internal */ const check_bigint_type_tags = - (project: IProject) => + (project: ITypiaContext) => (atomic: MetadataAtomic) => (input: ts.Expression): ICheckEntry.ICondition[][] => atomic.tags @@ -43,7 +43,7 @@ const check_bigint_type_tags = expected: `bigint & ${tag.name}`, expression: ( tag.predicate ?? - ExpressionFactory.transpile(project.context)(tag.validate!) + ExpressionFactory.transpile(project.transformer)(tag.validate!) )(input), })), ); diff --git a/src/programmers/internal/check_dynamic_key.ts b/src/programmers/internal/check_dynamic_key.ts index 2b65f3f5f6..a339005af8 100644 --- a/src/programmers/internal/check_dynamic_key.ts +++ b/src/programmers/internal/check_dynamic_key.ts @@ -2,7 +2,7 @@ import ts from "typescript"; import { Metadata } from "../../schemas/metadata/Metadata"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FunctionImporter } from "../helpers/FunctionImporter"; import { ICheckEntry } from "../helpers/ICheckEntry"; @@ -12,7 +12,7 @@ import { check_string } from "./check_string"; import { check_template } from "./check_template"; export const check_dynamic_key = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (input: ts.Expression, metadata: Metadata): ts.Expression => { // IF PURE STRING EXISTS, THEN SKIP VALIDATION diff --git a/src/programmers/internal/check_dynamic_properties.ts b/src/programmers/internal/check_dynamic_properties.ts index 1edc0cddcc..c2ab4c1742 100644 --- a/src/programmers/internal/check_dynamic_properties.ts +++ b/src/programmers/internal/check_dynamic_properties.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FunctionImporter } from "../helpers/FunctionImporter"; import { IExpressionEntry } from "../helpers/IExpressionEntry"; @@ -17,7 +17,7 @@ import { check_object } from "./check_object"; */ export const check_dynamic_properties = (props: check_object.IProps) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( input: ts.Expression, @@ -101,7 +101,7 @@ export const check_dynamic_properties = const check_dynamic_property = (props: check_object.IProps) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( input: ts.Expression, diff --git a/src/programmers/internal/check_number.ts b/src/programmers/internal/check_number.ts index 2777a2a376..9408b629b1 100644 --- a/src/programmers/internal/check_number.ts +++ b/src/programmers/internal/check_number.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ICheckEntry } from "../helpers/ICheckEntry"; import { OptionPredicator } from "../helpers/OptionPredicator"; @@ -13,7 +13,7 @@ import { OptionPredicator } from "../helpers/OptionPredicator"; * @internal */ export const check_number = - (project: IProject, numeric: boolean) => + (project: ITypiaContext, numeric: boolean) => (atomic: MetadataAtomic) => (input: ts.Expression): ICheckEntry => { const base = ts.factory.createStrictEquality( @@ -56,7 +56,7 @@ export const check_number = * @internal */ const check_numeric_type_tags = - (project: IProject) => + (project: ITypiaContext) => (atomic: MetadataAtomic) => (addition: ts.Expression | null) => (input: ts.Expression): ICheckEntry.ICondition[][] => @@ -101,7 +101,7 @@ const check_numeric_type_tags = expected: `number & ${tag.name}`, expression: ( tag.predicate ?? - ExpressionFactory.transpile(project.context)(tag.validate!) + ExpressionFactory.transpile(project.transformer)(tag.validate!) )(input), })), ]); diff --git a/src/programmers/internal/check_object.ts b/src/programmers/internal/check_object.ts index 5e1650ba44..ec5a2ca698 100644 --- a/src/programmers/internal/check_object.ts +++ b/src/programmers/internal/check_object.ts @@ -1,6 +1,6 @@ import ts from "typescript"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FunctionImporter } from "../helpers/FunctionImporter"; import { IExpressionEntry } from "../helpers/IExpressionEntry"; @@ -12,7 +12,7 @@ import { check_everything } from "./check_everything"; */ export const check_object = (props: check_object.IProps) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (input: ts.Expression, entries: IExpressionEntry[]) => { // PREPARE ASSETS diff --git a/src/programmers/internal/check_string.ts b/src/programmers/internal/check_string.ts index f4f16db601..b140c147b6 100644 --- a/src/programmers/internal/check_string.ts +++ b/src/programmers/internal/check_string.ts @@ -4,7 +4,7 @@ import { ExpressionFactory } from "../../factories/ExpressionFactory"; import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ICheckEntry } from "../helpers/ICheckEntry"; @@ -12,7 +12,7 @@ import { ICheckEntry } from "../helpers/ICheckEntry"; * @internal */ export const check_string = - (project: IProject) => + (project: ITypiaContext) => (atomic: MetadataAtomic) => (input: ts.Expression): ICheckEntry => { const conditions: ICheckEntry.ICondition[][] = @@ -31,7 +31,7 @@ export const check_string = * @internal */ const check_string_type_tags = - (project: IProject) => + (project: ITypiaContext) => (atomic: MetadataAtomic) => (input: ts.Expression): ICheckEntry.ICondition[][] => atomic.tags @@ -42,7 +42,7 @@ const check_string_type_tags = expected: `string & ${tag.name}`, expression: ( tag.predicate ?? - ExpressionFactory.transpile(project.context)(tag.validate!) + ExpressionFactory.transpile(project.transformer)(tag.validate!) )(input), })), ); diff --git a/src/programmers/json/JsonAssertParseProgrammer.ts b/src/programmers/json/JsonAssertParseProgrammer.ts index 309f806f18..b6dc1cce9c 100644 --- a/src/programmers/json/JsonAssertParseProgrammer.ts +++ b/src/programmers/json/JsonAssertParseProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -12,7 +13,7 @@ import { FunctionImporter } from "../helpers/FunctionImporter"; export namespace JsonAssertParseProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -20,16 +21,18 @@ export namespace JsonAssertParseProgrammer { }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, - guard: false, + config: { + equals: false, + guard: false, + }, }); return { functions: assert.functions, @@ -53,7 +56,7 @@ export namespace JsonAssertParseProgrammer { [ ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ], false, @@ -75,22 +78,21 @@ export namespace JsonAssertParseProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + importer, + type: props.type, + name: props.name, + init: props.init, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/json/JsonAssertStringifyProgrammer.ts b/src/programmers/json/JsonAssertStringifyProgrammer.ts index f512a1f42e..3ba6ef9bf5 100644 --- a/src/programmers/json/JsonAssertStringifyProgrammer.ts +++ b/src/programmers/json/JsonAssertStringifyProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +14,7 @@ import { JsonStringifyProgrammer } from "./JsonStringifyProgrammer"; export namespace JsonAssertStringifyProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -21,16 +22,18 @@ export namespace JsonAssertStringifyProgrammer { }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, - guard: false, + config: { + equals: false, + guard: false, + }, }); const stringify: FeatureProgrammer.IDecomposed = JsonStringifyProgrammer.decompose({ @@ -83,22 +86,21 @@ export namespace JsonAssertStringifyProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + importer, + type: props.type, + name: props.name, + init: props.init, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/json/JsonIsParseProgrammer.ts b/src/programmers/json/JsonIsParseProgrammer.ts index f33705a4b3..c824362a4a 100644 --- a/src/programmers/json/JsonIsParseProgrammer.ts +++ b/src/programmers/json/JsonIsParseProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -12,22 +13,24 @@ import { FunctionImporter } from "../helpers/FunctionImporter"; export namespace JsonIsParseProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, + config: { + equals: false, + }, }); return { functions: is.functions, @@ -49,7 +52,7 @@ export namespace JsonIsParseProgrammer { [ ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ], false, @@ -90,21 +93,20 @@ export namespace JsonIsParseProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/json/JsonIsStringifyProgrammer.ts b/src/programmers/json/JsonIsStringifyProgrammer.ts index f0aa6845e0..21e87e8938 100644 --- a/src/programmers/json/JsonIsStringifyProgrammer.ts +++ b/src/programmers/json/JsonIsStringifyProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -13,30 +14,32 @@ import { JsonStringifyProgrammer } from "./JsonStringifyProgrammer"; export namespace JsonIsStringifyProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, + config: { + equals: false, + }, }); const stringify: FeatureProgrammer.IDecomposed = JsonStringifyProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, @@ -82,21 +85,20 @@ export namespace JsonIsStringifyProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/json/JsonStringifyProgrammer.ts b/src/programmers/json/JsonStringifyProgrammer.ts index 9894b6925f..6b69d94ff2 100644 --- a/src/programmers/json/JsonStringifyProgrammer.ts +++ b/src/programmers/json/JsonStringifyProgrammer.ts @@ -14,7 +14,8 @@ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; import { MetadataTuple } from "../../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { Atomic } from "../../typings/Atomic"; @@ -38,18 +39,18 @@ export namespace JsonStringifyProgrammer { WRITER ----------------------------------------------------------- */ export const decompose = (props: { + context: ITypiaContext; validated: boolean; - project: IProject; importer: FunctionImporter; type: ts.Type; name: string | undefined; }): FeatureProgrammer.IDecomposed => { - const config: FeatureProgrammer.IConfig = configure(props.project)( + const config: FeatureProgrammer.IConfig = configure(props.context)( props.importer, ); if (props.validated === false) config.addition = (collection) => - IsProgrammer.write_function_statements(props.project)(props.importer)( + IsProgrammer.write_function_statements(props.context)(props.importer)( collection, ); const composed: FeatureProgrammer.IComposed = FeatureProgrammer.compose({ @@ -70,24 +71,23 @@ export namespace JsonStringifyProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - validated: false, - project, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + validated: false, + context: props.context, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; const write_array_functions = (config: FeatureProgrammer.IConfig) => @@ -125,7 +125,7 @@ export namespace JsonStringifyProgrammer { ); const write_tuple_functions = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -161,7 +161,7 @@ export namespace JsonStringifyProgrammer { DECODERS ----------------------------------------------------------- */ const decode = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -509,7 +509,7 @@ export namespace JsonStringifyProgrammer { ); const decode_tuple = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -535,7 +535,7 @@ export namespace JsonStringifyProgrammer { ); const decode_tuple_inline = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -585,7 +585,7 @@ export namespace JsonStringifyProgrammer { }; const decode_atomic = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( input: ts.Expression, @@ -615,7 +615,7 @@ export namespace JsonStringifyProgrammer { }; const decode_constant_string = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( input: ts.Expression, @@ -632,7 +632,7 @@ export namespace JsonStringifyProgrammer { }; const decode_to_json = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -678,7 +678,7 @@ export namespace JsonStringifyProgrammer { ); const explore_arrays = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -836,7 +836,7 @@ export namespace JsonStringifyProgrammer { const PREFIX = "$s"; const configure = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): FeatureProgrammer.IConfig => { const config: FeatureProgrammer.IConfig = { types: { @@ -875,7 +875,7 @@ export namespace JsonStringifyProgrammer { (project) => (importer) => (type) => JsonMetadataFactory.analyze(`typia.json.${importer.method}`)( project.checker, - project.context, + project.transformer, )(type); const create_throw_error = diff --git a/src/programmers/json/JsonValidateParseProgrammer.ts b/src/programmers/json/JsonValidateParseProgrammer.ts index 646e62d587..56f4b30922 100644 --- a/src/programmers/json/JsonValidateParseProgrammer.ts +++ b/src/programmers/json/JsonValidateParseProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -12,7 +13,7 @@ import { FunctionImporter } from "../helpers/FunctionImporter"; export namespace JsonValidateParseProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -21,15 +22,17 @@ export namespace JsonValidateParseProgrammer { const validate: FeatureProgrammer.IDecomposed = ValidateProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, + config: { + equals: false, + }, }); return { functions: validate.functions, @@ -44,7 +47,7 @@ export namespace JsonValidateParseProgrammer { ts.factory.createTypeReferenceNode( `typia.IValidation>`, ), undefined, @@ -66,22 +69,21 @@ export namespace JsonValidateParseProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + modulo: props.modulo, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/json/JsonValidateStringifyProgrammer.ts b/src/programmers/json/JsonValidateStringifyProgrammer.ts index 773f14dbac..5238f532a0 100644 --- a/src/programmers/json/JsonValidateStringifyProgrammer.ts +++ b/src/programmers/json/JsonValidateStringifyProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -13,7 +14,7 @@ import { JsonStringifyProgrammer } from "./JsonStringifyProgrammer"; export namespace JsonValidateStringifyProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -22,15 +23,17 @@ export namespace JsonValidateStringifyProgrammer { const validate: FeatureProgrammer.IDecomposed = ValidateProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, + config: { + equals: false, + }, }); const stringify: FeatureProgrammer.IDecomposed = JsonStringifyProgrammer.decompose({ @@ -90,22 +93,21 @@ export namespace JsonValidateStringifyProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + context: props.context, + modulo: props.modulo, + importer, + type: props.type, + name: props.name, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/misc/MiscAssertCloneProgrammer.ts b/src/programmers/misc/MiscAssertCloneProgrammer.ts index 6d98bd7a17..d258478a07 100644 --- a/src/programmers/misc/MiscAssertCloneProgrammer.ts +++ b/src/programmers/misc/MiscAssertCloneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +13,7 @@ import { MiscCloneProgrammer } from "./MiscCloneProgrammer"; export namespace MiscAssertCloneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -67,7 +67,7 @@ export namespace MiscAssertCloneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/misc/MiscAssertPruneProgrammer.ts b/src/programmers/misc/MiscAssertPruneProgrammer.ts index 9fc2c130f9..7efec5e739 100644 --- a/src/programmers/misc/MiscAssertPruneProgrammer.ts +++ b/src/programmers/misc/MiscAssertPruneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,7 +13,7 @@ import { MiscPruneProgrammer } from "./MiscPruneProgrammer"; export namespace MiscAssertPruneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -85,7 +85,7 @@ export namespace MiscAssertPruneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/misc/MiscCloneProgrammer.ts b/src/programmers/misc/MiscCloneProgrammer.ts index b17abebdab..db87f78a1d 100644 --- a/src/programmers/misc/MiscCloneProgrammer.ts +++ b/src/programmers/misc/MiscCloneProgrammer.ts @@ -12,7 +12,7 @@ import { MetadataArray } from "../../schemas/metadata/MetadataArray"; import { MetadataTuple } from "../../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -27,7 +27,7 @@ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple"; export namespace MiscCloneProgrammer { export const decompose = (props: { validated: boolean; - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -57,7 +57,7 @@ export namespace MiscCloneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); @@ -111,7 +111,7 @@ export namespace MiscCloneProgrammer { ); const write_tuple_functions = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -147,7 +147,7 @@ export namespace MiscCloneProgrammer { DECODERS ----------------------------------------------------------- */ const decode = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -343,7 +343,7 @@ export namespace MiscCloneProgrammer { ); const decode_tuple = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -369,7 +369,7 @@ export namespace MiscCloneProgrammer { ); const decode_tuple_inline = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -501,7 +501,7 @@ export namespace MiscCloneProgrammer { EXPLORERS FOR UNION TYPES ----------------------------------------------------------- */ const explore_sets = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -532,7 +532,7 @@ export namespace MiscCloneProgrammer { ); const explore_maps = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -593,7 +593,7 @@ export namespace MiscCloneProgrammer { ); const explore_arrays = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -673,7 +673,7 @@ export namespace MiscCloneProgrammer { const PREFIX = "$c"; const configure = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): FeatureProgrammer.IConfig => { const config: FeatureProgrammer.IConfig = { types: { @@ -726,7 +726,7 @@ export namespace MiscCloneProgrammer { const collection = new MetadataCollection(); const result = MetadataFactory.analyze( project.checker, - project.context, + project.transformer, )({ escape: false, constant: true, diff --git a/src/programmers/misc/MiscIsCloneProgrammer.ts b/src/programmers/misc/MiscIsCloneProgrammer.ts index 50f4f9a231..9c1da3dcc7 100644 --- a/src/programmers/misc/MiscIsCloneProgrammer.ts +++ b/src/programmers/misc/MiscIsCloneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -13,7 +13,7 @@ import { MiscCloneProgrammer } from "./MiscCloneProgrammer"; export namespace MiscIsCloneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -74,7 +74,7 @@ export namespace MiscIsCloneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/misc/MiscIsPruneProgrammer.ts b/src/programmers/misc/MiscIsPruneProgrammer.ts index 605832075b..8da68d92de 100644 --- a/src/programmers/misc/MiscIsPruneProgrammer.ts +++ b/src/programmers/misc/MiscIsPruneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -13,7 +13,7 @@ import { MiscPruneProgrammer } from "./MiscPruneProgrammer"; export namespace MiscIsPruneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -72,7 +72,7 @@ export namespace MiscIsPruneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/misc/MiscLiteralsProgrammer.ts b/src/programmers/misc/MiscLiteralsProgrammer.ts index 61d1cc2201..6e37b4d28e 100644 --- a/src/programmers/misc/MiscLiteralsProgrammer.ts +++ b/src/programmers/misc/MiscLiteralsProgrammer.ts @@ -6,16 +6,20 @@ import { MetadataFactory } from "../../factories/MetadataFactory"; import { Metadata } from "../../schemas/metadata/Metadata"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { Atomic } from "../../typings/Atomic"; export namespace MiscLiteralsProgrammer { - export const write = (project: IProject) => (type: ts.Type) => { + export interface IProps { + context: ITypiaContext; + type: ts.Type; + } + export const write = (props: IProps) => { const result = MetadataFactory.analyze( - project.checker, - project.context, + props.context.checker, + props.context.transformer, )({ escape: true, constant: true, @@ -30,7 +34,7 @@ export namespace MiscLiteralsProgrammer { else if (meta.size() !== length) return [ErrorMessages.ONLY]; return []; }, - })(new MetadataCollection())(type); + })(new MetadataCollection())(props.type); if (result.success === false) throw TransformerError.from(`typia.misc.literals`)(result.errors); diff --git a/src/programmers/misc/MiscPruneProgrammer.ts b/src/programmers/misc/MiscPruneProgrammer.ts index fc4b59469d..10d706eae6 100644 --- a/src/programmers/misc/MiscPruneProgrammer.ts +++ b/src/programmers/misc/MiscPruneProgrammer.ts @@ -12,7 +12,7 @@ import { MetadataArray } from "../../schemas/metadata/MetadataArray"; import { MetadataTuple } from "../../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -27,7 +27,7 @@ import { wrap_metadata_rest_tuple } from "../internal/wrap_metadata_rest_tuple"; export namespace MiscPruneProgrammer { export const decompose = (props: { validated: boolean; - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -57,7 +57,7 @@ export namespace MiscPruneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); @@ -111,7 +111,7 @@ export namespace MiscPruneProgrammer { ); const write_tuple_functions = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -147,7 +147,7 @@ export namespace MiscPruneProgrammer { DECODERS ----------------------------------------------------------- */ const decode = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -294,7 +294,7 @@ export namespace MiscPruneProgrammer { ); const decode_tuple = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -320,7 +320,7 @@ export namespace MiscPruneProgrammer { ); const decode_tuple_inline = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -391,7 +391,7 @@ export namespace MiscPruneProgrammer { }; const explore_arrays = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -482,7 +482,7 @@ export namespace MiscPruneProgrammer { const PREFIX = "$p"; const configure = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): FeatureProgrammer.IConfig => { const config: FeatureProgrammer.IConfig = { types: { @@ -522,7 +522,7 @@ export namespace MiscPruneProgrammer { const collection = new MetadataCollection(); const result = MetadataFactory.analyze( project.checker, - project.context, + project.transformer, )({ escape: false, constant: true, diff --git a/src/programmers/misc/MiscValidateCloneProgrammer.ts b/src/programmers/misc/MiscValidateCloneProgrammer.ts index daf630b69d..26264ba42f 100644 --- a/src/programmers/misc/MiscValidateCloneProgrammer.ts +++ b/src/programmers/misc/MiscValidateCloneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -13,7 +13,7 @@ import { MiscCloneProgrammer } from "./MiscCloneProgrammer"; export namespace MiscValidateCloneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -84,7 +84,7 @@ export namespace MiscValidateCloneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/misc/MiscValidatePruneProgrammer.ts b/src/programmers/misc/MiscValidatePruneProgrammer.ts index 1a94db56fd..43e29f3b12 100644 --- a/src/programmers/misc/MiscValidatePruneProgrammer.ts +++ b/src/programmers/misc/MiscValidatePruneProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -13,7 +13,7 @@ import { MiscPruneProgrammer } from "./MiscPruneProgrammer"; export namespace MiscValidatePruneProgrammer { export const decompose = (props: { - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -81,7 +81,7 @@ export namespace MiscValidatePruneProgrammer { }; export const write = - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/notations/NotationAssertGeneralProgrammer.ts b/src/programmers/notations/NotationAssertGeneralProgrammer.ts index c2341e9cc9..5bcd593fff 100644 --- a/src/programmers/notations/NotationAssertGeneralProgrammer.ts +++ b/src/programmers/notations/NotationAssertGeneralProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -14,7 +14,7 @@ import { NotationGeneralProgrammer } from "./NotationGeneralProgrammer"; export namespace NotationAssertGeneralProgrammer { export const decompose = (props: { rename: (str: string) => string; - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -70,7 +70,7 @@ export namespace NotationAssertGeneralProgrammer { export const write = (rename: (str: string) => string) => - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/notations/NotationGeneralProgrammer.ts b/src/programmers/notations/NotationGeneralProgrammer.ts index d2ac40a6c8..ed4d0ad672 100644 --- a/src/programmers/notations/NotationGeneralProgrammer.ts +++ b/src/programmers/notations/NotationGeneralProgrammer.ts @@ -12,7 +12,7 @@ import { MetadataArray } from "../../schemas/metadata/MetadataArray"; import { MetadataTuple } from "../../schemas/metadata/MetadataTuple"; import { MetadataTupleType } from "../../schemas/metadata/MetadataTupleType"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { TransformerError } from "../../transformers/TransformerError"; import { StringUtil } from "../../utils/StringUtil"; @@ -34,7 +34,7 @@ export namespace NotationGeneralProgrammer { export const decompose = (props: { rename: (str: string) => string; validated: boolean; - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -70,7 +70,7 @@ export namespace NotationGeneralProgrammer { export const write = (rename: (str: string) => string) => - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string) => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); @@ -125,7 +125,7 @@ export namespace NotationGeneralProgrammer { ); const write_tuple_functions = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => (collection: MetadataCollection): ts.VariableStatement[] => @@ -161,7 +161,7 @@ export namespace NotationGeneralProgrammer { DECODERS ----------------------------------------------------------- */ const decode = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -359,7 +359,7 @@ export namespace NotationGeneralProgrammer { ); const decode_tuple = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -385,7 +385,7 @@ export namespace NotationGeneralProgrammer { ); const decode_tuple_inline = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -447,7 +447,7 @@ export namespace NotationGeneralProgrammer { EXPLORERS FOR UNION TYPES ----------------------------------------------------------- */ const explore_sets = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -478,7 +478,7 @@ export namespace NotationGeneralProgrammer { ); const explore_maps = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -541,7 +541,7 @@ export namespace NotationGeneralProgrammer { }; const explore_arrays = - (project: IProject) => + (project: ITypiaContext) => (config: FeatureProgrammer.IConfig) => (importer: FunctionImporter) => ( @@ -622,7 +622,7 @@ export namespace NotationGeneralProgrammer { const configure = (rename: (str: string) => string) => - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter): FeatureProgrammer.IConfig => { const config: FeatureProgrammer.IConfig = { types: { @@ -667,7 +667,7 @@ export namespace NotationGeneralProgrammer { const collection = new MetadataCollection(); const result = MetadataFactory.analyze( project.checker, - project.context, + project.transformer, )({ escape: false, constant: true, diff --git a/src/programmers/notations/NotationIsGeneralProgrammer.ts b/src/programmers/notations/NotationIsGeneralProgrammer.ts index 47dca1deed..be25d153e9 100644 --- a/src/programmers/notations/NotationIsGeneralProgrammer.ts +++ b/src/programmers/notations/NotationIsGeneralProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -14,7 +14,7 @@ import { NotationGeneralProgrammer } from "./NotationGeneralProgrammer"; export namespace NotationIsGeneralProgrammer { export const decompose = (props: { rename: (str: string) => string; - project: IProject; + project: ITypiaContext; importer: FunctionImporter; type: ts.Type; name: string | undefined; @@ -77,7 +77,7 @@ export namespace NotationIsGeneralProgrammer { export const write = (rename: (str: string) => string) => - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/notations/NotationValidateGeneralProgrammer.ts b/src/programmers/notations/NotationValidateGeneralProgrammer.ts index 2b9a74014b..816b8f4d33 100644 --- a/src/programmers/notations/NotationValidateGeneralProgrammer.ts +++ b/src/programmers/notations/NotationValidateGeneralProgrammer.ts @@ -4,7 +4,7 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -14,7 +14,7 @@ import { NotationGeneralProgrammer } from "./NotationGeneralProgrammer"; export namespace NotationValidateGeneralProgrammer { export const decompose = (props: { rename: (str: string) => string; - project: IProject; + project: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -89,7 +89,7 @@ export namespace NotationValidateGeneralProgrammer { export const write = (rename: (str: string) => string) => - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type, name?: string): ts.CallExpression => { const importer: FunctionImporter = new FunctionImporter(modulo.getText()); diff --git a/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts b/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts index 417e743fb3..cc4b5151d0 100644 --- a/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts @@ -2,7 +2,8 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -11,25 +12,27 @@ import { ProtobufDecodeProgrammer } from "./ProtobufDecodeProgrammer"; export namespace ProtobufAssertDecodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; name: string | undefined; - init: ts.Expression | undefined; + init?: ts.Expression | undefined; }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, - guard: false, + config: { + equals: false, + guard: false, + }, }); const decode: FeatureProgrammer.IDecomposed = ProtobufDecodeProgrammer.decompose(props); @@ -69,23 +72,18 @@ export namespace ProtobufAssertDecodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts b/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts index 5b8728cf07..5e6be8db98 100644 --- a/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { AssertProgrammer } from "../AssertProgrammer"; import { FeatureProgrammer } from "../FeatureProgrammer"; @@ -13,25 +14,27 @@ import { ProtobufEncodeProgrammer } from "./ProtobufEncodeProgrammer"; export namespace ProtobufAssertEncodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; name: string | undefined; - init: ts.Expression | undefined; + init?: ts.Expression | undefined; }): FeatureProgrammer.IDecomposed => { const assert: FeatureProgrammer.IDecomposed = AssertProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, - guard: false, + config: { + equals: false, + guard: false, + }, }); const encode: FeatureProgrammer.IDecomposed = ProtobufEncodeProgrammer.decompose(props); @@ -73,23 +76,18 @@ export namespace ProtobufAssertEncodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string, init?: ts.Expression): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - init, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/protobuf/ProtobufDecodeProgrammer.ts b/src/programmers/protobuf/ProtobufDecodeProgrammer.ts index 22676cd2fe..e15e36b96d 100644 --- a/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufDecodeProgrammer.ts @@ -14,7 +14,8 @@ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ProtobufAtomic } from "../../typings/ProtobufAtomic"; @@ -24,7 +25,7 @@ import { ProtobufUtil } from "../helpers/ProtobufUtil"; export namespace ProtobufDecodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -32,8 +33,8 @@ export namespace ProtobufDecodeProgrammer { }): FeatureProgrammer.IDecomposed => { const collection: MetadataCollection = new MetadataCollection(); const meta: Metadata = ProtobufFactory.metadata(props.modulo.getText())( - props.project.checker, - props.project.context, + props.context.checker, + props.context.transformer, )(collection)(props.type); return { functions: Object.fromEntries( @@ -44,7 +45,7 @@ export namespace ProtobufDecodeProgrammer { `${PREFIX}o${obj.index}`, StatementFactory.constant( props.importer.useLocal(`${PREFIX}o${obj.index}`), - write_object_function(props.project)(props.importer)(obj), + write_object_function(props.context)(props.importer)(obj), ), ]), ), @@ -67,7 +68,7 @@ export namespace ProtobufDecodeProgrammer { [ ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ], ), @@ -92,27 +93,23 @@ export namespace ProtobufDecodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; const write_object_function = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (obj: MetadataObject): ts.ArrowFunction => ts.factory.createArrowFunction( @@ -178,7 +175,7 @@ export namespace ProtobufDecodeProgrammer { ); const write_object_function_body = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (props: { condition: ts.Expression; tag: string; output: string }) => (properties: MetadataProperty[]): ts.Statement[] => { @@ -304,7 +301,7 @@ export namespace ProtobufDecodeProgrammer { DECODERS ----------------------------------------------------------- */ const decode_property = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (index: number) => ( @@ -508,7 +505,7 @@ export namespace ProtobufDecodeProgrammer { ); const decode_dynamic_object = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression, @@ -551,7 +548,7 @@ export namespace ProtobufDecodeProgrammer { }; const decode_map = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression, @@ -581,7 +578,7 @@ export namespace ProtobufDecodeProgrammer { })(map, required); const decode_entry = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (props: { initializer: () => ts.Expression; diff --git a/src/programmers/protobuf/ProtobufEncodeProgrammer.ts b/src/programmers/protobuf/ProtobufEncodeProgrammer.ts index 13822bb86a..28ec9947cb 100644 --- a/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufEncodeProgrammer.ts @@ -14,7 +14,8 @@ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { ProtobufAtomic } from "../../typings/ProtobufAtomic"; @@ -28,7 +29,7 @@ import { decode_union_object } from "../internal/decode_union_object"; export namespace ProtobufEncodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -36,8 +37,8 @@ export namespace ProtobufEncodeProgrammer { }): FeatureProgrammer.IDecomposed => { const collection: MetadataCollection = new MetadataCollection(); const meta: Metadata = ProtobufFactory.metadata(props.modulo.getText())( - props.project.checker, - props.project.context, + props.context.checker, + props.context.transformer, )(collection)(props.type); const callEncoder = (writer: string) => (factory: ts.NewExpression) => @@ -53,7 +54,7 @@ export namespace ProtobufEncodeProgrammer { functions: { encoder: StatementFactory.constant( props.importer.useLocal("encoder"), - write_encoder(props.project)(props.importer)(collection)(meta), + write_encoder(props.context)(props.importer)(collection)(meta), ), }, statements: [], @@ -65,7 +66,7 @@ export namespace ProtobufEncodeProgrammer { "input", ts.factory.createTypeReferenceNode( props.name ?? - TypeFactory.getFullName(props.project.checker)(props.type), + TypeFactory.getFullName(props.context.checker)(props.type), ), ), ], @@ -101,27 +102,23 @@ export namespace ProtobufEncodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; const write_encoder = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (collection: MetadataCollection) => (meta: Metadata): ts.ArrowFunction => { @@ -180,7 +177,7 @@ export namespace ProtobufEncodeProgrammer { }; const write_object_function = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => ( input: ts.Expression, @@ -221,7 +218,7 @@ export namespace ProtobufEncodeProgrammer { DECODERS ----------------------------------------------------------- */ const decode = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (index: number | null) => ( @@ -399,7 +396,7 @@ export namespace ProtobufEncodeProgrammer { ); const decode_map = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (index: number) => ( @@ -450,7 +447,7 @@ export namespace ProtobufEncodeProgrammer { }; const decode_object = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (index: number | null) => ( @@ -518,7 +515,7 @@ export namespace ProtobufEncodeProgrammer { }; const decode_array = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (index: number) => ( @@ -724,7 +721,7 @@ export namespace ProtobufEncodeProgrammer { EXPLORERS ----------------------------------------------------------- */ const explore_objects = - (project: IProject) => + (project: ITypiaContext) => (importer: FunctionImporter) => (level: number) => (index: number | null) => diff --git a/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts b/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts index 08d832de46..2ade32371a 100644 --- a/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts @@ -3,7 +3,8 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -12,7 +13,7 @@ import { ProtobufDecodeProgrammer } from "./ProtobufDecodeProgrammer"; export namespace ProtobufIsDecodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -20,15 +21,17 @@ export namespace ProtobufIsDecodeProgrammer { }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, + config: { + equals: false, + }, }); const decode: FeatureProgrammer.IDecomposed = ProtobufDecodeProgrammer.decompose(props); @@ -83,22 +86,18 @@ export namespace ProtobufIsDecodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts b/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts index abe7a4bb24..67ce46057a 100644 --- a/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { IsProgrammer } from "../IsProgrammer"; @@ -13,7 +14,7 @@ import { ProtobufEncodeProgrammer } from "./ProtobufEncodeProgrammer"; export namespace ProtobufIsEncodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -21,15 +22,17 @@ export namespace ProtobufIsEncodeProgrammer { }): FeatureProgrammer.IDecomposed => { const is: FeatureProgrammer.IDecomposed = IsProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, + config: { + equals: false, + }, }); const encode: FeatureProgrammer.IDecomposed = ProtobufEncodeProgrammer.decompose(props); @@ -72,22 +75,18 @@ export namespace ProtobufIsEncodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/protobuf/ProtobufMessageProgrammer.ts b/src/programmers/protobuf/ProtobufMessageProgrammer.ts index 7ba183755f..94336e325d 100644 --- a/src/programmers/protobuf/ProtobufMessageProgrammer.ts +++ b/src/programmers/protobuf/ProtobufMessageProgrammer.ts @@ -8,7 +8,7 @@ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic"; import { MetadataObject } from "../../schemas/metadata/MetadataObject"; import { MetadataProperty } from "../../schemas/metadata/MetadataProperty"; -import { IProject } from "../../transformers/IProject"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { MapUtil } from "../../utils/MapUtil"; import { NameEncoder } from "../../utils/NameEncoder"; @@ -16,12 +16,17 @@ import { NameEncoder } from "../../utils/NameEncoder"; import { ProtobufUtil } from "../helpers/ProtobufUtil"; export namespace ProtobufMessageProgrammer { - export const write = (project: IProject) => (type: ts.Type) => { + export interface IProps { + context: ITypiaContext; + type: ts.Type; + } + export const write = (props: IProps) => { // PARSE TARGET TYPE const collection: MetadataCollection = new MetadataCollection(); - ProtobufFactory.metadata("message")(project.checker, project.context)( - collection, - )(type); + ProtobufFactory.metadata("message")( + props.context.checker, + props.context.transformer, + )(collection)(props.type); // STRINGIFY const hierarchies: Map = new Map(); diff --git a/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts b/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts index f130ded784..ed5d7bed59 100644 --- a/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts @@ -3,7 +3,8 @@ import ts from "typescript"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -12,7 +13,7 @@ import { ProtobufDecodeProgrammer } from "./ProtobufDecodeProgrammer"; export namespace ProtobufValidateDecodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -20,15 +21,17 @@ export namespace ProtobufValidateDecodeProgrammer { }): FeatureProgrammer.IDecomposed => { const validate = ValidateProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: false, }, }, - equals: false, + config: { + equals: false, + }, }); const decode = ProtobufDecodeProgrammer.decompose(props); return { @@ -64,22 +67,18 @@ export namespace ProtobufValidateDecodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts b/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts index d49d30316a..f133de6aa4 100644 --- a/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +++ b/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts @@ -4,7 +4,8 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory"; import { StatementFactory } from "../../factories/StatementFactory"; import { TypeFactory } from "../../factories/TypeFactory"; -import { IProject } from "../../transformers/IProject"; +import { IProgrammerProps } from "../../transformers/IProgrammerProps"; +import { ITypiaContext } from "../../transformers/ITypiaContext"; import { FeatureProgrammer } from "../FeatureProgrammer"; import { ValidateProgrammer } from "../ValidateProgrammer"; @@ -13,7 +14,7 @@ import { ProtobufEncodeProgrammer } from "./ProtobufEncodeProgrammer"; export namespace ProtobufValidateEncodeProgrammer { export const decompose = (props: { - project: IProject; + context: ITypiaContext; modulo: ts.LeftHandSideExpression; importer: FunctionImporter; type: ts.Type; @@ -21,15 +22,17 @@ export namespace ProtobufValidateEncodeProgrammer { }): FeatureProgrammer.IDecomposed => { const validate = ValidateProgrammer.decompose({ ...props, - project: { - ...props.project, + context: { + ...props.context, options: { - ...props.project.options, + ...props.context.options, functional: false, numeric: true, }, }, - equals: false, + config: { + equals: false, + }, }); const encode = ProtobufEncodeProgrammer.decompose(props); return { @@ -88,22 +91,18 @@ export namespace ProtobufValidateEncodeProgrammer { }; }; - export const write = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (type: ts.Type, name?: string): ts.CallExpression => { - const importer: FunctionImporter = new FunctionImporter(modulo.getText()); - const result: FeatureProgrammer.IDecomposed = decompose({ - project, - modulo, - importer, - type, - name, - }); - return FeatureProgrammer.writeDecomposed({ - modulo, - importer, - result, - }); - }; + export const write = (props: IProgrammerProps): ts.CallExpression => { + const importer: FunctionImporter = new FunctionImporter( + props.modulo.getText(), + ); + const result: FeatureProgrammer.IDecomposed = decompose({ + ...props, + importer, + }); + return FeatureProgrammer.writeDecomposed({ + modulo: props.modulo, + importer, + result, + }); + }; } diff --git a/src/transform.ts b/src/transform.ts index 3ea619796f..db1c066435 100644 --- a/src/transform.ts +++ b/src/transform.ts @@ -1,13 +1,13 @@ import ts from "typescript"; import { FileTransformer } from "./transformers/FileTransformer"; -import { IProject } from "./transformers/IProject"; import { ITransformOptions } from "./transformers/ITransformOptions"; +import { ITypiaContext } from "./transformers/ITypiaContext"; export const transform = ( program: ts.Program, options: ITransformOptions | undefined, - extras: IProject["extras"], + extras: ITypiaContext["extras"], ): ts.TransformerFactory => { const compilerOptions: ts.CompilerOptions = program.getCompilerOptions(); const strict: boolean = diff --git a/src/transformers/CallExpressionTransformer.ts b/src/transformers/CallExpressionTransformer.ts index cbd8f3d98f..8e2265f690 100644 --- a/src/transformers/CallExpressionTransformer.ts +++ b/src/transformers/CallExpressionTransformer.ts @@ -14,7 +14,8 @@ import { FunctionalGenericTransformer } from "./features/functional/FunctionalGe import { NamingConvention } from "../utils/NamingConvention"; -import { IProject } from "./IProject"; +import { ITransformProps } from "./ITransformProps"; +import { ITypiaContext } from "./ITypiaContext"; import { AssertTransformer } from "./features/AssertTransformer"; import { CreateAssertTransformer } from "./features/CreateAssertTransformer"; import { CreateIsTransformer } from "./features/CreateIsTransformer"; @@ -113,14 +114,14 @@ import { ReflectNameTransformer } from "./features/reflect/ReflectNameTransforme export namespace CallExpressionTransformer { export const transform = - (project: IProject) => + (context: ITypiaContext) => (expression: ts.CallExpression): ts.Expression | null => { //---- // VALIDATIONS //---- // SIGNATURE DECLARATION const declaration: ts.Declaration | undefined = - project.checker.getResolvedSignature(expression)?.declaration; + context.checker.getResolvedSignature(expression)?.declaration; if (!declaration) return expression; // FILE PATH @@ -134,16 +135,18 @@ export namespace CallExpressionTransformer { //---- // FUNCTION NAME const module: string = location.split(path.sep).at(-1)!.split(".")[0]!; - const { name } = project.checker.getTypeAtLocation(declaration).symbol; + const { name } = context.checker.getTypeAtLocation(declaration).symbol; // FIND TRANSFORMER const functor: (() => Task) | undefined = FUNCTORS[module]?.[name]; if (functor === undefined) return expression; // RETURNS WITH TRANSFORMATION - const result: ts.Expression | null = functor()(project)( - expression.expression, - )(expression); + const result: ts.Expression | null = functor()({ + context, + modulo: expression.expression, + expression, + }); return result ?? expression; }; @@ -155,11 +158,7 @@ export namespace CallExpressionTransformer { }; } -type Task = ( - project: IProject, -) => ( - modulo: ts.LeftHandSideExpression, -) => (expression: ts.CallExpression) => ts.Expression | null; +type Task = (props: ITransformProps) => ts.Expression | null; const FUNCTORS: Record Task>> = { module: { @@ -169,21 +168,20 @@ const FUNCTORS: Record Task>> = { AssertTransformer.transform({ equals: false, guard: true }), assertType: () => AssertTransformer.transform({ equals: false, guard: false }), - is: () => IsTransformer.transform(false), - validate: () => ValidateTransformer.transform(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(true), - validateEquals: () => ValidateTransformer.transform(true), + equals: () => IsTransformer.transform({ equals: true }), + validateEquals: () => ValidateTransformer.transform({ equals: true }), // RANDOM + INTERNAL random: () => RandomTransformer.transform, - metadata: () => (project) => () => - ReflectMetadataTransformer.transform(project), + metadata: () => ReflectMetadataTransformer.transform, // FACTORIES createAssert: () => @@ -192,14 +190,16 @@ const FUNCTORS: Record Task>> = { CreateAssertTransformer.transform({ equals: false, guard: true }), createAssertType: () => CreateAssertTransformer.transform({ equals: false, guard: false }), - createIs: () => CreateIsTransformer.transform(false), - createValidate: () => CreateValidateTransformer.transform(false), + createIs: () => CreateIsTransformer.transform({ equals: false }), + createValidate: () => + CreateValidateTransformer.transform({ equals: false }), createAssertEquals: () => CreateAssertTransformer.transform({ equals: true, guard: false }), createAssertGuardEquals: () => CreateAssertTransformer.transform({ equals: true, guard: true }), - createEquals: () => CreateIsTransformer.transform(true), - createValidateEquals: () => CreateValidateTransformer.transform(true), + createEquals: () => CreateIsTransformer.transform({ equals: true }), + createValidateEquals: () => + CreateValidateTransformer.transform({ equals: true }), createRandom: () => CreateRandomTransformer.transform, }, functional: { @@ -356,14 +356,12 @@ const FUNCTORS: Record Task>> = { createValidateQuery: () => CreateHttpValidateQueryTransformer.transform, }, llm: { - application: () => (project) => - LlmApplicationTransformer.transform(project), - schema: () => (project) => () => LlmSchemaTransformer.transform(project), + application: () => LlmApplicationTransformer.transform, + schema: () => LlmSchemaTransformer.transform, }, json: { // SCHEMA - application: () => (project) => () => - JsonApplicationTransformer.transform(project), + application: () => JsonApplicationTransformer.transform, // PARSER isParse: () => JsonIsParseTransformer.transform, @@ -415,13 +413,11 @@ const FUNCTORS: Record Task>> = { ProtobufCreateValidateDecodeTransformer.transform, }, reflect: { - metadata: () => (project) => () => - ReflectMetadataTransformer.transform(project), - name: () => (project) => () => ReflectNameTransformer.transform(project), + metadata: () => ReflectMetadataTransformer.transform, + name: () => ReflectNameTransformer.transform, }, misc: { - literals: () => (project) => () => - MiscLiteralsTransformer.transform(project), + literals: () => MiscLiteralsTransformer.transform, // CLONE clone: () => MiscCloneTransformer.transform, diff --git a/src/transformers/FileTransformer.ts b/src/transformers/FileTransformer.ts index 4dbca098b2..a562af595b 100644 --- a/src/transformers/FileTransformer.ts +++ b/src/transformers/FileTransformer.ts @@ -2,41 +2,41 @@ import ts from "typescript"; import { Singleton } from "../utils/Singleton"; -import { IProject } from "./IProject"; +import { ITypiaContext } from "./ITypiaContext"; import { NodeTransformer } from "./NodeTransformer"; import { TransformerError } from "./TransformerError"; export namespace FileTransformer { export const transform = - (environments: Omit) => - (context: ts.TransformationContext) => + (environments: Omit) => + (transformer: ts.TransformationContext) => (file: ts.SourceFile): ts.SourceFile => { if (file.isDeclarationFile) return file; - const project: IProject = { + const project: ITypiaContext = { ...environments, - context, + transformer, }; checkJsDocParsingMode.get(project, file); return ts.visitEachChild( file, (node) => iterate_node(project)(node), - context, + transformer, ); }; const iterate_node = - (project: IProject) => + (project: ITypiaContext) => (node: ts.Node): ts.Node => ts.visitEachChild( try_transform_node(project)(node) ?? node, (child) => iterate_node(project)(child), - project.context, + project.transformer, ); const try_transform_node = - (project: IProject) => + (project: ITypiaContext) => (node: ts.Node): ts.Node | null => { try { return NodeTransformer.transform(project)(node); @@ -65,7 +65,7 @@ const isTransformerError = (error: any): error is TransformerError => typeof error.message === "string"; const checkJsDocParsingMode = new Singleton( - (project: IProject, file: ts.SourceFile) => { + (project: ITypiaContext, file: ts.SourceFile) => { if ( typeof file.jsDocParsingMode === "number" && file.jsDocParsingMode !== 0 diff --git a/src/transformers/IProgrammerProps.ts b/src/transformers/IProgrammerProps.ts new file mode 100644 index 0000000000..3fa1fce8db --- /dev/null +++ b/src/transformers/IProgrammerProps.ts @@ -0,0 +1,11 @@ +import ts from "typescript"; + +import { ITypiaContext } from "./ITypiaContext"; + +export interface IProgrammerProps { + context: ITypiaContext; + modulo: ts.LeftHandSideExpression; + type: ts.Type; + name: string | undefined; + init?: ts.Expression | undefined; +} diff --git a/src/transformers/ITransformProps.ts b/src/transformers/ITransformProps.ts new file mode 100644 index 0000000000..386c110732 --- /dev/null +++ b/src/transformers/ITransformProps.ts @@ -0,0 +1,9 @@ +import ts from "typescript"; + +import { ITypiaContext } from "./ITypiaContext"; + +export interface ITransformProps { + context: ITypiaContext; + modulo: ts.LeftHandSideExpression; + expression: ts.CallExpression; +} diff --git a/src/transformers/IProject.ts b/src/transformers/ITypiaContext.ts similarity index 80% rename from src/transformers/IProject.ts rename to src/transformers/ITypiaContext.ts index 5138bf9627..e224593998 100644 --- a/src/transformers/IProject.ts +++ b/src/transformers/ITypiaContext.ts @@ -2,13 +2,13 @@ import ts from "typescript"; import { ITransformOptions } from "./ITransformOptions"; -export interface IProject { +export interface ITypiaContext { program: ts.Program; compilerOptions: ts.CompilerOptions; checker: ts.TypeChecker; printer: ts.Printer; options: ITransformOptions; - context: ts.TransformationContext; + transformer: ts.TransformationContext; extras: { addDiagnostic: (diag: ts.Diagnostic) => number; }; diff --git a/src/transformers/NodeTransformer.ts b/src/transformers/NodeTransformer.ts index 98e915c22f..494ebdf31b 100644 --- a/src/transformers/NodeTransformer.ts +++ b/src/transformers/NodeTransformer.ts @@ -1,11 +1,11 @@ import ts from "typescript"; import { CallExpressionTransformer } from "./CallExpressionTransformer"; -import { IProject } from "./IProject"; +import { ITypiaContext } from "./ITypiaContext"; export namespace NodeTransformer { export const transform = - (project: IProject) => + (project: ITypiaContext) => (expression: ts.Node): ts.Node | null => ts.isCallExpression(expression) && expression.parent ? CallExpressionTransformer.transform(project)(expression) diff --git a/src/transformers/features/AssertTransformer.ts b/src/transformers/features/AssertTransformer.ts index 4b64577eba..06eb67345c 100644 --- a/src/transformers/features/AssertTransformer.ts +++ b/src/transformers/features/AssertTransformer.ts @@ -1,16 +1,24 @@ import { AssertProgrammer } from "../../programmers/AssertProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace AssertTransformer { - export const transform = (props: { equals: boolean; guard: boolean }) => - GenericTransformer.scalar( - props.equals - ? props.guard - ? "assertGuardEquals" - : "assertEquals" - : props.guard - ? "assertGuard" - : "assert", - )((project) => (modulo) => AssertProgrammer.write(project)(modulo)(props)); + export const transform = + (config: AssertProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: config.equals + ? config.guard + ? "assertGuardEquals" + : "assertEquals" + : config.guard + ? "assertGuard" + : "assert", + write: (x) => + AssertProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/CreateAssertTransformer.ts b/src/transformers/features/CreateAssertTransformer.ts index 384ce79fb2..78485efef1 100644 --- a/src/transformers/features/CreateAssertTransformer.ts +++ b/src/transformers/features/CreateAssertTransformer.ts @@ -1,16 +1,24 @@ import { AssertProgrammer } from "../../programmers/AssertProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace CreateAssertTransformer { - export const transform = (props: { equals: boolean; guard: boolean }) => - GenericTransformer.factory( - props.equals - ? props.guard - ? "createAssertGuardEquals" - : "createAssertEquals" - : props.guard - ? "createAssertGuard" - : "createAssert", - )((project) => (modulo) => AssertProgrammer.write(project)(modulo)(props)); + export const transform = + (config: AssertProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: config.equals + ? config.guard + ? "assertGuardEquals" + : "assertEquals" + : config.guard + ? "assertGuard" + : "assert", + write: (x) => + AssertProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/CreateIsTransformer.ts b/src/transformers/features/CreateIsTransformer.ts index 3ace32e84c..56b2ebb1dd 100644 --- a/src/transformers/features/CreateIsTransformer.ts +++ b/src/transformers/features/CreateIsTransformer.ts @@ -1,10 +1,18 @@ import { IsProgrammer } from "../../programmers/IsProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace CreateIsTransformer { - export const transform = (equals: boolean) => - GenericTransformer.factory(equals ? "createEquals" : "createIs")( - (project) => (modulo) => IsProgrammer.write(project)(modulo)(equals), - ); + export const transform = + (config: IsProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: config.equals ? "equals" : "is", + write: (x) => + IsProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/CreateRandomTransformer.ts b/src/transformers/features/CreateRandomTransformer.ts index f0bc8a34d7..ac5bbc9a94 100644 --- a/src/transformers/features/CreateRandomTransformer.ts +++ b/src/transformers/features/CreateRandomTransformer.ts @@ -2,39 +2,42 @@ import ts from "typescript"; import { RandomProgrammer } from "../../programmers/RandomProgrammer"; -import { IProject } from "../IProject"; +import { ITransformProps } from "../ITransformProps"; import { TransformerError } from "../TransformerError"; export namespace CreateRandomTransformer { - export const transform = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression): ts.Expression => { - // CHECK GENERIC ARGUMENT EXISTENCE - if (!expression.typeArguments?.[0]) - throw new TransformerError({ - code: "typia.createRandom", - message: "generic argument is not specified.", - }); + export const transform = (props: ITransformProps): ts.Expression => { + // CHECK GENERIC ARGUMENT EXISTENCE + if (!props.expression.typeArguments?.[0]) + throw new TransformerError({ + code: "typia.createRandom", + message: "generic argument is not specified.", + }); - // GET TYPE INFO - const node: ts.TypeNode = expression.typeArguments[0]; - const type: ts.Type = project.checker.getTypeFromTypeNode(node); + // GET TYPE INFO + const node: ts.TypeNode = props.expression.typeArguments[0]; + const type: ts.Type = props.context.checker.getTypeFromTypeNode(node); - if (type.isTypeParameter()) - throw new TransformerError({ - code: "typia.createRandom", - message: "non-specified generic argument.", - }); + if (type.isTypeParameter()) + throw new TransformerError({ + code: "typia.createRandom", + message: "non-specified generic argument.", + }); - // DO TRANSFORM - return RandomProgrammer.write({ - ...project, + // DO TRANSFORM + return RandomProgrammer.write({ + context: { + ...props.context, options: { - ...project.options, + ...props.context.options, functional: false, numeric: false, }, - })(modulo)(expression.arguments?.[0])(type, node.getFullText().trim()); - }; + }, + modulo: props.modulo, + type, + name: node.getFullText().trim(), + init: props.expression.arguments?.[0], + }); + }; } diff --git a/src/transformers/features/CreateValidateTransformer.ts b/src/transformers/features/CreateValidateTransformer.ts index f583c38e1a..1968f181c4 100644 --- a/src/transformers/features/CreateValidateTransformer.ts +++ b/src/transformers/features/CreateValidateTransformer.ts @@ -1,13 +1,18 @@ import { ValidateProgrammer } from "../../programmers/ValidateProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace CreateValidateTransformer { - export const transform = (equals: boolean) => - GenericTransformer.factory( - equals ? "createValidateEquals" : "createValidate", - )( - (project) => (modulo) => - ValidateProgrammer.write(project)(modulo)(equals), - ); + export const transform = + (config: ValidateProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: config.equals ? "validateEquals" : "validate", + write: (x) => + ValidateProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/IsTransformer.ts b/src/transformers/features/IsTransformer.ts index 4146bce507..1cabf757b4 100644 --- a/src/transformers/features/IsTransformer.ts +++ b/src/transformers/features/IsTransformer.ts @@ -1,10 +1,18 @@ import { IsProgrammer } from "../../programmers/IsProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace IsTransformer { - export const transform = (equals: boolean) => - GenericTransformer.scalar(equals ? "equals" : "is")( - (project) => (modulo) => IsProgrammer.write(project)(modulo)(equals), - ); + export const transform = + (config: IsProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: config.equals ? "equals" : "is", + write: (x) => + IsProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/RandomTransformer.ts b/src/transformers/features/RandomTransformer.ts index b656dd4a7c..9e4a157802 100644 --- a/src/transformers/features/RandomTransformer.ts +++ b/src/transformers/features/RandomTransformer.ts @@ -2,43 +2,40 @@ import ts from "typescript"; import { RandomProgrammer } from "../../programmers/RandomProgrammer"; -import { IProject } from "../IProject"; +import { ITransformProps } from "../ITransformProps"; import { TransformerError } from "../TransformerError"; export namespace RandomTransformer { - export const transform = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression): ts.Expression => { - // CHECK GENERIC ARGUMENT EXISTENCE - if (!expression.typeArguments?.[0]) - throw new TransformerError({ - code: `typia.${modulo.getText()}`, - message: "generic argument is not specified.", - }); + export const transform = (props: ITransformProps): ts.Expression => { + // CHECK GENERIC ARGUMENT EXISTENCE + if (!props.expression.typeArguments?.[0]) + throw new TransformerError({ + code: `typia.${props.modulo.getText()}`, + message: "generic argument is not specified.", + }); - // GET TYPE INFO - const node: ts.TypeNode = expression.typeArguments[0]; - const type: ts.Type = project.checker.getTypeFromTypeNode(node); + // GET TYPE INFO + const node: ts.TypeNode = props.expression.typeArguments[0]; + const type: ts.Type = props.context.checker.getTypeFromTypeNode(node); - if (type.isTypeParameter()) - throw new TransformerError({ - code: `typia.${modulo.getText()}`, - message: "non-specified generic argument.", - }); + if (type.isTypeParameter()) + throw new TransformerError({ + code: `typia.${props.modulo.getText()}`, + message: "non-specified generic argument.", + }); - // DO TRANSFORM - return ts.factory.createCallExpression( - RandomProgrammer.write({ - ...project, - options: { - ...project.options, - functional: false, - numeric: false, - }, - })(modulo)()(type, node.getFullText().trim()), - undefined, - expression.arguments.length ? [expression.arguments[0]!] : undefined, - ); - }; + return ts.factory.createCallExpression( + RandomProgrammer.write({ + context: props.context, + modulo: props.modulo, + type, + name: node.getFullText().trim(), + init: undefined, + }), + undefined, + props.expression.arguments.length + ? [props.expression.arguments[0]!] + : undefined, + ); + }; } diff --git a/src/transformers/features/ValidateTransformer.ts b/src/transformers/features/ValidateTransformer.ts index 4bed1f5231..3a016f2408 100644 --- a/src/transformers/features/ValidateTransformer.ts +++ b/src/transformers/features/ValidateTransformer.ts @@ -1,11 +1,18 @@ import { ValidateProgrammer } from "../../programmers/ValidateProgrammer"; +import { ITransformProps } from "../ITransformProps"; import { GenericTransformer } from "../internal/GenericTransformer"; export namespace ValidateTransformer { - export const transform = (equals: boolean) => - GenericTransformer.scalar(equals ? "validateEquals" : "validate")( - (project) => (modulo) => - ValidateProgrammer.write(project)(modulo)(equals), - ); + export const transform = + (config: ValidateProgrammer.IConfig) => (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: config.equals ? "validateEquals" : "validate", + write: (x) => + ValidateProgrammer.write({ + ...x, + config, + }), + }); } diff --git a/src/transformers/features/functional/FunctionalGenericTransformer.ts b/src/transformers/features/functional/FunctionalGenericTransformer.ts index 4ef8f3e257..ceec15c639 100644 --- a/src/transformers/features/functional/FunctionalGenericTransformer.ts +++ b/src/transformers/features/functional/FunctionalGenericTransformer.ts @@ -2,7 +2,7 @@ import ts from "typescript"; import { TypeFactory } from "../../../factories/TypeFactory"; -import { IProject } from "../../IProject"; +import { ITypiaContext } from "../../ITypiaContext"; import { TransformerError } from "../../TransformerError"; export namespace FunctionalGenericTransformer { @@ -10,7 +10,7 @@ export namespace FunctionalGenericTransformer { (props: { method: string; programmer: ( - project: IProject, + project: ITypiaContext, ) => ( modulo: ts.LeftHandSideExpression, ) => ( @@ -22,7 +22,7 @@ export namespace FunctionalGenericTransformer { ) => ts.Expression; equals: boolean; }) => - (project: IProject) => + (project: ITypiaContext) => (modulo: ts.LeftHandSideExpression) => (expression: ts.CallExpression) => { // CHECK PARAMETER @@ -37,12 +37,6 @@ export namespace FunctionalGenericTransformer { expression.typeArguments && expression.typeArguments[0] ? project.checker.getTypeFromTypeNode(expression.typeArguments[0]) : project.checker.getTypeAtLocation(expression.arguments[0]!); - // if (type. === true) - // throw new TransformerError({ - // code: `typia.functional.${props.method}`, - // message: `non-specified generic argument.`, - // }); - // else if (TypeFactory.isFunction(type) === false) throw new TransformerError({ code: `typia.functional.${props.method}`, diff --git a/src/transformers/features/json/JsonApplicationTransformer.ts b/src/transformers/features/json/JsonApplicationTransformer.ts index f059dd8a2f..14ec01c32a 100644 --- a/src/transformers/features/json/JsonApplicationTransformer.ts +++ b/src/transformers/features/json/JsonApplicationTransformer.ts @@ -11,82 +11,82 @@ import { JsonApplicationProgrammer } from "../../../programmers/json/JsonApplica import { ValidationPipe } from "../../../typings/ValidationPipe"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace JsonApplicationTransformer { - export const transform = - (project: IProject) => - (expression: ts.CallExpression): ts.Expression => { - if (!expression.typeArguments?.length) - throw new TransformerError({ - code: "typia.json.application", - message: "no generic argument.", - }); + export const transform = ( + props: Pick, + ): ts.Expression => { + if (!props.expression.typeArguments?.length) + throw new TransformerError({ + code: "typia.json.application", + message: "no generic argument.", + }); - //---- - // GET ARGUMENTS - //---- - // VALIDATE TUPLE ARGUMENTS - const top: ts.Node = expression.typeArguments[0]!; - if (!ts.isTupleTypeNode(top)) return expression; - else if (top.elements.some((child) => !ts.isTypeNode(child))) - return expression; + //---- + // GET ARGUMENTS + //---- + // VALIDATE TUPLE ARGUMENTS + const top: ts.Node = props.expression.typeArguments[0]!; + if (!ts.isTupleTypeNode(top)) return props.expression; + else if (top.elements.some((child) => !ts.isTypeNode(child))) + return props.expression; - // GET TYPES - const types: ts.Type[] = top.elements.map((child) => - project.checker.getTypeFromTypeNode(child as ts.TypeNode), - ); - if (types.some((t) => t.isTypeParameter())) - throw new TransformerError({ - code: "typia.json.application", - message: "non-specified generic argument(s).", - }); + // GET TYPES + const types: ts.Type[] = top.elements.map((child) => + props.context.checker.getTypeFromTypeNode(child as ts.TypeNode), + ); + if (types.some((t) => t.isTypeParameter())) + throw new TransformerError({ + code: "typia.json.application", + message: "non-specified generic argument(s).", + }); - // ADDITIONAL PARAMETERS - const version: "3.0" | "3.1" = get_parameter<"3.0" | "3.1">({ - checker: project.checker, - name: "Version", - is: (str) => str === "3.0" || str === "3.1", - cast: (str) => str as "3.0" | "3.1", - default: () => "3.1", - })(expression.typeArguments[1]); + // ADDITIONAL PARAMETERS + const version: "3.0" | "3.1" = get_parameter<"3.0" | "3.1">({ + checker: props.context.checker, + name: "Version", + is: (str) => str === "3.0" || str === "3.1", + cast: (str) => str as "3.0" | "3.1", + default: () => "3.1", + })(props.expression.typeArguments[1]); - //---- - // GENERATORS - //---- - // METADATA - const collection: MetadataCollection = new MetadataCollection({ - replace: MetadataCollection.replace, - }); - const results: ValidationPipe[] = - types.map((type) => - MetadataFactory.analyze( - project.checker, - project.context, - )({ - escape: true, - constant: true, - absorb: false, - validate: JsonApplicationProgrammer.validate, - })(collection)(type), - ); + //---- + // GENERATORS + //---- + // METADATA + const collection: MetadataCollection = new MetadataCollection({ + replace: MetadataCollection.replace, + }); + const results: ValidationPipe[] = + types.map((type) => + MetadataFactory.analyze( + props.context.checker, + props.context.transformer, + )({ + escape: true, + constant: true, + absorb: false, + validate: JsonApplicationProgrammer.validate, + })(collection)(type), + ); - // REPORT BUG IF REQUIRED - const metadatas: Metadata[] = []; - const errors: MetadataFactory.IError[] = []; - for (const r of results) { - if (r.success === false) errors.push(...r.errors); - else metadatas.push(r.data); - } - if (errors.length) - throw TransformerError.from("typia.json.application")(errors); + // REPORT BUG IF REQUIRED + const metadatas: Metadata[] = []; + const errors: MetadataFactory.IError[] = []; + for (const r of results) { + if (r.success === false) errors.push(...r.errors); + else metadatas.push(r.data); + } + if (errors.length) + throw TransformerError.from("typia.json.application")(errors); - // APPLICATION - const app: IJsonApplication = - JsonApplicationProgrammer.write(version)(metadatas); - return LiteralFactory.generate(app); - }; + // APPLICATION + const app: IJsonApplication = + JsonApplicationProgrammer.write(version)(metadatas); + return LiteralFactory.generate(app); + }; const get_parameter = (props: { diff --git a/src/transformers/features/json/JsonAssertParseTransformer.ts b/src/transformers/features/json/JsonAssertParseTransformer.ts index bb4cb008d1..e5509a9ed5 100644 --- a/src/transformers/features/json/JsonAssertParseTransformer.ts +++ b/src/transformers/features/json/JsonAssertParseTransformer.ts @@ -1,9 +1,13 @@ import { JsonAssertParseProgrammer } from "../../../programmers/json/JsonAssertParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonAssertParseTransformer { - export const transform = GenericTransformer.scalar("json.assertParse")( - (project) => (modulo) => JsonAssertParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.assertParse", + write: JsonAssertParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonAssertStringifyTransformer.ts b/src/transformers/features/json/JsonAssertStringifyTransformer.ts index b0bd9330af..4ac68a3491 100644 --- a/src/transformers/features/json/JsonAssertStringifyTransformer.ts +++ b/src/transformers/features/json/JsonAssertStringifyTransformer.ts @@ -1,10 +1,13 @@ import { JsonAssertStringifyProgrammer } from "../../../programmers/json/JsonAssertStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonAssertStringifyTransformer { - export const transform = GenericTransformer.scalar("json.assertStringify")( - (project) => (modulo) => - JsonAssertStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.assertStringify", + write: JsonAssertStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateAssertParseTransformer.ts b/src/transformers/features/json/JsonCreateAssertParseTransformer.ts index 8533089b4e..966b230f60 100644 --- a/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +++ b/src/transformers/features/json/JsonCreateAssertParseTransformer.ts @@ -1,9 +1,13 @@ import { JsonAssertParseProgrammer } from "../../../programmers/json/JsonAssertParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateAssertParseTransformer { - export const transform = GenericTransformer.factory("json.createAssertParse")( - (project) => (modulo) => JsonAssertParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createAssertParse", + write: JsonAssertParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts b/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts index 52b807d8ef..d88f4769f5 100644 --- a/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +++ b/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts @@ -1,12 +1,13 @@ import { JsonAssertStringifyProgrammer } from "../../../programmers/json/JsonAssertStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateAssertStringifyTransformer { - export const transform = GenericTransformer.factory( - "json.createAssertStringify", - )( - (project) => (modulo) => - JsonAssertStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createAssertStringify", + write: JsonAssertStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateIsParseTransformer.ts b/src/transformers/features/json/JsonCreateIsParseTransformer.ts index 6379f65890..fa0acc0a41 100644 --- a/src/transformers/features/json/JsonCreateIsParseTransformer.ts +++ b/src/transformers/features/json/JsonCreateIsParseTransformer.ts @@ -1,9 +1,13 @@ import { JsonIsParseProgrammer } from "../../../programmers/json/JsonIsParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateIsParseTransformer { - export const transform = GenericTransformer.factory("json.createIsParse")( - (project) => (modulo) => JsonIsParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createIsParse", + write: JsonIsParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts b/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts index ab65e325a5..2192226d4a 100644 --- a/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +++ b/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts @@ -1,9 +1,13 @@ -import { JsonIsStringifyProgrammer } from "../../../programmers/json/JsonIsStringifyProgrammer"; +import { JsonStringifyProgrammer } from "../../../programmers/json/JsonStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateIsStringifyTransformer { - export const transform = GenericTransformer.factory("json.createIsStringify")( - (project) => (modulo) => JsonIsStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.stringify", + write: JsonStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateStringifyTransformer.ts b/src/transformers/features/json/JsonCreateStringifyTransformer.ts index a2e8bd3c97..ec8a3bb16f 100644 --- a/src/transformers/features/json/JsonCreateStringifyTransformer.ts +++ b/src/transformers/features/json/JsonCreateStringifyTransformer.ts @@ -1,9 +1,13 @@ import { JsonStringifyProgrammer } from "../../../programmers/json/JsonStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateStringifyTransformer { - export const transform = GenericTransformer.factory("json.createStringify")( - (project) => (modulo) => JsonStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createStringify", + write: JsonStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateValidateParseTransformer.ts b/src/transformers/features/json/JsonCreateValidateParseTransformer.ts index 40281e3c58..bcd4921fac 100644 --- a/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +++ b/src/transformers/features/json/JsonCreateValidateParseTransformer.ts @@ -1,11 +1,13 @@ import { JsonValidateParseProgrammer } from "../../../programmers/json/JsonValidateParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateValidateParseTransformer { - export const transform = GenericTransformer.factory( - "json.createValidateParse", - )( - (project) => (modulo) => JsonValidateParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createValidateParse", + write: JsonValidateParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts b/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts index 6653204e23..3ba39bec17 100644 --- a/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +++ b/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts @@ -1,12 +1,13 @@ import { JsonValidateStringifyProgrammer } from "../../../programmers/json/JsonValidateStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonCreateValidateStringifyTransformer { - export const transform = GenericTransformer.factory( - "json.createValidateStringify", - )( - (project) => (modulo) => - JsonValidateStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "json.createValidateStringify", + write: JsonValidateStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonIsParseTransformer.ts b/src/transformers/features/json/JsonIsParseTransformer.ts index 65fbf40a4a..3629a1d92c 100644 --- a/src/transformers/features/json/JsonIsParseTransformer.ts +++ b/src/transformers/features/json/JsonIsParseTransformer.ts @@ -1,9 +1,13 @@ import { JsonIsParseProgrammer } from "../../../programmers/json/JsonIsParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonIsParseTransformer { - export const transform = GenericTransformer.scalar("json.isParse")( - (project) => (modulo) => JsonIsParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.isParse", + write: JsonIsParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonIsStringifyTransformer.ts b/src/transformers/features/json/JsonIsStringifyTransformer.ts index 65ce3a5619..3533660239 100644 --- a/src/transformers/features/json/JsonIsStringifyTransformer.ts +++ b/src/transformers/features/json/JsonIsStringifyTransformer.ts @@ -1,9 +1,13 @@ import { JsonIsStringifyProgrammer } from "../../../programmers/json/JsonIsStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonIsStringifyTransformer { - export const transform = GenericTransformer.scalar("json.isStringify")( - (project) => (modulo) => JsonIsStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.isStringify", + write: JsonIsStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonStringifyTransformer.ts b/src/transformers/features/json/JsonStringifyTransformer.ts index d25de51ebe..bb059cf8d8 100644 --- a/src/transformers/features/json/JsonStringifyTransformer.ts +++ b/src/transformers/features/json/JsonStringifyTransformer.ts @@ -1,9 +1,13 @@ import { JsonStringifyProgrammer } from "../../../programmers/json/JsonStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonStringifyTransformer { - export const transform = GenericTransformer.scalar("json.stringify")( - (project) => (modulo) => JsonStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.stringify", + write: JsonStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonValidateParseTransformer.ts b/src/transformers/features/json/JsonValidateParseTransformer.ts index 93a09533f6..5decc11ef4 100644 --- a/src/transformers/features/json/JsonValidateParseTransformer.ts +++ b/src/transformers/features/json/JsonValidateParseTransformer.ts @@ -1,9 +1,13 @@ import { JsonValidateParseProgrammer } from "../../../programmers/json/JsonValidateParseProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonValidateParseTransformer { - export const transform = GenericTransformer.scalar("json.validatParse")( - (project) => (modulo) => JsonValidateParseProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.validatParse", + write: JsonValidateParseProgrammer.write, + }); } diff --git a/src/transformers/features/json/JsonValidateStringifyTransformer.ts b/src/transformers/features/json/JsonValidateStringifyTransformer.ts index 9ca8f80569..a8a764f9fe 100644 --- a/src/transformers/features/json/JsonValidateStringifyTransformer.ts +++ b/src/transformers/features/json/JsonValidateStringifyTransformer.ts @@ -1,10 +1,13 @@ import { JsonValidateStringifyProgrammer } from "../../../programmers/json/JsonValidateStringifyProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace JsonValidateStringifyTransformer { - export const transform = GenericTransformer.scalar("json.validatStringify")( - (project) => (modulo) => - JsonValidateStringifyProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "json.validatStringify", + write: JsonValidateStringifyProgrammer.write, + }); } diff --git a/src/transformers/features/llm/LlmApplicationTransformer.ts b/src/transformers/features/llm/LlmApplicationTransformer.ts index f39324c9c3..ee068470ff 100644 --- a/src/transformers/features/llm/LlmApplicationTransformer.ts +++ b/src/transformers/features/llm/LlmApplicationTransformer.ts @@ -15,73 +15,66 @@ import { LlmApplicationProgrammer } from "../../../programmers/llm/LlmApplicatio import { ValidationPipe } from "../../../typings/ValidationPipe"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace LlmApplicationTransformer { - export const transform = - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression): ts.Expression => { - // GET GENERIC ARGUMENT - if (!expression.typeArguments?.length) - throw new TransformerError({ - code: "typia.llm.schema", - message: "no generic argument.", - }); + export const transform = (props: ITransformProps): ts.Expression => { + // GET GENERIC ARGUMENT + if (!props.expression.typeArguments?.length) + throw new TransformerError({ + code: "typia.llm.schema", + message: "no generic argument.", + }); - const top: ts.Node = expression.typeArguments[0]!; - if (ts.isTypeNode(top) === false) return expression; + const top: ts.Node = props.expression.typeArguments[0]!; + if (ts.isTypeNode(top) === false) return props.expression; - // GET TYPE - const type: ts.Type = project.checker.getTypeFromTypeNode(top); - const collection: MetadataCollection = new MetadataCollection({ - replace: MetadataCollection.replace, - }); - const result: ValidationPipe = - MetadataFactory.analyze( - project.checker, - project.context, - )({ - escape: true, - constant: true, - absorb: false, - functional: true, - validate: LlmApplicationProgrammer.validate, - })(collection)(type); - if (result.success === false) - throw TransformerError.from("typia.llm.application")(result.errors); + // GET TYPE + const type: ts.Type = props.context.checker.getTypeFromTypeNode(top); + const collection: MetadataCollection = new MetadataCollection({ + replace: MetadataCollection.replace, + }); + const result: ValidationPipe = + MetadataFactory.analyze( + props.context.checker, + props.context.transformer, + )({ + escape: true, + constant: true, + absorb: false, + functional: true, + validate: LlmApplicationProgrammer.validate, + })(collection)(type); + if (result.success === false) + throw TransformerError.from("typia.llm.application")(result.errors); - // GENERATE LLM APPLICATION - const schema: ILlmApplication = LlmApplicationProgrammer.write( - result.data, - ); + // GENERATE LLM APPLICATION + const schema: ILlmApplication = LlmApplicationProgrammer.write(result.data); - return ExpressionFactory.selfCall( - ts.factory.createBlock( - [ - StatementFactory.constant("app", LiteralFactory.generate(schema)), - ts.factory.createExpressionStatement( - ts.factory.createCallExpression( - ts.factory.createAsExpression( - IdentifierFactory.access(modulo)("finalize"), - TypeFactory.keyword("any"), - ), - undefined, - [ - ts.factory.createIdentifier("app"), - ...(expression.arguments?.[0] - ? [expression.arguments[0]] - : []), - ], + return ExpressionFactory.selfCall( + ts.factory.createBlock( + [ + StatementFactory.constant("app", LiteralFactory.generate(schema)), + ts.factory.createExpressionStatement( + ts.factory.createCallExpression( + ts.factory.createAsExpression( + IdentifierFactory.access(props.modulo)("finalize"), + TypeFactory.keyword("any"), ), + undefined, + [ + ts.factory.createIdentifier("app"), + ...(props.expression.arguments?.[0] + ? [props.expression.arguments[0]] + : []), + ], ), - ts.factory.createReturnStatement( - ts.factory.createIdentifier("app"), - ), - ], - true, - ), - ); - }; + ), + ts.factory.createReturnStatement(ts.factory.createIdentifier("app")), + ], + true, + ), + ); + }; } diff --git a/src/transformers/features/llm/LlmSchemaTransformer.ts b/src/transformers/features/llm/LlmSchemaTransformer.ts index b1dfd08f3a..f197efa6cd 100644 --- a/src/transformers/features/llm/LlmSchemaTransformer.ts +++ b/src/transformers/features/llm/LlmSchemaTransformer.ts @@ -11,43 +11,43 @@ import { LlmSchemaProgrammer } from "../../../programmers/llm/LlmSchemaProgramme import { ValidationPipe } from "../../../typings/ValidationPipe"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace LlmSchemaTransformer { - export const transform = - (project: IProject) => - (expression: ts.CallExpression): ts.Expression => { - // GET GENERIC ARGUMENT - if (!expression.typeArguments?.length) - throw new TransformerError({ - code: "typia.llm.schema", - message: "no generic argument.", - }); - - const top: ts.Node = expression.typeArguments[0]!; - if (ts.isTypeNode(top) === false) return expression; - - // GET TYPE - const type: ts.Type = project.checker.getTypeFromTypeNode(top); - const collection: MetadataCollection = new MetadataCollection({ - replace: MetadataCollection.replace, + export const transform = ( + props: Omit, + ): ts.Expression => { + // GET GENERIC ARGUMENT + if (!props.expression.typeArguments?.length) + throw new TransformerError({ + code: "typia.llm.schema", + message: "no generic argument.", }); - const result: ValidationPipe = - MetadataFactory.analyze( - project.checker, - project.context, - )({ - escape: true, - constant: true, - absorb: false, - validate: LlmSchemaProgrammer.validate, - })(collection)(type); - if (result.success === false) - throw TransformerError.from("typia.llm.schema")(result.errors); - - // GENERATE LLM SCHEMA - const schema: ILlmSchema = LlmSchemaProgrammer.write(result.data); - return LiteralFactory.generate(schema); - }; + + const top: ts.Node = props.expression.typeArguments[0]!; + if (ts.isTypeNode(top) === false) return props.expression; + + // GET TYPE + const type: ts.Type = props.context.checker.getTypeFromTypeNode(top); + const collection: MetadataCollection = new MetadataCollection({ + replace: MetadataCollection.replace, + }); + const result: ValidationPipe = + MetadataFactory.analyze( + props.context.checker, + props.context.transformer, + )({ + escape: true, + constant: true, + absorb: false, + validate: LlmSchemaProgrammer.validate, + })(collection)(type); + if (result.success === false) + throw TransformerError.from("typia.llm.schema")(result.errors); + + // GENERATE LLM SCHEMA + const schema: ILlmSchema = LlmSchemaProgrammer.write(result.data); + return LiteralFactory.generate(schema); + }; } diff --git a/src/transformers/features/misc/MiscLiteralsTransformer.ts b/src/transformers/features/misc/MiscLiteralsTransformer.ts index 468374e92a..4250680a1a 100644 --- a/src/transformers/features/misc/MiscLiteralsTransformer.ts +++ b/src/transformers/features/misc/MiscLiteralsTransformer.ts @@ -2,31 +2,34 @@ import ts from "typescript"; import { MiscLiteralsProgrammer } from "../../../programmers/misc/MiscLiteralsProgrammer"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace MiscLiteralsTransformer { - export const transform = - (project: IProject) => - (expression: ts.CallExpression): ts.Expression => { - // CHECK GENERIC ARGUMENT EXISTENCE - if (!expression.typeArguments?.[0]) - throw new TransformerError({ - code: "typia.misc.literals", - message: "generic argument is not specified.", - }); + export const transform = ( + props: Omit, + ): ts.Expression => { + // CHECK GENERIC ARGUMENT EXISTENCE + if (!props.expression.typeArguments?.[0]) + throw new TransformerError({ + code: "typia.misc.literals", + message: "generic argument is not specified.", + }); - // GET TYPE INFO - const node: ts.TypeNode = expression.typeArguments[0]; - const type: ts.Type = project.checker.getTypeFromTypeNode(node); + // GET TYPE INFO + const node: ts.TypeNode = props.expression.typeArguments[0]; + const type: ts.Type = props.context.checker.getTypeFromTypeNode(node); - if (type.isTypeParameter()) - throw new TransformerError({ - code: "typia.misc.literals", - message: "non-specified generic argument.", - }); + if (type.isTypeParameter()) + throw new TransformerError({ + code: "typia.misc.literals", + message: "non-specified generic argument.", + }); - // DO TRANSFORM - return MiscLiteralsProgrammer.write(project)(type); - }; + // DO TRANSFORM + return MiscLiteralsProgrammer.write({ + context: props.context, + type, + }); + }; } diff --git a/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts index 5974232c8a..2273084be1 100644 --- a/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts @@ -1,10 +1,13 @@ import { ProtobufAssertDecodeProgrammer } from "../../../programmers/protobuf/ProtobufAssertDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufAssertDecodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.assertDecode")( - (project) => (modulo) => - ProtobufAssertDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.assertDecode", + write: ProtobufAssertDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts index febfca7cc0..fd70802898 100644 --- a/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts @@ -1,10 +1,13 @@ import { ProtobufAssertEncodeProgrammer } from "../../../programmers/protobuf/ProtobufAssertEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufAssertEncodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.assertEncode")( - (project) => (modulo) => - ProtobufAssertEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.assertEncode", + write: ProtobufAssertEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts index 3124fa44dc..13f3a8e1ad 100644 --- a/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts @@ -1,12 +1,13 @@ import { ProtobufAssertDecodeProgrammer } from "../../../programmers/protobuf/ProtobufAssertDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateAssertDecodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createAssertDecode", - )( - (project) => (modulo) => - ProtobufAssertDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createAssertDecode", + write: ProtobufAssertDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts index d930526e12..e81d9e23f7 100644 --- a/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts @@ -1,12 +1,13 @@ import { ProtobufAssertEncodeProgrammer } from "../../../programmers/protobuf/ProtobufAssertEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateAssertEncodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createAssertEncode", - )( - (project) => (modulo) => - ProtobufAssertEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createAssertEncode", + write: ProtobufAssertEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts index 5d1d522854..d69e1404cb 100644 --- a/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufDecodeProgrammer } from "../../../programmers/protobuf/ProtobufDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateDecodeTransformer { - export const transform = GenericTransformer.factory("protobuf.createDecode")( - (project) => (modulo) => ProtobufDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createDecode", + write: ProtobufDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts index 8350682da1..8d7a20799e 100644 --- a/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufEncodeProgrammer } from "../../../programmers/protobuf/ProtobufEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateEncodeTransformer { - export const transform = GenericTransformer.factory("protobuf.createEncode")( - (project) => (modulo) => ProtobufEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createEncode", + write: ProtobufEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts index dd0a678a3c..a3c936169b 100644 --- a/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufIsDecodeProgrammer } from "../../../programmers/protobuf/ProtobufIsDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateIsDecodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createIsDecode", - )((project) => (modulo) => ProtobufIsDecodeProgrammer.write(project)(modulo)); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createIsDecode", + write: ProtobufIsDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts index f090d0a37b..b1eb339eeb 100644 --- a/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufIsEncodeProgrammer } from "../../../programmers/protobuf/ProtobufIsEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateIsEncodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createIsEncode", - )((project) => (modulo) => ProtobufIsEncodeProgrammer.write(project)(modulo)); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createIsEncode", + write: ProtobufIsEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts index 06f80923a9..6b8f7f4929 100644 --- a/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts @@ -1,12 +1,13 @@ import { ProtobufValidateDecodeProgrammer } from "../../../programmers/protobuf/ProtobufValidateDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateValidateDecodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createValidateDecode", - )( - (project) => (modulo) => - ProtobufValidateDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createValidateDecode", + write: ProtobufValidateDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts index 324dd29536..0e7cebb156 100644 --- a/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts @@ -1,12 +1,13 @@ import { ProtobufValidateEncodeProgrammer } from "../../../programmers/protobuf/ProtobufValidateEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufCreateValidateEncodeTransformer { - export const transform = GenericTransformer.factory( - "protobuf.createValidateEncode", - )( - (project) => (modulo) => - ProtobufValidateEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.factory({ + ...props, + method: "protobuf.createValidateEncode", + write: ProtobufValidateEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts index ecf847aeeb..212d9b752c 100644 --- a/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufDecodeProgrammer } from "../../../programmers/protobuf/ProtobufDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufDecodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.decode")( - (project) => (modulo) => ProtobufDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.decode", + write: ProtobufDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts index c41bb47509..40bdab0b45 100644 --- a/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufEncodeProgrammer } from "../../../programmers/protobuf/ProtobufEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufEncodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.encode")( - (project) => (modulo) => ProtobufEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.encode", + write: ProtobufEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts index 59c42c3fc8..69d034c691 100644 --- a/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufIsDecodeProgrammer } from "../../../programmers/protobuf/ProtobufIsDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufIsDecodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.isDecode")( - (project) => (modulo) => ProtobufIsDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.isDecode", + write: ProtobufIsDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts index e576a2ab8d..c9d9690bbb 100644 --- a/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts @@ -1,9 +1,13 @@ import { ProtobufIsEncodeProgrammer } from "../../../programmers/protobuf/ProtobufIsEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufIsEncodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.isEncode")( - (project) => (modulo) => ProtobufIsEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.isEncode", + write: ProtobufIsEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufMessageTransformer.ts b/src/transformers/features/protobuf/ProtobufMessageTransformer.ts index 12480dbc47..937797b6a9 100644 --- a/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufMessageTransformer.ts @@ -2,32 +2,34 @@ import ts from "typescript"; import { ProtobufMessageProgrammer } from "../../../programmers/protobuf/ProtobufMessageProgrammer"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace ProtobufMessageTransformer { - export const transform = - (project: IProject) => - (_modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression): ts.Expression => { - // CHECK GENERIC ARGUMENT EXISTENCE - if (!expression.typeArguments || !expression.typeArguments[0]) - throw new TransformerError({ - code: "typia.protobuf.message", - message: "generic argument is not specified.", - }); + export const transform = ( + props: Pick, + ): ts.Expression => { + // CHECK GENERIC ARGUMENT EXISTENCE + if (!props.expression.typeArguments || !props.expression.typeArguments[0]) + throw new TransformerError({ + code: "typia.protobuf.message", + message: "generic argument is not specified.", + }); - // GET TYPE INFO - const type: ts.Type = project.checker.getTypeFromTypeNode( - expression.typeArguments[0], - ); - if (type.isTypeParameter()) - throw new TransformerError({ - code: "tyipa.protobuf.message", - message: "non-specified generic argument.", - }); + // GET TYPE INFO + const type: ts.Type = props.context.checker.getTypeFromTypeNode( + props.expression.typeArguments[0], + ); + if (type.isTypeParameter()) + throw new TransformerError({ + code: "tyipa.protobuf.message", + message: "non-specified generic argument.", + }); - // DO TRANSFORM - return ProtobufMessageProgrammer.write(project)(type); - }; + // DO TRANSFORM + return ProtobufMessageProgrammer.write({ + context: props.context, + type, + }); + }; } diff --git a/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts b/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts index be8d10726b..d861809df3 100644 --- a/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts @@ -1,10 +1,13 @@ import { ProtobufValidateDecodeProgrammer } from "../../../programmers/protobuf/ProtobufValidateDecodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufValidateDecodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.validateDecode")( - (project) => (modulo) => - ProtobufValidateDecodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.validateDecode", + write: ProtobufValidateDecodeProgrammer.write, + }); } diff --git a/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts b/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts index b7e02eef38..0b213e2741 100644 --- a/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +++ b/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts @@ -1,10 +1,13 @@ import { ProtobufValidateEncodeProgrammer } from "../../../programmers/protobuf/ProtobufValidateEncodeProgrammer"; +import { ITransformProps } from "../../ITransformProps"; import { GenericTransformer } from "../../internal/GenericTransformer"; export namespace ProtobufValidateEncodeTransformer { - export const transform = GenericTransformer.scalar("protobuf.validateEncode")( - (project) => (modulo) => - ProtobufValidateEncodeProgrammer.write(project)(modulo), - ); + export const transform = (props: ITransformProps) => + GenericTransformer.scalar({ + ...props, + method: "protobuf.validateEncode", + write: ProtobufValidateEncodeProgrammer.write, + }); } diff --git a/src/transformers/features/reflect/ReflectMetadataTransformer.ts b/src/transformers/features/reflect/ReflectMetadataTransformer.ts index db7c9427af..7e70469ac9 100644 --- a/src/transformers/features/reflect/ReflectMetadataTransformer.ts +++ b/src/transformers/features/reflect/ReflectMetadataTransformer.ts @@ -7,57 +7,57 @@ import { MetadataFactory } from "../../../factories/MetadataFactory"; import { IMetadataApplication } from "../../../schemas/metadata/IMetadataApplication"; import { Metadata } from "../../../schemas/metadata/Metadata"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; import { TransformerError } from "../../TransformerError"; export namespace ReflectMetadataTransformer { - export const transform = - (project: IProject) => - (expression: ts.CallExpression): ts.Expression => { - if (!expression.typeArguments?.length) - throw new TransformerError({ - code: "typia.reflect.metadata", - message: "no generic argument.", - }); - - // VALIDATE TUPLE ARGUMENTS - const top: ts.Node = expression.typeArguments[0]!; - if (!ts.isTupleTypeNode(top)) return expression; - else if (top.elements.some((child) => !ts.isTypeNode(child))) - return expression; - - // GET TYPES - const types: ts.Type[] = top.elements.map((child) => - project.checker.getTypeFromTypeNode(child as ts.TypeNode), - ); - if (types.some((t) => t.isTypeParameter())) - throw new TransformerError({ - code: "typia.reflect.metadata", - message: "non-specified generic argument(s).", - }); - - // METADATA - const collection: MetadataCollection = new MetadataCollection(); - const metadatas: Array = types.map((type) => { - const result = MetadataFactory.analyze( - project.checker, - project.context, - )({ - escape: true, - constant: true, - absorb: true, - functional: true, - })(collection)(type); - if (result.success === false) - throw TransformerError.from("typia.reflect.metadata")(result.errors); - return result.data; + export const transform = ( + props: Pick, + ): ts.Expression => { + if (!props.expression.typeArguments?.length) + throw new TransformerError({ + code: "typia.reflect.metadata", + message: "no generic argument.", }); - // CONVERT TO PRIMITIVE TYPE - const app: IMetadataApplication = { - metadatas: metadatas.map((metadata) => metadata.toJSON()), - components: collection.toJSON(), - }; - return LiteralFactory.generate(app); + // VALIDATE TUPLE ARGUMENTS + const top: ts.Node = props.expression.typeArguments[0]!; + if (!ts.isTupleTypeNode(top)) return props.expression; + else if (top.elements.some((child) => !ts.isTypeNode(child))) + return props.expression; + + // GET TYPES + const types: ts.Type[] = top.elements.map((child) => + props.context.checker.getTypeFromTypeNode(child as ts.TypeNode), + ); + if (types.some((t) => t.isTypeParameter())) + throw new TransformerError({ + code: "typia.reflect.metadata", + message: "non-specified generic argument(s).", + }); + + // METADATA + const collection: MetadataCollection = new MetadataCollection(); + const metadatas: Array = types.map((type) => { + const result = MetadataFactory.analyze( + props.context.checker, + props.context.transformer, + )({ + escape: true, + constant: true, + absorb: true, + functional: true, + })(collection)(type); + if (result.success === false) + throw TransformerError.from("typia.reflect.metadata")(result.errors); + return result.data; + }); + + // CONVERT TO PRIMITIVE TYPE + const app: IMetadataApplication = { + metadatas: metadatas.map((metadata) => metadata.toJSON()), + components: collection.toJSON(), }; + return LiteralFactory.generate(app); + }; } diff --git a/src/transformers/features/reflect/ReflectNameTransformer.ts b/src/transformers/features/reflect/ReflectNameTransformer.ts index 7d8557943d..bb7aef5059 100644 --- a/src/transformers/features/reflect/ReflectNameTransformer.ts +++ b/src/transformers/features/reflect/ReflectNameTransformer.ts @@ -7,60 +7,70 @@ import { Metadata } from "../../../schemas/metadata/Metadata"; import { ValidationPipe } from "../../../typings/ValidationPipe"; -import { IProject } from "../../IProject"; +import { ITransformProps } from "../../ITransformProps"; +import { ITypiaContext } from "../../ITypiaContext"; import { TransformerError } from "../../TransformerError"; export namespace ReflectNameTransformer { - export const transform = - (project: IProject) => - (expression: ts.CallExpression): ts.Expression => { - if (!expression.typeArguments?.length) - throw new TransformerError({ - code: "typia.reflect.metadata", - message: "no generic argument.", - }); - const top: ts.Node = expression.typeArguments[0]!; - const regular: boolean = (() => { - // CHECK SECOND ARGUMENT EXISTENCE - const second: ts.Node | undefined = expression.typeArguments[1]!; - if (second === undefined) return false; + export const transform = ( + props: Pick, + ): ts.Expression => { + if (!props.expression.typeArguments?.length) + throw new TransformerError({ + code: "typia.reflect.metadata", + message: "no generic argument.", + }); + const top: ts.Node = props.expression.typeArguments[0]!; + const regular: boolean = (() => { + // CHECK SECOND ARGUMENT EXISTENCE + const second: ts.Node | undefined = props.expression.typeArguments[1]!; + if (second === undefined) return false; - // GET BOOELAN VALUE - const value: Metadata = getMetadata(project)(second); - return value.size() === 1 && - value.constants.length === 1 && - value.constants[0]!.type === "boolean" && - value.constants[0]!.values.length === 1 - ? (value.constants[0]!.values[0]!.value as boolean) - : false; - })(); + // GET BOOELAN VALUE + const value: Metadata = getMetadata({ + context: props.context, + node: second, + }); + return value.size() === 1 && + value.constants.length === 1 && + value.constants[0]!.type === "boolean" && + value.constants[0]!.values.length === 1 + ? (value.constants[0]!.values[0]!.value as boolean) + : false; + })(); - // RETURNS NAME - return ts.factory.createStringLiteral( - regular ? getMetadata(project)(top).getName() : top.getFullText(), - ); - }; -} - -const getMetadata = - (project: IProject) => - (node: ts.Node): Metadata => { - const type: ts.Type = project.checker.getTypeFromTypeNode( - node as ts.TypeNode, + // RETURNS NAME + return ts.factory.createStringLiteral( + regular + ? getMetadata({ + context: props.context, + node: top, + }).getName() + : top.getFullText(), ); - const collection: MetadataCollection = new MetadataCollection({ - replace: MetadataCollection.replace, - }); - const result: ValidationPipe = - MetadataFactory.analyze( - project.checker, - project.context, - )({ - escape: false, - constant: true, - absorb: false, - })(collection)(type); - if (result.success === false) - throw TransformerError.from("typia.reflect.name")(result.errors); - return result.data; }; +} + +const getMetadata = (props: { + context: ITypiaContext; + node: ts.Node; +}): Metadata => { + const type: ts.Type = props.context.checker.getTypeFromTypeNode( + props.node as ts.TypeNode, + ); + const collection: MetadataCollection = new MetadataCollection({ + replace: MetadataCollection.replace, + }); + const result: ValidationPipe = + MetadataFactory.analyze( + props.context.checker, + props.context.transformer, + )({ + escape: false, + constant: true, + absorb: false, + })(collection)(type); + if (result.success === false) + throw TransformerError.from("typia.reflect.name")(result.errors); + return result.data; +}; diff --git a/src/transformers/internal/GenericTransformer.ts b/src/transformers/internal/GenericTransformer.ts index a5c8294085..0fb2958165 100644 --- a/src/transformers/internal/GenericTransformer.ts +++ b/src/transformers/internal/GenericTransformer.ts @@ -1,104 +1,101 @@ import ts from "typescript"; -import { IProject } from "../IProject"; +import { IProgrammerProps } from "../IProgrammerProps"; +import { ITransformProps } from "../ITransformProps"; import { TransformerError } from "../TransformerError"; export namespace GenericTransformer { - export const scalar = - (method: string) => - ( - programmer: ( - project: IProject, - ) => ( - modulo: ts.LeftHandSideExpression, - ) => (type: ts.Type, name: string) => ts.Expression | ts.ArrowFunction, - ) => - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression) => { - // CHECK PARAMETER - if (expression.arguments.length === 0) - throw new TransformerError({ - code: `typia.${method}`, - message: `no input value.`, - }); + export interface IProps extends ITransformProps { + method: string; + write: (props: IProgrammerProps) => ts.Expression | ts.ArrowFunction; + } - // GET TYPE INFO - const [type, node, generic]: [ts.Type, ts.Node, boolean] = - expression.typeArguments && expression.typeArguments[0] - ? [ - project.checker.getTypeFromTypeNode(expression.typeArguments[0]), - expression.typeArguments[0], - true, - ] - : [ - project.checker.getTypeAtLocation(expression.arguments[0]!), - expression.arguments[0]!, - false, - ]; - if (type.isTypeParameter()) - throw new TransformerError({ - code: `typia.${method}`, - message: `non-specified generic argument.`, - }); + export const scalar = (props: IProps) => { + // CHECK PARAMETER + if (props.expression.arguments.length === 0) + throw new TransformerError({ + code: `typia.${props.method}`, + message: `no input value.`, + }); - // DO TRANSFORM - return ts.factory.createCallExpression( - programmer(project)(modulo)( - type, - generic - ? node.getFullText().trim() - : name(project.checker)(type)(node), - ), - undefined, - expression.arguments, - ); - }; + // GET TYPE INFO + const [type, node, generic]: [ts.Type, ts.Node, boolean] = + props.expression.typeArguments && props.expression.typeArguments[0] + ? [ + props.context.checker.getTypeFromTypeNode( + props.expression.typeArguments[0], + ), + props.expression.typeArguments[0], + true, + ] + : [ + props.context.checker.getTypeAtLocation( + props.expression.arguments[0]!, + ), + props.expression.arguments[0]!, + false, + ]; + if (type.isTypeParameter()) + throw new TransformerError({ + code: `typia.${props.method}`, + message: `non-specified generic argument.`, + }); - export const factory = - (method: string) => - ( - programmer: ( - project: IProject, - ) => ( - modulo: ts.LeftHandSideExpression, - ) => ( - type: ts.Type, - name: string, - init?: ts.Expression, - ) => ts.Expression | ts.ArrowFunction, - ) => - (project: IProject) => - (modulo: ts.LeftHandSideExpression) => - (expression: ts.CallExpression) => { - // CHECK GENERIC ARGUMENT EXISTENCE - if (!expression.typeArguments?.[0]) - throw new TransformerError({ - code: `typia.${method}`, - message: `generic argument is not specified.`, - }); + // DO TRANSFORM + return ts.factory.createCallExpression( + props.write({ + context: props.context, + modulo: props.modulo, + type, + name: generic + ? node.getFullText().trim() + : getTypeName({ + checker: props.context.checker, + type, + node, + }), + }), + undefined, + props.expression.arguments, + ); + }; - // GET TYPE INFO - const node: ts.TypeNode = expression.typeArguments[0]; - const type: ts.Type = project.checker.getTypeFromTypeNode(node); + export const factory = (props: IProps) => { + // CHECK GENERIC ARGUMENT EXISTENCE + if (!props.expression.typeArguments?.[0]) + throw new TransformerError({ + code: `typia.${props.method}`, + message: `generic argument is not specified.`, + }); - if (type.isTypeParameter()) - throw new TransformerError({ - code: `typia.${method}`, - message: `non-specified generic argument.`, - }); + // GET TYPE INFO + const node: ts.TypeNode = props.expression.typeArguments[0]; + const type: ts.Type = props.context.checker.getTypeFromTypeNode(node); - // DO TRANSFORM - return programmer(project)(modulo)( - type, - node.getFullText().trim(), - expression.arguments[0], - ); - }; + if (type.isTypeParameter()) + throw new TransformerError({ + code: `typia.${props.method}`, + message: `non-specified generic argument.`, + }); + + // DO TRANSFORM + return props.write({ + context: props.context, + modulo: props.modulo, + type, + name: node.getFullText().trim(), + init: props.expression.arguments[0], + }); + }; - const name = - (checker: ts.TypeChecker) => - (type: ts.Type) => - (node: ts.Node): string => - checker.typeToString(type, node, ts.TypeFormatFlags.NodeBuilderFlagsMask); + const getTypeName = (props: { + checker: ts.TypeChecker; + type: ts.Type; + node: ts.Node; + }): string => + props.checker.typeToString( + props.type, + props.node, + ts.TypeFormatFlags.NodeBuilderFlagsMask, + ); }