typia 5.0.0-dev.20230824 → 5.0.0-dev.20230827

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 (292) hide show
  1. package/README.md +1 -2
  2. package/lib/IRandomGenerator.d.ts +4 -3
  3. package/lib/factories/ExpressionFactory.d.ts +1 -1
  4. package/lib/factories/ExpressionFactory.js +1 -1
  5. package/lib/factories/ExpressionFactory.js.map +1 -1
  6. package/lib/factories/LiteralFactory.js +6 -2
  7. package/lib/factories/LiteralFactory.js.map +1 -1
  8. package/lib/factories/MetadataCollection.js +0 -1
  9. package/lib/factories/MetadataCollection.js.map +1 -1
  10. package/lib/factories/MetadataCommentTagFactory.js +532 -0
  11. package/lib/factories/MetadataCommentTagFactory.js.map +1 -0
  12. package/lib/factories/MetadataTypeTagFactory.d.ts +6 -0
  13. package/lib/factories/MetadataTypeTagFactory.js +207 -0
  14. package/lib/factories/MetadataTypeTagFactory.js.map +1 -0
  15. package/lib/factories/NumericRangeFactory.d.ts +6 -0
  16. package/lib/factories/NumericRangeFactory.js +34 -0
  17. package/lib/factories/NumericRangeFactory.js.map +1 -0
  18. package/lib/factories/ProtobufFactory.js +41 -10
  19. package/lib/factories/ProtobufFactory.js.map +1 -1
  20. package/lib/factories/internal/metadata/emend_metadata_atomics.js +7 -1
  21. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_alias.js +1 -13
  23. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  24. package/lib/factories/internal/metadata/emplace_metadata_object.js +0 -1
  25. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +2 -1
  27. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +3 -4
  29. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  30. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +8 -6
  31. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  32. package/lib/functional/Namespace.js +0 -16
  33. package/lib/functional/Namespace.js.map +1 -1
  34. package/lib/programmers/AssertProgrammer.js +28 -8
  35. package/lib/programmers/AssertProgrammer.js.map +1 -1
  36. package/lib/programmers/CheckerProgrammer.js +65 -52
  37. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  38. package/lib/programmers/FeatureProgrammer.d.ts +3 -5
  39. package/lib/programmers/FeatureProgrammer.js +6 -6
  40. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  41. package/lib/programmers/IsProgrammer.d.ts +1 -1
  42. package/lib/programmers/IsProgrammer.js +32 -19
  43. package/lib/programmers/IsProgrammer.js.map +1 -1
  44. package/lib/programmers/RandomProgrammer.js +155 -135
  45. package/lib/programmers/RandomProgrammer.js.map +1 -1
  46. package/lib/programmers/ValidateProgrammer.js +28 -8
  47. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  48. package/lib/programmers/helpers/CloneJoiner.js +10 -2
  49. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  50. package/lib/programmers/helpers/ICheckEntry.d.ts +3 -2
  51. package/lib/programmers/helpers/ProtobufUtil.d.ts +6 -2
  52. package/lib/programmers/helpers/ProtobufUtil.js +175 -17
  53. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  54. package/lib/programmers/helpers/RandomJoiner.d.ts +3 -5
  55. package/lib/programmers/helpers/RandomJoiner.js +7 -10
  56. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  57. package/lib/programmers/helpers/RandomRanger.d.ts +5 -6
  58. package/lib/programmers/helpers/RandomRanger.js +13 -33
  59. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  60. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -8
  61. package/lib/programmers/helpers/UnionExplorer.js +6 -6
  62. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  63. package/lib/programmers/internal/application_alias.js +0 -1
  64. package/lib/programmers/internal/application_alias.js.map +1 -1
  65. package/lib/programmers/internal/application_array.js +60 -20
  66. package/lib/programmers/internal/application_array.js.map +1 -1
  67. package/lib/programmers/internal/application_number.js +95 -69
  68. package/lib/programmers/internal/application_number.js.map +1 -1
  69. package/lib/programmers/internal/application_object.js +0 -3
  70. package/lib/programmers/internal/application_object.js.map +1 -1
  71. package/lib/programmers/internal/application_schema.js +37 -20
  72. package/lib/programmers/internal/application_schema.js.map +1 -1
  73. package/lib/programmers/internal/application_string.js +56 -22
  74. package/lib/programmers/internal/application_string.js.map +1 -1
  75. package/lib/programmers/internal/check_array_length.js +25 -25
  76. package/lib/programmers/internal/check_array_length.js.map +1 -1
  77. package/lib/programmers/internal/check_bigint.js +13 -116
  78. package/lib/programmers/internal/check_bigint.js.map +1 -1
  79. package/lib/programmers/internal/check_dynamic_properties.js +1 -1
  80. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  81. package/lib/programmers/internal/check_number.js +62 -163
  82. package/lib/programmers/internal/check_number.js.map +1 -1
  83. package/lib/programmers/internal/check_string.js +16 -52
  84. package/lib/programmers/internal/check_string.js.map +1 -1
  85. package/lib/programmers/internal/check_template.js +16 -1
  86. package/lib/programmers/internal/check_template.js.map +1 -1
  87. package/lib/programmers/internal/check_union_array_like.js +4 -4
  88. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  89. package/lib/programmers/internal/feature_object_entries.js +1 -1
  90. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  91. package/lib/programmers/internal/random_custom.js +2 -2
  92. package/lib/programmers/internal/random_custom.js.map +1 -1
  93. package/lib/programmers/json/JsonStringifyProgrammer.js +21 -16
  94. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  95. package/lib/programmers/misc/MiscCloneProgrammer.js +13 -9
  96. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  97. package/lib/programmers/{IsPruneProgrammer.d.ts → misc/MiscIsPruneProgrammer.d.ts} +2 -2
  98. package/lib/programmers/{IsPruneProgrammer.js → misc/MiscIsPruneProgrammer.js} +11 -11
  99. package/lib/programmers/misc/MiscIsPruneProgrammer.js.map +1 -0
  100. package/lib/programmers/misc/MiscPruneProgrammer.js +10 -6
  101. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  102. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +24 -44
  103. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  104. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +138 -65
  105. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  106. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +59 -85
  107. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  108. package/lib/schemas/json/IJsonSchema.d.ts +10 -38
  109. package/lib/schemas/metadata/IMetadataAlias.d.ts +0 -2
  110. package/lib/schemas/metadata/IMetadataProperty.d.ts +0 -2
  111. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +2 -0
  112. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  113. package/lib/schemas/metadata/Metadata.js +25 -25
  114. package/lib/schemas/metadata/Metadata.js.map +1 -1
  115. package/lib/schemas/metadata/MetadataAlias.d.ts +0 -2
  116. package/lib/schemas/metadata/MetadataAlias.js +0 -3
  117. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  118. package/lib/schemas/metadata/MetadataArray.d.ts +2 -0
  119. package/lib/schemas/metadata/MetadataArray.js +45 -2
  120. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  121. package/lib/schemas/metadata/MetadataAtomic.d.ts +9 -0
  122. package/lib/schemas/metadata/MetadataAtomic.js +59 -0
  123. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -0
  124. package/lib/schemas/metadata/MetadataProperty.d.ts +0 -2
  125. package/lib/schemas/metadata/MetadataProperty.js +0 -3
  126. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  127. package/lib/schemas/metadata/MetadataTuple.d.ts +4 -2
  128. package/lib/schemas/metadata/MetadataTuple.js +1 -2
  129. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  130. package/lib/tags/ExclusiveMaximum.d.ts +10 -8
  131. package/lib/tags/ExclusiveMinimum.d.ts +10 -8
  132. package/lib/tags/Format.d.ts +8 -8
  133. package/lib/tags/MaxItems.d.ts +8 -8
  134. package/lib/tags/MaxLength.d.ts +8 -8
  135. package/lib/tags/Maximum.d.ts +10 -8
  136. package/lib/tags/MinItems.d.ts +8 -8
  137. package/lib/tags/MinLength.d.ts +8 -8
  138. package/lib/tags/Minimum.d.ts +10 -8
  139. package/lib/tags/MultipleOf.d.ts +10 -8
  140. package/lib/tags/Pattern.d.ts +7 -8
  141. package/lib/tags/TagBase.d.ts +10 -6
  142. package/lib/tags/Type.d.ts +14 -13
  143. package/lib/tags/index.d.ts +1 -0
  144. package/lib/tags/index.js +1 -0
  145. package/lib/tags/index.js.map +1 -1
  146. package/lib/transformers/FileTransformer.js +3 -1
  147. package/lib/transformers/FileTransformer.js.map +1 -1
  148. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js +2 -2
  149. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js.map +1 -1
  150. package/lib/transformers/features/misc/MiscIsPruneTransformer.js +2 -2
  151. package/lib/transformers/features/misc/MiscIsPruneTransformer.js.map +1 -1
  152. package/lib/typings/ProtobufAtomic.d.ts +5 -0
  153. package/lib/{schemas/metadata/ICommentTag.js → typings/ProtobufAtomic.js} +1 -1
  154. package/lib/typings/ProtobufAtomic.js.map +1 -0
  155. package/package.json +2 -2
  156. package/src/IRandomGenerator.ts +4 -3
  157. package/src/factories/ExpressionFactory.ts +2 -2
  158. package/src/factories/LiteralFactory.ts +10 -3
  159. package/src/factories/MetadataCollection.ts +0 -1
  160. package/src/factories/MetadataCommentTagFactory.ts +583 -0
  161. package/src/factories/MetadataTypeTagFactory.ts +263 -0
  162. package/src/factories/NumericRangeFactory.ts +33 -0
  163. package/src/factories/ProtobufFactory.ts +27 -13
  164. package/src/factories/internal/metadata/emend_metadata_atomics.ts +6 -1
  165. package/src/factories/internal/metadata/emplace_metadata_alias.ts +0 -6
  166. package/src/factories/internal/metadata/emplace_metadata_object.ts +0 -1
  167. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +2 -1
  168. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +3 -7
  169. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +13 -10
  170. package/src/functional/Namespace.ts +0 -16
  171. package/src/programmers/AssertProgrammer.ts +57 -21
  172. package/src/programmers/CheckerProgrammer.ts +43 -118
  173. package/src/programmers/FeatureProgrammer.ts +11 -33
  174. package/src/programmers/IsProgrammer.ts +52 -41
  175. package/src/programmers/RandomProgrammer.ts +206 -226
  176. package/src/programmers/ValidateProgrammer.ts +60 -21
  177. package/src/programmers/helpers/CloneJoiner.ts +57 -20
  178. package/src/programmers/helpers/ICheckEntry.ts +3 -2
  179. package/src/programmers/helpers/ProtobufUtil.ts +113 -17
  180. package/src/programmers/helpers/RandomJoiner.ts +11 -37
  181. package/src/programmers/helpers/RandomRanger.ts +16 -51
  182. package/src/programmers/helpers/UnionExplorer.ts +1 -20
  183. package/src/programmers/internal/application_alias.ts +0 -1
  184. package/src/programmers/internal/application_array.ts +32 -10
  185. package/src/programmers/internal/application_number.ts +76 -70
  186. package/src/programmers/internal/application_object.ts +0 -3
  187. package/src/programmers/internal/application_schema.ts +36 -18
  188. package/src/programmers/internal/application_string.ts +33 -27
  189. package/src/programmers/internal/check_array_length.ts +34 -28
  190. package/src/programmers/internal/check_bigint.ts +25 -118
  191. package/src/programmers/internal/check_dynamic_properties.ts +1 -2
  192. package/src/programmers/internal/check_number.ts +81 -261
  193. package/src/programmers/internal/check_string.ts +28 -39
  194. package/src/programmers/internal/check_template.ts +17 -1
  195. package/src/programmers/internal/check_union_array_like.ts +1 -16
  196. package/src/programmers/internal/feature_object_entries.ts +12 -18
  197. package/src/programmers/internal/random_custom.ts +3 -3
  198. package/src/programmers/json/JsonStringifyProgrammer.ts +25 -36
  199. package/src/programmers/misc/MiscCloneProgrammer.ts +10 -24
  200. package/src/programmers/{IsPruneProgrammer.ts → misc/MiscIsPruneProgrammer.ts} +7 -7
  201. package/src/programmers/misc/MiscPruneProgrammer.ts +8 -18
  202. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +34 -68
  203. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +153 -98
  204. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +6 -36
  205. package/src/schemas/json/IJsonSchema.ts +11 -38
  206. package/src/schemas/metadata/IMetadataAlias.ts +0 -2
  207. package/src/schemas/metadata/IMetadataProperty.ts +0 -2
  208. package/src/schemas/metadata/IMetadataTypeTag.ts +2 -0
  209. package/src/schemas/metadata/Metadata.ts +28 -42
  210. package/src/schemas/metadata/MetadataAlias.ts +0 -5
  211. package/src/schemas/metadata/MetadataArray.ts +21 -3
  212. package/src/schemas/metadata/MetadataAtomic.ts +42 -0
  213. package/src/schemas/metadata/MetadataProperty.ts +0 -5
  214. package/src/schemas/metadata/MetadataTuple.ts +5 -4
  215. package/src/tags/ExclusiveMaximum.ts +13 -8
  216. package/src/tags/ExclusiveMinimum.ts +13 -8
  217. package/src/tags/Format.ts +21 -20
  218. package/src/tags/MaxItems.ts +9 -8
  219. package/src/tags/MaxLength.ts +9 -8
  220. package/src/tags/Maximum.ts +13 -8
  221. package/src/tags/MinItems.ts +9 -8
  222. package/src/tags/MinLength.ts +9 -8
  223. package/src/tags/Minimum.ts +13 -8
  224. package/src/tags/MultipleOf.ts +15 -10
  225. package/src/tags/Pattern.ts +8 -8
  226. package/src/tags/TagBase.ts +18 -13
  227. package/src/tags/Type.ts +26 -29
  228. package/src/tags/index.ts +1 -0
  229. package/src/transformers/FileTransformer.ts +4 -4
  230. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +2 -2
  231. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +2 -2
  232. package/src/typings/ProtobufAtomic.ts +19 -0
  233. package/lib/factories/MetadataTagFactory.d.ts +0 -6
  234. package/lib/factories/MetadataTagFactory.js +0 -312
  235. package/lib/factories/MetadataTagFactory.js.map +0 -1
  236. package/lib/factories/internal/metadata/iterate_metadata_type_tags.d.ts +0 -3
  237. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js +0 -157
  238. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js.map +0 -1
  239. package/lib/functional/$is_custom.d.ts +0 -2
  240. package/lib/functional/$is_custom.js +0 -13
  241. package/lib/functional/$is_custom.js.map +0 -1
  242. package/lib/functional/$is_date.d.ts +0 -1
  243. package/lib/functional/$is_date.js +0 -7
  244. package/lib/functional/$is_date.js.map +0 -1
  245. package/lib/functional/$is_datetime.d.ts +0 -1
  246. package/lib/functional/$is_datetime.js +0 -8
  247. package/lib/functional/$is_datetime.js.map +0 -1
  248. package/lib/functional/$is_email.d.ts +0 -1
  249. package/lib/functional/$is_email.js +0 -7
  250. package/lib/functional/$is_email.js.map +0 -1
  251. package/lib/functional/$is_ipv4.d.ts +0 -1
  252. package/lib/functional/$is_ipv4.js +0 -7
  253. package/lib/functional/$is_ipv4.js.map +0 -1
  254. package/lib/functional/$is_ipv6.d.ts +0 -1
  255. package/lib/functional/$is_ipv6.js +0 -7
  256. package/lib/functional/$is_ipv6.js.map +0 -1
  257. package/lib/functional/$is_url.d.ts +0 -1
  258. package/lib/functional/$is_url.js +0 -7
  259. package/lib/functional/$is_url.js.map +0 -1
  260. package/lib/functional/$is_uuid.d.ts +0 -1
  261. package/lib/functional/$is_uuid.js +0 -7
  262. package/lib/functional/$is_uuid.js.map +0 -1
  263. package/lib/programmers/IsPruneProgrammer.js.map +0 -1
  264. package/lib/programmers/internal/check_array_tags.js +0 -39
  265. package/lib/programmers/internal/check_array_tags.js.map +0 -1
  266. package/lib/programmers/internal/check_string_tags.d.ts +0 -1
  267. package/lib/programmers/internal/check_string_tags.js +0 -89
  268. package/lib/programmers/internal/check_string_tags.js.map +0 -1
  269. package/lib/programmers/internal/get_comment_tags.d.ts +0 -1
  270. package/lib/programmers/internal/get_comment_tags.js +0 -25
  271. package/lib/programmers/internal/get_comment_tags.js.map +0 -1
  272. package/lib/schemas/metadata/ICommentTag.d.ts +0 -4
  273. package/lib/schemas/metadata/ICommentTag.js.map +0 -1
  274. package/lib/schemas/metadata/IMetadataCommentTag.d.ts +0 -63
  275. package/lib/schemas/metadata/IMetadataCommentTag.js +0 -3
  276. package/lib/schemas/metadata/IMetadataCommentTag.js.map +0 -1
  277. package/src/factories/MetadataTagFactory.ts +0 -365
  278. package/src/factories/internal/metadata/iterate_metadata_type_tags.ts +0 -183
  279. package/src/functional/$is_custom.ts +0 -14
  280. package/src/functional/$is_date.ts +0 -3
  281. package/src/functional/$is_datetime.ts +0 -2
  282. package/src/functional/$is_email.ts +0 -4
  283. package/src/functional/$is_ipv4.ts +0 -4
  284. package/src/functional/$is_ipv6.ts +0 -4
  285. package/src/functional/$is_url.ts +0 -4
  286. package/src/functional/$is_uuid.ts +0 -4
  287. package/src/programmers/internal/check_array_tags.ts +0 -45
  288. package/src/programmers/internal/check_string_tags.ts +0 -67
  289. package/src/programmers/internal/get_comment_tags.ts +0 -23
  290. package/src/schemas/metadata/ICommentTag.ts +0 -4
  291. package/src/schemas/metadata/IMetadataCommentTag.ts +0 -112
  292. /package/lib/{programmers/internal/check_array_tags.d.ts → factories/MetadataCommentTagFactory.d.ts} +0 -0
