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,583 @@
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
+ import { Metadata } from "../schemas/metadata/Metadata";
5
+
6
+ import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
7
+
8
+ /**
9
+ * Extremely hard coded, but no reason to maintain.
10
+ *
11
+ * @internal
12
+ */
13
+ export namespace MetadataCommentTagFactory {
14
+ export const analyze =
15
+ (identifier: () => string) =>
16
+ (metadata: Metadata) =>
17
+ (commentList: ts.JSDocTagInfo[]) => {
18
+ for (const comment of commentList) {
19
+ const tagger: TagRecord = parse(identifier)(comment);
20
+ for (const [key, value] of Object.entries(tagger)) {
21
+ 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()}".`,
27
+ );
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);
37
+ } else {
38
+ const atomic = metadata.atomics.find(
39
+ (a) => a.type == key,
40
+ );
41
+ if (atomic === undefined) {
42
+ if (key === "bigint" || key === "number") {
43
+ const opposite =
44
+ key === "bigint" ? "number" : "bigint";
45
+ if (
46
+ tagger[opposite] !== undefined &&
47
+ metadata.atomics.some(
48
+ (a) => a.type === opposite,
49
+ )
50
+ )
51
+ continue;
52
+ } else if (
53
+ key === "string" &&
54
+ value[0]?.kind === "format" &&
55
+ value[0]?.value === "date-time"
56
+ )
57
+ continue;
58
+ throw new Error(
59
+ `${LABEL}: ${
60
+ comment.name
61
+ } requires ${key} type, no on "${identifier()}".`,
62
+ );
63
+ }
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
+ }
74
+ }
75
+ }
76
+ };
77
+
78
+ const parse =
79
+ (identifier: () => string) =>
80
+ (comment: ts.JSDocTagInfo): TagRecord => {
81
+ const parser = PARSER[comment.name];
82
+ if (parser === undefined) return {};
83
+
84
+ 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);
91
+ };
92
+ }
93
+
94
+ type TagRecord = {
95
+ [P in Target]?: IMetadataTypeTag[];
96
+ };
97
+ type Target = "bigint" | "number" | "string" | "array";
98
+
99
+ const PARSER: Record<
100
+ string,
101
+ (identifier: () => string) => (text: string) => {
102
+ [P in Target]?: IMetadataTypeTag[];
103
+ }
104
+ > = {
105
+ /* -----------------------------------------------------------
106
+ ARRAY
107
+ ----------------------------------------------------------- */
108
+ items: (identifier) => (Value) => ({
109
+ array: [
110
+ {
111
+ name: `MinItems<${Value}>`,
112
+ target: "array",
113
+ kind: "minItems",
114
+ value: parse_integer(identifier)(true)(Value),
115
+ validate: `${Value} <= $input.length`,
116
+ exclusive: true,
117
+ },
118
+ {
119
+ name: `MaxItems<${Value}>`,
120
+ target: "array",
121
+ kind: "maxItems",
122
+ value: parse_integer(identifier)(true)(Value),
123
+ validate: `$input.length <= ${Value}`,
124
+ exclusive: true,
125
+ },
126
+ ],
127
+ }),
128
+ minItems: (identifier) => (Value) => ({
129
+ array: [
130
+ {
131
+ name: `MinItems<${Value}>`,
132
+ target: "array",
133
+ kind: "minItems",
134
+ value: parse_integer(identifier)(true)(Value),
135
+ validate: `${Value} <= $input.length`,
136
+ exclusive: true,
137
+ },
138
+ ],
139
+ }),
140
+ maxItems: (identifier) => (Value) => ({
141
+ array: [
142
+ {
143
+ name: `MaxItems<${Value}>`,
144
+ target: "array",
145
+ kind: "maxItems",
146
+ value: parse_integer(identifier)(true)(Value),
147
+ validate: `$input.length <= ${Value}`,
148
+ exclusive: true,
149
+ },
150
+ ],
151
+ }),
152
+
153
+ /* -----------------------------------------------------------
154
+ NUMBER
155
+ ----------------------------------------------------------- */
156
+ type: () => (Value) => {
157
+ // EMENDATIONS
158
+ if (Value.startsWith("{") && Value.endsWith("}"))
159
+ Value = Value.substring(1, Value.length - 1);
160
+ if (Value === "int") Value = "int32";
161
+ else if (Value === "uint") Value = "uint32";
162
+
163
+ // MUST BE ONE OF THEM
164
+ if (
165
+ ["int32", "uint32", "int64", "uint64", "float", "double"].includes(
166
+ Value,
167
+ ) === false
168
+ )
169
+ return {};
170
+ return {
171
+ number: [
172
+ {
173
+ name: `Type<${Value}>`,
174
+ target: "number",
175
+ kind: "type",
176
+ value: Value,
177
+ validate:
178
+ Value === "int32"
179
+ ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
180
+ : Value === "uint32"
181
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
182
+ : Value === "int64"
183
+ ? `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`
184
+ : Value === "uint64"
185
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`
186
+ : Value === "float"
187
+ ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
188
+ : `true`,
189
+ exclusive: true,
190
+ },
191
+ ],
192
+ bigint:
193
+ Value === "int64" || "uint64"
194
+ ? [
195
+ {
196
+ name: `Type<${Value}>`,
197
+ target: "bigint",
198
+ kind: "type",
199
+ value: Value,
200
+ validate:
201
+ Value === "int64"
202
+ ? "true"
203
+ : "BigInt(0) <= $input",
204
+ exclusive: true,
205
+ },
206
+ ]
207
+ : [],
208
+ };
209
+ },
210
+ minimum: (identifier) => (Value) => ({
211
+ number: [
212
+ {
213
+ name: `Minimum<${Value}>`,
214
+ target: "number",
215
+ kind: "minimum",
216
+ value: parse_number(identifier)(Value),
217
+ validate: `${Value} <= $input`,
218
+ exclusive: ["minimum", "exclusiveMinimum"],
219
+ },
220
+ ],
221
+ bigint: [
222
+ {
223
+ name: `Minimum<${Value}n>`,
224
+ target: "bigint",
225
+ kind: "minimum",
226
+ value: BigInt(parse_integer(identifier)(false)(Value)),
227
+ validate: `${Value} <= $input`,
228
+ exclusive: ["minimum", "exclusiveMinimum"],
229
+ },
230
+ ],
231
+ }),
232
+ maximum: (identifier) => (Value) => ({
233
+ number: [
234
+ {
235
+ name: `Maximum<${Value}>`,
236
+ target: "number",
237
+ kind: "maximum",
238
+ value: parse_number(identifier)(Value),
239
+ validate: `$input <= ${Value}`,
240
+ exclusive: ["maximum", "exclusiveMaximum"],
241
+ },
242
+ ],
243
+ bigint: [
244
+ {
245
+ name: `Maximum<${Value}n>`,
246
+ target: "bigint",
247
+ kind: "maximum",
248
+ value: BigInt(parse_integer(identifier)(false)(Value)),
249
+ validate: `$input <= ${Value}`,
250
+ exclusive: ["maximum", "exclusiveMaximum"],
251
+ },
252
+ ],
253
+ }),
254
+ exclusiveMinimum: (identifier) => (Value) => ({
255
+ number: [
256
+ {
257
+ name: `ExclusiveMinimum<${Value}>`,
258
+ target: "number",
259
+ kind: "exclusiveMinimum",
260
+ value: parse_number(identifier)(Value),
261
+ validate: `${Value} < $input`,
262
+ exclusive: ["minimum", "exclusiveMinimum"],
263
+ },
264
+ ],
265
+ bigint: [
266
+ {
267
+ name: `ExclusiveMinimum<${Value}n>`,
268
+ target: "bigint",
269
+ kind: "exclusiveMinimum",
270
+ value: BigInt(parse_integer(identifier)(false)(Value)),
271
+ validate: `${Value} < $input`,
272
+ exclusive: ["minimum", "exclusiveMinimum"],
273
+ },
274
+ ],
275
+ }),
276
+ exclusiveMaximum: (identifier) => (Value) => ({
277
+ number: [
278
+ {
279
+ name: `ExclusiveMaximum<${Value}>`,
280
+ target: "number",
281
+ kind: "exclusiveMaximum",
282
+ value: parse_number(identifier)(Value),
283
+ validate: `$input < ${Value}`,
284
+ exclusive: ["maximum", "exclusiveMaximum"],
285
+ },
286
+ ],
287
+ bigint: [
288
+ {
289
+ name: `ExclusiveMaximum<${Value}n>`,
290
+ target: "bigint",
291
+ kind: "exclusiveMaximum",
292
+ value: BigInt(parse_integer(identifier)(false)(Value)),
293
+ validate: `$input < ${Value}`,
294
+ exclusive: ["maximum", "exclusiveMaximum"],
295
+ },
296
+ ],
297
+ }),
298
+ multipleOf: (identifier) => (Value) => ({
299
+ number: [
300
+ {
301
+ name: `MultipleOf<${Value}>`,
302
+ target: "number",
303
+ kind: "multipleOf",
304
+ value: parse_number(identifier)(Value),
305
+ validate: `$input % ${Value} === 0`,
306
+ exclusive: true,
307
+ },
308
+ ],
309
+ bigint: [
310
+ {
311
+ name: `MultipleOf<${Value}n>`,
312
+ target: "bigint",
313
+ kind: "multipleOf",
314
+ value: BigInt(parse_integer(identifier)(false)(Value)),
315
+ validate: `$input % ${Value}n === 0n`,
316
+ exclusive: true,
317
+ },
318
+ ],
319
+ }),
320
+
321
+ /* -----------------------------------------------------------
322
+ STRING
323
+ ----------------------------------------------------------- */
324
+ format: () => (Value) => {
325
+ const matched = FORMATS.get(Value);
326
+ if (matched === undefined) return {};
327
+ return {
328
+ string: [
329
+ {
330
+ name: `Format<${matched[0]}>`,
331
+ target: "string",
332
+ kind: "format",
333
+ value: matched[0],
334
+ validate: matched[1],
335
+ exclusive: true,
336
+ },
337
+ ],
338
+ };
339
+ },
340
+ pattern: () => (Value) => ({
341
+ string: [
342
+ {
343
+ name: `Pattern<${Value}>`,
344
+ target: "string",
345
+ kind: "pattern",
346
+ value: Value,
347
+ validate: `RegExp(/${Value}/).test($input)`,
348
+ exclusive: ["format"],
349
+ },
350
+ ],
351
+ }),
352
+ length: (identifier) => (Value) => ({
353
+ string: [
354
+ {
355
+ name: `MinLength<${Value}>`,
356
+ target: "string",
357
+ kind: "minLength",
358
+ value: parse_number(identifier)(Value),
359
+ validate: `${Value} <= $input.length`,
360
+ exclusive: true,
361
+ },
362
+ {
363
+ name: `MaxLength<${Value}>`,
364
+ target: "string",
365
+ kind: "maxLength",
366
+ value: parse_number(identifier)(Value),
367
+ validate: `$input.length <= ${Value}`,
368
+ exclusive: true,
369
+ },
370
+ ],
371
+ }),
372
+ minLength: (identifier) => (Value) => ({
373
+ string: [
374
+ {
375
+ name: `MinLength<${Value}>`,
376
+ target: "string",
377
+ kind: "minLength",
378
+ value: parse_number(identifier)(Value),
379
+ validate: `${Value} <= $input.length`,
380
+ exclusive: true,
381
+ },
382
+ ],
383
+ }),
384
+ maxLength: (identifier) => (Value) => ({
385
+ string: [
386
+ {
387
+ name: `MaxLength<${Value}>`,
388
+ target: "string",
389
+ kind: "maxLength",
390
+ value: parse_number(identifier)(Value),
391
+ validate: `$input.length <= ${Value}`,
392
+ exclusive: true,
393
+ },
394
+ ],
395
+ }),
396
+ };
397
+
398
+ const parse_number =
399
+ (identifier: () => string) =>
400
+ (str: string): number => {
401
+ const value: number = Number(str);
402
+ if (isNaN(value) === true)
403
+ throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
404
+ return value;
405
+ };
406
+
407
+ const parse_integer =
408
+ (identifier: () => string) =>
409
+ (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()}".`);
414
+ else if (unsigned === true && value < 0)
415
+ throw new Error(
416
+ `${LABEL}: invalid unsigned integer on "${identifier()}".`,
417
+ );
418
+ return value;
419
+ };
420
+
421
+ type IMetadataCommentTag =
422
+ // NUMBER
423
+ | IMetadataCommentTag.IType
424
+ | IMetadataCommentTag.IMinimum
425
+ | IMetadataCommentTag.IMaximum
426
+ | IMetadataCommentTag.IExclusiveMinimum
427
+ | IMetadataCommentTag.IExclusiveMaximum
428
+ | IMetadataCommentTag.IMultipleOf
429
+ | IMetadataCommentTag.IStep
430
+ // STRING
431
+ | IMetadataCommentTag.IFormat
432
+ | IMetadataCommentTag.IPattern
433
+ | IMetadataCommentTag.ILength
434
+ | IMetadataCommentTag.IMinLength
435
+ | IMetadataCommentTag.IMaxLength
436
+ // ARRAY
437
+ | IMetadataCommentTag.IItems
438
+ | IMetadataCommentTag.IMinItems
439
+ | IMetadataCommentTag.IMaxItems;
440
+
441
+ namespace IMetadataCommentTag {
442
+ /* -----------------------------------------------------------
443
+ NUMBER
444
+ ----------------------------------------------------------- */
445
+ export interface IType {
446
+ kind: "type";
447
+ value:
448
+ | "int"
449
+ | "uint"
450
+ | "int32"
451
+ | "uint32"
452
+ | "int64"
453
+ | "uint64"
454
+ | "float";
455
+ }
456
+
457
+ export interface IMinimum {
458
+ kind: "minimum";
459
+ value: number;
460
+ }
461
+
462
+ export interface IMaximum {
463
+ kind: "maximum";
464
+ value: number;
465
+ }
466
+
467
+ export interface IExclusiveMinimum {
468
+ kind: "exclusiveMinimum";
469
+ value: number;
470
+ }
471
+
472
+ export interface IExclusiveMaximum {
473
+ kind: "exclusiveMaximum";
474
+ value: number;
475
+ }
476
+
477
+ export interface IMultipleOf {
478
+ kind: "multipleOf";
479
+ value: number;
480
+ }
481
+
482
+ export interface IStep {
483
+ kind: "step";
484
+ value: number;
485
+ }
486
+
487
+ /* -----------------------------------------------------------
488
+ STRING
489
+ ----------------------------------------------------------- */
490
+ export interface IFormat {
491
+ kind: "format";
492
+ value:
493
+ | "uuid"
494
+ | "email"
495
+ | "url"
496
+ | "ipv4"
497
+ | "ipv6"
498
+ | "date"
499
+ | "date-time";
500
+ }
501
+
502
+ export interface IPattern {
503
+ kind: "pattern";
504
+ value: string;
505
+ }
506
+
507
+ export interface ILength {
508
+ kind: "length";
509
+ value: number;
510
+ }
511
+
512
+ export interface IMinLength {
513
+ kind: "minLength";
514
+ value: number;
515
+ }
516
+
517
+ export interface IMaxLength {
518
+ kind: "maxLength";
519
+ value: number;
520
+ }
521
+
522
+ /* -----------------------------------------------------------
523
+ ARRAY
524
+ ----------------------------------------------------------- */
525
+ export interface IItems {
526
+ kind: "items";
527
+ value: number;
528
+ }
529
+
530
+ export interface IMinItems {
531
+ kind: "minItems";
532
+ value: number;
533
+ }
534
+
535
+ export interface IMaxItems {
536
+ kind: "maxItems";
537
+ value: number;
538
+ }
539
+ }
540
+
541
+ const LABEL = "Error on typia.MetadataCommentTagFactory.generate()";
542
+ const FORMATS: Map<string, [IMetadataCommentTag.IFormat["value"], string]> =
543
+ new Map([
544
+ [
545
+ "email",
546
+ [
547
+ "email",
548
+ `/^(([^<>()[\\]\\.,;:\\s@\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\"]+)*)|(\\".+\\"))@(([^<>()[\\]\\.,;:\\s@\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\"]{2,})$/i.test($input)`,
549
+ ],
550
+ ],
551
+ [
552
+ "uuid",
553
+ [
554
+ "uuid",
555
+ `/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i.test($input)`,
556
+ ],
557
+ ],
558
+ [
559
+ "ipv4",
560
+ [
561
+ "ipv4",
562
+ `/^(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test($input)`,
563
+ ],
564
+ ],
565
+ [
566
+ "ipv6",
567
+ [
568
+ "ipv6",
569
+ `/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/.test($input)`,
570
+ ],
571
+ ],
572
+ [
573
+ "url",
574
+ [
575
+ "url",
576
+ `/^[a-zA-Z0-9]+:\\/\\/(?:www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/.test($input)`,
577
+ ],
578
+ ],
579
+ ["date", ["date", `/^(\\d{4})-(\\d{2})-(\\d{2})$/.test($input)`]],
580
+ ["datetime", ["date-time", `!isNaN(new Date($input).getTime())`]],
581
+ ["date-time", ["date-time", `!isNaN(new Date($input).getTime())`]],
582
+ ["dateTime", ["date-time", `!isNaN(new Date($input).getTime())`]],
583
+ ]);