typia 5.0.0-dev.20230827 → 5.0.0-dev.20230829

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 (277) hide show
  1. package/lib/executable/TypiaGenerateWizard.js +1 -1
  2. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  3. package/lib/executable/TypiaSetupWizard.js +1 -1
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/PackageManager.js +1 -1
  6. package/lib/executable/setup/PackageManager.js.map +1 -1
  7. package/lib/executable/setup/PluginConfigurator.js +2 -2
  8. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  9. package/lib/factories/ExpressionFactory.js +2 -2
  10. package/lib/factories/ExpressionFactory.js.map +1 -1
  11. package/lib/factories/JsonMetadataFactory.d.ts +7 -0
  12. package/lib/factories/JsonMetadataFactory.js +38 -0
  13. package/lib/factories/JsonMetadataFactory.js.map +1 -0
  14. package/lib/factories/LiteralFactory.js +1 -1
  15. package/lib/factories/LiteralFactory.js.map +1 -1
  16. package/lib/factories/MetadataCollection.js +0 -1
  17. package/lib/factories/MetadataCollection.js.map +1 -1
  18. package/lib/factories/MetadataCommentTagFactory.js +129 -118
  19. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  20. package/lib/factories/MetadataFactory.d.ts +22 -2
  21. package/lib/factories/MetadataFactory.js +248 -17
  22. package/lib/factories/MetadataFactory.js.map +1 -1
  23. package/lib/factories/MetadataTypeTagFactory.d.ts +3 -2
  24. package/lib/factories/MetadataTypeTagFactory.js +246 -173
  25. package/lib/factories/MetadataTypeTagFactory.js.map +1 -1
  26. package/lib/factories/ProtobufFactory.js +112 -97
  27. package/lib/factories/ProtobufFactory.js.map +1 -1
  28. package/lib/factories/TypeFactory.d.ts +0 -1
  29. package/lib/factories/TypeFactory.js +0 -5
  30. package/lib/factories/TypeFactory.js.map +1 -1
  31. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +1 -1
  32. package/lib/factories/internal/metadata/emplace_metadata_alias.js +20 -7
  33. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  34. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +1 -1
  35. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +20 -7
  36. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  37. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
  38. package/lib/factories/internal/metadata/emplace_metadata_object.js +100 -84
  39. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  40. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +1 -1
  41. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +34 -21
  42. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  43. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  44. package/lib/factories/internal/metadata/explore_metadata.js +12 -12
  45. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  47. package/lib/factories/internal/metadata/iterate_metadata.js +39 -19
  48. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  49. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +1 -1
  50. package/lib/factories/internal/metadata/iterate_metadata_alias.js +12 -10
  51. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  52. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
  53. package/lib/factories/internal/metadata/iterate_metadata_array.js +11 -9
  54. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -1
  56. package/lib/factories/internal/metadata/iterate_metadata_collection.js +47 -45
  57. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +2 -1
  59. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +16 -20
  60. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +1 -1
  62. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +145 -135
  63. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_map.js +28 -15
  66. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  67. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
  68. package/lib/factories/internal/metadata/iterate_metadata_object.js +16 -14
  69. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
  71. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +28 -15
  72. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
  74. package/lib/factories/internal/metadata/iterate_metadata_set.js +24 -11
  75. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  76. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
  77. package/lib/factories/internal/metadata/iterate_metadata_template.js +28 -15
  78. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
  80. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +11 -9
  81. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
  83. package/lib/factories/internal/metadata/iterate_metadata_union.js +20 -7
  84. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  85. package/lib/programmers/CheckerProgrammer.js +13 -8
  86. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  87. package/lib/programmers/FeatureProgrammer.d.ts +1 -1
  88. package/lib/programmers/FeatureProgrammer.js +1 -1
  89. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  90. package/lib/programmers/IsProgrammer.js +1 -1
  91. package/lib/programmers/IsProgrammer.js.map +1 -1
  92. package/lib/programmers/RandomProgrammer.js +9 -4
  93. package/lib/programmers/RandomProgrammer.js.map +1 -1
  94. package/lib/programmers/TypiaProgrammer.js +58 -28
  95. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  96. package/lib/programmers/helpers/ProtobufUtil.js +1 -1
  97. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  98. package/lib/programmers/internal/application_escaped.d.ts +4 -0
  99. package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +4 -4
  100. package/lib/programmers/internal/application_escaped.js.map +1 -0
  101. package/lib/programmers/internal/application_schema.js +5 -5
  102. package/lib/programmers/internal/application_schema.js.map +1 -1
  103. package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
  104. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  105. package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
  106. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  107. package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
  108. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  109. package/lib/programmers/json/JsonStringifyProgrammer.js +20 -62
  110. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  111. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
  112. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  113. package/lib/programmers/misc/MiscCloneProgrammer.js +13 -8
  114. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  115. package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
  116. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  117. package/lib/programmers/misc/MiscPruneProgrammer.js +13 -8
  118. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  119. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +21 -1
  120. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  121. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +11 -1
  122. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  123. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +22 -1
  124. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  125. package/lib/schemas/metadata/Metadata.js +4 -4
  126. package/lib/schemas/metadata/Metadata.js.map +1 -1
  127. package/lib/transform.d.ts +2 -1
  128. package/lib/transform.js +11 -3
  129. package/lib/transform.js.map +1 -1
  130. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  131. package/lib/transformers/CallExpressionTransformer.js +2 -1
  132. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  133. package/lib/transformers/FileTransformer.js +18 -8
  134. package/lib/transformers/FileTransformer.js.map +1 -1
  135. package/lib/transformers/IProject.d.ts +3 -0
  136. package/lib/transformers/NodeTransformer.d.ts +1 -1
  137. package/lib/transformers/TransformerError.d.ts +12 -0
  138. package/lib/transformers/TransformerError.js +66 -0
  139. package/lib/transformers/TransformerError.js.map +1 -0
  140. package/lib/transformers/features/AssertTransformer.d.ts +1 -0
  141. package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
  142. package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
  143. package/lib/transformers/features/CreateRandomTransformer.js +9 -4
  144. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  145. package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
  146. package/lib/transformers/features/IsTransformer.d.ts +1 -0
  147. package/lib/transformers/features/RandomTransformer.js +9 -4
  148. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  149. package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
  150. package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -19
  151. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  152. package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
  153. package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
  154. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
  155. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
  156. package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
  157. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
  158. package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
  159. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
  160. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
  161. package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
  162. package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
  163. package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
  164. package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
  165. package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
  166. package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
  167. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  168. package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
  169. package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
  170. package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
  171. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
  172. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
  173. package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
  174. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
  175. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
  176. package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
  177. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
  178. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
  179. package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
  180. package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
  181. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
  182. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  183. package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
  184. package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
  185. package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
  186. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
  187. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
  188. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
  189. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
  190. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
  191. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
  192. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
  193. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
  194. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
  195. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
  196. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
  197. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
  198. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
  199. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
  200. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
  201. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  202. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
  203. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
  204. package/lib/transformers/internal/GenericTransformer.js +17 -4
  205. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  206. package/lib/typings/ValidationPipe.d.ts +7 -0
  207. package/lib/typings/ValidationPipe.js +3 -0
  208. package/lib/typings/ValidationPipe.js.map +1 -0
  209. package/package.json +5 -1
  210. package/src/executable/TypiaGenerateWizard.ts +1 -1
  211. package/src/executable/TypiaSetupWizard.ts +1 -1
  212. package/src/executable/setup/PackageManager.ts +1 -1
  213. package/src/executable/setup/PluginConfigurator.ts +2 -2
  214. package/src/factories/ExpressionFactory.ts +2 -2
  215. package/src/factories/JsonMetadataFactory.ts +43 -0
  216. package/src/factories/LiteralFactory.ts +2 -1
  217. package/src/factories/MetadataCollection.ts +0 -5
  218. package/src/factories/MetadataCommentTagFactory.ts +130 -84
  219. package/src/factories/MetadataFactory.ts +175 -7
  220. package/src/factories/MetadataTypeTagFactory.ts +191 -141
  221. package/src/factories/ProtobufFactory.ts +92 -102
  222. package/src/factories/TypeFactory.ts +0 -5
  223. package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -5
  224. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +12 -5
  225. package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -5
  226. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +12 -2
  227. package/src/factories/internal/metadata/explore_metadata.ts +5 -11
  228. package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
  229. package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
  230. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -2
  231. package/src/factories/internal/metadata/iterate_metadata_collection.ts +30 -29
  232. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +21 -22
  233. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +33 -17
  234. package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
  235. package/src/factories/internal/metadata/iterate_metadata_object.ts +2 -1
  236. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +15 -12
  237. package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
  238. package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
  239. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -2
  240. package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
  241. package/src/programmers/CheckerProgrammer.ts +8 -2
  242. package/src/programmers/FeatureProgrammer.ts +4 -1
  243. package/src/programmers/IsProgrammer.ts +1 -1
  244. package/src/programmers/RandomProgrammer.ts +18 -17
  245. package/src/programmers/TypiaProgrammer.ts +27 -2
  246. package/src/programmers/helpers/ProtobufUtil.ts +1 -1
  247. package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +1 -1
  248. package/src/programmers/internal/application_schema.ts +5 -5
  249. package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
  250. package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
  251. package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
  252. package/src/programmers/json/JsonStringifyProgrammer.ts +7 -37
  253. package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
  254. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
  255. package/src/programmers/misc/MiscCloneProgrammer.ts +14 -11
  256. package/src/programmers/misc/MiscLiteralsProgrammer.ts +11 -6
  257. package/src/programmers/misc/MiscPruneProgrammer.ts +8 -2
  258. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +17 -1
  259. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +15 -1
  260. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +18 -1
  261. package/src/schemas/metadata/Metadata.ts +4 -4
  262. package/src/transform.ts +13 -5
  263. package/src/transformers/CallExpressionTransformer.ts +6 -3
  264. package/src/transformers/FileTransformer.ts +25 -13
  265. package/src/transformers/IProject.ts +3 -0
  266. package/src/transformers/NodeTransformer.ts +1 -1
  267. package/src/transformers/TransformerError.ts +55 -0
  268. package/src/transformers/features/CreateRandomTransformer.ts +11 -7
  269. package/src/transformers/features/RandomTransformer.ts +11 -7
  270. package/src/transformers/features/json/JsonApplicationTransformer.ts +39 -35
  271. package/src/transformers/features/misc/MetadataTransformer.ts +18 -10
  272. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
  273. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
  274. package/src/transformers/internal/GenericTransformer.ts +17 -10
  275. package/src/typings/ValidationPipe.ts +9 -0
  276. package/lib/programmers/internal/application_resolved.d.ts +0 -4
  277. package/lib/programmers/internal/application_resolved.js.map +0 -1