@@ -0,0 +1,263 @@
1
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
2
+ import { Metadata } from "../schemas/metadata/Metadata";
3
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
4
+ import { MetadataProperty } from "../schemas/metadata/MetadataProperty";
5
+
6
+ export namespace MetadataTypeTagFactory {
7
+ export const analyze =
8
+ (type: "bigint" | "number" | "string" | "array") =>
9
+ (objects: MetadataObject[]): IMetadataTypeTag[] => {
10
+ //----
11
+ // VALIDATION PROCESS
12
+ //----
13
+ const filtered: MetadataObject[] = objects.filter((obj) => {
14
+ // ONLY ONE PROPERTY
15
+ if (obj.properties.length !== 1) return false;
16
+
17
+ // THE TAG.TYPE PROPERTY MUST BE
18
+ const top: MetadataProperty = obj.properties[0]!;
19
+ if (
20
+ top.key.getSoleLiteral() !== "typia.tag" ||
21
+ top.value.size() !== 1 ||
22
+ top.value.objects.length !== 1
23
+ )
24
+ return false;
25
+ else if (top.value.optional === false)
26
+ throw error(null)("must be optional object");
27
+
28
+ // CHECK LIST OF PROPERTIES
29
+ const tag: MetadataObject = top.value.objects[0]!;
30
+ const statics: string[] = tag.properties
31
+ .map((p) => p.key.getSoleLiteral()!)
32
+ .filter((str) => str !== null);
33
+ if (FIELDS.some((f) => !statics.includes(f)))
34
+ throw error(null)(
35
+ `must have four properties - ${FIELDS.map(
36
+ (str) => `'${str}'`,
37
+ ).join(", ")}`,
38
+ );
39
+
40
+ tag.properties.forEach((p) => {
41
+ const key: string | null = p.key.getSoleLiteral();
42
+ if (key === null) return;
43
+ else if (FIELDS.includes(key) === false) return;
44
+ validate_property(key, p.value);
45
+ });
46
+ return true;
47
+ });
48
+ if (filtered.length === 0) return [];
49
+
50
+ //----
51
+ // CONSTRUCT TYPE TAGS
52
+ //----
53
+ // CREATE 1ST
54
+ const tagList: ITypeTag[] = filtered.map(create_metadata_type_tag);
55
+ const output: IMetadataTypeTag[] = tagList.map((tag) => ({
56
+ target: tag.target,
57
+ name: tag.name,
58
+ kind: tag.kind,
59
+ value: tag.value,
60
+ validate: tag.validate[type]!,
61
+ exclusive: tag.exclusive,
62
+ }));
63
+ validate(type)(output);
64
+ return output;
65
+ };
66
+
67
+ export const validate =
68
+ (type: "bigint" | "number" | "string" | "array") =>
69
+ (tagList: IMetadataTypeTag[]) => {
70
+ for (const tag of tagList)
71
+ if (tag.target.includes(type))
72
+ error(null)(`target must constains ${type} type - ${tag}`);
73
+
74
+ tagList.forEach((tag, i) => {
75
+ if (tag.exclusive === false) return;
76
+ else if (tag.exclusive === true) {
77
+ const some: boolean = tagList.some(
78
+ (opposite, j) => i !== j && opposite.kind === tag.kind,
79
+ );
80
+ if (some === true)
81
+ throw error(null)(
82
+ `kind '${tag.kind}' can't be duplicated`,
83
+ );
84
+ } else if (Array.isArray(tag.exclusive)) {
85
+ const some: IMetadataTypeTag | undefined = tagList.find(
86
+ (opposite, j) =>
87
+ i !== j &&
88
+ opposite.kind === tag.kind &&
89
+ (tag.exclusive as string[]).includes(opposite.name),
90
+ );
91
+ if (some !== undefined)
92
+ throw error(null)(
93
+ `kind '${tag.kind}' can't be used with '${some.name}'`,
94
+ );
95
+ }
96
+ });
97
+ };
98
+
99
+ const validate_property = (key: string, value: Metadata) => {
100
+ if (
101
+ // TARGET
102
+ key === "target" &&
103
+ (value.constants.length !== 1 ||
104
+ value.constants[0]!.values.length !== value.size() ||
105
+ value.constants[0]!.values.some(
106
+ (v) =>
107
+ v !== "bigint" &&
108
+ v !== "number" &&
109
+ v !== "string" &&
110
+ v !== "array",
111
+ ))
112
+ )
113
+ throw error(key)(
114
+ `must be one of 'bigint', 'number', 'string', 'array'`,
115
+ );
116
+ else if (
117
+ // KIND
118
+ key === "kind" &&
119
+ (value.size() !== 1 ||
120
+ value.constants.length !== 1 ||
121
+ value.constants[0]!.type !== "string" ||
122
+ value.constants[0]!.values.length !== 1)
123
+ )
124
+ throw error(key)("must be a string literal type");
125
+ else if (
126
+ // VALUE
127
+ key === "value" &&
128
+ (value.size() > 1 ||
129
+ (value.size() !== 0 &&
130
+ (value.constants.length !== 1 ||
131
+ value.constants[0]!.values.length !== 1)))
132
+ )
133
+ throw error(key)(
134
+ "must be a constant literal type or undefined value",
135
+ );
136
+ else if (key === "exclusive") get_exclusive(key)(value);
137
+ else if (key === "validate") {
138
+ //----
139
+ // VALIDATE
140
+ //----
141
+ // STRING CASE
142
+ const single: boolean =
143
+ value.size() === 1 &&
144
+ value.constants.length === 1 &&
145
+ value.constants[0]!.type === "string" &&
146
+ value.constants[0]!.values.length === 1;
147
+ if (single === true) return;
148
+
149
+ // RECORD<TARGET, STRING>
150
+ const target: string[] | undefined = value.objects[0]?.properties
151
+ .map((p) => p.key.getSoleLiteral()!)
152
+ .filter((str) => str !== null) as string[] | undefined;
153
+ if (target === undefined)
154
+ throw error("target")(
155
+ `must be one of 'bigint', 'number', 'string', 'array'`,
156
+ );
157
+ const variadic: boolean =
158
+ value.size() === 1 &&
159
+ value.objects.length === 1 &&
160
+ value.objects[0]!.properties.every(
161
+ (vp) =>
162
+ vp.value.size() === 1 &&
163
+ vp.value.isRequired() &&
164
+ vp.value.nullable === false &&
165
+ vp.value.constants.length === 1 &&
166
+ vp.value.constants[0]!.type === "string" &&
167
+ vp.value.constants[0]!.values.length === 1 &&
168
+ target.includes(vp.key.getSoleLiteral()!),
169
+ );
170
+ if (variadic === false)
171
+ throw error(key)(
172
+ `must be a string literal type or Record<Target, string> type.`,
173
+ );
174
+ }
175
+ };
176
+
177
+ const create_metadata_type_tag = (obj: MetadataObject): ITypeTag => {
178
+ const find = (key: string): MetadataProperty | undefined =>
179
+ obj.properties[0]?.value.objects[0]?.properties.find(
180
+ (p) => p.key.getSoleLiteral() === key,
181
+ );
182
+
183
+ const target = find("target")!.value.constants[0]!
184
+ .values[0] as ITypeTag["target"];
185
+ const kind: string = find("kind")!.value.constants[0]!
186
+ .values[0] as string;
187
+ const value: boolean | bigint | number | string | undefined =
188
+ find("value")?.value.constants[0]?.values[0];
189
+ const exclusive: string[] | boolean | undefined = get_exclusive(
190
+ "exclusive",
191
+ )(find("exclusive")?.value);
192
+ const validate: Record<string, string> = (() => {
193
+ const validate = find("validate")!.value;
194
+ if (validate.constants.length)
195
+ return {
196
+ [target]: validate.constants[0]!.values[0] as string,
197
+ };
198
+ return Object.fromEntries(
199
+ validate.objects[0]!.properties.map((p) => [
200
+ p.key.getSoleLiteral()!,
201
+ p.value.constants[0]!.values[0]! as string,
202
+ ]),
203
+ );
204
+ })();
205
+
206
+ return {
207
+ name: obj.name,
208
+ target,
209
+ kind,
210
+ value,
211
+ validate,
212
+ exclusive: exclusive ?? false,
213
+ };
214
+ };
215
+
216
+ const get_exclusive =
217
+ (key: string) =>
218
+ (value: Metadata | undefined): boolean | string[] => {
219
+ if (value === undefined) return false;
220
+ else if (
221
+ value.size() === 1 &&
222
+ value.constants.length === 1 &&
223
+ value.constants[0]!.type === "boolean" &&
224
+ value.constants[0]!.values.length === 1
225
+ )
226
+ return value.constants[0]!.values[0]! as boolean;
227
+ else if (
228
+ value.size() === 1 &&
229
+ value.tuples.length === 1 &&
230
+ value.tuples[0]!.type.elements.every(
231
+ (elem) =>
232
+ elem.size() === 1 &&
233
+ elem.constants.length === 1 &&
234
+ elem.constants[0]!.type === "string" &&
235
+ elem.constants[0]!.values.length === 1,
236
+ )
237
+ )
238
+ return value.tuples[0]!.type.elements.map(
239
+ (elem) => elem.constants[0]!.values[0]! as string,
240
+ );
241
+ throw error(key)(
242
+ "must a boolean literal type or a tuple of string literal types.",
243
+ );
244
+ };
245
+ }
246
+
247
+ interface ITypeTag {
248
+ name: string;
249
+ target: "bigint" | "number" | "string" | "array";
250
+ kind: string;
251
+ value?: boolean | bigint | number | string;
252
+ validate: Record<string, string>;
253
+ exclusive: boolean | string[];
254
+ }
255
+
256
+ const FIELDS = ["target", "kind", "value", "validate"];
257
+
258
+ const error = (property: string | null) => (msg: string) =>
259
+ new Error(
260
+ `Error on typia.MetadataFactory.analyze(): the property '${
261
+ property === null ? `["typia.tag"]` : `["typia.tag.${property}"]`
262
+ }' ${msg}.`,
263
+ );
@@ -0,0 +1,33 @@
1
+ import ts from "typescript";
2
+
3
+ import { ProtobufAtomic } from "../typings/ProtobufAtomic";
4
+
5
+ import { ExpressionFactory } from "./ExpressionFactory";
6
+
7
+ export namespace NumericRangeFactory {
8
+ export const number =
9
+ (context: ts.TransformationContext) =>
10
+ (type: ProtobufAtomic.Numeric) =>
11
+ (input: ts.Expression): ts.Expression =>
12
+ ExpressionFactory.transpile(context)(NUMBER_TEXT[type])(input);
13
+
14
+ export const bigint =
15
+ (context: ts.TransformationContext) =>
16
+ (type: ProtobufAtomic.BigNumeric) =>
17
+ (input: ts.Expression): ts.Expression =>
18
+ ExpressionFactory.transpile(context)(BIGINT_TEXT[type])(input);
19
+ }
20
+
21
+ const NUMBER_TEXT = {
22
+ int32: `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`,
23
+ uint32: `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`,
24
+ int64: `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`,
25
+ uint64: `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`,
26
+ float: `-1.175494351e38 <= $input && $input <= 3.4028235e38`,
27
+ double: `true`,
28
+ };
29
+
30
+ const BIGINT_TEXT = {
31
+ int64: `true`,
32
+ uint64: `BigInt(0) <= $input`,
33
+ };
@@ -71,6 +71,22 @@ export namespace ProtobufFactory {
71
71
  );
