typia 7.0.0-dev.20240916 → 7.0.0-dev.20240918

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 (170) hide show
  1. package/lib/factories/JsonMetadataFactory.d.ts +7 -1
  2. package/lib/factories/JsonMetadataFactory.js +17 -15
  3. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  4. package/lib/factories/MetadataFactory.d.ts +14 -2
  5. package/lib/factories/MetadataFactory.js +287 -324
  6. package/lib/factories/MetadataFactory.js.map +1 -1
  7. package/lib/factories/ProtobufFactory.d.ts +8 -1
  8. package/lib/factories/ProtobufFactory.js +22 -17
  9. package/lib/factories/ProtobufFactory.js.map +1 -1
  10. package/lib/factories/internal/metadata/IMetadataIteratorProps.d.ts +13 -0
  11. package/lib/factories/internal/metadata/IMetadataIteratorProps.js +3 -0
  12. package/lib/factories/internal/metadata/IMetadataIteratorProps.js.map +1 -0
  13. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +2 -4
  14. package/lib/factories/internal/metadata/emplace_metadata_alias.js +10 -18
  15. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  16. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +6 -3
  17. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +10 -18
  18. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  19. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +2 -4
  20. package/lib/factories/internal/metadata/emplace_metadata_object.js +171 -158
  21. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +2 -3
  23. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +26 -34
  24. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  25. package/lib/factories/internal/metadata/explore_metadata.d.ts +6 -3
  26. package/lib/factories/internal/metadata/explore_metadata.js +24 -21
  27. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata.d.ts +2 -5
  29. package/lib/factories/internal/metadata/iterate_metadata.js +27 -36
  30. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +2 -5
  32. package/lib/factories/internal/metadata/iterate_metadata_alias.js +11 -19
  33. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  34. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +2 -5
  35. package/lib/factories/internal/metadata/iterate_metadata_array.js +59 -56
  36. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  37. package/lib/factories/internal/metadata/iterate_metadata_atomic.d.ts +4 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +3 -3
  39. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  40. package/lib/factories/internal/metadata/iterate_metadata_coalesce.d.ts +4 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js +5 -5
  42. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -1
  43. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +4 -1
  44. package/lib/factories/internal/metadata/iterate_metadata_collection.js +119 -121
  45. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +4 -1
  47. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +7 -7
  48. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  49. package/lib/factories/internal/metadata/iterate_metadata_constant.d.ts +2 -4
  50. package/lib/factories/internal/metadata/iterate_metadata_constant.js +39 -43
  51. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -1
  52. package/lib/factories/internal/metadata/iterate_metadata_escape.d.ts +2 -5
  53. package/lib/factories/internal/metadata/iterate_metadata_escape.js +15 -23
  54. package/lib/factories/internal/metadata/iterate_metadata_escape.js.map +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata_function.d.ts +2 -5
  56. package/lib/factories/internal/metadata/iterate_metadata_function.js +43 -51
  57. package/lib/factories/internal/metadata/iterate_metadata_function.js.map +1 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +2 -5
  59. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +142 -152
  60. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +2 -5
  62. package/lib/factories/internal/metadata/iterate_metadata_map.js +15 -23
  63. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_native.d.ts +2 -3
  65. package/lib/factories/internal/metadata/iterate_metadata_native.js +42 -36
  66. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  67. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +2 -5
  68. package/lib/factories/internal/metadata/iterate_metadata_object.js +12 -20
  69. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +2 -5
  71. package/lib/factories/internal/metadata/iterate_metadata_set.js +11 -19
  72. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +4 -1
  74. package/lib/factories/internal/metadata/iterate_metadata_sort.js +112 -95
  75. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  76. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +2 -5
  77. package/lib/factories/internal/metadata/iterate_metadata_template.js +17 -25
  78. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +2 -4
  80. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +9 -17
  81. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +2 -5
  83. package/lib/factories/internal/metadata/iterate_metadata_union.js +7 -15
  84. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  85. package/lib/programmers/CheckerProgrammer.js +11 -5
  86. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  87. package/lib/programmers/RandomProgrammer.js +18 -12
  88. package/lib/programmers/RandomProgrammer.js.map +1 -1
  89. package/lib/programmers/http/HttpFormDataProgrammer.js +12 -6
  90. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  91. package/lib/programmers/http/HttpHeadersProgrammer.js +12 -6
  92. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  93. package/lib/programmers/http/HttpParameterProgrammer.js +12 -6
  94. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  95. package/lib/programmers/http/HttpQueryProgrammer.js +14 -6
  96. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  97. package/lib/programmers/json/JsonStringifyProgrammer.js +6 -1
  98. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  99. package/lib/programmers/misc/MiscCloneProgrammer.js +18 -12
  100. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  101. package/lib/programmers/misc/MiscLiteralsProgrammer.js +21 -15
  102. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  103. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -5
  104. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  105. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -5
  106. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  107. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +7 -1
  108. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  109. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +7 -1
  110. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  111. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +7 -1
  112. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  113. package/lib/transformers/features/json/JsonApplicationTransformer.js +12 -6
  114. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  115. package/lib/transformers/features/llm/LlmApplicationTransformer.js +13 -7
  116. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  117. package/lib/transformers/features/llm/LlmSchemaTransformer.js +12 -6
  118. package/lib/transformers/features/llm/LlmSchemaTransformer.js.map +1 -1
  119. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js +12 -6
  120. package/lib/transformers/features/reflect/ReflectMetadataTransformer.js.map +1 -1
  121. package/lib/transformers/features/reflect/ReflectNameTransformer.js +11 -5
  122. package/lib/transformers/features/reflect/ReflectNameTransformer.js.map +1 -1
  123. package/package.json +1 -1
  124. package/src/factories/JsonMetadataFactory.ts +21 -14
  125. package/src/factories/MetadataFactory.ts +269 -184
  126. package/src/factories/ProtobufFactory.ts +23 -16
  127. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +16 -0
  128. package/src/factories/internal/metadata/emplace_metadata_alias.ts +22 -31
  129. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +26 -29
  130. package/src/factories/internal/metadata/emplace_metadata_object.ts +163 -144
  131. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +39 -40
  132. package/src/factories/internal/metadata/explore_metadata.ts +22 -20
  133. package/src/factories/internal/metadata/iterate_metadata.ts +31 -80
  134. package/src/factories/internal/metadata/iterate_metadata_alias.ts +18 -24
  135. package/src/factories/internal/metadata/iterate_metadata_array.ts +51 -51
  136. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +6 -6
  137. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +8 -8
  138. package/src/factories/internal/metadata/iterate_metadata_collection.ts +128 -114
  139. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +24 -22
  140. package/src/factories/internal/metadata/iterate_metadata_constant.ts +63 -63
  141. package/src/factories/internal/metadata/iterate_metadata_escape.ts +35 -40
  142. package/src/factories/internal/metadata/iterate_metadata_function.ts +70 -74
  143. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +182 -182
  144. package/src/factories/internal/metadata/iterate_metadata_map.ts +37 -36
  145. package/src/factories/internal/metadata/iterate_metadata_native.ts +56 -43
  146. package/src/factories/internal/metadata/iterate_metadata_object.ts +18 -24
  147. package/src/factories/internal/metadata/iterate_metadata_set.ts +24 -30
  148. package/src/factories/internal/metadata/iterate_metadata_sort.ts +71 -62
  149. package/src/factories/internal/metadata/iterate_metadata_template.ts +29 -31
  150. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +16 -27
  151. package/src/factories/internal/metadata/iterate_metadata_union.ts +16 -24
  152. package/src/programmers/CheckerProgrammer.ts +11 -8
  153. package/src/programmers/RandomProgrammer.ts +18 -15
  154. package/src/programmers/http/HttpFormDataProgrammer.ts +12 -9
  155. package/src/programmers/http/HttpHeadersProgrammer.ts +12 -9
  156. package/src/programmers/http/HttpParameterProgrammer.ts +12 -9
  157. package/src/programmers/http/HttpQueryProgrammer.ts +13 -9
  158. package/src/programmers/json/JsonStringifyProgrammer.ts +6 -4
  159. package/src/programmers/misc/MiscCloneProgrammer.ts +18 -15
  160. package/src/programmers/misc/MiscLiteralsProgrammer.ts +20 -17
  161. package/src/programmers/misc/MiscPruneProgrammer.ts +11 -8
  162. package/src/programmers/notations/NotationGeneralProgrammer.ts +11 -8
  163. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +7 -4
  164. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +7 -4
  165. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +7 -4
  166. package/src/transformers/features/json/JsonApplicationTransformer.ts +12 -9
  167. package/src/transformers/features/llm/LlmApplicationTransformer.ts +13 -10
  168. package/src/transformers/features/llm/LlmSchemaTransformer.ts +12 -9
  169. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +12 -9
  170. package/src/transformers/features/reflect/ReflectNameTransformer.ts +11 -8
