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.
Files changed (45) hide show
  1. package/README.md +5 -47
  2. package/lib/executable/internal/TypiaSetupWizard.js +8 -6
  3. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/executable/internal/TypiaSetupWizard.ts +148 -149
  6. package/src/executable/typia.ts +35 -35
  7. package/src/factories/MetadataTagFactory.ts +347 -347
  8. package/src/factories/internal/iterate_metadata.ts +81 -81
  9. package/src/factories/internal/iterate_metadata_native.ts +227 -227
  10. package/src/functional/$number.ts +19 -19
  11. package/src/index.ts +4 -4
  12. package/src/module.ts +1535 -1535
  13. package/src/programmers/ApplicationProgrammer.ts +55 -55
  14. package/src/programmers/StringifyProgrammer.ts +746 -746
  15. package/src/programmers/internal/application_array.ts +45 -45
  16. package/src/programmers/internal/application_default.ts +17 -17
  17. package/src/programmers/internal/application_number.ts +76 -76
  18. package/src/programmers/internal/application_object.ts +103 -103
  19. package/src/programmers/internal/application_string.ts +49 -49
  20. package/src/schemas/IJsonComponents.ts +24 -24
  21. package/src/schemas/IJsonSchema.ts +92 -92
  22. package/src/transformers/CallExpressionTransformer.ts +124 -124
  23. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -114
  24. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +41 -41
  25. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  26. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
  27. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
  28. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
  29. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
  30. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
  31. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
  32. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
  33. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
  34. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
  35. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
  36. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
  37. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
  38. package/src/transformers/features/stringifiers/StringifyTransformer.ts +36 -36
  39. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
  40. package/src/transformers/features/validators/AssertTransformer.ts +43 -43
  41. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
  42. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
  43. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
  44. package/src/transformers/features/validators/IsTransformer.ts +43 -43
  45. 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
+ }