typia 5.0.0-dev.20230827 → 5.0.0-dev.20230828

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 (265) 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 +221 -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 +73 -68
  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/internal/application_escaped.d.ts +4 -0
  97. package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +4 -4
  98. package/lib/programmers/internal/application_escaped.js.map +1 -0
  99. package/lib/programmers/internal/application_schema.js +5 -5
  100. package/lib/programmers/internal/application_schema.js.map +1 -1
  101. package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
  102. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  103. package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
  104. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  105. package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
  106. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  107. package/lib/programmers/json/JsonStringifyProgrammer.js +20 -62
  108. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  109. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
  110. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  111. package/lib/programmers/misc/MiscCloneProgrammer.js +13 -8
  112. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  113. package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
  114. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  115. package/lib/programmers/misc/MiscPruneProgrammer.js +13 -8
  116. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  117. package/lib/schemas/metadata/Metadata.js +4 -4
  118. package/lib/schemas/metadata/Metadata.js.map +1 -1
  119. package/lib/transform.d.ts +2 -1
  120. package/lib/transform.js +11 -3
  121. package/lib/transform.js.map +1 -1
  122. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  123. package/lib/transformers/CallExpressionTransformer.js +2 -1
  124. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  125. package/lib/transformers/FileTransformer.js +18 -8
  126. package/lib/transformers/FileTransformer.js.map +1 -1
  127. package/lib/transformers/IProject.d.ts +3 -0
  128. package/lib/transformers/NodeTransformer.d.ts +1 -1
  129. package/lib/transformers/TransformerError.d.ts +12 -0
  130. package/lib/transformers/TransformerError.js +66 -0
  131. package/lib/transformers/TransformerError.js.map +1 -0
  132. package/lib/transformers/features/AssertTransformer.d.ts +1 -0
  133. package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
  134. package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
  135. package/lib/transformers/features/CreateRandomTransformer.js +9 -4
  136. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  137. package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
  138. package/lib/transformers/features/IsTransformer.d.ts +1 -0
  139. package/lib/transformers/features/RandomTransformer.js +9 -4
  140. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  141. package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
  142. package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -19
  143. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  144. package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
  145. package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
  146. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
  147. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
  148. package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
  149. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
  150. package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
  151. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
  152. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
  153. package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
  154. package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
  155. package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
  156. package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
  157. package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
  158. package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
  159. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  160. package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
  161. package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
  162. package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
  163. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
  164. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
  165. package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
  166. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
  167. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
  168. package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
  169. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
  170. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
  171. package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
  172. package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
  173. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
  174. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  175. package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
  176. package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
  177. package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
  178. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
  179. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
  180. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
  181. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
  182. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
  183. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
  184. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
  185. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
  186. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
  187. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
  188. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
  189. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
  190. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
  191. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
  192. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
  193. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  194. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
  195. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
  196. package/lib/transformers/internal/GenericTransformer.js +17 -4
  197. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  198. package/lib/typings/ValidationPipe.d.ts +7 -0
  199. package/lib/typings/ValidationPipe.js +3 -0
  200. package/lib/typings/ValidationPipe.js.map +1 -0
  201. package/package.json +3 -1
  202. package/src/executable/TypiaGenerateWizard.ts +1 -1
  203. package/src/executable/TypiaSetupWizard.ts +1 -1
  204. package/src/executable/setup/PackageManager.ts +1 -1
  205. package/src/executable/setup/PluginConfigurator.ts +2 -2
  206. package/src/factories/ExpressionFactory.ts +2 -2
  207. package/src/factories/JsonMetadataFactory.ts +43 -0
  208. package/src/factories/LiteralFactory.ts +2 -1
  209. package/src/factories/MetadataCollection.ts +0 -5
  210. package/src/factories/MetadataCommentTagFactory.ts +130 -84
  211. package/src/factories/MetadataFactory.ts +169 -7
  212. package/src/factories/MetadataTypeTagFactory.ts +191 -141
  213. package/src/factories/ProtobufFactory.ts +86 -93
  214. package/src/factories/TypeFactory.ts +0 -5
  215. package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -5
  216. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +12 -5
  217. package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -5
  218. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +12 -2
  219. package/src/factories/internal/metadata/explore_metadata.ts +5 -11
  220. package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
  221. package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
  222. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -2
  223. package/src/factories/internal/metadata/iterate_metadata_collection.ts +30 -29
  224. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +21 -22
  225. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +33 -17
  226. package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
  227. package/src/factories/internal/metadata/iterate_metadata_object.ts +2 -1
  228. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +15 -12
  229. package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
  230. package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
  231. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -2
  232. package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
  233. package/src/programmers/CheckerProgrammer.ts +8 -2
  234. package/src/programmers/FeatureProgrammer.ts +4 -1
  235. package/src/programmers/IsProgrammer.ts +1 -1
  236. package/src/programmers/RandomProgrammer.ts +18 -17
  237. package/src/programmers/TypiaProgrammer.ts +27 -2
  238. package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +1 -1
  239. package/src/programmers/internal/application_schema.ts +5 -5
  240. package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
  241. package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
  242. package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
  243. package/src/programmers/json/JsonStringifyProgrammer.ts +7 -37
  244. package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
  245. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
  246. package/src/programmers/misc/MiscCloneProgrammer.ts +14 -11
  247. package/src/programmers/misc/MiscLiteralsProgrammer.ts +11 -6
  248. package/src/programmers/misc/MiscPruneProgrammer.ts +8 -2
  249. package/src/schemas/metadata/Metadata.ts +4 -4
  250. package/src/transform.ts +13 -5
  251. package/src/transformers/CallExpressionTransformer.ts +6 -3
  252. package/src/transformers/FileTransformer.ts +25 -13
  253. package/src/transformers/IProject.ts +3 -0
  254. package/src/transformers/NodeTransformer.ts +1 -1
  255. package/src/transformers/TransformerError.ts +55 -0
  256. package/src/transformers/features/CreateRandomTransformer.ts +11 -7
  257. package/src/transformers/features/RandomTransformer.ts +11 -7
  258. package/src/transformers/features/json/JsonApplicationTransformer.ts +39 -35
  259. package/src/transformers/features/misc/MetadataTransformer.ts +18 -10
  260. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
  261. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
  262. package/src/transformers/internal/GenericTransformer.ts +17 -10
  263. package/src/typings/ValidationPipe.ts +9 -0
  264. package/lib/programmers/internal/application_resolved.d.ts +0 -4
  265. package/lib/programmers/internal/application_resolved.js.map +0 -1
