typia 3.4.4 → 3.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -47
- package/lib/executable/internal/TypiaSetupWizard.js +8 -6
- package/lib/executable/internal/TypiaSetupWizard.js.map +1 -1
- package/package.json +1 -1
- package/src/executable/internal/TypiaSetupWizard.ts +148 -149
- package/src/executable/typia.ts +35 -35
- package/src/factories/MetadataTagFactory.ts +347 -347
- package/src/factories/internal/iterate_metadata.ts +81 -81
- package/src/factories/internal/iterate_metadata_native.ts +227 -227
- package/src/functional/$number.ts +19 -19
- package/src/index.ts +4 -4
- package/src/module.ts +1535 -1535
- package/src/programmers/ApplicationProgrammer.ts +55 -55
- package/src/programmers/StringifyProgrammer.ts +746 -746
- package/src/programmers/internal/application_array.ts +45 -45
- package/src/programmers/internal/application_default.ts +17 -17
- package/src/programmers/internal/application_number.ts +76 -76
- package/src/programmers/internal/application_object.ts +103 -103
- package/src/programmers/internal/application_string.ts +49 -49
- package/src/schemas/IJsonComponents.ts +24 -24
- package/src/schemas/IJsonSchema.ts +92 -92
- package/src/transformers/CallExpressionTransformer.ts +124 -124
- package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -114
- package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +41 -41
- package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
- package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
- package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
- package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
- package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
- package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
- package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
- package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
- package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
- package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
- package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
- package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
- package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
- package/src/transformers/features/stringifiers/StringifyTransformer.ts +36 -36
- package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
- package/src/transformers/features/validators/AssertTransformer.ts +43 -43
- package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
- package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
- package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
- package/src/transformers/features/validators/IsTransformer.ts +43 -43
- package/src/transformers/features/validators/ValidateTransformer.ts +43 -43
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
|
|
2
|
-
import { IMetadataTag } from "../metadata/IMetadataTag";
|
|
3
|
-
|
|
4
|
-
import { Atomic } from "../typings/Atomic";
|
|
5
|
-
|
|
6
|
-
export type IJsonSchema = IJsonSchema.NotUnknown | IJsonSchema.IUnknown;
|
|
7
|
-
export namespace IJsonSchema {
|
|
8
|
-
export type NotUnknown =
|
|
9
|
-
| IEnumeration<"boolean">
|
|
10
|
-
| IEnumeration<"number">
|
|
11
|
-
| IEnumeration<"bigint">
|
|
12
|
-
| IEnumeration<"string">
|
|
13
|
-
| IBoolean
|
|
14
|
-
| INumber
|
|
15
|
-
| IBigInt
|
|
16
|
-
| IString
|
|
17
|
-
| IArray
|
|
18
|
-
| ITuple
|
|
19
|
-
| IOneOf
|
|
20
|
-
| IReference
|
|
21
|
-
| IRecursiveReference
|
|
22
|
-
| INullOnly;
|
|
23
|
-
|
|
24
|
-
/* -----------------------------------------------------------
|
|
25
|
-
ATOMICS
|
|
26
|
-
----------------------------------------------------------- */
|
|
27
|
-
export interface IEnumeration<Literal extends Atomic.Literal>
|
|
28
|
-
extends IAtomic<Literal> {
|
|
29
|
-
enum: Array<Atomic.Mapper[Literal]>;
|
|
30
|
-
}
|
|
31
|
-
export interface IAtomic<Literal extends Atomic.Literal>
|
|
32
|
-
extends ISignificant<Literal> {
|
|
33
|
-
default?: Atomic.Mapper[Literal];
|
|
34
|
-
}
|
|
35
|
-
export interface IString extends IAtomic<"string"> {
|
|
36
|
-
minLength?: number;
|
|
37
|
-
maxLength?: number;
|
|
38
|
-
pattern?: string;
|
|
39
|
-
format?: string;
|
|
40
|
-
}
|
|
41
|
-
export interface INumber extends IAtomic<"number" | "integer"> {
|
|
42
|
-
minimum?: number;
|
|
43
|
-
maximum?: number;
|
|
44
|
-
exclusiveMinimum?: number;
|
|
45
|
-
exclusiveMaximum?: number;
|
|
46
|
-
multipleOf?: number;
|
|
47
|
-
}
|
|
48
|
-
export interface IBoolean extends IAtomic<"boolean"> {}
|
|
49
|
-
export interface IBigInt extends IAtomic<"bigint"> {}
|
|
50
|
-
|
|
51
|
-
/* -----------------------------------------------------------
|
|
52
|
-
OBJECTS
|
|
53
|
-
----------------------------------------------------------- */
|
|
54
|
-
export interface IArray extends ISignificant<"array"> {
|
|
55
|
-
items: IJsonSchema;
|
|
56
|
-
minItems?: number;
|
|
57
|
-
maxItems?: number;
|
|
58
|
-
}
|
|
59
|
-
export interface ITuple extends ISignificant<"array"> {
|
|
60
|
-
items: IJsonSchema[];
|
|
61
|
-
}
|
|
62
|
-
export interface IReference extends IAttribute {
|
|
63
|
-
$ref: string;
|
|
64
|
-
}
|
|
65
|
-
export interface IRecursiveReference extends IAttribute {
|
|
66
|
-
$recursiveRef: string;
|
|
67
|
-
}
|
|
68
|
-
export interface INullOnly extends IAttribute {
|
|
69
|
-
type: "null";
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/* -----------------------------------------------------------
|
|
73
|
-
MISCELLANEOUS
|
|
74
|
-
----------------------------------------------------------- */
|
|
75
|
-
export interface IOneOf extends IAttribute {
|
|
76
|
-
oneOf: IJsonSchema[];
|
|
77
|
-
}
|
|
78
|
-
export interface IUnknown {}
|
|
79
|
-
|
|
80
|
-
export interface ISignificant<Literal extends string> extends IAttribute {
|
|
81
|
-
type: Literal;
|
|
82
|
-
nullable: boolean;
|
|
83
|
-
}
|
|
84
|
-
export interface IAttribute {
|
|
85
|
-
deprecated?: boolean;
|
|
86
|
-
title?: string;
|
|
87
|
-
description?: string;
|
|
88
|
-
"x-typia-metaTags"?: IMetadataTag[];
|
|
89
|
-
"x-typia-jsDocTags"?: IJsDocTagInfo[];
|
|
90
|
-
"x-typia-required"?: boolean;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
1
|
+
import { IJsDocTagInfo } from "../metadata/IJsDocTagInfo";
|
|
2
|
+
import { IMetadataTag } from "../metadata/IMetadataTag";
|
|
3
|
+
|
|
4
|
+
import { Atomic } from "../typings/Atomic";
|
|
5
|
+
|
|
6
|
+
export type IJsonSchema = IJsonSchema.NotUnknown | IJsonSchema.IUnknown;
|
|
7
|
+
export namespace IJsonSchema {
|
|
8
|
+
export type NotUnknown =
|
|
9
|
+
| IEnumeration<"boolean">
|
|
10
|
+
| IEnumeration<"number">
|
|
11
|
+
| IEnumeration<"bigint">
|
|
12
|
+
| IEnumeration<"string">
|
|
13
|
+
| IBoolean
|
|
14
|
+
| INumber
|
|
15
|
+
| IBigInt
|
|
16
|
+
| IString
|
|
17
|
+
| IArray
|
|
18
|
+
| ITuple
|
|
19
|
+
| IOneOf
|
|
20
|
+
| IReference
|
|
21
|
+
| IRecursiveReference
|
|
22
|
+
| INullOnly;
|
|
23
|
+
|
|
24
|
+
/* -----------------------------------------------------------
|
|
25
|
+
ATOMICS
|
|
26
|
+
----------------------------------------------------------- */
|
|
27
|
+
export interface IEnumeration<Literal extends Atomic.Literal>
|
|
28
|
+
extends IAtomic<Literal> {
|
|
29
|
+
enum: Array<Atomic.Mapper[Literal]>;
|
|
30
|
+
}
|
|
31
|
+
export interface IAtomic<Literal extends Atomic.Literal>
|
|
32
|
+
extends ISignificant<Literal> {
|
|
33
|
+
default?: Atomic.Mapper[Literal];
|
|
34
|
+
}
|
|
35
|
+
export interface IString extends IAtomic<"string"> {
|
|
36
|
+
minLength?: number;
|
|
37
|
+
maxLength?: number;
|
|
38
|
+
pattern?: string;
|
|
39
|
+
format?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface INumber extends IAtomic<"number" | "integer"> {
|
|
42
|
+
minimum?: number;
|
|
43
|
+
maximum?: number;
|
|
44
|
+
exclusiveMinimum?: number;
|
|
45
|
+
exclusiveMaximum?: number;
|
|
46
|
+
multipleOf?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface IBoolean extends IAtomic<"boolean"> {}
|
|
49
|
+
export interface IBigInt extends IAtomic<"bigint"> {}
|
|
50
|
+
|
|
51
|
+
/* -----------------------------------------------------------
|
|
52
|
+
OBJECTS
|
|
53
|
+
----------------------------------------------------------- */
|
|
54
|
+
export interface IArray extends ISignificant<"array"> {
|
|
55
|
+
items: IJsonSchema;
|
|
56
|
+
minItems?: number;
|
|
57
|
+
maxItems?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface ITuple extends ISignificant<"array"> {
|
|
60
|
+
items: IJsonSchema[];
|
|
61
|
+
}
|
|
62
|
+
export interface IReference extends IAttribute {
|
|
63
|
+
$ref: string;
|
|
64
|
+
}
|
|
65
|
+
export interface IRecursiveReference extends IAttribute {
|
|
66
|
+
$recursiveRef: string;
|
|
67
|
+
}
|
|
68
|
+
export interface INullOnly extends IAttribute {
|
|
69
|
+
type: "null";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* -----------------------------------------------------------
|
|
73
|
+
MISCELLANEOUS
|
|
74
|
+
----------------------------------------------------------- */
|
|
75
|
+
export interface IOneOf extends IAttribute {
|
|
76
|
+
oneOf: IJsonSchema[];
|
|
77
|
+
}
|
|
78
|
+
export interface IUnknown {}
|
|
79
|
+
|
|
80
|
+
export interface ISignificant<Literal extends string> extends IAttribute {
|
|
81
|
+
type: Literal;
|
|
82
|
+
nullable: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface IAttribute {
|
|
85
|
+
deprecated?: boolean;
|
|
86
|
+
title?: string;
|
|
87
|
+
description?: string;
|
|
88
|
+
"x-typia-metaTags"?: IMetadataTag[];
|
|
89
|
+
"x-typia-jsDocTags"?: IJsDocTagInfo[];
|
|
90
|
+
"x-typia-required"?: boolean;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import ts from "typescript";
|
|
3
|
-
|
|
4
|
-
import { IProject } from "./IProject";
|
|
5
|
-
import { ApplicationTransformer } from "./features/miscellaneous/ApplicationTransformer";
|
|
6
|
-
import { MetadataTransformer } from "./features/miscellaneous/MetadataTransformer";
|
|
7
|
-
import { AssertParseTransformer } from "./features/parsers/AssertParseTransformer";
|
|
8
|
-
import { CreateAssertParseTransformer } from "./features/parsers/CreateAssertParseTransformer";
|
|
9
|
-
import { CreateIsParseTransformer } from "./features/parsers/CreateIsParseTransformer";
|
|
10
|
-
import { CreateValidateParseTransformer } from "./features/parsers/CreateValidateParseTransformer";
|
|
11
|
-
import { IsParseTransformer } from "./features/parsers/IsParseTransformer";
|
|
12
|
-
import { ValidateParseTransformer } from "./features/parsers/ValidateParseTransformer";
|
|
13
|
-
import { AssertStringifyTransformer } from "./features/stringifiers/AssertStringifyTransformer";
|
|
14
|
-
import { CreateAssertStringifyTransformer } from "./features/stringifiers/CreateAssertStringifyTransformer";
|
|
15
|
-
import { CreateIsStringifyTransformer } from "./features/stringifiers/CreateIsStringifyTransformer";
|
|
16
|
-
import { CreateStringifyTransformer } from "./features/stringifiers/CreateStringifyTransformer";
|
|
17
|
-
import { CreateValidateStringifyTransformer } from "./features/stringifiers/CreateValidateStringifyProgrammer";
|
|
18
|
-
import { IsStringifyTransformer } from "./features/stringifiers/IsStringifyTransformer";
|
|
19
|
-
import { StringifyTransformer } from "./features/stringifiers/StringifyTransformer";
|
|
20
|
-
import { ValidateStringifyTransformer } from "./features/stringifiers/ValidateStringifyTransformer";
|
|
21
|
-
import { AssertTransformer } from "./features/validators/AssertTransformer";
|
|
22
|
-
import { CreateAssertTransformer } from "./features/validators/CreateAssertTransformer";
|
|
23
|
-
import { CreateIsTransformer } from "./features/validators/CreateIsTransformer";
|
|
24
|
-
import { CreateValidateTransformer } from "./features/validators/CreateValidateTransformer";
|
|
25
|
-
import { IsTransformer } from "./features/validators/IsTransformer";
|
|
26
|
-
import { ValidateTransformer } from "./features/validators/ValidateTransformer";
|
|
27
|
-
|
|
28
|
-
export namespace CallExpressionTransformer {
|
|
29
|
-
export function transform(
|
|
30
|
-
project: IProject,
|
|
31
|
-
expression: ts.CallExpression,
|
|
32
|
-
): ts.Expression {
|
|
33
|
-
//----
|
|
34
|
-
// VALIDATIONS
|
|
35
|
-
//----
|
|
36
|
-
// SIGNATURE DECLARATION
|
|
37
|
-
const declaration: ts.Declaration | undefined =
|
|
38
|
-
project.checker.getResolvedSignature(expression)?.declaration;
|
|
39
|
-
if (!declaration) return expression;
|
|
40
|
-
|
|
41
|
-
// FILE PATH
|
|
42
|
-
const file: string = path.resolve(declaration.getSourceFile().fileName);
|
|
43
|
-
if (file.indexOf(LIB_PATH) === -1 && file !== SRC_PATH)
|
|
44
|
-
return expression;
|
|
45
|
-
|
|
46
|
-
//----
|
|
47
|
-
// TRANSFORMATION
|
|
48
|
-
//----
|
|
49
|
-
// FUNCTION NAME
|
|
50
|
-
const { name } = project.checker.getTypeAtLocation(declaration).symbol;
|
|
51
|
-
|
|
52
|
-
// FIND TRANSFORMER
|
|
53
|
-
const functor: (() => Task) | undefined = FUNCTORS[name];
|
|
54
|
-
if (functor === undefined) return expression;
|
|
55
|
-
|
|
56
|
-
// RETURNS WITH TRANSFORMATION
|
|
57
|
-
return functor()(project, expression.expression, expression);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
type Task = (
|
|
62
|
-
project: IProject,
|
|
63
|
-
modulo: ts.LeftHandSideExpression,
|
|
64
|
-
expression: ts.CallExpression,
|
|
65
|
-
) => ts.Expression;
|
|
66
|
-
|
|
67
|
-
const LIB_PATH = path.join("node_modules", "typia", "lib", "module.d.ts");
|
|
68
|
-
const SRC_PATH = path.resolve(path.join(__dirname, "..", "module.ts"));
|
|
69
|
-
|
|
70
|
-
const FUNCTORS: Record<string, () => Task> = {
|
|
71
|
-
//----
|
|
72
|
-
// SINGLE FUNCTIONS
|
|
73
|
-
//----
|
|
74
|
-
// BASIC VALIDATORS
|
|
75
|
-
assert: () => AssertTransformer.transform(false),
|
|
76
|
-
assertType: () => AssertTransformer.transform(false),
|
|
77
|
-
is: () => IsTransformer.transform(false),
|
|
78
|
-
validate: () => ValidateTransformer.transform(false),
|
|
79
|
-
|
|
80
|
-
// STRICT VALIDATORS
|
|
81
|
-
assertEquals: () => AssertTransformer.transform(true),
|
|
82
|
-
equals: () => IsTransformer.transform(true),
|
|
83
|
-
validateEquals: () => ValidateTransformer.transform(true),
|
|
84
|
-
|
|
85
|
-
// PARSE FUNCTIONS
|
|
86
|
-
isParse: () => IsParseTransformer.transform,
|
|
87
|
-
assertParse: () => AssertParseTransformer.transform,
|
|
88
|
-
validateParse: () => ValidateParseTransformer.transform,
|
|
89
|
-
|
|
90
|
-
// STRINGIFY FUNCTIONS
|
|
91
|
-
stringify: () => StringifyTransformer.transform,
|
|
92
|
-
assertStringify: () => AssertStringifyTransformer.transform,
|
|
93
|
-
isStringify: () => IsStringifyTransformer.transform,
|
|
94
|
-
validateStringify: () => ValidateStringifyTransformer.transform,
|
|
95
|
-
|
|
96
|
-
// MISC
|
|
97
|
-
application: () => ApplicationTransformer.transform,
|
|
98
|
-
metadata: () => MetadataTransformer.transform,
|
|
99
|
-
|
|
100
|
-
//----
|
|
101
|
-
// FACTORY FUNCTIONS
|
|
102
|
-
//----
|
|
103
|
-
// BASIC VALIDATORS
|
|
104
|
-
createAssert: () => CreateAssertTransformer.transform(false),
|
|
105
|
-
createAssertType: () => CreateAssertTransformer.transform(false),
|
|
106
|
-
createIs: () => CreateIsTransformer.transform(false),
|
|
107
|
-
createValidate: () => CreateValidateTransformer.transform(false),
|
|
108
|
-
|
|
109
|
-
// STRICT VALIDATORS
|
|
110
|
-
createAssertEquals: () => CreateAssertTransformer.transform(true),
|
|
111
|
-
createEquals: () => CreateIsTransformer.transform(true),
|
|
112
|
-
createValidateEquals: () => CreateValidateTransformer.transform(true),
|
|
113
|
-
|
|
114
|
-
// PARSE FUNCTIONS
|
|
115
|
-
createIsParse: () => CreateIsParseTransformer.transform,
|
|
116
|
-
createAssertParse: () => CreateAssertParseTransformer.transform,
|
|
117
|
-
createValidateParse: () => CreateValidateParseTransformer.transform,
|
|
118
|
-
|
|
119
|
-
// STRINGIFY FUNCTIONS
|
|
120
|
-
createStringify: () => CreateStringifyTransformer.transform,
|
|
121
|
-
createAssertStringify: () => CreateAssertStringifyTransformer.transform,
|
|
122
|
-
createIsStringify: () => CreateIsStringifyTransformer.transform,
|
|
123
|
-
createValidateStringify: () => CreateValidateStringifyTransformer.transform,
|
|
124
|
-
};
|
|
1
|
+
import path from "path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
|
|
4
|
+
import { IProject } from "./IProject";
|
|
5
|
+
import { ApplicationTransformer } from "./features/miscellaneous/ApplicationTransformer";
|
|
6
|
+
import { MetadataTransformer } from "./features/miscellaneous/MetadataTransformer";
|
|
7
|
+
import { AssertParseTransformer } from "./features/parsers/AssertParseTransformer";
|
|
8
|
+
import { CreateAssertParseTransformer } from "./features/parsers/CreateAssertParseTransformer";
|
|
9
|
+
import { CreateIsParseTransformer } from "./features/parsers/CreateIsParseTransformer";
|
|
10
|
+
import { CreateValidateParseTransformer } from "./features/parsers/CreateValidateParseTransformer";
|
|
11
|
+
import { IsParseTransformer } from "./features/parsers/IsParseTransformer";
|
|
12
|
+
import { ValidateParseTransformer } from "./features/parsers/ValidateParseTransformer";
|
|
13
|
+
import { AssertStringifyTransformer } from "./features/stringifiers/AssertStringifyTransformer";
|
|
14
|
+
import { CreateAssertStringifyTransformer } from "./features/stringifiers/CreateAssertStringifyTransformer";
|
|
15
|
+
import { CreateIsStringifyTransformer } from "./features/stringifiers/CreateIsStringifyTransformer";
|
|
16
|
+
import { CreateStringifyTransformer } from "./features/stringifiers/CreateStringifyTransformer";
|
|
17
|
+
import { CreateValidateStringifyTransformer } from "./features/stringifiers/CreateValidateStringifyProgrammer";
|
|
18
|
+
import { IsStringifyTransformer } from "./features/stringifiers/IsStringifyTransformer";
|
|
19
|
+
import { StringifyTransformer } from "./features/stringifiers/StringifyTransformer";
|
|
20
|
+
import { ValidateStringifyTransformer } from "./features/stringifiers/ValidateStringifyTransformer";
|
|
21
|
+
import { AssertTransformer } from "./features/validators/AssertTransformer";
|
|
22
|
+
import { CreateAssertTransformer } from "./features/validators/CreateAssertTransformer";
|
|
23
|
+
import { CreateIsTransformer } from "./features/validators/CreateIsTransformer";
|
|
24
|
+
import { CreateValidateTransformer } from "./features/validators/CreateValidateTransformer";
|
|
25
|
+
import { IsTransformer } from "./features/validators/IsTransformer";
|
|
26
|
+
import { ValidateTransformer } from "./features/validators/ValidateTransformer";
|
|
27
|
+
|
|
28
|
+
export namespace CallExpressionTransformer {
|
|
29
|
+
export function transform(
|
|
30
|
+
project: IProject,
|
|
31
|
+
expression: ts.CallExpression,
|
|
32
|
+
): ts.Expression {
|
|
33
|
+
//----
|
|
34
|
+
// VALIDATIONS
|
|
35
|
+
//----
|
|
36
|
+
// SIGNATURE DECLARATION
|
|
37
|
+
const declaration: ts.Declaration | undefined =
|
|
38
|
+
project.checker.getResolvedSignature(expression)?.declaration;
|
|
39
|
+
if (!declaration) return expression;
|
|
40
|
+
|
|
41
|
+
// FILE PATH
|
|
42
|
+
const file: string = path.resolve(declaration.getSourceFile().fileName);
|
|
43
|
+
if (file.indexOf(LIB_PATH) === -1 && file !== SRC_PATH)
|
|
44
|
+
return expression;
|
|
45
|
+
|
|
46
|
+
//----
|
|
47
|
+
// TRANSFORMATION
|
|
48
|
+
//----
|
|
49
|
+
// FUNCTION NAME
|
|
50
|
+
const { name } = project.checker.getTypeAtLocation(declaration).symbol;
|
|
51
|
+
|
|
52
|
+
// FIND TRANSFORMER
|
|
53
|
+
const functor: (() => Task) | undefined = FUNCTORS[name];
|
|
54
|
+
if (functor === undefined) return expression;
|
|
55
|
+
|
|
56
|
+
// RETURNS WITH TRANSFORMATION
|
|
57
|
+
return functor()(project, expression.expression, expression);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
type Task = (
|
|
62
|
+
project: IProject,
|
|
63
|
+
modulo: ts.LeftHandSideExpression,
|
|
64
|
+
expression: ts.CallExpression,
|
|
65
|
+
) => ts.Expression;
|
|
66
|
+
|
|
67
|
+
const LIB_PATH = path.join("node_modules", "typia", "lib", "module.d.ts");
|
|
68
|
+
const SRC_PATH = path.resolve(path.join(__dirname, "..", "module.ts"));
|
|
69
|
+
|
|
70
|
+
const FUNCTORS: Record<string, () => Task> = {
|
|
71
|
+
//----
|
|
72
|
+
// SINGLE FUNCTIONS
|
|
73
|
+
//----
|
|
74
|
+
// BASIC VALIDATORS
|
|
75
|
+
assert: () => AssertTransformer.transform(false),
|
|
76
|
+
assertType: () => AssertTransformer.transform(false),
|
|
77
|
+
is: () => IsTransformer.transform(false),
|
|
78
|
+
validate: () => ValidateTransformer.transform(false),
|
|
79
|
+
|
|
80
|
+
// STRICT VALIDATORS
|
|
81
|
+
assertEquals: () => AssertTransformer.transform(true),
|
|
82
|
+
equals: () => IsTransformer.transform(true),
|
|
83
|
+
validateEquals: () => ValidateTransformer.transform(true),
|
|
84
|
+
|
|
85
|
+
// PARSE FUNCTIONS
|
|
86
|
+
isParse: () => IsParseTransformer.transform,
|
|
87
|
+
assertParse: () => AssertParseTransformer.transform,
|
|
88
|
+
validateParse: () => ValidateParseTransformer.transform,
|
|
89
|
+
|
|
90
|
+
// STRINGIFY FUNCTIONS
|
|
91
|
+
stringify: () => StringifyTransformer.transform,
|
|
92
|
+
assertStringify: () => AssertStringifyTransformer.transform,
|
|
93
|
+
isStringify: () => IsStringifyTransformer.transform,
|
|
94
|
+
validateStringify: () => ValidateStringifyTransformer.transform,
|
|
95
|
+
|
|
96
|
+
// MISC
|
|
97
|
+
application: () => ApplicationTransformer.transform,
|
|
98
|
+
metadata: () => MetadataTransformer.transform,
|
|
99
|
+
|
|
100
|
+
//----
|
|
101
|
+
// FACTORY FUNCTIONS
|
|
102
|
+
//----
|
|
103
|
+
// BASIC VALIDATORS
|
|
104
|
+
createAssert: () => CreateAssertTransformer.transform(false),
|
|
105
|
+
createAssertType: () => CreateAssertTransformer.transform(false),
|
|
106
|
+
createIs: () => CreateIsTransformer.transform(false),
|
|
107
|
+
createValidate: () => CreateValidateTransformer.transform(false),
|
|
108
|
+
|
|
109
|
+
// STRICT VALIDATORS
|
|
110
|
+
createAssertEquals: () => CreateAssertTransformer.transform(true),
|
|
111
|
+
createEquals: () => CreateIsTransformer.transform(true),
|
|
112
|
+
createValidateEquals: () => CreateValidateTransformer.transform(true),
|
|
113
|
+
|
|
114
|
+
// PARSE FUNCTIONS
|
|
115
|
+
createIsParse: () => CreateIsParseTransformer.transform,
|
|
116
|
+
createAssertParse: () => CreateAssertParseTransformer.transform,
|
|
117
|
+
createValidateParse: () => CreateValidateParseTransformer.transform,
|
|
118
|
+
|
|
119
|
+
// STRINGIFY FUNCTIONS
|
|
120
|
+
createStringify: () => CreateStringifyTransformer.transform,
|
|
121
|
+
createAssertStringify: () => CreateAssertStringifyTransformer.transform,
|
|
122
|
+
createIsStringify: () => CreateIsStringifyTransformer.transform,
|
|
123
|
+
createValidateStringify: () => CreateValidateStringifyTransformer.transform,
|
|
124
|
+
};
|
|
@@ -1,114 +1,114 @@
|
|
|
1
|
-
import ts from "typescript";
|
|
2
|
-
|
|
3
|
-
import { LiteralFactory } from "../../../factories/LiteralFactory";
|
|
4
|
-
import { MetadataCollection } from "../../../factories/MetadataCollection";
|
|
5
|
-
import { MetadataFactory } from "../../../factories/MetadataFactory";
|
|
6
|
-
|
|
7
|
-
import { Metadata } from "../../../metadata/Metadata";
|
|
8
|
-
import { IJsonApplication } from "../../../schemas/IJsonApplication";
|
|
9
|
-
|
|
10
|
-
import { ApplicationProgrammer } from "../../../programmers/ApplicationProgrammer";
|
|
11
|
-
|
|
12
|
-
import { IProject } from "../../IProject";
|
|
13
|
-
|
|
14
|
-
export namespace ApplicationTransformer {
|
|
15
|
-
export function transform(
|
|
16
|
-
{ checker }: IProject,
|
|
17
|
-
_modulo: ts.LeftHandSideExpression,
|
|
18
|
-
expression: ts.CallExpression,
|
|
19
|
-
): ts.Expression {
|
|
20
|
-
if (!expression.typeArguments?.length)
|
|
21
|
-
throw new Error(ErrorMessages.NO_GENERIC_ARGUMENT);
|
|
22
|
-
|
|
23
|
-
//----
|
|
24
|
-
// GET ARGUMENTS
|
|
25
|
-
//----
|
|
26
|
-
// VALIDATE TUPLE ARGUMENTS
|
|
27
|
-
const top: ts.Node = expression.typeArguments[0]!;
|
|
28
|
-
if (!ts.isTupleTypeNode(top)) return expression;
|
|
29
|
-
else if (top.elements.some((child) => !ts.isTypeNode(child)))
|
|
30
|
-
return expression;
|
|
31
|
-
|
|
32
|
-
// GET TYPES
|
|
33
|
-
const types: ts.Type[] = top.elements.map((child) =>
|
|
34
|
-
checker.getTypeFromTypeNode(child as ts.TypeNode),
|
|
35
|
-
);
|
|
36
|
-
if (types.some((t) => t.isTypeParameter()))
|
|
37
|
-
throw new Error(ErrorMessages.GENERIC_ARGUMENT);
|
|
38
|
-
|
|
39
|
-
// ADDITIONAL PARAMETERS
|
|
40
|
-
const purpose: "swagger" | "ajv" = get_parameter(
|
|
41
|
-
checker,
|
|
42
|
-
"Purpose",
|
|
43
|
-
expression.typeArguments[1],
|
|
44
|
-
(str) => str === "swagger" || str === "ajv",
|
|
45
|
-
() => "swagger",
|
|
46
|
-
);
|
|
47
|
-
const prefix: string = get_parameter(
|
|
48
|
-
checker,
|
|
49
|
-
"Prefix",
|
|
50
|
-
expression.typeArguments[2],
|
|
51
|
-
() => true,
|
|
52
|
-
() =>
|
|
53
|
-
purpose === "swagger"
|
|
54
|
-
? "#/components/schemas"
|
|
55
|
-
: "components#/schemas",
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
//----
|
|
59
|
-
// GENERATORS
|
|
60
|
-
//----
|
|
61
|
-
// METADATA
|
|
62
|
-
const collection: MetadataCollection = new MetadataCollection({
|
|
63
|
-
replace: MetadataCollection.replace,
|
|
64
|
-
});
|
|
65
|
-
const metadatas: Array<Metadata> = types.map((type) =>
|
|
66
|
-
MetadataFactory.generate(checker, collection, type, {
|
|
67
|
-
resolve: true,
|
|
68
|
-
constant: true,
|
|
69
|
-
}),
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
// APPLICATION
|
|
73
|
-
const app: IJsonApplication = ApplicationProgrammer.generate(
|
|
74
|
-
metadatas,
|
|
75
|
-
{
|
|
76
|
-
purpose,
|
|
77
|
-
prefix,
|
|
78
|
-
},
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
// RETURNS WITH LITERAL EXPRESSION
|
|
82
|
-
return LiteralFactory.generate(app);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function get_parameter<T extends string>(
|
|
86
|
-
checker: ts.TypeChecker,
|
|
87
|
-
name: string,
|
|
88
|
-
node: ts.TypeNode | undefined,
|
|
89
|
-
predicator: (value: string) => boolean,
|
|
90
|
-
defaulter: () => T,
|
|
91
|
-
): T {
|
|
92
|
-
if (!node) return defaulter();
|
|
93
|
-
|
|
94
|
-
// CHECK LITERAL TYPE
|
|
95
|
-
const type: ts.Type = checker.getTypeFromTypeNode(node);
|
|
96
|
-
if (!type.isLiteral())
|
|
97
|
-
throw new Error(
|
|
98
|
-
`Error on typia.application(): generic argument "${name}" must be constant.`,
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
// GET VALUE AND VALIDATE IT
|
|
102
|
-
const value = type.value;
|
|
103
|
-
if (typeof value !== "string" || predicator(value) === false)
|
|
104
|
-
throw new Error(
|
|
105
|
-
`Error on typia.application(): invalid value on generic argument "${name}".`,
|
|
106
|
-
);
|
|
107
|
-
return value as T;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const enum ErrorMessages {
|
|
112
|
-
NO_GENERIC_ARGUMENT = "Error on typia.application(): no generic argument.",
|
|
113
|
-
GENERIC_ARGUMENT = "Error on typia.application(): non-specified generic argument(s).",
|
|
114
|
-
}
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
|
|
3
|
+
import { LiteralFactory } from "../../../factories/LiteralFactory";
|
|
4
|
+
import { MetadataCollection } from "../../../factories/MetadataCollection";
|
|
5
|
+
import { MetadataFactory } from "../../../factories/MetadataFactory";
|
|
6
|
+
|
|
7
|
+
import { Metadata } from "../../../metadata/Metadata";
|
|
8
|
+
import { IJsonApplication } from "../../../schemas/IJsonApplication";
|
|
9
|
+
|
|
10
|
+
import { ApplicationProgrammer } from "../../../programmers/ApplicationProgrammer";
|
|
11
|
+
|
|
12
|
+
import { IProject } from "../../IProject";
|
|
13
|
+
|
|
14
|
+
export namespace ApplicationTransformer {
|
|
15
|
+
export function transform(
|
|
16
|
+
{ checker }: IProject,
|
|
17
|
+
_modulo: ts.LeftHandSideExpression,
|
|
18
|
+
expression: ts.CallExpression,
|
|
19
|
+
): ts.Expression {
|
|
20
|
+
if (!expression.typeArguments?.length)
|
|
21
|
+
throw new Error(ErrorMessages.NO_GENERIC_ARGUMENT);
|
|
22
|
+
|
|
23
|
+
//----
|
|
24
|
+
// GET ARGUMENTS
|
|
25
|
+
//----
|
|
26
|
+
// VALIDATE TUPLE ARGUMENTS
|
|
27
|
+
const top: ts.Node = expression.typeArguments[0]!;
|
|
28
|
+
if (!ts.isTupleTypeNode(top)) return expression;
|
|
29
|
+
else if (top.elements.some((child) => !ts.isTypeNode(child)))
|
|
30
|
+
return expression;
|
|
31
|
+
|
|
32
|
+
// GET TYPES
|
|
33
|
+
const types: ts.Type[] = top.elements.map((child) =>
|
|
34
|
+
checker.getTypeFromTypeNode(child as ts.TypeNode),
|
|
35
|
+
);
|
|
36
|
+
if (types.some((t) => t.isTypeParameter()))
|
|
37
|
+
throw new Error(ErrorMessages.GENERIC_ARGUMENT);
|
|
38
|
+
|
|
39
|
+
// ADDITIONAL PARAMETERS
|
|
40
|
+
const purpose: "swagger" | "ajv" = get_parameter(
|
|
41
|
+
checker,
|
|
42
|
+
"Purpose",
|
|
43
|
+
expression.typeArguments[1],
|
|
44
|
+
(str) => str === "swagger" || str === "ajv",
|
|
45
|
+
() => "swagger",
|
|
46
|
+
);
|
|
47
|
+
const prefix: string = get_parameter(
|
|
48
|
+
checker,
|
|
49
|
+
"Prefix",
|
|
50
|
+
expression.typeArguments[2],
|
|
51
|
+
() => true,
|
|
52
|
+
() =>
|
|
53
|
+
purpose === "swagger"
|
|
54
|
+
? "#/components/schemas"
|
|
55
|
+
: "components#/schemas",
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
//----
|
|
59
|
+
// GENERATORS
|
|
60
|
+
//----
|
|
61
|
+
// METADATA
|
|
62
|
+
const collection: MetadataCollection = new MetadataCollection({
|
|
63
|
+
replace: MetadataCollection.replace,
|
|
64
|
+
});
|
|
65
|
+
const metadatas: Array<Metadata> = types.map((type) =>
|
|
66
|
+
MetadataFactory.generate(checker, collection, type, {
|
|
67
|
+
resolve: true,
|
|
68
|
+
constant: true,
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
// APPLICATION
|
|
73
|
+
const app: IJsonApplication = ApplicationProgrammer.generate(
|
|
74
|
+
metadatas,
|
|
75
|
+
{
|
|
76
|
+
purpose,
|
|
77
|
+
prefix,
|
|
78
|
+
},
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
// RETURNS WITH LITERAL EXPRESSION
|
|
82
|
+
return LiteralFactory.generate(app);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function get_parameter<T extends string>(
|
|
86
|
+
checker: ts.TypeChecker,
|
|
87
|
+
name: string,
|
|
88
|
+
node: ts.TypeNode | undefined,
|
|
89
|
+
predicator: (value: string) => boolean,
|
|
90
|
+
defaulter: () => T,
|
|
91
|
+
): T {
|
|
92
|
+
if (!node) return defaulter();
|
|
93
|
+
|
|
94
|
+
// CHECK LITERAL TYPE
|
|
95
|
+
const type: ts.Type = checker.getTypeFromTypeNode(node);
|
|
96
|
+
if (!type.isLiteral())
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Error on typia.application(): generic argument "${name}" must be constant.`,
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// GET VALUE AND VALIDATE IT
|
|
102
|
+
const value = type.value;
|
|
103
|
+
if (typeof value !== "string" || predicator(value) === false)
|
|
104
|
+
throw new Error(
|
|
105
|
+
`Error on typia.application(): invalid value on generic argument "${name}".`,
|
|
106
|
+
);
|
|
107
|
+
return value as T;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const enum ErrorMessages {
|
|
112
|
+
NO_GENERIC_ARGUMENT = "Error on typia.application(): no generic argument.",
|
|
113
|
+
GENERIC_ARGUMENT = "Error on typia.application(): non-specified generic argument(s).",
|
|
114
|
+
}
|