72
72
  }
73
73
  //----
74
+ // ATOMIC CASES
75
+ //----
76
+ else if (meta.atomics.length) {
77
+ const numbers = ProtobufUtil.getNumbers(meta);
78
+ const bigints = ProtobufUtil.getBigints(meta);
79
+
80
+ for (const type of ["int64", "uint64"])
81
+ if (
82
+ numbers.some((n) => n === type) &&
83
+ bigints.some((b) => b === type)
84
+ )
85
+ throw notSupportedError({ method })(
86
+ `${type} cannot be used in both number and bigint types. Recommend to remove from number type`,
87
+ );
88
+ }
89
+ //----
74
90
  // ARRRAY CASES
75
91
  //----
76
92
  // DO NOT ALLOW MULTI-DIMENTIONAL ARRAY
@@ -182,7 +198,7 @@ export namespace ProtobufFactory {
182
198
  meta.objects.some(
183
199
  (obj) =>
184
200
  isDynamicObject(obj) &&
185
- obj.properties.some((p) => p.value.isBinaryUnion()),
201
+ obj.properties.some((p) => ProtobufUtil.isUnion(p.value)),
186
202
  )
187
203
  )
188
204
  throw notSupportedError({ method })(
@@ -191,20 +207,18 @@ export namespace ProtobufFactory {
191
207
  //----
192
208
  // MAP CASES
193
209
  //----
194
- // MAP TYPE, BUT PROPERTY KEY TYPE IS NOT STRING
195
- // @todo -> need to allow other typed keys
210
+ // KEY TYPE ISUNION
196
211
  else if (
197
212
  meta.maps.length &&
198
- meta.maps.some(
199
- (m) =>
200
- m.key.isBinaryUnion() ||
201
- (m.key.atomics.find((v) => v.type === "string") ===
202
- undefined &&
203
- m.key.constants.find((c) => c.type === "string") ===
204
- undefined),
205
- )
213
+ meta.maps.some((m) => ProtobufUtil.isUnion(m.key))
214
+ )
215
+ throw notSupportedError({ method })("union key typed map");
216
+ // KEY TYPE IS NOT ATOMIC
217
+ else if (
218
+ meta.maps.length &&
219
+ meta.maps.some((m) => ProtobufUtil.getAtomics(m.key).length !== 1)
206
220
  )
207
- throw notSupportedError({ method })("non-string key typed map");
221
+ throw notSupportedError({ method })("non-atomic key typed map");
208
222
  // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
209
223
  else if (
210
224
  meta.maps.length &&
@@ -227,7 +241,7 @@ export namespace ProtobufFactory {
227
241
  // UNION IN MAP
228
242
  else if (
229
243
  meta.maps.length &&
230
- meta.maps.some((m) => m.value.isBinaryUnion())
244
+ meta.maps.some((m) => ProtobufUtil.isUnion(m.value))
231
245
  )
232
246
  throw notSupportedError({ method })("union type in map");
233
247
  };
@@ -1,4 +1,5 @@
1
1
  import { Metadata } from "../../../schemas/metadata/Metadata";
2
+ import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic";
2
3
 
3
4
  import { ArrayUtil } from "../../../utils/ArrayUtil";
4
5
 
@@ -21,7 +22,11 @@ export const emend_metadata_atomics = (meta: Metadata) => {
21
22
  ArrayUtil.take(
22
23
  meta.atomics,
23
24
  (a) => a.type === "boolean",
24
- () => ({ type: "boolean" as const, tags: [] }),
25
+ () =>
26
+ MetadataAtomic.create({
27
+ type: "boolean" as const,
28
+ tags: [],
29
+ }),
25
30
  );
26
31
  }
27
32
  }
@@ -7,7 +7,6 @@ import { ArrayUtil } from "../../../utils/ArrayUtil";
7
7
 
8
8
  import { MetadataCollection } from "../../MetadataCollection";
9
9
  import { MetadataFactory } from "../../MetadataFactory";
10
- import { MetadataTagFactory } from "../../MetadataTagFactory";
11
10
  import { explore_metadata } from "./explore_metadata";
12
11
 
13
12
  export const emplace_metadata_alias =
@@ -31,10 +30,5 @@ export const emplace_metadata_alias =
31
30
  true,
32
31
  );
33
32
  closure(value);
34
- alias.tags.push(
35
- ...MetadataTagFactory.generate(value)(alias.jsDocTags)(
36
- () => alias.name,
37
- ),
38
- );
39
33
  return alias;
40
34
  };
