typia 5.0.0-dev.20230823-2 → 5.0.0-dev.20230824

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 (316) hide show
  1. package/lib/factories/ExpressionFactory.d.ts +2 -0
  2. package/lib/factories/ExpressionFactory.js +24 -0
  3. package/lib/factories/ExpressionFactory.js.map +1 -1
  4. package/lib/factories/IdentifierFactory.d.ts +2 -1
  5. package/lib/factories/IdentifierFactory.js +11 -0
  6. package/lib/factories/IdentifierFactory.js.map +1 -1
  7. package/lib/factories/MetadataCollection.d.ts +7 -7
  8. package/lib/factories/MetadataCollection.js +4 -4
  9. package/lib/factories/MetadataCollection.js.map +1 -1
  10. package/lib/factories/MetadataTagFactory.d.ts +2 -2
  11. package/lib/factories/MetadataTagFactory.js +9 -7
  12. package/lib/factories/MetadataTagFactory.js.map +1 -1
  13. package/lib/factories/ProtobufFactory.js +9 -8
  14. package/lib/factories/ProtobufFactory.js.map +1 -1
  15. package/lib/factories/internal/metadata/emend_metadata_atomics.js +6 -6
  16. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  17. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +5 -0
  18. package/lib/factories/internal/metadata/{emplace_metadata_array.js → emplace_metadata_array_type.js} +4 -4
  19. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -0
  20. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +2 -2
  21. package/lib/factories/internal/metadata/iterate_metadata_array.js +7 -3
  22. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +1 -1
  24. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  25. package/lib/factories/internal/metadata/iterate_metadata_collection.js +20 -12
  26. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  27. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +2 -0
  28. package/lib/factories/internal/metadata/{iterate_metadata_tag.js → iterate_metadata_comment_tags.js} +4 -4
  29. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -0
  30. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +138 -16
  31. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  32. package/lib/factories/internal/metadata/iterate_metadata_object.js +0 -7
  33. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  34. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  35. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  36. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +6 -2
  37. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_type_tags.d.ts +3 -0
  39. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js +157 -0
  40. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js.map +1 -0
  41. package/lib/functional/$any.js +2 -1
  42. package/lib/functional/$any.js.map +1 -1
  43. package/lib/functional/$clone.d.ts +2 -0
  44. package/lib/functional/$clone.js +8 -0
  45. package/lib/functional/$clone.js.map +1 -0
  46. package/lib/module.d.ts +2 -39
  47. package/lib/module.js +3 -17
  48. package/lib/module.js.map +1 -1
  49. package/lib/programmers/AssertProgrammer.js +1 -3
  50. package/lib/programmers/AssertProgrammer.js.map +1 -1
  51. package/lib/programmers/CheckerProgrammer.js +38 -29
  52. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  53. package/lib/programmers/FeatureProgrammer.d.ts +4 -4
  54. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  55. package/lib/programmers/IsProgrammer.d.ts +1 -1
  56. package/lib/programmers/IsProgrammer.js +1 -3
  57. package/lib/programmers/IsProgrammer.js.map +1 -1
  58. package/lib/programmers/RandomProgrammer.js +44 -33
  59. package/lib/programmers/RandomProgrammer.js.map +1 -1
  60. package/lib/programmers/ValidateProgrammer.js +1 -3
  61. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  62. package/lib/programmers/helpers/AtomicPredicator.js +2 -2
  63. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  64. package/lib/programmers/helpers/ICheckEntry.d.ts +1 -1
  65. package/lib/programmers/helpers/ProtobufUtil.js +2 -2
  66. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  67. package/lib/programmers/helpers/RandomJoiner.d.ts +4 -4
  68. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  69. package/lib/programmers/helpers/RandomRanger.d.ts +6 -6
  70. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  71. package/lib/programmers/helpers/UnionExplorer.d.ts +8 -8
  72. package/lib/programmers/helpers/UnionExplorer.js +40 -29
  73. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  74. package/lib/programmers/internal/application_array.js +1 -1
  75. package/lib/programmers/internal/application_array.js.map +1 -1
  76. package/lib/programmers/internal/application_default_string.js +2 -2
  77. package/lib/programmers/internal/application_default_string.js.map +1 -1
  78. package/lib/programmers/internal/application_resolved.js +2 -2
  79. package/lib/programmers/internal/application_resolved.js.map +1 -1
  80. package/lib/programmers/internal/application_schema.js +5 -5
  81. package/lib/programmers/internal/application_schema.js.map +1 -1
  82. package/lib/programmers/internal/application_string.js.map +1 -1
  83. package/lib/programmers/internal/application_tuple.js +10 -9
  84. package/lib/programmers/internal/application_tuple.js.map +1 -1
  85. package/lib/programmers/internal/check_array_length.js.map +1 -1
  86. package/lib/programmers/internal/check_array_tags.js +39 -0
  87. package/lib/programmers/internal/check_array_tags.js.map +1 -0
  88. package/lib/programmers/internal/check_bigint.js +88 -74
  89. package/lib/programmers/internal/check_bigint.js.map +1 -1
  90. package/lib/programmers/internal/check_number.js +142 -131
  91. package/lib/programmers/internal/check_number.js.map +1 -1
  92. package/lib/programmers/internal/check_string.js +30 -6
  93. package/lib/programmers/internal/check_string.js.map +1 -1
  94. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  95. package/lib/programmers/internal/check_template.js +16 -49
  96. package/lib/programmers/internal/check_template.js.map +1 -1
  97. package/lib/programmers/internal/check_union_array_like.js +3 -2
  98. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  99. package/lib/programmers/internal/metadata_to_pattern.js +4 -4
  100. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  101. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -1
  102. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  103. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +9 -5
  104. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  105. package/lib/programmers/json/JsonStringifyProgrammer.js +29 -23
  106. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/misc/MiscCloneProgrammer.js +10 -10
  108. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  109. package/lib/programmers/misc/MiscLiteralsProgrammer.js +2 -2
  110. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  111. package/lib/programmers/misc/MiscPruneProgrammer.js +13 -13
  112. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  113. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +6 -6
  114. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  115. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +2 -2
  116. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  117. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -1
  118. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  119. package/lib/schemas/json/IJsonSchema.d.ts +2 -2
  120. package/lib/schemas/metadata/IMetadata.d.ts +11 -4
  121. package/lib/schemas/metadata/IMetadataAlias.d.ts +2 -2
  122. package/lib/schemas/metadata/IMetadataArray.d.ts +4 -6
  123. package/lib/schemas/metadata/IMetadataArrayType.d.ts +8 -0
  124. package/lib/{CustomValidatorMap.js → schemas/metadata/IMetadataArrayType.js} +1 -1
  125. package/lib/schemas/metadata/IMetadataArrayType.js.map +1 -0
  126. package/lib/schemas/metadata/IMetadataAtomic.d.ts +5 -0
  127. package/lib/schemas/metadata/IMetadataAtomic.js +3 -0
  128. package/lib/schemas/metadata/IMetadataAtomic.js.map +1 -0
  129. package/lib/schemas/metadata/IMetadataCollection.d.ts +4 -4
  130. package/lib/schemas/metadata/{IMetadataTag.d.ts → IMetadataCommentTag.d.ts} +2 -2
  131. package/lib/schemas/metadata/IMetadataCommentTag.js +3 -0
  132. package/lib/schemas/metadata/IMetadataCommentTag.js.map +1 -0
  133. package/lib/schemas/metadata/IMetadataProperty.d.ts +2 -2
  134. package/lib/schemas/metadata/IMetadataTuple.d.ts +4 -6
  135. package/lib/schemas/metadata/IMetadataTupleType.d.ts +8 -0
  136. package/lib/schemas/metadata/IMetadataTupleType.js +3 -0
  137. package/lib/schemas/metadata/IMetadataTupleType.js.map +1 -0
  138. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +6 -0
  139. package/lib/schemas/metadata/IMetadataTypeTag.js +3 -0
  140. package/lib/schemas/metadata/IMetadataTypeTag.js.map +1 -0
  141. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  142. package/lib/schemas/metadata/Metadata.js +206 -146
  143. package/lib/schemas/metadata/Metadata.js.map +1 -1
  144. package/lib/schemas/metadata/MetadataAlias.d.ts +2 -2
  145. package/lib/schemas/metadata/MetadataArray.d.ts +6 -6
  146. package/lib/schemas/metadata/MetadataArray.js +5 -19
  147. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  148. package/lib/schemas/metadata/MetadataArrayType.d.ts +14 -0
  149. package/lib/schemas/metadata/MetadataArrayType.js +36 -0
  150. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -0
  151. package/lib/schemas/metadata/MetadataProperty.d.ts +2 -2
  152. package/lib/schemas/metadata/MetadataTuple.d.ts +4 -6
  153. package/lib/schemas/metadata/MetadataTuple.js +5 -19
  154. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  155. package/lib/schemas/metadata/MetadataTupleType.d.ts +13 -0
  156. package/lib/schemas/metadata/MetadataTupleType.js +40 -0
  157. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -0
  158. package/lib/tags/ExclusiveMaximum.d.ts +8 -0
  159. package/lib/tags/ExclusiveMaximum.js +3 -0
  160. package/lib/tags/ExclusiveMaximum.js.map +1 -0
  161. package/lib/tags/ExclusiveMinimum.d.ts +8 -0
  162. package/lib/tags/ExclusiveMinimum.js +3 -0
  163. package/lib/tags/ExclusiveMinimum.js.map +1 -0
  164. package/lib/tags/Format.d.ts +8 -0
  165. package/lib/{schemas/metadata/IMetadataTag.js → tags/Format.js} +1 -1
  166. package/lib/tags/Format.js.map +1 -0
  167. package/lib/tags/MaxItems.d.ts +8 -0
  168. package/lib/tags/MaxItems.js +3 -0
  169. package/lib/tags/MaxItems.js.map +1 -0
  170. package/lib/tags/MaxLength.d.ts +8 -0
  171. package/lib/tags/MaxLength.js +3 -0
  172. package/lib/tags/MaxLength.js.map +1 -0
  173. package/lib/tags/Maximum.d.ts +8 -0
  174. package/lib/tags/Maximum.js +3 -0
  175. package/lib/tags/Maximum.js.map +1 -0
  176. package/lib/tags/MinItems.d.ts +8 -0
  177. package/lib/tags/MinItems.js +3 -0
  178. package/lib/tags/MinItems.js.map +1 -0
  179. package/lib/tags/MinLength.d.ts +8 -0
  180. package/lib/tags/MinLength.js +3 -0
  181. package/lib/tags/MinLength.js.map +1 -0
  182. package/lib/tags/Minimum.d.ts +8 -0
  183. package/lib/tags/Minimum.js +3 -0
  184. package/lib/tags/Minimum.js.map +1 -0
  185. package/lib/tags/MultipleOf.d.ts +8 -0
  186. package/lib/tags/MultipleOf.js +3 -0
  187. package/lib/tags/MultipleOf.js.map +1 -0
  188. package/lib/tags/Pattern.d.ts +8 -0
  189. package/lib/tags/Pattern.js +3 -0
  190. package/lib/tags/Pattern.js.map +1 -0
  191. package/lib/tags/TagBase.d.ts +10 -0
  192. package/lib/tags/TagBase.js +3 -0
  193. package/lib/tags/TagBase.js.map +1 -0
  194. package/lib/tags/Type.d.ts +13 -0
  195. package/lib/tags/Type.js +3 -0
  196. package/lib/tags/Type.js.map +1 -0
  197. package/lib/tags/index.d.ts +12 -0
  198. package/lib/tags/index.js +29 -0
  199. package/lib/tags/index.js.map +1 -0
  200. package/lib/transformers/FileTransformer.d.ts +1 -1
  201. package/lib/transformers/FileTransformer.js +12 -1
  202. package/lib/transformers/FileTransformer.js.map +1 -1
  203. package/lib/transformers/IProject.d.ts +1 -0
  204. package/lib/transformers/features/json/JsonApplicationTransformer.js +4 -2
  205. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  206. package/package.json +1 -1
  207. package/src/factories/ExpressionFactory.ts +44 -0
  208. package/src/factories/IdentifierFactory.ts +15 -0
  209. package/src/factories/MetadataCollection.ts +18 -12
  210. package/src/factories/MetadataTagFactory.ts +22 -21
  211. package/src/factories/ProtobufFactory.ts +10 -8
  212. package/src/factories/internal/metadata/emend_metadata_atomics.ts +7 -5
  213. package/src/factories/internal/metadata/{emplace_metadata_array.ts → emplace_metadata_array_type.ts} +3 -3
  214. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +2 -2
  215. package/src/factories/internal/metadata/iterate_metadata_array.ts +13 -5
  216. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +6 -4
  217. package/src/factories/internal/metadata/iterate_metadata_collection.ts +23 -16
  218. package/src/factories/internal/metadata/{iterate_metadata_tag.ts → iterate_metadata_comment_tags.ts} +1 -1
  219. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +109 -15
  220. package/src/factories/internal/metadata/iterate_metadata_object.ts +10 -10
  221. package/src/factories/internal/metadata/iterate_metadata_sort.ts +2 -2
  222. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +12 -4
  223. package/src/factories/internal/metadata/iterate_metadata_type_tags.ts +183 -0
  224. package/src/functional/$any.ts +3 -1
  225. package/src/functional/$clone.ts +4 -0
  226. package/src/module.ts +2 -55
  227. package/src/programmers/AssertProgrammer.ts +1 -1
  228. package/src/programmers/CheckerProgrammer.ts +80 -47
  229. package/src/programmers/FeatureProgrammer.ts +6 -6
  230. package/src/programmers/IsProgrammer.ts +1 -1
  231. package/src/programmers/RandomProgrammer.ts +68 -45
  232. package/src/programmers/ValidateProgrammer.ts +1 -1
  233. package/src/programmers/helpers/AtomicPredicator.ts +2 -2
  234. package/src/programmers/helpers/ICheckEntry.ts +1 -1
  235. package/src/programmers/helpers/ProtobufUtil.ts +1 -1
  236. package/src/programmers/helpers/RandomJoiner.ts +8 -4
  237. package/src/programmers/helpers/RandomRanger.ts +8 -8
  238. package/src/programmers/helpers/UnionExplorer.ts +48 -34
  239. package/src/programmers/internal/application_array.ts +5 -4
  240. package/src/programmers/internal/application_default_string.ts +6 -2
  241. package/src/programmers/internal/application_resolved.ts +2 -2
  242. package/src/programmers/internal/application_schema.ts +5 -5
  243. package/src/programmers/internal/application_string.ts +2 -2
  244. package/src/programmers/internal/application_tuple.ts +12 -11
  245. package/src/programmers/internal/check_array_length.ts +2 -2
  246. package/src/programmers/internal/check_array_tags.ts +45 -0
  247. package/src/programmers/internal/check_bigint.ts +45 -17
  248. package/src/programmers/internal/check_number.ts +97 -70
  249. package/src/programmers/internal/check_string.ts +43 -12
  250. package/src/programmers/internal/check_string_tags.ts +3 -3
  251. package/src/programmers/internal/check_template.ts +1 -12
  252. package/src/programmers/internal/check_union_array_like.ts +6 -5
  253. package/src/programmers/internal/metadata_to_pattern.ts +4 -4
  254. package/src/programmers/internal/stringify_dynamic_properties.ts +1 -1
  255. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +9 -5
  256. package/src/programmers/json/JsonStringifyProgrammer.ts +41 -25
  257. package/src/programmers/misc/MiscCloneProgrammer.ts +24 -14
  258. package/src/programmers/misc/MiscLiteralsProgrammer.ts +2 -2
  259. package/src/programmers/misc/MiscPruneProgrammer.ts +27 -17
  260. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +12 -12
  261. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +14 -14
  262. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +6 -6
  263. package/src/schemas/json/IJsonSchema.ts +2 -2
  264. package/src/schemas/metadata/IMetadata.ts +11 -5
  265. package/src/schemas/metadata/IMetadataAlias.ts +2 -2
  266. package/src/schemas/metadata/IMetadataArray.ts +4 -7
  267. package/src/schemas/metadata/IMetadataArrayType.ts +10 -0
  268. package/src/schemas/metadata/IMetadataAtomic.ts +6 -0
  269. package/src/schemas/metadata/IMetadataCollection.ts +4 -4
  270. package/src/schemas/metadata/{IMetadataTag.ts → IMetadataCommentTag.ts} +17 -17
  271. package/src/schemas/metadata/IMetadataDictionary.ts +4 -4
  272. package/src/schemas/metadata/IMetadataProperty.ts +2 -2
  273. package/src/schemas/metadata/IMetadataTuple.ts +4 -7
  274. package/src/schemas/metadata/IMetadataTupleType.ts +10 -0
  275. package/src/schemas/metadata/IMetadataTypeTag.ts +6 -0
  276. package/src/schemas/metadata/Metadata.ts +109 -44
  277. package/src/schemas/metadata/MetadataAlias.ts +2 -2
  278. package/src/schemas/metadata/MetadataArray.ts +10 -34
  279. package/src/schemas/metadata/MetadataArrayType.ts +57 -0
  280. package/src/schemas/metadata/MetadataProperty.ts +2 -2
  281. package/src/schemas/metadata/MetadataTuple.ts +10 -37
  282. package/src/schemas/metadata/MetadataTupleType.ts +67 -0
  283. package/src/tags/ExclusiveMaximum.ts +8 -0
  284. package/src/tags/ExclusiveMinimum.ts +8 -0
  285. package/src/tags/Format.ts +29 -0
  286. package/src/tags/MaxItems.ts +8 -0
  287. package/src/tags/MaxLength.ts +8 -0
  288. package/src/tags/Maximum.ts +8 -0
  289. package/src/tags/MinItems.ts +8 -0
  290. package/src/tags/MinLength.ts +8 -0
  291. package/src/tags/Minimum.ts +8 -0
  292. package/src/tags/MultipleOf.ts +10 -0
  293. package/src/tags/Pattern.ts +8 -0
  294. package/src/tags/TagBase.ts +17 -0
  295. package/src/tags/Type.ts +30 -0
  296. package/src/tags/index.ts +12 -0
  297. package/src/transformers/FileTransformer.ts +2 -2
  298. package/src/transformers/IProject.ts +1 -0
  299. package/src/transformers/features/json/JsonApplicationTransformer.ts +3 -2
  300. package/src/typings/Atomic.ts +1 -0
  301. package/lib/CustomValidatorMap.d.ts +0 -110
  302. package/lib/CustomValidatorMap.js.map +0 -1
  303. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +0 -5
  304. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +0 -1
  305. package/lib/factories/internal/metadata/iterate_metadata_tag.d.ts +0 -2
  306. package/lib/factories/internal/metadata/iterate_metadata_tag.js.map +0 -1
  307. package/lib/programmers/internal/check_array.js +0 -44
  308. package/lib/programmers/internal/check_array.js.map +0 -1
  309. package/lib/programmers/internal/check_custom.d.ts +0 -1
  310. package/lib/programmers/internal/check_custom.js +0 -30
  311. package/lib/programmers/internal/check_custom.js.map +0 -1
  312. package/lib/schemas/metadata/IMetadataTag.js.map +0 -1
  313. package/src/CustomValidatorMap.ts +0 -126
  314. package/src/programmers/internal/check_array.ts +0 -30
  315. package/src/programmers/internal/check_custom.ts +0 -31
  316. /package/lib/programmers/internal/{check_array.d.ts → check_array_tags.d.ts} +0 -0