@@ -2,6 +2,7 @@ import ts from "typescript";
2
2
 
3
3
  import { IProject } from "./IProject";
4
4
  import { NodeTransformer } from "./NodeTransformer";
5
+ import { TransformerError } from "./TransformerError";
5
6
 
6
7
  export namespace FileTransformer {
7
8
  export const transform =
@@ -19,29 +20,40 @@ export namespace FileTransformer {
19
20
  const iterate_node =
20
21
  (project: IProject) =>
21
22
  (context: ts.TransformationContext) =>
22
- (node: ts.Node): ts.Node =>
23
- ts.visitEachChild(
24
- try_transform_node(project)(node),
23
+ (node: ts.Node): ts.Node => {
24
+ const changed: ts.Node | null = try_transform_node(project)(node);
25
+ return ts.visitEachChild(
26
+ changed ?? node,
25
27
  (child) => iterate_node(project)(context)(child),
26
28
  context,
27
29
  );
30
+ };
28
31
 
29
32
  const try_transform_node =
30
33
  (project: IProject) =>
31
- (node: ts.Node): ts.Node => {
34
+ (node: ts.Node): ts.Node | null => {
32
35
  try {
33
36
  return NodeTransformer.transform(project)(node);
34
37
  } catch (exp) {
35
- if (!(exp instanceof Error)) throw exp;
36
-
37
- const file: ts.SourceFile | undefined = node.getSourceFile();
38
- if (file === undefined) throw exp;
38
+ // ONLY ACCEPT TRANSFORMER-ERROR
39
+ if (!isTransformerError(exp)) throw exp;
39
40
 
40
- const { line, character } = file.getLineAndCharacterOfPosition(
41
- node.pos,
42
- );
43
- console.error(`${file.fileName}:${line}:${character}:`, exp);
44
- throw exp;
41
+ // REPORT DIAGNOSTIC
42
+ const diagnostic = ts.createDiagnosticForNode(node, {
43
+ key: exp.code,
44
+ category: ts.DiagnosticCategory.Error,
45
+ message: exp.message,
46
+ code: `(${exp.code})` as any,
47
+ });
48
+ project.extras.addDiagnostic(diagnostic);
49
+ return null;
45
50
  }
46
51
  };
47
52
  }
53
+
54
+ const isTransformerError = (error: any): error is TransformerError =>
55
+ typeof error === "object" &&
56
+ error !== null &&
57
+ error.constructor.name === "TransformerError" &&
58
+ typeof error.code === "string" &&
59
+ typeof error.message === "string";
@@ -9,4 +9,7 @@ export interface IProject {
9
9
  printer: ts.Printer;
10
10
  options: ITransformOptions;
11
11
  context: ts.TransformationContext;
12
+ extras: {
13
+ addDiagnostic: (diag: ts.Diagnostic) => number;
14
+ };
12
15
  }
@@ -6,7 +6,7 @@ import { IProject } from "./IProject";
6
6
  export namespace NodeTransformer {
7
7
  export const transform =
8
8
  (project: IProject) =>
9
- (expression: ts.Node): ts.Node =>
9
+ (expression: ts.Node): ts.Node | null =>
10
10
  ts.isCallExpression(expression)
11
11
  ? CallExpressionTransformer.transform(project)(expression)
12
12
  : expression;
@@ -0,0 +1,55 @@
1
+ import { MetadataFactory } from "../factories/MetadataFactory";
2
+
3
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
4
+
5
+ import { Escaper } from "../utils/Escaper";
6
+
7
+ export class TransformerError extends Error {
8
+ public readonly code: string;
9
+
10
+ public constructor(props: TransformerError.IProps) {
11
+ super(props.message);
12
+ this.code = props.code;
13
+
14
+ // INHERITANCE POLYFILL
15
+ const proto = new.target.prototype;
16
+ if (Object.setPrototypeOf) Object.setPrototypeOf(this, proto);
17
+ else (this as any).__proto__ = proto;
18
+ }
19
+ }
20
+ export namespace TransformerError {
21
+ export interface IProps {
22
+ code: string;
23
+ message: string;
24
+ }
25
+
26
+ export const from =
27
+ (method: string) =>
28
+ (errors: MetadataFactory.IError[]): TransformerError => {
29
+ const body: string = errors
30
+ .map((e) => {
31
+ const subject: string =
32
+ e.explore.object === null
33
+ ? ""
34
+ : join(e.explore.object)(e.explore.property);
35
+ const type: string = `${
36
+ subject.length ? `${subject}: ` : ""
37
+ }${e.name}`;
38
+ return `- ${type}\n${e.messages
39
+ .map((msg) => ` - ${msg}`)
40
+ .join("\n")}`;
41
+ })
42
+ .join("\n\n");
43
+ return new TransformerError({
44
+ code: method,
45
+ message: `unsupported type detected\n\n${body}`,
46
+ });
47
+ };
48
+
49
+ const join = (object: MetadataObject) => (key: string | object | null) => {
50
+ if (key === null) return object.name;
51
+ else if (typeof key === "object") return `${object.name}[key]`;
52
+ else if (Escaper.variable(key)) return `${object.name}.${key}`;
53
+ return `${object.name}[${JSON.stringify(key)}]`;
54
+ };
55
+ }
@@ -3,6 +3,7 @@ import ts from "typescript";
3
3
  import { RandomProgrammer } from "../../programmers/RandomProgrammer";
4
4
 
5
5
  import { IProject } from "../IProject";
6
+ import { TransformerError } from "../TransformerError";
6
7
 
7
8
  export namespace CreateRandomTransformer {
8
9
  export const transform =
@@ -10,13 +11,21 @@ export namespace CreateRandomTransformer {
10
11
  (modulo: ts.LeftHandSideExpression) =>
11
12
  (expression: ts.CallExpression): ts.Expression => {
12
13
  // CHECK GENERIC ARGUMENT EXISTENCE
13
- if (!expression.typeArguments?.[0]) throw new Error(NOT_SPECIFIED);
14
+ if (!expression.typeArguments?.[0])
15
+ throw new TransformerError({
16
+ code: "typia.createRandom",
17
+ message: "generic argument is not specified.",
18
+ });
14
19
 
15
20
  // GET TYPE INFO
16
21
  const node: ts.TypeNode = expression.typeArguments[0];
17
22
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
18
23
 
19
- if (type.isTypeParameter()) throw new Error(NO_GENERIC_ARGUMENT);
24
+ if (type.isTypeParameter())
25
+ throw new TransformerError({
26
+ code: "typia.createRandom",
27
+ message: "non-specified generic argument.",
28
+ });
20
29
 
21
30
  // DO TRANSFORM
22
31
  return RandomProgrammer.write({
@@ -32,8 +41,3 @@ export namespace CreateRandomTransformer {
32
41
  );
33
42
  };
34
43
  }
35
-
36
- const NOT_SPECIFIED =
37
- "Error on typia.createRandom(): generic argument is not specified.";
38
- const NO_GENERIC_ARGUMENT =
39
- "Error on typia.createRandom(): non-specified generic argument.";
@@ -3,6 +3,7 @@ import ts from "typescript";
3
3
  import { RandomProgrammer } from "../../programmers/RandomProgrammer";
4
4
 
5
5
  import { IProject } from "../IProject";
6
+ import { TransformerError } from "../TransformerError";
6
7
 
7
8
  export namespace RandomTransformer {
8
9
  export const transform =
@@ -10,13 +11,21 @@ export namespace RandomTransformer {
10
11
  (modulo: ts.LeftHandSideExpression) =>
11
12
  (expression: ts.CallExpression): ts.Expression => {
12
13
  // CHECK GENERIC ARGUMENT EXISTENCE
13
- if (!expression.typeArguments?.[0]) throw new Error(NOT_SPECIFIED);
14
+ if (!expression.typeArguments?.[0])
15
+ throw new TransformerError({
16
+ code: `typia.${modulo.getText()}`,
17
+ message: "generic argument is not specified.",
18
+ });
14
19
 
15
20
  // GET TYPE INFO
16
21
  const node: ts.TypeNode = expression.typeArguments[0];
17
22
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
18
23
 
19
- if (type.isTypeParameter()) throw new Error(NO_GENERIC_ARGUMENT);
24
+ if (type.isTypeParameter())
25
+ throw new TransformerError({
26
+ code: `typia.${modulo.getText()}`,
27
+ message: "non-specified generic argument.",
28
+ });
20
29
 
21
30
  // DO TRANSFORM
22
31
  return ts.factory.createCallExpression(
@@ -35,8 +44,3 @@ export namespace RandomTransformer {
35
44
  );
36
45
  };
37
46
  }
38
-
39
- const NOT_SPECIFIED =
40
- "Error on typia.random(): generic argument is not specified.";
41
- const NO_GENERIC_ARGUMENT =
42
- "Error on typia.random(): non-specified generic argument.";
@@ -1,5 +1,6 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { JsonMetadataFactory } from "../../../factories/JsonMetadataFactory";
3
4
  import { LiteralFactory } from "../../../factories/LiteralFactory";
4
5
  import { MetadataCollection } from "../../../factories/MetadataCollection";
5
6
  import { MetadataFactory } from "../../../factories/MetadataFactory";
@@ -9,14 +10,20 @@ import { Metadata } from "../../../schemas/metadata/Metadata";
9
10
 
10
11
  import { JsonApplicationProgrammer } from "../../../programmers/json/JsonApplicationProgrammer";
11
12
 
13
+ import { ValidationPipe } from "../../../typings/ValidationPipe";
14
+
12
15
  import { IProject } from "../../IProject";
16
+ import { TransformerError } from "../../TransformerError";
13
17
 
14
18
  export namespace JsonApplicationTransformer {
15
19
  export const transform =
16
20
  ({ checker }: IProject) =>
17
21
  (expression: ts.CallExpression): ts.Expression => {
18
22
  if (!expression.typeArguments?.length)
19
- throw new Error(NO_GENERIC_ARGUMENT);
23
+ throw new TransformerError({
24
+ code: "typia.json.application",
25
+ message: "no generic argument.",
26
+ });
20
27
 
21
28
  //----
22
29
  // GET ARGUMENTS
@@ -32,7 +39,10 @@ export namespace JsonApplicationTransformer {
32
39
  checker.getTypeFromTypeNode(child as ts.TypeNode),
33
40
  );
34
41
  if (types.some((t) => t.isTypeParameter()))
35
- throw new Error(GENERIC_ARGUMENT);
42
+ throw new TransformerError({
43
+ code: "typia.json.application",
44
+ message: "non-specified generic argument(s).",
45
+ });
36
46
 
37
47
  // ADDITIONAL PARAMETERS
38
48
  const purpose: "swagger" | "ajv" = get_parameter(
@@ -48,24 +58,25 @@ export namespace JsonApplicationTransformer {
48
58
  //----
49
59
  // METADATA
50
60
  const collection: MetadataCollection = new MetadataCollection();
51
- const metadatas: Array<Metadata> = types.map((type) =>
52
- MetadataFactory.analyze(checker)({
53
- escape: true,
54
- constant: true,
55
- absorb: false,
56
- validate: (meta) => {
57
- if (meta.atomics.find((atom) => atom.type === "bigint"))
58
- throw new Error(NO_BIGIT);
59
- else if (
60
- meta.arrays.some(
61
- (array) =>
62
- array.type.value.isRequired() === false,
63
- )
64
- )
65
- throw new Error(NO_UNDEFINED_IN_ARRAY);
66
- },
67
- })(collection)(type),
68
- );
61
+ const results: ValidationPipe<Metadata, MetadataFactory.IError>[] =
62
+ types.map((type) =>
63
+ MetadataFactory.analyze(checker)({
64
+ escape: true,
65
+ constant: true,
66
+ absorb: false,
67
+ validate: JsonMetadataFactory.validate,
68
+ })(collection)(type),
69
+ );
70
+
71
+ // REPORT BUG IF REQUIRED
72
+ const metadatas: Metadata[] = [];
73
+ const errors: MetadataFactory.IError[] = [];
74
+ for (const r of results) {
75
+ if (r.success === false) errors.push(...r.errors);
76
+ else metadatas.push(r.data);
77
+ }
78
+ if (errors.length)
79
+ throw TransformerError.from("typia.json.application")(errors);
69
80
 
70
81
  // APPLICATION
71
82
  const app: IJsonApplication = JsonApplicationProgrammer.write({
@@ -88,25 +99,18 @@ export namespace JsonApplicationTransformer {
88
99
  // CHECK LITERAL TYPE
89
100
  const type: ts.Type = checker.getTypeFromTypeNode(node);
90
101
  if (!type.isLiteral())
91
- throw new Error(
92
- `Error on typia.application(): generic argument "${name}" must be constant.`,
93
- );
102
+ throw new TransformerError({
103
+ code: "typia.json.application",
104
+ message: `generic argument "${name}" must be constant.`,
105
+ });
94
106
 
95
107
  // GET VALUE AND VALIDATE IT
96
108
  const value = type.value;
97
109
  if (typeof value !== "string" || predicator(value) === false)
98
- throw new Error(
99
- `Error on typia.application(): invalid value on generic argument "${name}".`,
100
- );
110
+ throw new TransformerError({
111
+ code: "typia.json.application",
112
+ message: `invalid value on generic argument "${name}".`,
113
+ });
101
114
  return value as T;
102
115
  };
103
116
  }
104
-
105
- const NO_GENERIC_ARGUMENT =
106
- "Error on typia.json.application(): no generic argument.";
107
- const GENERIC_ARGUMENT =
108
- "Error on typia.json.application(): non-specified generic argument(s).";
109
- const NO_BIGIT =
110
- "Error on typia.json.application(): does not allow bigint type.";
111
- const NO_UNDEFINED_IN_ARRAY =
112
- "Error on typia.json.application(): does not allow undefined type in array.";
@@ -8,13 +8,17 @@ import { IMetadataApplication } from "../../../schemas/metadata/IMetadataApplica
8
8
  import { Metadata } from "../../../schemas/metadata/Metadata";
9
9
 
10
10
  import { IProject } from "../../IProject";
11
+ import { TransformerError } from "../../TransformerError";
11
12
 
12
13
  export namespace MetadataTransformer {
13
14
  export const transform =
14
15
  ({ checker }: IProject) =>
15
16
  (expression: ts.CallExpression): ts.Expression => {
16
17
  if (!expression.typeArguments?.length)
17
- throw new Error(NO_GENERIC_ARGUMENT);
18
+ throw new TransformerError({
19
+ code: "typia.metadata",
20
+ message: "no generic argument.",
21
+ });
18
22
 
19
23
  // VALIDATE TUPLE ARGUMENTS
20
24
  const top: ts.Node = expression.typeArguments[0]!;
@@ -27,17 +31,25 @@ export namespace MetadataTransformer {
27
31
  checker.getTypeFromTypeNode(child as ts.TypeNode),
28
32
  );
29
33
  if (types.some((t) => t.isTypeParameter()))
30
- throw new Error(GENERIC_ARGUMENT);
34
+ throw new TransformerError({
35
+ code: "typia.metadata",
36
+ message: "non-specified generic argument(s).",
37
+ });
31
38
 
32
39
  // METADATA
33
40
  const collection: MetadataCollection = new MetadataCollection();
34
- const metadatas: Array<Metadata> = types.map((type) =>
35
- MetadataFactory.analyze(checker)({
41
+ const metadatas: Array<Metadata> = types.map((type) => {
42
+ const result = MetadataFactory.analyze(checker)({
36
43
  escape: true,
37
44
  constant: true,
38
45
  absorb: true,
39
- })(collection)(type),
40
- );
46
+ })(collection)(type);
47
+ if (result.success === false)
48
+ throw TransformerError.from("typia.metadata")(
49
+ result.errors,
50
+ );
51
+ return result.data;
52
+ });
41
53
 
42
54
  // CONVERT TO PRIMITIVE TYPE
43
55
  const app: IMetadataApplication = {
@@ -47,7 +59,3 @@ export namespace MetadataTransformer {
47
59
  return LiteralFactory.generate(app);
48
60
  };
49
61
  }
50
-
51
- const NO_GENERIC_ARGUMENT = "Error on typia.metadata(): no generic argument.";
52
- const GENERIC_ARGUMENT =
53
- "Error on typia.metadata(): non-specified generic argument(s).";
@@ -3,26 +3,30 @@ import ts from "typescript";
3
3
  import { MiscLiteralsProgrammer } from "../../../programmers/misc/MiscLiteralsProgrammer";
4
4
 
5
5
  import { IProject } from "../../IProject";
6
+ import { TransformerError } from "../../TransformerError";
6
7
 
7
8
  export namespace MiscLiteralsTransformer {
8
9
  export const transform =
9
10
  (project: IProject) =>
10
11
  (expression: ts.CallExpression): ts.Expression => {
11
12
  // CHECK GENERIC ARGUMENT EXISTENCE
12
- if (!expression.typeArguments?.[0]) throw new Error(NOT_SPECIFIED);
13
+ if (!expression.typeArguments?.[0])
14
+ throw new TransformerError({
15
+ code: "typia.misc.literals",
16
+ message: "generic argument is not specified.",
17
+ });
13
18
 
14
19
  // GET TYPE INFO
15
20
  const node: ts.TypeNode = expression.typeArguments[0];
16
21
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
17
22
 
18
- if (type.isTypeParameter()) throw new Error(NO_GENERIC_ARGUMENT);
23
+ if (type.isTypeParameter())
24
+ throw new TransformerError({
25
+ code: "typia.misc.literals",
26
+ message: "non-specified generic argument.",
27
+ });
19
28
 
20
29
  // DO TRANSFORM
21
30
  return MiscLiteralsProgrammer.write(project)(type);
22
31
  };
23
32
  }
24
-
25
- const NOT_SPECIFIED =
26
- "Error on typia.literals(): generic argument is not specified.";
27
- const NO_GENERIC_ARGUMENT =
28
- "Error on typia.literals(): non-specified generic argument.";
@@ -3,6 +3,7 @@ import ts from "typescript";
3
3
  import { ProtobufMessageProgrammer } from "../../../programmers/protobuf/ProtobufMessageProgrammer";
4
4
 
5
5
  import { IProject } from "../../IProject";
6
+ import { TransformerError } from "../../TransformerError";
6
7
 
7
8
  export namespace ProtobufMessageTransformer {
8
9
  export const transform =
@@ -11,21 +12,22 @@ export namespace ProtobufMessageTransformer {
11
12
  (expression: ts.CallExpression): ts.Expression => {
12
13
  // CHECK GENERIC ARGUMENT EXISTENCE
13
14
  if (!expression.typeArguments || !expression.typeArguments[0])
14
- throw new Error(ErrorMessages.NOT_SPECIFIED);
15
+ throw new TransformerError({
16
+ code: "typia.protobuf.message",
17
+ message: "generic argument is not specified.",
18
+ });
15
19
 
16
20
  // GET TYPE INFO
17
21
  const type: ts.Type = project.checker.getTypeFromTypeNode(
18
22
  expression.typeArguments[0],
19
23
  );
20
24
  if (type.isTypeParameter())
21
- throw new Error(ErrorMessages.GENERIC_ARGUMENT);
25
+ throw new TransformerError({
26
+ code: "tyipa.protobuf.message",
27
+ message: "non-specified generic argument.",
28
+ });
22
29
 
23
30
  // DO TRANSFORM
24
31
  return ProtobufMessageProgrammer.write(project)(type);
25
32
  };
26
33
  }
27
-
28
- const enum ErrorMessages {
29
- NOT_SPECIFIED = "Error on typia.protobuf.message(): generic argument is not specified.",
30
- GENERIC_ARGUMENT = "Error on typia.protobuf.message(): non-specified generic argument.",
31
- }
@@ -1,6 +1,7 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { IProject } from "../IProject";
4
+ import { TransformerError } from "../TransformerError";
4
5
 
5
6
  export namespace GenericTransformer {
6
7
  export const scalar =
@@ -17,7 +18,10 @@ export namespace GenericTransformer {
17
18
  (expression: ts.CallExpression) => {
18
19
  // CHECK PARAMETER
19
20
  if (expression.arguments.length !== 1)
20
- throw new Error(`Error on typia.${method}(): no input value.`);
21
+ throw new TransformerError({
22
+ code: `typia.${method}`,
23
+ message: `no input value.`,
24
+ });
21
25
 
22
26
  // GET TYPE INFO
23
27
  const [type, node, generic]: [ts.Type, ts.Node, boolean] =
@@ -37,9 +41,10 @@ export namespace GenericTransformer {
37
41
  false,
38
42
  ];
39
43
  if (type.isTypeParameter())
40
- throw new Error(
41
- `Error on typia.${method}(): non-specified generic argument.`,
42
- );
44
+ throw new TransformerError({
45
+ code: `typia.${method}`,
46
+ message: `non-specified generic argument.`,
47
+ });
43
48
 
44
49
  // DO TRANSFORM
45
50
  return ts.factory.createCallExpression(
@@ -68,18 +73,20 @@ export namespace GenericTransformer {
68
73
  (expression: ts.CallExpression) => {
69
74
  // CHECK GENERIC ARGUMENT EXISTENCE
70
75
  if (!expression.typeArguments?.[0])
71
- throw new Error(
72
- `Error on typia.${method}(): generic argument is not specified.`,
73
- );
76
+ throw new TransformerError({
77
+ code: `typia.${method}`,
78
+ message: `generic argument is not specified.`,
79
+ });
74
80
 
75
81
  // GET TYPE INFO
76
82
  const node: ts.TypeNode = expression.typeArguments[0];
77
83
  const type: ts.Type = project.checker.getTypeFromTypeNode(node);
78
84
 
79
85
  if (type.isTypeParameter())
80
- throw new Error(
81
- `Error on typia.${method}(): non-specified generic argument.`,
82
- );
86
+ throw new TransformerError({
87
+ code: `typia.${method}`,
88
+ message: `non-specified generic argument.`,
89
+ });
83
90
 
84
91
  // DO TRANSFORM
85
92
  return programmer(project)(modulo)(type, node.getFullText().trim());
@@ -0,0 +1,9 @@
1
+ export type ValidationPipe<T, E> =
2
+ | {
3
+ success: true;
4
+ data: T;
5
+ }
6
+ | {
7
+ success: false;
8
+ errors: E[];
9
+ };
@@ -1,4 +0,0 @@
1
- import { MetadataEscaped } from "../../schemas/metadata/MetadataEscaped";
2
- import { IJsonComponents, IJsonSchema } from "../../module";
3
- import { JsonApplicationProgrammer } from "../json/JsonApplicationProgrammer";
4
- export declare const application_resolved: (options: JsonApplicationProgrammer.IOptions) => <BlockNever extends boolean>(blockNever: BlockNever) => (components: IJsonComponents) => (resolved: MetadataEscaped) => (attribute: IJsonSchema.IAttribute) => IJsonSchema[];
@@ -1 +0,0 @@
1
- {"version":3,"file":"application_resolved.js","sourceRoot":"","sources":["../../../src/programmers/internal/application_resolved.ts"],"names":[],"mappings":";;;AAKA,2DAA0D;AAEnD,IAAM,oBAAoB,GAC7B,UAAC,OAA2C;IAC5C,OAAA,UAA6B,UAAsB;QACnD,OAAA,UAAC,UAA2B;YAC5B,OAAA,UAAC,QAAyB;gBAC1B,OAAA,UAAC,SAAiC;oBAC9B,IAAM,MAAM,GAAG,IAAA,uCAAkB,EAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAC9D,QAAQ,CAAC,OAAO,CACnB,CAAC,SAAS,CAAC,CAAC;oBACb,IAAI,MAAM,KAAK,IAAI;wBAAE,OAAO,EAAE,CAAC;oBAE/B,IAAI,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;wBACvC,IAAM,MAAM,GAAoC,SAAS,CAAC,MAAM,CAAC;4BAC7D,CAAC,CAAC,MAAM;4BACR,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gCACnB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gCAC9B,CAAC,CAAC,SAAS,CAAC;wBAChB,IACI,MAAM,KAAK,SAAS;4BACpB,MAAM,CAAC,MAAM,KAAK,MAAM;4BACxB,MAAM,CAAC,MAAM,KAAK,WAAW;4BAE7B,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC;qBACnC;oBACD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;YApBD,CAoBC;QArBD,CAqBC;IAtBD,CAsBC;AAvBD,CAuBC,CAAC;AAzBO,QAAA,oBAAoB,wBAyB3B;AAEN,IAAM,SAAS,GAAG,UAAC,IAAiB;IAChC,OAAC,IAA4B,CAAC,IAAI,KAAK,QAAQ;AAA/C,CAA+C,CAAC;AAEpD,IAAM,SAAS,GAAG,UAAC,IAAiB;IAChC,OAAA,KAAK,CAAC,OAAO,CAAE,IAA2B,CAAC,KAAK,CAAC;AAAjD,CAAiD,CAAC;AAEtD,IAAM,OAAO,GACT,UAAC,OAAsB;IACvB,OAAA,UAAC,IAAc;QACX,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElB,OAAO,CACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,KAAK,MAAM,EAAf,CAAe,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAC,KAAK,IAAK,OAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAlC,CAAkC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAC,KAAK;gBACnB,OAAA,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAA1C,CAA0C,CAC7C;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAC,KAAK,IAAK,OAAA,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAA7B,CAA6B,CAAC,CAC9D,CAAC;IACN,CAAC;AAZD,CAYC,CAAC"}