@@ -10,24 +10,31 @@ import { MetadataCollection } from "./MetadataCollection";
10
10
  import { MetadataFactory } from "./MetadataFactory";
11
11
 
12
12
  export namespace JsonMetadataFactory {
13
- export const analyze =
14
- (method: string) =>
15
- (checker: ts.TypeChecker, context?: ts.TransformationContext) =>
16
- (type: ts.Type): [MetadataCollection, Metadata] => {
17
- const collection = new MetadataCollection();
18
- const result = MetadataFactory.analyze(
19
- checker,
20
- context,
21
- )({
13
+ export interface IProps {
14
+ method: string;
15
+ checker: ts.TypeChecker;
16
+ transformer?: ts.TransformationContext;
17
+ type: ts.Type;
18
+ }
19
+
20
+ export const analyze = (props: IProps): [MetadataCollection, Metadata] => {
21
+ const collection = new MetadataCollection();
22
+ const result = MetadataFactory.analyze({
23
+ checker: props.checker,
24
+ transformer: props.transformer,
25
+ options: {
22
26
  escape: true,
23
27
  constant: true,
24
28
  absorb: true,
25
29
  validate,
26
- })(collection)(type);
27
- if (result.success === false)
28
- throw TransformerError.from(method)(result.errors);
29
- return [collection, result.data];
30
- };
30
+ },
31
+ collection,
32
+ type: props.type,
33
+ });
34
+ if (result.success === false)
35
+ throw TransformerError.from(props.method)(result.errors);
36
+ return [collection, result.data];
37
+ };
31
38
 
32
39
  export const validate = (meta: Metadata) => {
33
40
  const output: string[] = [];
@@ -19,6 +19,13 @@ import { MetadataCollection } from "./MetadataCollection";
19
19
  export namespace MetadataFactory {
20
20
  export type Validator = (meta: Metadata, explore: IExplore) => string[];
21
21
 
22
+ export interface IProps {
23
+ checker: ts.TypeChecker;
24
+ transformer: ts.TransformationContext | undefined;
25
+ options: IOptions;
26
+ collection: MetadataCollection;
27
+ type: ts.Type | null;
28
+ }
22
29
  export interface IOptions {
23
30
  escape: boolean;
24
31
  constant: boolean;
@@ -27,7 +34,6 @@ export namespace MetadataFactory {
27
34
  validate?: Validator;
28
35
  onError?: (node: ts.Node | undefined, message: string) => void;
29
36
  }
30
-
31
37
  export interface IExplore {
32
38
  top: boolean;
33
39
  object: MetadataObject | null;
@@ -45,15 +51,12 @@ export namespace MetadataFactory {
45
51
  messages: string[];
46
52
  }
47
53
 
48
- export const analyze =
49
- (checker: ts.TypeChecker, context?: ts.TransformationContext) =>
50
- (options: IOptions) =>
51
- (collection: MetadataCollection) =>
52
- (type: ts.Type | null): ValidationPipe<Metadata, IError> => {
53
- const errors: IError[] = [];
54
- const meta: Metadata = explore_metadata(checker)(options)(collection)(
55
- errors,
56
- )(type, {
54
+ export const analyze = (props: IProps): ValidationPipe<Metadata, IError> => {
55
+ const errors: IError[] = [];
56
+ const metadata: Metadata = explore_metadata({
57
+ ...props,
58
+ errors,
59
+ explore: {
57
60
  top: true,
58
61
  object: null,
59
62
  property: null,
@@ -62,22 +65,36 @@ export namespace MetadataFactory {
62
65
  aliased: false,
63
66
  escaped: false,
64
67
  output: false,
65
- });
66
- iterate_metadata_collection(errors)(collection);
67
- iterate_metadata_sort(collection)(meta);
68
+ },
69
+ });
70
+ iterate_metadata_collection({
71
+ errors,
72
+ collection: props.collection,
73
+ });
74
+ iterate_metadata_sort({
75
+ collection: props.collection,
76
+ metadata: metadata,
77
+ });
68
78
 
69
- if (options.validate)
70
- errors.push(...validate(context)(options)(options.validate)(meta));
71
- return errors.length
72
- ? {
73
- success: false,
74
- errors,
75
- }
76
- : {
77
- success: true,
78
- data: meta,
79
- };
80
- };
79
+ if (props.options.validate)
80
+ errors.push(
81
+ ...validate({
82
+ transformer: props.transformer,
83
+ options: props.options,
84
+ functor: props.options.validate,
85
+ metadata,
86
+ }),
87
+ );
88
+ return errors.length
89
+ ? {
90
+ success: false,
91
+ errors,
92
+ }
93
+ : {
94
+ success: true,
95
+ data: metadata,
96
+ };
97
+ };
81
98
 
82
99
  /**
83
100
  * @internal
@@ -98,21 +115,25 @@ export namespace MetadataFactory {
98
115
  return meta;
99
116
  };
100
117
 
101
- export const validate =
102
- (context?: ts.TransformationContext) =>
103
- (options: IOptions) =>
104
- (functor: Validator) =>
105
- (meta: Metadata): IError[] => {
106
- const visitor: IValidationVisitor = {
107
- functor,
108
- errors: [],
109
- objects: new Set(),
110
- arrays: new Set(),
111
- tuples: new Set(),
112
- aliases: new Set(),
113
- functions: new Set(),
114
- };
115
- validateMeta(context)(options)(visitor)(meta, {
118
+ export const validate = (props: {
119
+ transformer?: ts.TransformationContext;
120
+ options: IOptions;
121
+ functor: Validator;
122
+ metadata: Metadata;
123
+ }): IError[] => {
124
+ const visitor: IValidationVisitor = {
125
+ functor: props.functor,
126
+ errors: [],
127
+ objects: new Set(),
128
+ arrays: new Set(),
129
+ tuples: new Set(),
130
+ aliases: new Set(),
131
+ functions: new Set(),
132
+ };
133
+ validateMeta({
134
+ ...props,
135
+ visitor,
136
+ explore: {
116
137
  object: null,
117
138
  property: null,
118
139
  parameter: null,
@@ -121,149 +142,202 @@ export namespace MetadataFactory {
121
142
  aliased: false,
122
143
  escaped: false,
123
144
  output: false,
124
- });
125
- return visitor.errors;
126
- };
145
+ },
146
+ });
147
+ return visitor.errors;
148
+ };
127
149
 
128
- const validateMeta =
129
- (context?: ts.TransformationContext) =>
130
- (options: IOptions) =>
131
- (visitor: IValidationVisitor) =>
132
- (meta: Metadata, explore: IExplore) => {
133
- const result: string[] = [];
134
- if (context !== undefined)
135
- for (const atomic of meta.atomics)
136
- for (const row of atomic.tags)
137
- for (const tag of row.filter(
138
- (t) => t.validate !== undefined && t.predicate === undefined,
139
- ))
140
- try {
141
- tag.predicate = ExpressionFactory.transpile(context)(
142
- tag.validate!,
143
- );
144
- } catch {
145
- result.push(
146
- `Unable to transpile type tag script: ${JSON.stringify(
147
- tag.validate,
148
- )}`,
149
- );
150
- tag.predicate = () => ts.factory.createTrue();
151
- }
152
- result.push(...visitor.functor(meta, explore));
153
- if (result.length)
154
- visitor.errors.push({
155
- name: meta.getName(),
156
- explore: { ...explore },
157
- messages: [...new Set(result)],
158
- });
150
+ const validateMeta = (props: {
151
+ transformer?: ts.TransformationContext;
152
+ options: IOptions;
153
+ visitor: IValidationVisitor;
154
+ metadata: Metadata;
155
+ explore: IExplore;
156
+ }) => {
157
+ const result: string[] = [];
158
+ if (props.transformer !== undefined)
159
+ for (const atomic of props.metadata.atomics)
160
+ for (const row of atomic.tags)
161
+ for (const tag of row.filter(
162
+ (t) => t.validate !== undefined && t.predicate === undefined,
163
+ ))
164
+ try {
165
+ tag.predicate = ExpressionFactory.transpile(props.transformer)(
166
+ tag.validate!,
167
+ );
168
+ } catch {
169
+ result.push(
170
+ `Unable to transpile type tag script: ${JSON.stringify(
171
+ tag.validate,
172
+ )}`,
173
+ );
174
+ tag.predicate = () => ts.factory.createTrue();
175
+ }
176
+ result.push(...props.visitor.functor(props.metadata, props.explore));
177
+ if (result.length)
178
+ props.visitor.errors.push({
179
+ name: props.metadata.getName(),
180
+ explore: { ...props.explore },
181
+ messages: [...new Set(result)],
182
+ });
159
183
 
160
- for (const alias of meta.aliases)
161
- validateAlias(context)(options)(visitor)(alias, explore);
162
- for (const array of meta.arrays)
163
- validateArray(context)(options)(visitor)(array.type, explore);
164
- for (const tuple of meta.tuples)
165
- validateTuple(context)(options)(visitor)(tuple.type, explore);
166
- for (const obj of meta.objects)
167
- validateObject(context)(options)(visitor)(obj);
168
- for (const func of meta.functions)
169
- validateFunction(context)(options)(visitor)(func, explore);
170
- for (const set of meta.sets)
171
- validateMeta(context)(options)(visitor)(set, explore);
172
- for (const map of meta.maps) {
173
- validateMeta(context)(options)(visitor)(map.key, explore);
174
- validateMeta(context)(options)(visitor)(map.value, explore);
175
- }
184
+ for (const alias of props.metadata.aliases)
185
+ validateAlias({
186
+ ...props,
187
+ alias,
188
+ });
189
+ for (const array of props.metadata.arrays)
190
+ validateArray({
191
+ ...props,
192
+ array: array.type,
193
+ });
194
+ for (const tuple of props.metadata.tuples)
195
+ validateTuple({
196
+ ...props,
197
+ tuple: tuple.type,
198
+ });
199
+ for (const object of props.metadata.objects)
200
+ validateObject({
201
+ ...props,
202
+ object,
203
+ });
204
+ for (const func of props.metadata.functions)
205
+ validateFunction({
206
+ ...props,
207
+ function: func,
208
+ });
209
+ for (const set of props.metadata.sets)
210
+ validateMeta({
211
+ ...props,
212
+ metadata: set,
213
+ });
214
+ for (const map of props.metadata.maps) {
215
+ validateMeta({
216
+ ...props,
217
+ metadata: map.key,
218
+ });
219
+ validateMeta({
220
+ ...props,
221
+ metadata: map.value,
222
+ });
223
+ }
176
224
 
177
- if (options.escape === true && meta.escaped !== null)
178
- validateMeta(context)(options)(visitor)(meta.escaped.returns, {
179
- ...explore,
225
+ if (props.options.escape === true && props.metadata.escaped !== null)
226
+ validateMeta({
227
+ ...props,
228
+ metadata: props.metadata.escaped.returns,
229
+ explore: {
230
+ ...props.explore,
180
231
  escaped: true,
181
- });
182
- };
232
+ },
233
+ });
234
+ };
183
235
 
184
- const validateAlias =
185
- (context?: ts.TransformationContext) =>
186
- (options: IOptions) =>
187
- (visitor: IValidationVisitor) =>
188
- (alias: MetadataAlias, explore: IExplore) => {
189
- if (visitor.aliases.has(alias)) return;
190
- visitor.aliases.add(alias);
236
+ const validateAlias = (props: {
237
+ transformer?: ts.TransformationContext;
238
+ options: IOptions;
239
+ visitor: IValidationVisitor;
240
+ alias: MetadataAlias;
241
+ explore: IExplore;
242
+ }) => {
243
+ if (props.visitor.aliases.has(props.alias)) return;
244
+ props.visitor.aliases.add(props.alias);
191
245
 
192
- validateMeta(context)(options)(visitor)(alias.value, {
193
- ...explore,
194
- nested: alias,
246
+ validateMeta({
247
+ ...props,
248
+ metadata: props.alias.value,
249
+ explore: {
250
+ ...props.explore,
251
+ nested: props.alias,
195
252
  aliased: true,
196
- });
197
- };
253
+ },
254
+ });
255
+ };
198
256
 
199
- const validateArray =
200
- (context?: ts.TransformationContext) =>
201
- (options: IOptions) =>
202
- (visitor: IValidationVisitor) =>
203
- (array: MetadataArrayType, explore: IExplore) => {
204
- if (visitor.arrays.has(array)) return;
205
- visitor.arrays.add(array);
257
+ const validateArray = (props: {
258
+ transformer?: ts.TransformationContext;
259
+ options: IOptions;
260
+ visitor: IValidationVisitor;
261
+ array: MetadataArrayType;
262
+ explore: IExplore;
263
+ }) => {
264
+ if (props.visitor.arrays.has(props.array)) return;
265
+ props.visitor.arrays.add(props.array);
206
266
 
207
- validateMeta(context)(options)(visitor)(array.value, {
208
- ...explore,
209
- nested: array,
267
+ validateMeta({
268
+ ...props,
269
+ metadata: props.array.value,
270
+ explore: {
271
+ ...props.explore,
272
+ nested: props.array,
210
273
  top: false,
211
- });
212
- };
274
+ },
275
+ });
276
+ };
213
277
 
214
- const validateTuple =
215
- (context?: ts.TransformationContext) =>
216
- (options: IOptions) =>
217
- (visitor: IValidationVisitor) =>
218
- (tuple: MetadataTupleType, explore: IExplore) => {
219
- if (visitor.tuples.has(tuple)) return;
220
- visitor.tuples.add(tuple);
278
+ const validateTuple = (props: {
279
+ transformer?: ts.TransformationContext;
280
+ options: IOptions;
281
+ visitor: IValidationVisitor;
282
+ tuple: MetadataTupleType;
283
+ explore: IExplore;
284
+ }) => {
285
+ if (props.visitor.tuples.has(props.tuple)) return;
286
+ props.visitor.tuples.add(props.tuple);
221
287
 
222
- for (const elem of tuple.elements)
223
- validateMeta(context)(options)(visitor)(elem, {
224
- ...explore,
225
- nested: tuple,
288
+ for (const elem of props.tuple.elements)
289
+ validateMeta({
290
+ ...props,
291
+ metadata: elem,
292
+ explore: {
293
+ ...props.explore,
294
+ nested: props.tuple,
226
295
  top: false,
227
- });
228
- };
296
+ },
297
+ });
298
+ };
229
299
 
230
- const validateObject =
231
- (context?: ts.TransformationContext) =>
232
- (options: IOptions) =>
233
- (visitor: IValidationVisitor) =>
234
- (object: MetadataObject) => {
235
- if (visitor.objects.has(object)) return;
236
- visitor.objects.add(object);
300
+ const validateObject = (props: {
301
+ transformer?: ts.TransformationContext;
302
+ options: IOptions;
303
+ visitor: IValidationVisitor;
304
+ object: MetadataObject;
305
+ }) => {
306
+ if (props.visitor.objects.has(props.object)) return;
307
+ props.visitor.objects.add(props.object);
237
308
 
238
- if (options.validate) {
239
- const explore: IExplore = {
240
- object,
241
- top: false,
242
- property: null,
243
- parameter: null,
244
- nested: null,
245
- aliased: false,
246
- escaped: false,
247
- output: false,
248
- };
249
- const errors: string[] = options.validate(
250
- Metadata.create({
251
- ...Metadata.initialize(),
252
- objects: [object],
253
- }),
309
+ if (props.options.validate) {
310
+ const explore: IExplore = {
311
+ object: props.object,
312
+ top: false,
313
+ property: null,
314
+ parameter: null,
315
+ nested: null,
316
+ aliased: false,
317
+ escaped: false,
318
+ output: false,
319
+ };
320
+ const errors: string[] = props.options.validate(
321
+ Metadata.create({
322
+ ...Metadata.initialize(),
323
+ objects: [props.object],
324
+ }),
325
+ explore,
326
+ );
327
+ if (errors.length)
328
+ props.visitor.errors.push({
329
+ name: props.object.name,
254
330
  explore,
255
- );
256
- if (errors.length)
257
- visitor.errors.push({
258
- name: object.name,
259
- explore,
260
- messages: [...new Set(errors)],
261
- });
262
- }
331
+ messages: [...new Set(errors)],
332
+ });
333
+ }
263
334
 
264
- for (const property of object.properties)
265
- validateMeta(context)(options)(visitor)(property.value, {
266
- object,
335
+ for (const property of props.object.properties)
336
+ validateMeta({
337
+ ...props,
338
+ metadata: property.value,
339
+ explore: {
340
+ object: props.object,
267
341
  property: property.key.isSoleLiteral()
268
342
  ? property.key.getSoleLiteral()!
269
343
  : {},
@@ -273,34 +347,45 @@ export namespace MetadataFactory {
273
347
  aliased: false,
274
348
  escaped: false,
275
349
  output: false,
276
- });
277
- };
350
+ },
351
+ });
352
+ };
278
353
 
279
- const validateFunction =
280
- (context?: ts.TransformationContext) =>
281
- (options: IOptions) =>
282
- (visitor: IValidationVisitor) =>
283
- (func: MetadataFunction, explore: IExplore) => {
284
- if (visitor.functions.has(func)) return;
285
- visitor.functions.add(func);
354
+ const validateFunction = (props: {
355
+ transformer?: ts.TransformationContext;
356
+ options: IOptions;
357
+ visitor: IValidationVisitor;
358
+ function: MetadataFunction;
359
+ explore: IExplore;
360
+ }) => {
361
+ if (props.visitor.functions.has(props.function)) return;
362
+ props.visitor.functions.add(props.function);
286
363
 
287
- for (const param of func.parameters)
288
- validateMeta(context)(options)(visitor)(param.type, {
289
- ...explore,
364
+ for (const param of props.function.parameters)
365
+ validateMeta({
366
+ ...props,
367
+ metadata: param.type,
368
+ explore: {
369
+ ...props.explore,
290
370
  parameter: param.name,
291
371
  nested: null,
292
372
  top: false,
293
373
  output: false,
294
- });
295
- if (func.output)
296
- validateMeta(context)(options)(visitor)(func.output, {
297
- ...explore,
374
+ },
375
+ });
376
+ if (props.function.output)
377
+ validateMeta({
378
+ ...props,
379
+ metadata: props.function.output,
380
+ explore: {
381
+ ...props.explore,
298
382
  parameter: null,
299
383
  nested: null,
300
384
  top: false,
301
385
  output: true,
302
- });
303
- };
386
+ },
387
+ });
388
+ };
304
389
 
305
390
  interface IValidationVisitor {
306
391
  functor: Validator;
@@ -15,26 +15,33 @@ import { MetadataCollection } from "./MetadataCollection";
15
15
  import { MetadataFactory } from "./MetadataFactory";
16
16
 
17
17
  export namespace ProtobufFactory {
18
- export const metadata =
19
- (method: string) =>
20
- (checker: ts.TypeChecker, context?: ts.TransformationContext) =>
21
- (collection: MetadataCollection) =>
22
- (type: ts.Type): Metadata => {
23
- // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
24
- const result: ValidationPipe<Metadata, MetadataFactory.IError> =
25
- MetadataFactory.analyze(
26
- checker,
27
- context,
28
- )({
18
+ export interface IProps {
19
+ method: string;
20
+ checker: ts.TypeChecker;
21
+ transformer?: ts.TransformationContext;
22
+ collection: MetadataCollection;
23
+ type: ts.Type;
24
+ }
25
+
26
+ export const metadata = (props: IProps): Metadata => {
27
+ // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
28
+ const result: ValidationPipe<Metadata, MetadataFactory.IError> =
29
+ MetadataFactory.analyze({
30
+ ...props,
31
+ transformer: props.transformer,
32
+ options: {
29
33
  escape: false,
30
34
  constant: true,
31
35
  absorb: true,
32
36
  validate,
33
- })(collection)(type);
34
- if (result.success === false)
35
- throw TransformerError.from(`typia.protobuf.${method}`)(result.errors);
36
- return result.data;
37
- };
37
+ },
38
+ });
39
+ if (result.success === false)
40
+ throw TransformerError.from(`typia.protobuf.${props.method}`)(
41
+ result.errors,
42
+ );
43
+ return result.data;
44
+ };
38
45
 
39
46
  const validate = (
40
47
  meta: Metadata,
@@ -0,0 +1,16 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../schemas/metadata/Metadata";
4
+
5
+ import { MetadataCollection } from "../../MetadataCollection";
6
+ import { MetadataFactory } from "../../MetadataFactory";
7
+
8
+ export interface IMetadataIteratorProps<Type extends ts.Type = ts.Type> {
9
+ options: MetadataFactory.IOptions;
10
+ checker: ts.TypeChecker;
11
+ collection: MetadataCollection;
12
+ errors: MetadataFactory.IError[];
13
+ metadata: Metadata;
14
+ type: Type;
15
+ explore: MetadataFactory.IExplore;
16
+ }