@@ -61,7 +61,6 @@ export const emplace_metadata_object =
61
61
  value,
62
62
  description,
63
63
  jsDocTags,
64
- tags: [],
65
64
  });
66
65
  obj.properties.push(property);
67
66
  return property;
@@ -1,6 +1,7 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../schemas/metadata/Metadata";
4
+ import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic";
4
5
 
5
6
  import { ArrayUtil } from "../../../utils/ArrayUtil";
6
7
 
@@ -19,7 +20,7 @@ export const iterate_metadata_atomic = (
19
20
  if (filter(info.atomic) || filter(info.literal)) {
20
21
  ArrayUtil.add(
21
22
  meta.atomics,
22
- { type: info.name, tags: [] },
23
+ MetadataAtomic.create({ type: info.name, tags: [] }),
23
24
  (x, y) => x.type === y.type,
24
25
  );
25
26
  return true;
@@ -1,10 +1,8 @@
1
1
  import { MetadataObject } from "../../../schemas/metadata/MetadataObject";
2
2
 
3
- import { Writable } from "../../../typings/Writable";
4
-
5
3
  import { Escaper } from "../../../utils/Escaper";
6
4
 
7
- import { MetadataTagFactory } from "../../MetadataTagFactory";
5
+ import { MetadataCommentTagFactory } from "../../MetadataCommentTagFactory";
8
6
 
9
7
  export const iterate_metadata_comment_tags = (obj: MetadataObject) => {
10
8
  if (obj.tagged_ === true) return;
@@ -20,12 +18,10 @@ export const iterate_metadata_comment_tags = (obj: MetadataObject) => {
20
18
  ? key.slice(1, -1)
21
19
  : null;
22
20
 
23
- Writable(prop).tags = MetadataTagFactory.generate(prop.value)(
24
- prop.jsDocTags,
25
- )(
21
+ MetadataCommentTagFactory.analyze(
26
22
  variable !== null
27
23
  ? () => `${obj.name}.${variable}`
28
24
  : () => `${obj.name}[${key}]`,
29
- );
25
+ )(prop.value)(prop.jsDocTags);
30
26
  }
31
27
  };
@@ -1,18 +1,17 @@
1
1
  import ts from "typescript";
2
2
 
3
- import { $clone } from "../../../functional/$clone";
4
-
5
3
  import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag";
6
4
  import { Metadata } from "../../../schemas/metadata/Metadata";
5
+ import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic";
7
6
 
8
7
  import { ArrayUtil } from "../../../utils/ArrayUtil";
9
8
 
10
9
  import { MetadataCollection } from "../../MetadataCollection";
11
10
  import { MetadataFactory } from "../../MetadataFactory";
11
+ import { MetadataTypeTagFactory } from "../../MetadataTypeTagFactory";
12
12
  import { explore_metadata } from "./explore_metadata";
13
13
  import { iterate_metadata } from "./iterate_metadata";
14
14
  import { iterate_metadata_array } from "./iterate_metadata_array";
15
- import { iterate_metadata_type_tags } from "./iterate_metadata_type_tags";
16
15
 
17
16
  export const iterate_metadata_intersection =
18
17
  (checker: ts.TypeChecker) =>
@@ -58,7 +57,11 @@ export const iterate_metadata_intersection =
58
57
  aliased,
59
58
  );
60
59
  return true;
61
- }
60
+ } else if (
61
+ // ONLY OBJECT TYPES -> SPECIAL LOGIC FOR TS V5.2
62
+ children.every((c) => c.objects.length === 1 && c.size() === 1)
63
+ )
64
+ return false;
62
65
 