@@ -3,6 +3,9 @@ import ts from "typescript";
3
3
  import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
4
  import { Metadata } from "../schemas/metadata/Metadata";
5
5
 
6
+ import { Writable } from "../typings/Writable";
7
+
8
+ import { MetadataFactory } from "./MetadataFactory";
6
9
  import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
7
10
 
8
11
  /**
@@ -12,33 +15,60 @@ import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
12
15
  */
13
16
  export namespace MetadataCommentTagFactory {
14
17
  export const analyze =
15
- (identifier: () => string) =>
18
+ (errors: MetadataFactory.IError[]) =>
16
19
  (metadata: Metadata) =>
17
- (commentList: ts.JSDocTagInfo[]) => {
20
+ (
21
+ commentList: ts.JSDocTagInfo[],
22
+ explore: MetadataFactory.IExplore,
23
+ ): void => {
24
+ // PREPARE MESSAGE CONTAINER
25
+ const messages: string[] = [];
26
+ const report = (msg: string) => {
27
+ messages.push(msg);
28
+ return null;
29
+ };
30
+ const validateReport =
31
+ (property: string | null) =>
32
+ (msg: string): false => {
33
+ messages.push(
34
+ `the property ${
35
+ property === null
36
+ ? `["typia.tag"]`
37
+ : `["typia.tag.${property}"]`
38
+ } ${msg}.`,
39
+ );
40
+ return false;
41
+ };
42
+
43
+ // VALIDATE AND CONSTRUCT COMMENT TAGS
18
44
  for (const comment of commentList) {
19
- const tagger: TagRecord = parse(identifier)(comment);
45
+ const tagger: TagRecord | null = parse(report)(comment);
46
+ if (tagger === null) continue;
20
47
  for (const [key, value] of Object.entries(tagger)) {
48
+ const filtered: IMetadataTypeTag[] = value.filter(
49
+ (v) => v.validate !== null,
50
+ ) as IMetadataTypeTag[];
21
51
  if (key === "array") {
22
- if (metadata.arrays.length === 0)
23
- throw new Error(
24
- `${LABEL}: ${
25
- comment.name
26
- } requires array type, no on "${identifier()}".`,
52
+ if (metadata.arrays.length === 0) {
53
+ report(`requires array type`);
54
+ continue;
55
+ }
56
+ for (const a of metadata.arrays) {
57
+ Writable(a).tags = a.tags.filter((x) =>
58
+ MetadataTypeTagFactory.validate(validateReport)(
59
+ "array",
60
+ )([...x, ...filtered]),
27
61
  );
28
- for (const a of metadata.arrays)
29
- for (const tags of a.tags ?? [])
30
- MetadataTypeTagFactory.validate("array")([
31
- ...tags,
32
- ...value,
33
- ]);
34
- for (const a of metadata.arrays)
35
- if (a.tags.length === 0) a.tags.push(value);
36
- else for (const tags of a.tags) tags.push(...value);
62
+ if (a.tags.length === 0) a.tags.push(filtered);
63
+ else
64
+ for (const tags of a.tags)
65
+ tags.push(...filtered);
66
+ }
37
67
  } else {
38
68
  const atomic = metadata.atomics.find(
39
69
  (a) => a.type == key,
40
70
  );
41
- if (atomic === undefined) {
71
+ if (atomic === undefined)
42
72
  if (key === "bigint" || key === "number") {
43
73
  const opposite =
44
74
  key === "bigint" ? "number" : "bigint";
@@ -55,63 +85,68 @@ export namespace MetadataCommentTagFactory {
55
85
  value[0]?.value === "date-time"
56
86
  )
57
87
  continue;
58
- throw new Error(
59
- `${LABEL}: ${
60
- comment.name
61
- } requires ${key} type, no on "${identifier()}".`,
88
+ else report(`requires ${key} type`);
89
+ else {
90
+ Writable(atomic).tags = atomic.tags.filter((x) =>
91
+ MetadataTypeTagFactory.validate(validateReport)(
92
+ key as "string",
93
+ )([...x, ...filtered]),
62
94
  );
95
+ if (atomic.tags.length === 0)
96
+ atomic.tags.push(filtered);
97
+ else
98
+ for (const tags of atomic.tags)
99
+ tags.push(...filtered);
63
100
  }
64
- for (const tags of atomic.tags ?? [])
65
- MetadataTypeTagFactory.validate(key as "string")([
66
- ...tags,
67
- ...value,
68
- ]);
69
-
70
- if (atomic.tags.length === 0) atomic.tags.push(value);
71
- else
72
- for (const tags of atomic.tags) tags.push(...value);
73
101
  }
74
102
  }
75
103
  }
104
+
105
+ // DO REPORT
106
+ if (messages.length !== 0)
107
+ errors.push({
108
+ name: "comment tag(s)",
109
+ explore,
110
+ messages,
111
+ });
76
112
  };
77
113
 
78
114
  const parse =
79
- (identifier: () => string) =>
80
- (comment: ts.JSDocTagInfo): TagRecord => {
115
+ (report: (msg: string) => null) =>
116
+ (comment: ts.JSDocTagInfo): TagRecord | null => {
81
117
  const parser = PARSER[comment.name];
82
118
  if (parser === undefined) return {};
83
119
 
84
120
  const text = (comment.text || [])[0]?.text;
85
- if (text === undefined)
86
- throw new Error(
87
- `${LABEL}: no comment tag value on ${identifier()}`,
88
- );
89
-
90
- return parser(identifier)(text);
121
+ if (text === undefined) return report(`no comment tag value`);
122
+ return parser(report)(text);
91
123
  };
92
124
  }
93
125
 
94
126
  type TagRecord = {
95
- [P in Target]?: IMetadataTypeTag[];
127
+ [P in Target]?: NotDeterminedTypeTag[];
96
128
  };
97
129
  type Target = "bigint" | "number" | "string" | "array";
130
+ type NotDeterminedTypeTag = Omit<IMetadataTypeTag, "validate"> & {
131
+ validate: string | null;
132
+ };
98
133
 
99
134
  const PARSER: Record<
100
135
  string,
101
- (identifier: () => string) => (text: string) => {
102
- [P in Target]?: IMetadataTypeTag[];
136
+ (report: (msg: string) => null) => (text: string) => {
137
+ [P in Target]?: NotDeterminedTypeTag[];
103
138
  }
104
139
  > = {
105
140
  /* -----------------------------------------------------------
106
141
  ARRAY
107
142
  ----------------------------------------------------------- */
108
- items: (identifier) => (Value) => ({
143
+ items: (report) => (Value) => ({
109
144
  array: [
110
145
  {
111
146
  name: `MinItems<${Value}>`,
112
147
  target: "array",
113
148
  kind: "minItems",
114
- value: parse_integer(identifier)(true)(Value),
149
+ value: parse_integer(report)(true)(Value),
115
150
  validate: `${Value} <= $input.length`,
116
151
  exclusive: true,
117
152
  },
@@ -119,31 +154,31 @@ const PARSER: Record<
119
154
  name: `MaxItems<${Value}>`,
120
155
  target: "array",
121
156
  kind: "maxItems",
122
- value: parse_integer(identifier)(true)(Value),
157
+ value: parse_integer(report)(true)(Value),
123
158
  validate: `$input.length <= ${Value}`,
124
159
  exclusive: true,
125
160
  },
126
161
  ],
127
162
  }),
128
- minItems: (identifier) => (Value) => ({
163
+ minItems: (report) => (Value) => ({
129
164
  array: [
130
165
  {
131
166
  name: `MinItems<${Value}>`,
132
167
  target: "array",
133
168
  kind: "minItems",
134
- value: parse_integer(identifier)(true)(Value),
169
+ value: parse_integer(report)(true)(Value),
135
170
  validate: `${Value} <= $input.length`,
136
171
  exclusive: true,
137
172
  },
138
173
  ],
139
174
  }),
140
- maxItems: (identifier) => (Value) => ({
175
+ maxItems: (report) => (Value) => ({
141
176
  array: [
142
177
  {
143
178
  name: `MaxItems<${Value}>`,
144
179
  target: "array",
145
180
  kind: "maxItems",
146
- value: parse_integer(identifier)(true)(Value),
181
+ value: parse_integer(report)(true)(Value),
147
182
  validate: `$input.length <= ${Value}`,
148
183
  exclusive: true,
149
184
  },
@@ -207,13 +242,13 @@ const PARSER: Record<
207
242
  : [],
208
243
  };
209
244
  },
210
- minimum: (identifier) => (Value) => ({
245
+ minimum: (report) => (Value) => ({
211
246
  number: [
212
247
  {
213
248
  name: `Minimum<${Value}>`,
214
249
  target: "number",
215
250
  kind: "minimum",
216
- value: parse_number(identifier)(Value),
251
+ value: parse_number(report)(Value),
217
252
  validate: `${Value} <= $input`,
218
253
  exclusive: ["minimum", "exclusiveMinimum"],
219
254
  },
@@ -223,19 +258,22 @@ const PARSER: Record<
223
258
  name: `Minimum<${Value}n>`,
224
259
  target: "bigint",
225
260
  kind: "minimum",
226
- value: BigInt(parse_integer(identifier)(false)(Value)),
261
+ value: (() => {
262
+ const value = parse_integer(report)(false)(Value);
263
+ return value === null ? null : BigInt(value);
264
+ })(),
227
265
  validate: `${Value} <= $input`,
228
266
  exclusive: ["minimum", "exclusiveMinimum"],
229
267
  },
230
268
  ],
231
269
  }),
232
- maximum: (identifier) => (Value) => ({
270
+ maximum: (report) => (Value) => ({
233
271
  number: [
234
272
  {
235
273
  name: `Maximum<${Value}>`,
236
274
  target: "number",
237
275
  kind: "maximum",
238
- value: parse_number(identifier)(Value),
276
+ value: parse_number(report)(Value),
239
277
  validate: `$input <= ${Value}`,
240
278
  exclusive: ["maximum", "exclusiveMaximum"],
241
279
  },
@@ -245,19 +283,22 @@ const PARSER: Record<
245
283
  name: `Maximum<${Value}n>`,
246
284
  target: "bigint",
247
285
  kind: "maximum",
248
- value: BigInt(parse_integer(identifier)(false)(Value)),
286
+ value: (() => {
287
+ const value = parse_integer(report)(false)(Value);
288
+ return value === null ? null : BigInt(value);
289
+ })(),
249
290
  validate: `$input <= ${Value}`,
250
291
  exclusive: ["maximum", "exclusiveMaximum"],
251
292
  },
252
293
  ],
253
294
  }),
254
- exclusiveMinimum: (identifier) => (Value) => ({
295
+ exclusiveMinimum: (report) => (Value) => ({
255
296
  number: [
256
297
  {
257
298
  name: `ExclusiveMinimum<${Value}>`,
258
299
  target: "number",
259
300
  kind: "exclusiveMinimum",
260
- value: parse_number(identifier)(Value),
301
+ value: parse_number(report)(Value),
261
302
  validate: `${Value} < $input`,
262
303
  exclusive: ["minimum", "exclusiveMinimum"],
263
304
  },
@@ -267,19 +308,22 @@ const PARSER: Record<
267
308
  name: `ExclusiveMinimum<${Value}n>`,
268
309
  target: "bigint",
269
310
  kind: "exclusiveMinimum",
270
- value: BigInt(parse_integer(identifier)(false)(Value)),
311
+ value: (() => {
312
+ const value = parse_integer(report)(false)(Value);
313
+ return value === null ? null : BigInt(value);
314
+ })(),
271
315
  validate: `${Value} < $input`,
272
316
  exclusive: ["minimum", "exclusiveMinimum"],
273
317
  },
274
318
  ],
275
319
  }),
276
- exclusiveMaximum: (identifier) => (Value) => ({
320
+ exclusiveMaximum: (report) => (Value) => ({
277
321
  number: [
278
322
  {
279
323
  name: `ExclusiveMaximum<${Value}>`,
280
324
  target: "number",
281
325
  kind: "exclusiveMaximum",
282
- value: parse_number(identifier)(Value),
326
+ value: parse_number(report)(Value),
283
327
  validate: `$input < ${Value}`,
284
328
  exclusive: ["maximum", "exclusiveMaximum"],
285
329
  },
@@ -289,19 +333,22 @@ const PARSER: Record<
289
333
  name: `ExclusiveMaximum<${Value}n>`,
290
334
  target: "bigint",
291
335
  kind: "exclusiveMaximum",
292
- value: BigInt(parse_integer(identifier)(false)(Value)),
336
+ value: (() => {
337
+ const value = parse_integer(report)(false)(Value);
338
+ return value === null ? null : BigInt(value);
339
+ })(),
293
340
  validate: `$input < ${Value}`,
294
341
  exclusive: ["maximum", "exclusiveMaximum"],
295
342
  },
296
343
  ],
297
344
  }),
298
- multipleOf: (identifier) => (Value) => ({
345
+ multipleOf: (report) => (Value) => ({
299
346
  number: [
300
347
  {
301
348
  name: `MultipleOf<${Value}>`,
302
349
  target: "number",
303
350
  kind: "multipleOf",
304
- value: parse_number(identifier)(Value),
351
+ value: parse_number(report)(Value),
305
352
  validate: `$input % ${Value} === 0`,
306
353
  exclusive: true,
307
354
  },
@@ -311,7 +358,10 @@ const PARSER: Record<
311
358
  name: `MultipleOf<${Value}n>`,
312
359
  target: "bigint",
313
360
  kind: "multipleOf",
314
- value: BigInt(parse_integer(identifier)(false)(Value)),
361
+ value: (() => {
362
+ const value = parse_integer(report)(false)(Value);
363
+ return value === null ? null : BigInt(value);
364
+ })(),
315
365
  validate: `$input % ${Value}n === 0n`,
316
366
  exclusive: true,
317
367
  },
@@ -349,13 +399,13 @@ const PARSER: Record<
349
399
  },
350
400
  ],
351
401
  }),
352
- length: (identifier) => (Value) => ({
402
+ length: (report) => (Value) => ({
353
403
  string: [
354
404
  {
355
405
  name: `MinLength<${Value}>`,
356
406
  target: "string",
357
407
  kind: "minLength",
358
- value: parse_number(identifier)(Value),
408
+ value: parse_number(report)(Value),
359
409
  validate: `${Value} <= $input.length`,
360
410
  exclusive: true,
361
411
  },
@@ -363,31 +413,31 @@ const PARSER: Record<
363
413
  name: `MaxLength<${Value}>`,
364
414
  target: "string",
365
415
  kind: "maxLength",
366
- value: parse_number(identifier)(Value),
416
+ value: parse_number(report)(Value),
367
417
  validate: `$input.length <= ${Value}`,
368
418
  exclusive: true,
369
419
  },
370
420
  ],
371
421
  }),
372
- minLength: (identifier) => (Value) => ({
422
+ minLength: (report) => (Value) => ({
373
423
  string: [
374
424
  {
375
425
  name: `MinLength<${Value}>`,
376
426
  target: "string",
377
427
  kind: "minLength",
378
- value: parse_number(identifier)(Value),
428
+ value: parse_number(report)(Value),
379
429
  validate: `${Value} <= $input.length`,
380
430
  exclusive: true,
381
431
  },
382
432
  ],
383
433
  }),
384
- maxLength: (identifier) => (Value) => ({
434
+ maxLength: (report) => (Value) => ({
385
435
  string: [
386
436
  {
387
437
  name: `MaxLength<${Value}>`,
388
438
  target: "string",
389
439
  kind: "maxLength",
390
- value: parse_number(identifier)(Value),
440
+ value: parse_number(report)(Value),
391
441
  validate: `$input.length <= ${Value}`,
392
442
  exclusive: true,
393
443
  },
@@ -396,25 +446,22 @@ const PARSER: Record<
396
446
  };
397
447
 
398
448
  const parse_number =
399
- (identifier: () => string) =>
400
- (str: string): number => {
449
+ (report: (msg: string) => null) =>
450
+ (str: string): number | null => {
401
451
  const value: number = Number(str);
402
- if (isNaN(value) === true)
403
- throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
452
+ if (isNaN(value) === true) return report(`invalid number`);
404
453
  return value;
405
454
  };
406
455
 
407
456
  const parse_integer =
408
- (identifier: () => string) =>
457
+ (report: (msg: string) => null) =>
409
458
  (unsigned: boolean) =>
410
- (str: string): number => {
411
- const value: number = parse_number(identifier)(str);
412
- if (Math.floor(value) !== value)
413
- throw new Error(`${LABEL}: invalid integer on "${identifier()}".`);
459
+ (str: string): number | null => {
460
+ const value: number | null = parse_number(report)(str);
461
+ if (value === null) return null;
462
+ else if (Math.floor(value) !== value) return report(`invalid integer`);
414
463
  else if (unsigned === true && value < 0)
415
- throw new Error(
416
- `${LABEL}: invalid unsigned integer on "${identifier()}".`,
417
- );
464
+ return report(`invalid unsigned integer`);
418
465
  return value;
419
466
  };
420
467
 
@@ -538,7 +585,6 @@ namespace IMetadataCommentTag {
538
585
  }
539
586
  }
540
587
 
541
- const LABEL = "Error on typia.MetadataCommentTagFactory.generate()";
542
588
  const FORMATS: Map<string, [IMetadataCommentTag.IFormat["value"], string]> =
543
589
  new Map([
544
590
  [
@@ -1,35 +1,74 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../schemas/metadata/Metadata";
4
+ import { MetadataAlias } from "../schemas/metadata/MetadataAlias";
5
+ import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
6
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
7
+ import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
4
8
  import { explore_metadata } from "./internal/metadata/explore_metadata";
5
9
  import { iterate_metadata_collection } from "./internal/metadata/iterate_metadata_collection";
6
10
  import { iterate_metadata_sort } from "./internal/metadata/iterate_metadata_sort";
7
11
 
12
+ import { ValidationPipe } from "../typings/ValidationPipe";
13
+
8
14
  import { MetadataCollection } from "./MetadataCollection";
9
15
 
10
16
  export namespace MetadataFactory {
17
+ export type Validator = (meta: Metadata, explore: IExplore) => string[];
18
+
11
19
  export interface IOptions {
12
20
  escape: boolean;
13
21
  constant: boolean;
14
22
  absorb: boolean;
15
- validate?: (meta: Metadata) => void;
23
+ validate?: Validator;
24
+ onError?: (node: ts.Node | undefined, message: string) => void;
25
+ }
26
+
27
+ export interface IExplore {
28
+ top: boolean;
29
+ object: MetadataObject | null;
30
+ property: string | object | null;
31
+ nested: null | MetadataAlias | MetadataArrayType | MetadataTupleType;
32
+ escaped: boolean;
33
+ aliased: boolean;
34
+ }
35
+
36
+ export interface IError {
37
+ name: string;
38
+ explore: IExplore;
39
+ messages: string[];
16
40
  }
17
41
 
18
42
  export const analyze =
19
43
  (checker: ts.TypeChecker) =>
20
44
  (options: IOptions) =>
21
45
  (collection: MetadataCollection) =>
22
- (type: ts.Type | null): Metadata => {
46
+ (type: ts.Type | null): ValidationPipe<Metadata, IError> => {
47
+ const errors: IError[] = [];
23
48
  const meta: Metadata = explore_metadata(checker)(options)(
24
49
  collection,
25
- )(type, false);
26
- iterate_metadata_collection(collection);
50
+ )(errors)(type, {
51
+ top: true,
52
+ object: null,
53
+ property: null,
54
+ nested: null,
55
+ escaped: false,
56
+ aliased: false,
57
+ });
58
+ iterate_metadata_collection(errors)(collection);
27
59
  iterate_metadata_sort(collection)(meta);
28
60
 
29
61
  if (options.validate)
30
- for (const elem of collection.entire_) options.validate(elem);
31
- collection.entire_.clear();
32
- return meta;
62
+ errors.push(...validate(options)(options.validate)(meta));
63
+ return errors.length
64
+ ? {
65
+ success: false,
66
+ errors,
67
+ }
68
+ : {
69
+ success: true,
70
+ data: meta,
71
+ };
33
72
  };
34
73
 
35
74
  /**
@@ -43,4 +82,127 @@ export namespace MetadataFactory {
43
82
  });
44
83
  return meta;
45
84
  };
85
+
86
+ const validate =
87
+ (options: IOptions) =>
88
+ (functor: Validator) =>
89
+ (meta: Metadata): IError[] => {
90
+ const visitor: IValidationVisitor = {
91
+ functor,
92
+ errors: [],
93
+ objects: new Set(),
94
+ arrays: new Set(),
95
+ tuples: new Set(),
96
+ aliases: new Set(),
97
+ };
98
+ validateMeta(options)(visitor)(meta, {
99
+ object: null,
100
+ property: null,
101
+ nested: null,
102
+ top: true,
103
+ aliased: false,
104
+ escaped: false,
105
+ });
106
+ return visitor.errors;
107
+ };
108
+
109
+ const validateMeta =
110
+ (options: IOptions) =>
111
+ (visitor: IValidationVisitor) =>
112
+ (meta: Metadata, explore: IExplore) => {
113
+ const result: Set<string> = new Set(visitor.functor(meta, explore));
114
+ if (result.size)
115
+ visitor.errors.push({
116
+ name: meta.getName(),
117
+ explore: { ...explore },
118
+ messages: [...result],
119
+ });
120
+
121
+ for (const alias of meta.aliases)
122
+ validateAlias(options)(visitor)(alias, explore);
123
+ for (const array of meta.arrays)
124
+ validateArray(options)(visitor)(array.type, explore);
125
+ for (const tuple of meta.tuples)
126
+ validateTuple(options)(visitor)(tuple.type, explore);
127
+ for (const obj of meta.objects)
128
+ validateObject(options)(visitor)(obj);
129
+
130
+ if (options.escape === true && meta.escaped !== null)
131
+ validateMeta(options)(visitor)(meta.escaped.returns, {
132
+ ...explore,
133
+ escaped: true,
134
+ });
135
+ };
136
+
137
+ const validateAlias =
138
+ (options: IOptions) =>
139
+ (visitor: IValidationVisitor) =>
140
+ (alias: MetadataAlias, explore: IExplore) => {
141
+ if (visitor.aliases.has(alias)) return;
142
+ visitor.aliases.add(alias);
143
+
144
+ validateMeta(options)(visitor)(alias.value, {
145
+ ...explore,
146
+ nested: alias,
147
+ aliased: true,
148
+ });
149
+ };
150
+
151
+ const validateArray =
152
+ (options: IOptions) =>
153
+ (visitor: IValidationVisitor) =>
154
+ (array: MetadataArrayType, explore: IExplore) => {
155
+ if (visitor.arrays.has(array)) return;
156
+ visitor.arrays.add(array);
157
+
158
+ validateMeta(options)(visitor)(array.value, {
159
+ ...explore,
160
+ nested: array,
161
+ top: false,
162
+ });
163
+ };
164
+
165
+ const validateTuple =
166
+ (options: IOptions) =>
167
+ (visitor: IValidationVisitor) =>
168
+ (tuple: MetadataTupleType, explore: IExplore) => {
169
+ if (visitor.tuples.has(tuple)) return;
170
+ visitor.tuples.add(tuple);
171
+
172
+ for (const elem of tuple.elements)
173
+ validateMeta(options)(visitor)(elem, {
174
+ ...explore,
175
+ nested: tuple,
176
+ top: false,
177
+ });
178
+ };
179
+
180
+ const validateObject =
181
+ (options: IOptions) =>
182
+ (visitor: IValidationVisitor) =>
183
+ (object: MetadataObject) => {
184
+ if (visitor.objects.has(object)) return;
185
+ visitor.objects.add(object);
186
+
187
+ for (const property of object.properties)
188
+ validateMeta(options)(visitor)(property.value, {
189
+ object,
190
+ property: property.value.isSoleLiteral()
191
+ ? property.value.getSoleLiteral()!
192
+ : {},
193
+ nested: null,
194
+ top: false,
195
+ aliased: false,
196
+ escaped: false,
197
+ });
198
+ };
199
+
200
+ interface IValidationVisitor {
201
+ functor: Validator;
202
+ errors: IError[];
203
+ objects: Set<MetadataObject>;
204
+ arrays: Set<MetadataArrayType>;
205
+ tuples: Set<MetadataTupleType>;
206
+ aliases: Set<MetadataAlias>;
207
+ }
46
208
  }