@@ -1,10 +1,10 @@
1
1
  import { Metadata } from "../../../schemas/metadata/Metadata";
2
- import { MetadataArray } from "../../../schemas/metadata/MetadataArray";
2
+ import { MetadataArrayType } from "../../../schemas/metadata/MetadataArrayType";
3
3
  import { MetadataObject } from "../../../schemas/metadata/MetadataObject";
4
- import { MetadataTuple } from "../../../schemas/metadata/MetadataTuple";
4
+ import { MetadataTupleType } from "../../../schemas/metadata/MetadataTupleType";
5
5
 
6
6
  import { MetadataCollection } from "../../MetadataCollection";
7
- import { iterate_metadata_tag } from "./iterate_metadata_tag";
7
+ import { iterate_metadata_comment_tags } from "./iterate_metadata_comment_tags";
8
8
 
9
9
  export const iterate_metadata_collection = (
10
10
  collection: MetadataCollection,
@@ -24,7 +24,7 @@ export const iterate_metadata_collection = (
24
24
  );
25
25
  }
26
26
  for (const obj of collection.objects()) {
27
- iterate_metadata_tag(obj);
27
+ iterate_metadata_comment_tags(obj);
28
28
  if (obj.recursive === null) {
29
29
  const visited: Set<Metadata> = new Set();
30
30
  collection.setObjectRecursive(
@@ -39,22 +39,26 @@ export const iterate_metadata_collection = (
39
39
 
40
40
  const isArrayRecursive =
41
41
  (visited: Set<Metadata>) =>
42
- (array: MetadataArray) =>
42
+ (array: MetadataArrayType) =>
43
43
  (meta: Metadata): boolean => {
44
44
  if (visited.has(meta)) return false;
45
45
  visited.add(meta);
46
46
 
47
47
  return (
48
48
  meta.arrays.some(
49
- (a) => a === array || isArrayRecursive(visited)(array)(a.value),
49
+ (a) =>
50
+ a.type === array ||
51
+ isArrayRecursive(visited)(array)(a.type.value),
50
52
  ) ||
51
53
  meta.aliases.some((alias) =>
52
54
  isArrayRecursive(visited)(array)(alias.value),
53
55
  ) ||
54
56
  meta.tuples.some(
55
57
  (t) =>
56
- !t.recursive &&
57
- t.elements.some((e) => isArrayRecursive(visited)(array)(e)),
58
+ !t.type.recursive &&
59
+ t.type.elements.some((e) =>
60
+ isArrayRecursive(visited)(array)(e),
61
+ ),
58
62
  ) ||
59
63
  meta.maps.some((m) => isArrayRecursive(visited)(array)(m.value)) ||
60
64
  meta.sets.some((s) => isArrayRecursive(visited)(array)(s)) ||
@@ -66,7 +70,7 @@ const isArrayRecursive =
66
70
 
67
71
  const isTupleRecursive =
68
72
  (visited: Set<Metadata>) =>
69
- (tuple: MetadataTuple) =>
73
+ (tuple: MetadataTupleType) =>
70
74
  (meta: Metadata): boolean => {
71
75
  if (visited.has(meta)) return false;
72
76
  visited.add(meta);
@@ -74,12 +78,15 @@ const isTupleRecursive =
74
78
  return (
75
79
  meta.tuples.some(
76
80
  (t) =>
77
- t === tuple ||
78
- t.elements.some((e) => isTupleRecursive(visited)(tuple)(e)),
81
+ t.type === tuple ||
82
+ t.type.elements.some((e) =>
83
+ isTupleRecursive(visited)(tuple)(e),
84
+ ),
79
85
  ) ||
80
86
  meta.arrays.some(
81
87
  (a) =>
82
- !a.recursive && isTupleRecursive(visited)(tuple)(a.value),
88
+ !a.type.recursive &&
89
+ isTupleRecursive(visited)(tuple)(a.type.value),
83
90
  ) ||
84
91
  meta.maps.some((m) => isTupleRecursive(visited)(tuple)(m.value)) ||
85
92
  meta.sets.some((s) => isTupleRecursive(visited)(tuple)(s)) ||
@@ -112,13 +119,13 @@ const isObjectRecursive =
112
119
  ) ||
113
120
  meta.arrays.some(
114
121
  (array) =>
115
- !array.recursive &&
116
- isObjectRecursive(visited)(obj)(array.value),
122
+ !array.type.recursive &&
123
+ isObjectRecursive(visited)(obj)(array.type.value),
117
124
  ) ||
118
125
  meta.tuples.some(
119
126
  (tuple) =>
120
- !tuple.recursive &&
121
- tuple.elements.some((elem) =>
127
+ !tuple.type.recursive &&
128
+ tuple.type.elements.some((elem) =>
122
129
  isObjectRecursive(visited)(obj)(elem),
123
130
  ),
124
131
  ) ||
@@ -6,7 +6,7 @@ import { Escaper } from "../../../utils/Escaper";
6
6
 
7
7
  import { MetadataTagFactory } from "../../MetadataTagFactory";
8
8
 
9
- export const iterate_metadata_tag = (obj: MetadataObject) => {
9
+ export const iterate_metadata_comment_tags = (obj: MetadataObject) => {
10
10
  if (obj.tagged_ === true) return;
11
11
  obj.tagged_ = true;
12
12
 
@@ -1,11 +1,18 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { $clone } from "../../../functional/$clone";
4
+
5
+ import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag";
3
6
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
7
 
8
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
9
+
5
10
  import { MetadataCollection } from "../../MetadataCollection";
6
11
  import { MetadataFactory } from "../../MetadataFactory";
7
12
  import { explore_metadata } from "./explore_metadata";
8
13
  import { iterate_metadata } from "./iterate_metadata";
14
+ import { iterate_metadata_array } from "./iterate_metadata_array";
15
+ import { iterate_metadata_type_tags } from "./iterate_metadata_type_tags";
9
16
 
10
17
  export const iterate_metadata_intersection =
11
18
  (checker: ts.TypeChecker) =>
@@ -53,28 +60,115 @@ export const iterate_metadata_intersection =
53
60
  return true;
54
61
  }
55
62
 
56
- // ABSORB TO ATOMIC (OR CONSTANT) TYPE
57
- const atomics: Metadata[] = children.filter(
58
- (c) =>
59
- (c.atomics.length ? 1 : 0 + c.constants.length ? 1 : 0) ===
60
- c.bucket(),
63
+ // VALIDATE EACH TYPES
64
+ const individuals: (readonly [Metadata, number])[] = children
65
+ .map((child, i) => [child, i] as const)
66
+ .filter(
67
+ ([c]) =>
68
+ c.size() === 1 &&
69
+ (c.atomics.length === 1 || c.arrays.length === 1),
70
+ );
71
+ const constants: Metadata[] = children.filter(
72
+ (m) =>
73
+ m.size() ===
74
+ m.constants
75
+ .map((c) => c.values.length)
76
+ .reduce((a, b) => a + b, 0) +
77
+ m.templates.length,
61
78
  );
62
79
  const objects: Metadata[] = children.filter(
63
- (c) => c.objects.length && c.objects.length === c.size(),
80
+ (c) =>
81
+ c.nullable === false &&
82
+ c.isRequired() === true &&
83
+ c.objects.length &&
84
+ c.objects.length === c.size() &&
85
+ c.objects.every((o) =>
86
+ o.properties.every((p) => p.value.optional),
87
+ ),
64
88
  );
89
+ const atomics: Set<"boolean" | "bigint" | "number" | "string"> =
90
+ new Set(
91
+ individuals.map(([c]) => c.atomics.map((a) => a.type)).flat(),
92
+ );
93
+ const arrays: Set<string> = new Set(
94
+ individuals.map(([c]) => c.arrays.map((a) => a.type.name)).flat(),
95
+ );
96
+
97
+ // ESCAPE WHEN ONLY CONSTANT TYPES EXIST
65
98
  if (
66
- atomics.length === 0 ||
67
- atomics.length + objects.length !== children.length
99
+ atomics.size + arrays.size > 1 ||
100
+ individuals.length + objects.length + constants.length !==
101
+ children.length
68
102
  )
69
103
  throw new Error(message(children));
104
+ else if (atomics.size === 0 && arrays.size === 0 && constants.length) {
105
+ for (const m of constants) {
106
+ for (const tpl of m.templates)
107
+ ArrayUtil.add(
108
+ meta.templates,
109
+ tpl,
110
+ (a, b) =>
111
+ a.map((ab) => ab.getName()).join(" | ") ===
112
+ b.map((bb) => bb.getName()).join(" | "),
113
+ );
114
+ for (const c of m.constants) {
115
+ const oldbie = meta.constants.find(
116
+ (o) => o.type === c.type,
117
+ );
118
+ if (oldbie)
119
+ for (const elem of c.values)
120
+ ArrayUtil.add(
121
+ oldbie.values,
122
+ elem,
123
+ (a, b) => a === b,
124
+ );
125
+ else meta.constants.push($clone(c));
126
+ }
127
+ }
128
+ return true;
129
+ }
70
130
 
71
- const least: Metadata = atomics.reduce((x, y) => {
72
- if (Metadata.covers(x, y)) return y;
73
- else if (Metadata.covers(y, x)) return x;
74
- throw new Error(message(children));
75
- });
76
- Object.assign(meta, Metadata.merge(meta, least));
77
- collection.entire_.add(least);
131
+ // RE-GENERATE TYPE
132
+ const target: "boolean" | "bigint" | "number" | "string" | "array" =
133
+ atomics.size ? atomics.values().next().value : "array";
134
+ if (
135
+ target === "boolean" ||
136
+ target === "bigint" ||
137
+ target === "number" ||
138
+ target === "string"
139
+ )
140
+ ArrayUtil.add(
141
+ meta.atomics,
142
+ {
143
+ type: atomics.values().next().value as "string",
144
+ tags: [],
145
+ },
146
+ (a, b) => a.type === b.type,
147
+ );
148
+ else if (target === "array") {
149
+ const name: string = arrays.values().next().value;
150
+ if (!meta.arrays.some((a) => a.type.name === name)) {
151
+ iterate_metadata_array(checker)(options)(collection)(
152
+ meta,
153
+ type.types[
154
+ individuals.find((i) => i[0].arrays.length === 1)![1]
155
+ ]!,
156
+ );
157
+ }
158
+ }
159
+
160
+ // ASSIGN TAGS
161
+ if (objects.length && target !== "boolean") {
162
+ const tags: IMetadataTypeTag[] = iterate_metadata_type_tags(target)(
163
+ objects.map((om) => om.objects).flat(),
164
+ );
165
+ if (tags.length)
166
+ if (target === "array") meta.arrays.at(-1)!.tags.push(tags);
167
+ else
168
+ meta.atomics
169
+ .find((a) => a.type === target)!
170
+ .tags.push(tags);
171
+ }
78
172
  return true;
79
173
  };
80
174
 
@@ -23,16 +23,16 @@ export const iterate_metadata_object =
23
23
  (type as any).intrinsicName !== "object"
24
24
  )
25
25
  return false;
26
- else if (
27
- type.isIntersection() &&
28
- !type.types.every(
29
- (child) =>
30
- (child.getFlags() & ts.TypeFlags.Object) !== 0 &&
31
- !checker.isArrayType(child) &&
32
- !checker.isTupleType(child),
33
- )
34
- )
35
- return false;
26
+ // else if (
27
+ // type.isIntersection() &&
28
+ // !type.types.every(
29
+ // (child) =>
30
+ // (child.getFlags() & ts.TypeFlags.Object) !== 0 &&
31
+ // !checker.isArrayType(child) &&
32
+ // !checker.isTupleType(child),
33
+ // )
34
+ // )
35
+ // return false;
36
36
  }
37
37
 
38
38
  const obj: MetadataObject = emplace_metadata_object(checker)(options)(
@@ -46,9 +46,9 @@ const iterate =
46
46
  // SORT ARRAYS AND TUPLES
47
47
  if (meta.arrays.length > 1)
48
48
  meta.arrays.sort((x, y) =>
49
- Metadata.covers(x.value, y.value)
49
+ Metadata.covers(x.type.value, y.type.value)
50
50
  ? -1
51
- : Metadata.covers(y.value, x.value)
51
+ : Metadata.covers(y.type.value, x.type.value)
52
52
  ? 1
53
53
  : 0,
54
54
  );
@@ -2,6 +2,7 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
4
  import { MetadataTuple } from "../../../schemas/metadata/MetadataTuple";
5
+ import { MetadataTupleType } from "../../../schemas/metadata/MetadataTupleType";
5
6
 
6
7
  import { ArrayUtil } from "../../../utils/ArrayUtil";
7
8
 
@@ -16,9 +17,16 @@ export const iterate_metadata_tuple =
16
17
  (meta: Metadata, type: ts.TupleType): boolean => {
17
18
  if (!checker.isTupleType(type)) return false;
18
19
 
19
- const tuple: MetadataTuple = emplace_metadata_tuple(checker)(options)(
20
- collection,
21
- )(type, meta.nullable);
22
- ArrayUtil.add(meta.tuples, tuple, (elem) => elem.name === tuple.name);
20
+ const tupleType: MetadataTupleType = emplace_metadata_tuple(checker)(
21
+ options,
22
+ )(collection)(type, meta.nullable);
23
+ ArrayUtil.add(
24
+ meta.tuples,
25
+ MetadataTuple.create({
26
+ type: tupleType,
27
+ tags: [],
28
+ }),
29
+ (elem) => elem.type.name === tupleType.name,
30
+ );
23
31
  return true;
24
32
  };
@@ -0,0 +1,183 @@
1
+ import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag";
2
+ import { MetadataObject } from "../../../schemas/metadata/MetadataObject";
3
+ import { MetadataProperty } from "../../../schemas/metadata/MetadataProperty";
4
+
5
+ export const iterate_metadata_type_tags =
6
+ (type: "bigint" | "number" | "string" | "array") =>
7
+ (objects: MetadataObject[]): IMetadataTypeTag[] => {
8
+ const filtered: MetadataObject[] = objects.filter((obj) => {
9
+ //----
10
+ // VALIDATION PROCESS
11
+ //----
12
+ // ONLY ONE PROPERTY
13
+ if (obj.properties.length !== 1) return false;
14
+
15
+ // THE TAG.TYPE PROPERTY MUST BE
16
+ const top: MetadataProperty = obj.properties[0]!;
17
+ if (
18
+ top.key.getSoleLiteral() !== "typia.tag" ||
19
+ top.value.size() !== 1 ||
20
+ top.value.objects.length !== 1
21
+ )
22
+ return false;
23
+ else if (top.value.optional === false)
24
+ throw error(null)("must be optional object");
25
+
26
+ // CHECK LIST OF PROPERTIES
27
+ const tag: MetadataObject = top.value.objects[0]!;
28
+ const statics: string[] = tag.properties
29
+ .map((p) => p.key.getSoleLiteral()!)
30
+ .filter((str) => str !== null);
31
+ if (FIELDS.some((f) => !statics.includes(f)))
32
+ throw error(null)(
33
+ `must have four properties - ${FIELDS.map(
34
+ (str) => `'${str}'`,
35
+ ).join(", ")}`,
36
+ );
37
+
38
+ for (const p of tag.properties) {
39
+ const key: string | null = p.key.getSoleLiteral();
40
+ if (key === null) continue;
41
+ else if (FIELDS.includes(key) === false) continue;
42
+ else if (
43
+ // TARGET
44
+ key === "target" &&
45
+ (p.value.constants.length !== 1 ||
46
+ p.value.constants[0]!.values.length !==
47
+ p.value.size() ||
48
+ p.value.constants[0]!.values.some(
49
+ (v) =>
50
+ v !== "bigint" &&
51
+ v !== "number" &&
52
+ v !== "string" &&
53
+ v !== "array",
54
+ ))
55
+ )
56
+ throw error(key)(
57
+ `must be one of 'bigint', 'number', 'string', 'array'`,
58
+ );
59
+ else if (
60
+ // KIND
61
+ key === "kind" &&
62
+ (p.value.size() !== 1 ||
63
+ p.value.constants.length !== 1 ||
64
+ p.value.constants[0]!.type !== "string" ||
65
+ p.value.constants[0]!.values.length !== 1)
66
+ )
67
+ throw error(key)("must be a string literal type");
68
+ else if (
69
+ // VALUE
70
+ key === "value" &&
71
+ (p.value.size() !== 1 ||
72
+ p.value.constants.length !== 1 ||
73
+ p.value.constants[0]!.values.length !== 1)
74
+ )
75
+ throw error(key)("must be a constant literal type");
76
+ else if (key === "validate") {
77
+ //----
78
+ // VALIDATE
79
+ //----
80
+ // STRING CASE
81
+ const single: boolean =
82
+ p.value.size() === 1 &&
83
+ p.value.constants.length === 1 &&
84
+ p.value.constants[0]!.type === "string" &&
85
+ p.value.constants[0]!.values.length === 1;
86
+ if (single === true) continue;
87
+
88
+ // RECORD<TARGET, STRING>
89
+ const target: string[] | undefined =
90
+ p.value.objects[0]?.properties.find(
91
+ (p) => p.key.getSoleLiteral()! === "target",
92
+ )?.value?.constants?.[0]?.values as
93
+ | string[]
94
+ | undefined;
95
+ if (target === undefined)
96
+ throw error("target")(
97
+ `must be one of 'bigint', 'number', 'string', 'array'`,
98
+ );
99
+ const variadic: boolean =
100
+ p.value.size() === 1 &&
101
+ p.value.objects.length === 1 &&
102
+ p.value.objects[0]!.properties.every(
103
+ (vp) =>
104
+ vp.value.size() === 1 &&
105
+ vp.value.isRequired() &&
106
+ vp.value.nullable === false &&
107
+ vp.value.constants.length === 1 &&
108
+ vp.value.constants[0]!.type === "string" &&
109
+ vp.value.constants[0]!.values.length === 1 &&
110
+ target.includes(vp.key.getSoleLiteral()!),
111
+ );
112
+ if (variadic === false)
113
+ throw error(key)(
114
+ `must be a string literal type or Record<Target, string> type.`,
115
+ );
116
+ }
117
+ }
118
+ return true;
119
+ });
120
+
121
+ const tagList: ITypedTag[] = filtered.map((obj) => {
122
+ const find = (key: string): MetadataProperty =>
123
+ obj.properties[0]!.value.objects[0]!.properties.find(
124
+ (p) => p.key.getSoleLiteral() === key,
125
+ )!;
126
+
127
+ const target = find("target").value.constants[0]!
128
+ .values as ITypedTag["target"];
129
+ const kind: string = find("kind").value.constants[0]!
130
+ .values[0] as string;
131
+ const value: boolean | bigint | number | string =
132
+ find("value").value.constants[0]!.values[0]!;
133
+ const validate: Record<string, string> = (() => {
134
+ const validate = find("validate").value;
135
+ if (validate.constants.length)
136
+ return {
137
+ [target[0]!]: validate.constants[0]!
138
+ .values[0] as string,
139
+ };
140
+ return Object.fromEntries(
141
+ validate.objects[0]!.properties.map((p) => [
142
+ p.key.getSoleLiteral()!,
143
+ p.value.constants[0]!.values[0]! as string,
144
+ ]),
145
+ );
146
+ })();
147
+
148
+ return { name: obj.name, target, kind, value, validate };
149
+ });
150
+ if (filtered.length === 0) return [];
151
+
152
+ for (const tag of tagList)
153
+ if (tag.target.includes(type))
154
+ error(null)(
155
+ `target must constains ${type} type - ${JSON.stringify(
156
+ tag,
157
+ )}`,
158
+ );
159
+
160
+ return tagList.map((tag) => ({
161
+ name: tag.name,
162
+ kind: tag.kind,
163
+ value: tag.value,
164
+ validate: tag.validate[type]!,
165
+ }));
166
+ };
167
+
168
+ interface ITypedTag {
169
+ name: string;
170
+ target: Array<"bigint" | "number" | "string" | "array">;
171
+ kind: string;
172
+ value: boolean | bigint | number | string;
173
+ validate: Record<string, string>;
174
+ }
175
+
176
+ const FIELDS = ["target", "kind", "value", "validate"];
177
+
178
+ const error = (property: string | null) => (msg: string) =>
179
+ new Error(
180
+ `Error on typia.MetadataFactory.analyze(): the property '${
181
+ property === null ? `["typia.tag"]` : `["typia.tag.${property}"]`
182
+ }' ${msg}.`,
183
+ );
@@ -1,2 +1,4 @@
1
+ import { $clone } from "./$clone";
2
+
1
3
  export const $any = (val: any): any =>
2
- val !== undefined ? JSON.parse(JSON.stringify(val)) : undefined;
4
+ val !== undefined ? $clone(val) : undefined;
@@ -0,0 +1,4 @@
1
+ import { Primitive } from "../Primitive";
2
+
3
+ export const $clone = <T>(value: T): Primitive<T> =>
4
+ JSON.parse(JSON.stringify(value));
package/src/module.ts CHANGED
@@ -1,18 +1,15 @@
1
- import { $dictionary } from "./functional/$dictionary";
2
1
  import { Namespace } from "./functional/Namespace";
3
2
 
4
3
  import { IMetadataApplication } from "./schemas/metadata/IMetadataApplication";
5
4
 
6
- import { MapUtil } from "./utils/MapUtil";
7
-
8
- import { CustomValidatorMap } from "./CustomValidatorMap";
9
5
  import { IRandomGenerator } from "./IRandomGenerator";
10
6
  import { IValidation } from "./IValidation";
11
7
  import { Resolved } from "./Resolved";
12
8
 
13
9
  export * as json from "./json";
14
- export * as protobuf from "./protobuf";
15
10
  export * as misc from "./misc";
11
+ export * as protobuf from "./protobuf";
12
+ export * as tags from "./tags";
16
13
 
17
14
  export * from "./schemas/json/IJsonApplication";
18
15
  export * from "./schemas/json/IJsonComponents";
@@ -23,56 +20,6 @@ export * from "./Primitive";
23
20
  export * from "./Resolved";
24
21
  export * from "./TypeGuardError";
25
22
 
26
- /**
27
- * Custom validators.
28
- *
29
- * If you want to add a custom validation logic utilizing comment tags,
30
- * add a closure function with its tag and type name. Below example code
31
- * would helpful to understand how to use this instance.
32
- *
33
- * ```ts
34
- * typia.customValidators.insert("powerOf")("number")(
35
- * (text: string) => {
36
- * const denominator: number = Math.log(Number(text));
37
- * return (value: number) => {
38
- * value = Math.log(value) / denominator;
39
- * return value === Math.floor(value);
40
- * };
41
- * }
42
- * );
43
- * typia.customValidators.insert("dollar")("string")(
44
- * () => (value: string) => value.startsWith("$"),
45
- * );
46
- *
47
- * interface TagCustom {
48
- * /**
49
- * * @powerOf 10
50
- * *\/
51
- * powerOf: number;
52
- *
53
- * /**
54
- * * @dollar
55
- * *\/
56
- * dollar: string;
57
- * }
58
- * ```
59
- *
60
- * @author Jeongho Nam - https://github.com/samchon
61
- */
62
- export const customValidators: CustomValidatorMap = {
63
- size: (name?: string) =>
64
- name ? $dictionary.get(name)?.size ?? 0 : $dictionary.size,
65
- has: (name) => (type) => $dictionary.get(name)?.has(type) ?? false,
66
- get: (name) => (type) => $dictionary.get(name)?.get(type),
67
- insert: (name) => (type) => (closure) => {
68
- const internal = MapUtil.take($dictionary)(name, () => new Map());
69
- if (internal.has(type)) return false;
70
- internal.set(type, closure);
71
- return true;
72
- },
73
- erase: (name) => (type) => $dictionary.get(name)?.delete(type) ?? false,
74
- };
75
-
76
23
  /* -----------------------------------------------------------
77
24
  BASIC VALIDATORS
78
25
  ----------------------------------------------------------- */
@@ -33,7 +33,7 @@ export namespace AssertProgrammer {
33
33
  equals,
34
34
  atomist: (explore) => (tuple) => (input) =>
35
35
  [
36
- tuple.expression,
36
+ ...(tuple.expression ? [tuple.expression] : []),
37
37
  ...tuple.tags.map((tag) =>
38
38
  ts.factory.createLogicalOr(
39
39
  tag.expression,