63
66
  // VALIDATE EACH TYPES
64
67
  const individuals: (readonly [Metadata, number])[] = children
@@ -122,7 +125,7 @@ export const iterate_metadata_intersection =
122
125
  elem,
123
126
  (a, b) => a === b,
124
127
  );
125
- else meta.constants.push($clone(c));
128
+ else meta.constants.push({ ...c });
126
129
  }
127
130
  }
128
131
  return true;
@@ -139,10 +142,10 @@ export const iterate_metadata_intersection =
139
142
  )
140
143
  ArrayUtil.add(
141
144
  meta.atomics,
142
- {
145
+ MetadataAtomic.create({
143
146
  type: atomics.values().next().value as "string",
144
147
  tags: [],
145
- },
148
+ }),
146
149
  (a, b) => a.type === b.type,
147
150
  );
148
151
  else if (target === "array") {
@@ -159,9 +162,9 @@ export const iterate_metadata_intersection =
159
162
 
160
163
  // ASSIGN TAGS
161
164
  if (objects.length && target !== "boolean") {
162
- const tags: IMetadataTypeTag[] = iterate_metadata_type_tags(target)(
163
- objects.map((om) => om.objects).flat(),
164
- );
165
+ const tags: IMetadataTypeTag[] = MetadataTypeTagFactory.analyze(
166
+ target,
167
+ )(objects.map((om) => om.objects).flat());
165
168
  if (tags.length)
166
169
  if (target === "array") meta.arrays.at(-1)!.tags.push(tags);
167
170
  else
@@ -9,14 +9,6 @@ import { $any } from "./$any";
9
9
  import { $every } from "./$every";
10
10
  import { $guard } from "./$guard";
11
11
  import { $is_between } from "./$is_between";
12
- import { $is_custom } from "./$is_custom";
13
- import { $is_date } from "./$is_date";
14
- import { $is_datetime } from "./$is_datetime";
15
- import { $is_email } from "./$is_email";
16
- import { $is_ipv4 } from "./$is_ipv4";
17
- import { $is_ipv6 } from "./$is_ipv6";
18
- import { $is_url } from "./$is_url";
19
- import { $is_uuid } from "./$is_uuid";
20
12
  import { $join } from "./$join";
21
13
  import { $number } from "./$number";
22
14
  import { $report } from "./$report";
@@ -30,15 +22,7 @@ import { $tail } from "./$tail";
30
22
  */
31
23
  export namespace Namespace {
32
24
  export const is = () => ({
33
- is_uuid: $is_uuid,
34
- is_email: $is_email,
35
- is_url: $is_url,
36
- is_ipv4: $is_ipv4,
37
- is_ipv6: $is_ipv6,
38
25
  is_between: $is_between,
39
- is_date: $is_date,
40
- is_datetime: $is_datetime,
41
- is_custom: $is_custom,
42
26
  });
43
27
 
44
28
  export const assert = (method: string) => ({
@@ -31,29 +31,65 @@ export namespace AssertProgrammer {
31
31
  trace: true,
32
32
  numeric: OptionPredicator.numeric(project.options),
33
33
  equals,
34
- atomist: (explore) => (tuple) => (input) =>
34
+ atomist: (explore) => (entry) => (input) =>
35
35
  [
36
- ...(tuple.expression ? [tuple.expression] : []),
37
- ...tuple.tags.map((tag) =>
38
- ts.factory.createLogicalOr(
39
- tag.expression,
40
- create_guard_call(importer)(
41
- explore.from === "top"
42
- ? ts.factory.createTrue()
43
- : ts.factory.createIdentifier(
44
- "_exceptionable",
36
+ ...(entry.expression ? [entry.expression] : []),
37
+ ...(entry.conditions.length === 0
38
+ ? []
39
+ : entry.conditions.length === 1
40
+ ? entry.conditions[0]!.map((cond) =>
41
+ ts.factory.createLogicalOr(
42
+ cond.expression,
43
+ create_guard_call(importer)(
44
+ explore.from === "top"
45
+ ? ts.factory.createTrue()
46
+ : ts.factory.createIdentifier(
47
+ "_exceptionable",
48
+ ),
49
+ )(
50
+ ts.factory.createIdentifier(
51
+ explore.postfix
52
+ ? `_path + ${explore.postfix}`
53
+ : "_path",
45
54
  ),
46
- )(
47
- ts.factory.createIdentifier(
48
- explore.postfix
49
- ? `_path + ${explore.postfix}`
50
- : "_path",
51
- ),
52
- tag.expected,
53
- input,
54
- ),
55
- ),
56
- ),
55
+ cond.expected,
56
+ input,
57
+ ),
58
+ ),
59
+ )
60
+ : [
61
+ ts.factory.createLogicalOr(
62
+ entry.conditions
63
+ .map((set) =>
64
+ set
65
+ .map((s) => s.expression)
66
+ .reduce((a, b) =>
67
+ ts.factory.createLogicalAnd(
68
+ a,
69
+ b,
70
+ ),
71
+ ),
72
+ )
73
+ .reduce((a, b) =>
74
+ ts.factory.createLogicalOr(a, b),
75
+ ),
76
+ create_guard_call(importer)(
77
+ explore.from === "top"
78
+ ? ts.factory.createTrue()
79
+ : ts.factory.createIdentifier(
80
+ "_exceptionable",
81
+ ),
82
+ )(
83
+ ts.factory.createIdentifier(
84
+ explore.postfix
85
+ ? `_path + ${explore.postfix}`
86
+ : "_path",
87
+ ),
88
+ entry.expected,
89
+ input,
90
+ ),
91
+ ),
92
+ ]),
57
93
  ].reduce((x, y) => ts.factory.createLogicalAnd(x, y)),
58
94
  combiner: combiner(equals)(importer),
59
95
  joiner: joiner(equals)(importer),