typia 5.3.12-dev.20240121 → 5.3.12

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 (360) hide show
  1. package/package.json +1 -1
  2. package/src/AssertionGuard.ts +1 -1
  3. package/src/CamelCase.ts +114 -114
  4. package/src/IRandomGenerator.ts +35 -35
  5. package/src/IValidation.ts +21 -21
  6. package/src/PascalCase.ts +114 -114
  7. package/src/Primitive.ts +135 -135
  8. package/src/Resolved.ts +116 -116
  9. package/src/SnakeCase.ts +156 -156
  10. package/src/TypeGuardError.ts +36 -36
  11. package/src/executable/TypiaGenerateWizard.ts +83 -83
  12. package/src/executable/TypiaPatchWizard.ts +42 -42
  13. package/src/executable/TypiaSetupWizard.ts +151 -151
  14. package/src/executable/setup/ArgumentParser.ts +43 -43
  15. package/src/executable/setup/CommandExecutor.ts +8 -8
  16. package/src/executable/setup/FileRetriever.ts +22 -22
  17. package/src/executable/setup/PackageManager.ts +71 -71
  18. package/src/executable/setup/PluginConfigurator.ts +69 -69
  19. package/src/executable/typia.ts +55 -55
  20. package/src/factories/CommentFactory.ts +79 -79
  21. package/src/factories/ExpressionFactory.ts +150 -150
  22. package/src/factories/IdentifierFactory.ts +70 -70
  23. package/src/factories/JsonMetadataFactory.ts +53 -53
  24. package/src/factories/LiteralFactory.ts +47 -47
  25. package/src/factories/MetadataCollection.ts +260 -260
  26. package/src/factories/MetadataCommentTagFactory.ts +601 -601
  27. package/src/factories/MetadataFactory.ts +267 -267
  28. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  29. package/src/factories/NumericRangeFactory.ts +72 -72
  30. package/src/factories/ProtobufFactory.ts +259 -259
  31. package/src/factories/StatementFactory.ts +72 -72
  32. package/src/factories/TemplateFactory.ts +56 -56
  33. package/src/factories/TypeFactory.ts +118 -118
  34. package/src/factories/ValueFactory.ts +12 -12
  35. package/src/factories/internal/metadata/MetadataHelper.ts +15 -15
  36. package/src/factories/internal/metadata/emend_metadata_atomics.ts +37 -37
  37. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  38. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +38 -38
  39. package/src/factories/internal/metadata/emplace_metadata_object.ts +175 -175
  40. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  41. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  42. package/src/factories/internal/metadata/iterate_metadata.ts +94 -94
  43. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  44. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  45. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  46. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  47. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  48. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  49. package/src/factories/internal/metadata/iterate_metadata_constant.ts +48 -48
  50. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +230 -230
  51. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  52. package/src/factories/internal/metadata/iterate_metadata_native.ts +208 -208
  53. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  54. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  55. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  56. package/src/factories/internal/metadata/iterate_metadata_sort.ts +61 -61
  57. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  58. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  59. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  60. package/src/functional/$HeadersReader/$HeadersReader.ts +26 -26
  61. package/src/functional/$HeadersReader/index.ts +1 -1
  62. package/src/functional/$ParameterReader/$ParameterReader.ts +29 -29
  63. package/src/functional/$ParameterReader/index.ts +1 -1
  64. package/src/functional/$ProtobufReader.ts +195 -195
  65. package/src/functional/$ProtobufSizer.ts +147 -147
  66. package/src/functional/$ProtobufWriter.ts +150 -150
  67. package/src/functional/$QueryReader/$QueryReader.ts +46 -46
  68. package/src/functional/$QueryReader/index.ts +1 -1
  69. package/src/functional/$any.ts +4 -4
  70. package/src/functional/$clone.ts +4 -4
  71. package/src/functional/$convention.ts +37 -37
  72. package/src/functional/$dictionary.ts +22 -22
  73. package/src/functional/$every.ts +11 -11
  74. package/src/functional/$guard.ts +35 -35
  75. package/src/functional/$is_between.ts +2 -2
  76. package/src/functional/$join.ts +46 -46
  77. package/src/functional/$number.ts +12 -12
  78. package/src/functional/$report.ts +13 -13
  79. package/src/functional/$rest.ts +3 -3
  80. package/src/functional/$stoll.ts +8 -8
  81. package/src/functional/$string.ts +50 -50
  82. package/src/functional/$strlen.ts +7 -7
  83. package/src/functional/$tail.ts +5 -5
  84. package/src/functional/$throws.ts +10 -10
  85. package/src/functional/$varint.ts +130 -130
  86. package/src/functional/$zigzag.ts +39 -39
  87. package/src/functional/IProtobufWriter.ts +18 -18
  88. package/src/functional/Namespace/http.ts +7 -7
  89. package/src/functional/Namespace/index.ts +75 -75
  90. package/src/functional/Namespace/json.ts +15 -15
  91. package/src/functional/Namespace/misc.ts +14 -14
  92. package/src/functional/Namespace/notations.ts +23 -23
  93. package/src/functional/Namespace/protobuf.ts +20 -20
  94. package/src/functional/is.ts +10 -10
  95. package/src/http.ts +1267 -1267
  96. package/src/index.ts +4 -4
  97. package/src/notations.ts +977 -977
  98. package/src/programmers/AssertProgrammer.ts +293 -293
  99. package/src/programmers/CheckerProgrammer.ts +1025 -1025
  100. package/src/programmers/FeatureProgrammer.ts +460 -460
  101. package/src/programmers/IsProgrammer.ts +232 -232
  102. package/src/programmers/RandomProgrammer.ts +825 -825
  103. package/src/programmers/TypiaProgrammer.ts +167 -167
  104. package/src/programmers/ValidateProgrammer.ts +307 -307
  105. package/src/programmers/helpers/AtomicPredicator.ts +25 -25
  106. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  107. package/src/programmers/helpers/FunctionImporeter.ts +87 -87
  108. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  109. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  110. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  111. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  112. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  113. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  114. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  115. package/src/programmers/helpers/PruneJoiner.ts +141 -141
  116. package/src/programmers/helpers/RandomJoiner.ts +140 -140
  117. package/src/programmers/helpers/RandomRanger.ts +171 -171
  118. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  119. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  120. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  121. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  122. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  123. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +77 -77
  124. package/src/programmers/http/HttpAssertQueryProgrammer.ts +75 -75
  125. package/src/programmers/http/HttpHeadersProgrammer.ts +314 -314
  126. package/src/programmers/http/HttpIsHeadersProgrammer.ts +84 -84
  127. package/src/programmers/http/HttpIsQueryProgrammer.ts +82 -82
  128. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  129. package/src/programmers/http/HttpQueryProgrammer.ts +252 -252
  130. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +77 -77
  131. package/src/programmers/http/HttpValidateQueryProgrammer.ts +75 -75
  132. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  133. package/src/programmers/internal/application_alias.ts +74 -74
  134. package/src/programmers/internal/application_array.ts +59 -59
  135. package/src/programmers/internal/application_boolean.ts +35 -35
  136. package/src/programmers/internal/application_constant.ts +25 -25
  137. package/src/programmers/internal/application_default.ts +17 -17
  138. package/src/programmers/internal/application_default_string.ts +33 -33
  139. package/src/programmers/internal/application_escaped.ts +52 -52
  140. package/src/programmers/internal/application_native.ts +34 -34
  141. package/src/programmers/internal/application_number.ts +97 -97
  142. package/src/programmers/internal/application_object.ts +183 -183
  143. package/src/programmers/internal/application_schema.ts +165 -165
  144. package/src/programmers/internal/application_string.ts +61 -61
  145. package/src/programmers/internal/application_templates.ts +24 -24
  146. package/src/programmers/internal/application_tuple.ts +54 -54
  147. package/src/programmers/internal/check_array_length.ts +45 -45
  148. package/src/programmers/internal/check_bigint.ts +49 -49
  149. package/src/programmers/internal/check_dynamic_key.ts +175 -175
  150. package/src/programmers/internal/check_dynamic_properties.ts +198 -198
  151. package/src/programmers/internal/check_everything.ts +23 -23
  152. package/src/programmers/internal/check_native.ts +21 -21
  153. package/src/programmers/internal/check_number.ts +106 -106
  154. package/src/programmers/internal/check_object.ts +60 -60
  155. package/src/programmers/internal/check_string.ts +48 -48
  156. package/src/programmers/internal/check_template.ts +61 -61
  157. package/src/programmers/internal/check_union_array_like.ts +307 -307
  158. package/src/programmers/internal/decode_union_object.ts +78 -78
  159. package/src/programmers/internal/feature_object_entries.ts +58 -58
  160. package/src/programmers/internal/metadata_to_pattern.ts +33 -33
  161. package/src/programmers/internal/prune_object_properties.ts +60 -60
  162. package/src/programmers/internal/random_custom.ts +37 -37
  163. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  164. package/src/programmers/internal/stringify_native.ts +7 -7
  165. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  166. package/src/programmers/internal/template_to_pattern.ts +15 -15
  167. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  168. package/src/programmers/json/JsonApplicationProgrammer.ts +49 -49
  169. package/src/programmers/json/JsonAssertParseProgrammer.ts +67 -67
  170. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +61 -61
  171. package/src/programmers/json/JsonIsParseProgrammer.ts +73 -73
  172. package/src/programmers/json/JsonIsStringifyProgrammer.ts +75 -75
  173. package/src/programmers/json/JsonStringifyProgrammer.ts +893 -893
  174. package/src/programmers/json/JsonValidateParseProgrammer.ts +64 -64
  175. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +83 -83
  176. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +63 -63
  177. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +60 -60
  178. package/src/programmers/misc/MiscCloneProgrammer.ts +713 -713
  179. package/src/programmers/misc/MiscIsCloneProgrammer.ts +70 -70
  180. package/src/programmers/misc/MiscIsPruneProgrammer.ts +66 -66
  181. package/src/programmers/misc/MiscLiteralsProgrammer.ts +72 -72
  182. package/src/programmers/misc/MiscPruneProgrammer.ts +523 -523
  183. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +80 -80
  184. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +73 -73
  185. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +64 -64
  186. package/src/programmers/notations/NotationGeneralProgrammer.ts +647 -647
  187. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +71 -71
  188. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +81 -81
  189. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  190. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +61 -61
  191. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +607 -607
  192. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +819 -819
  193. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +82 -82
  194. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +75 -75
  195. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  196. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  197. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +83 -83
  198. package/src/protobuf.ts +970 -970
  199. package/src/reflect.ts +57 -57
  200. package/src/schemas/json/IJsonApplication.ts +9 -9
  201. package/src/schemas/json/IJsonComponents.ts +19 -19
  202. package/src/schemas/json/IJsonSchema.ts +122 -122
  203. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  204. package/src/schemas/metadata/IMetadata.ts +34 -34
  205. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  206. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  207. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  208. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  209. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  210. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  211. package/src/schemas/metadata/IMetadataConstant.ts +23 -23
  212. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  213. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  214. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  215. package/src/schemas/metadata/IMetadataObject.ts +13 -13
  216. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  217. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  218. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  219. package/src/schemas/metadata/IMetadataTypeTag.ts +15 -15
  220. package/src/schemas/metadata/Metadata.ts +612 -612
  221. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  222. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  223. package/src/schemas/metadata/MetadataArray.ts +49 -49
  224. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  225. package/src/schemas/metadata/MetadataAtomic.ts +84 -84
  226. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  227. package/src/schemas/metadata/MetadataConstant.ts +46 -46
  228. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  229. package/src/schemas/metadata/MetadataObject.ts +154 -154
  230. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  231. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  232. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  233. package/src/tags/Default.ts +15 -15
  234. package/src/tags/ExclusiveMaximum.ts +13 -13
  235. package/src/tags/ExclusiveMinimum.ts +13 -13
  236. package/src/tags/Format.ts +30 -30
  237. package/src/tags/MaxItems.ts +9 -9
  238. package/src/tags/MaxLength.ts +9 -9
  239. package/src/tags/Maximum.ts +13 -13
  240. package/src/tags/MinItems.ts +9 -9
  241. package/src/tags/MinLength.ts +9 -9
  242. package/src/tags/Minimum.ts +13 -13
  243. package/src/tags/MultipleOf.ts +15 -15
  244. package/src/tags/Pattern.ts +9 -9
  245. package/src/tags/TagBase.ts +68 -68
  246. package/src/tags/Type.ts +27 -27
  247. package/src/tags/index.ts +14 -14
  248. package/src/transform.ts +35 -35
  249. package/src/transformers/CallExpressionTransformer.ts +351 -351
  250. package/src/transformers/FileTransformer.ts +91 -91
  251. package/src/transformers/IProject.ts +15 -15
  252. package/src/transformers/ITransformOptions.ts +62 -62
  253. package/src/transformers/ImportTransformer.ts +66 -66
  254. package/src/transformers/NodeTransformer.ts +13 -13
  255. package/src/transformers/TransformerError.ts +55 -55
  256. package/src/transformers/features/AssertTransformer.ts +16 -16
  257. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  258. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  259. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  260. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  261. package/src/transformers/features/IsTransformer.ts +10 -10
  262. package/src/transformers/features/RandomTransformer.ts +44 -44
  263. package/src/transformers/features/ValidateTransformer.ts +11 -11
  264. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  265. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  266. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  267. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  268. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  269. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  270. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  271. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  272. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  273. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  274. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  275. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  276. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  277. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  278. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  279. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  280. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  281. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  282. package/src/transformers/features/json/JsonApplicationTransformer.ts +134 -134
  283. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  284. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  285. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  286. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  287. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  288. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  289. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  290. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  291. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  292. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  293. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  294. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  295. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  296. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  297. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  298. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  299. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  300. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  301. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  302. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  303. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  304. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  305. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  306. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  307. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  308. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  309. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  310. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  311. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  312. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  313. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  314. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  315. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  316. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  317. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  318. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  319. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  320. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  321. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  322. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  323. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  324. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  325. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  326. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  327. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  328. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  329. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  330. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  331. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  332. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  333. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  334. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  335. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  336. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  337. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  338. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  339. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +63 -63
  340. package/src/transformers/internal/GenericTransformer.ts +96 -96
  341. package/src/typings/Atomic.ts +13 -13
  342. package/src/typings/ClassProperties.ts +5 -5
  343. package/src/typings/Customizable.ts +5 -5
  344. package/src/typings/OmitNever.ts +3 -3
  345. package/src/typings/ProtobufAtomic.ts +19 -19
  346. package/src/typings/SpecialFields.ts +3 -3
  347. package/src/typings/ValidationPipe.ts +9 -9
  348. package/src/typings/Writable.ts +11 -11
  349. package/src/utils/ArrayUtil.ts +43 -43
  350. package/src/utils/Escaper.ts +46 -46
  351. package/src/utils/MapUtil.ts +12 -12
  352. package/src/utils/NameEncoder.ts +32 -32
  353. package/src/utils/NamingConvention/NamingConvention.ts +77 -77
  354. package/src/utils/NamingConvention/index.ts +1 -1
  355. package/src/utils/PatternUtil.ts +29 -29
  356. package/src/utils/RandomGenerator/RandomGenerator.ts +74 -74
  357. package/src/utils/RandomGenerator/index.ts +1 -1
  358. package/src/utils/Singleton.ts +16 -16
  359. package/src/utils/StringUtil/StringUtil.ts +2 -2
  360. package/src/utils/StringUtil/index.ts +1 -1
@@ -1,601 +1,601 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
- import { Metadata } from "../schemas/metadata/Metadata";
5
-
6
- import { Writable } from "../typings/Writable";
7
-
8
- import { MetadataFactory } from "./MetadataFactory";
9
- import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
10
-
11
- /**
12
- * Extremely hard coded, but no reason to maintain.
13
- *
14
- * @internal
15
- */
16
- export namespace MetadataCommentTagFactory {
17
- export const analyze =
18
- (errors: MetadataFactory.IError[]) =>
19
- (metadata: Metadata) =>
20
- (
21
- commentList: ts.JSDocTagInfo[],
22
- explore: MetadataFactory.IExplore,
23
- ): void => {
24
- // PREPARE MESSAGE CONTAINER
25
- const messages: string[] = [];
26
- const report = (msg: string) => {
27
- messages.push(msg);
28
- return null;
29
- };
30
- const validateReport =
31
- (property: string | null) =>
32
- (msg: string): false => {
33
- messages.push(
34
- `the property ${
35
- property === null ? `["typia.tag"]` : `["typia.tag.${property}"]`
36
- } ${msg}.`,
37
- );
38
- return false;
39
- };
40
-
41
- // VALIDATE AND CONSTRUCT COMMENT TAGS
42
- for (const comment of commentList) {
43
- const tagger: TagRecord | null = parse(report)(comment);
44
- if (tagger === null) continue;
45
- for (const [key, value] of Object.entries(tagger)) {
46
- const filtered: IMetadataTypeTag[] = value.filter(
47
- (v) => v.validate !== null,
48
- ) as IMetadataTypeTag[];
49
- if (key === "array") {
50
- if (metadata.arrays.length === 0) {
51
- report(`requires array type`);
52
- continue;
53
- }
54
- for (const a of metadata.arrays) {
55
- Writable(a).tags = a.tags.filter((x) =>
56
- MetadataTypeTagFactory.validate(validateReport)("array")([
57
- ...x,
58
- ...filtered,
59
- ]),
60
- );
61
- if (a.tags.length === 0) a.tags.push(filtered);
62
- else for (const tags of a.tags) tags.push(...filtered);
63
- }
64
- } else {
65
- const atomic = metadata.atomics.find((a) => a.type == key);
66
- if (atomic === undefined)
67
- if (key === "bigint" || key === "number") {
68
- const opposite = key === "bigint" ? "number" : "bigint";
69
- if (
70
- tagger[opposite] !== undefined &&
71
- metadata.atomics.some((a) => a.type === opposite)
72
- )
73
- continue;
74
- } else if (
75
- key === "string" &&
76
- value[0]?.kind === "format" &&
77
- value[0]?.value === "date-time"
78
- )
79
- continue;
80
- else report(`requires ${key} type`);
81
- else {
82
- Writable(atomic).tags = atomic.tags.filter((x) =>
83
- MetadataTypeTagFactory.validate(validateReport)(
84
- key as "string",
85
- )([...x, ...filtered]),
86
- );
87
- if (atomic.tags.length === 0) atomic.tags.push(filtered);
88
- else for (const tags of atomic.tags) tags.push(...filtered);
89
- }
90
- }
91
- }
92
- }
93
-
94
- // DO REPORT
95
- if (messages.length !== 0)
96
- errors.push({
97
- name: "comment tag(s)",
98
- explore,
99
- messages,
100
- });
101
- };
102
-
103
- const parse =
104
- (report: (msg: string) => null) =>
105
- (comment: ts.JSDocTagInfo): TagRecord | null => {
106
- const parser = PARSER[comment.name];
107
- if (parser === undefined) return {};
108
-
109
- const text = (comment.text || [])[0]?.text;
110
- if (text === undefined) return report(`no comment tag value`);
111
- return parser(report)(text);
112
- };
113
- }
114
-
115
- type TagRecord = {
116
- [P in Target]?: NotDeterminedTypeTag[];
117
- };
118
- type Target = "bigint" | "number" | "string" | "array";
119
- type NotDeterminedTypeTag = Omit<IMetadataTypeTag, "validate"> & {
120
- validate: string | null;
121
- };
122
-
123
- const PARSER: Record<
124
- string,
125
- (report: (msg: string) => null) => (text: string) => {
126
- [P in Target]?: NotDeterminedTypeTag[];
127
- }
128
- > = {
129
- /* -----------------------------------------------------------
130
- ARRAY
131
- ----------------------------------------------------------- */
132
- items: (report) => (Value) => ({
133
- array: [
134
- {
135
- name: `MinItems<${Value}>`,
136
- target: "array",
137
- kind: "minItems",
138
- value: parse_integer(report)(true)(Value),
139
- validate: `${Value} <= $input.length`,
140
- exclusive: true,
141
- },
142
- {
143
- name: `MaxItems<${Value}>`,
144
- target: "array",
145
- kind: "maxItems",
146
- value: parse_integer(report)(true)(Value),
147
- validate: `$input.length <= ${Value}`,
148
- exclusive: true,
149
- },
150
- ],
151
- }),
152
- minItems: (report) => (Value) => ({
153
- array: [
154
- {
155
- name: `MinItems<${Value}>`,
156
- target: "array",
157
- kind: "minItems",
158
- value: parse_integer(report)(true)(Value),
159
- validate: `${Value} <= $input.length`,
160
- exclusive: true,
161
- },
162
- ],
163
- }),
164
- maxItems: (report) => (Value) => ({
165
- array: [
166
- {
167
- name: `MaxItems<${Value}>`,
168
- target: "array",
169
- kind: "maxItems",
170
- value: parse_integer(report)(true)(Value),
171
- validate: `$input.length <= ${Value}`,
172
- exclusive: true,
173
- },
174
- ],
175
- }),
176
-
177
- /* -----------------------------------------------------------
178
- NUMBER
179
- ----------------------------------------------------------- */
180
- type: () => (Value) => {
181
- // EMENDATIONS
182
- if (Value.startsWith("{") && Value.endsWith("}"))
183
- Value = Value.substring(1, Value.length - 1);
184
- if (Value === "int") Value = "int32";
185
- else if (Value === "uint") Value = "uint32";
186
-
187
- // MUST BE ONE OF THEM
188
- if (
189
- ["int32", "uint32", "int64", "uint64", "float", "double"].includes(
190
- Value,
191
- ) === false
192
- )
193
- return {};
194
- return {
195
- number: [
196
- {
197
- name: `Type<${JSON.stringify(Value)}>`,
198
- target: "number",
199
- kind: "type",
200
- value: Value,
201
- validate:
202
- Value === "int32"
203
- ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
204
- : Value === "uint32"
205
- ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
206
- : Value === "int64"
207
- ? `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`
208
- : Value === "uint64"
209
- ? `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`
210
- : Value === "float"
211
- ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
212
- : `true`,
213
- exclusive: true,
214
- },
215
- ],
216
- bigint:
217
- Value === "int64" || "uint64"
218
- ? [
219
- {
220
- name: `Type<${JSON.stringify(Value)}>`,
221
- target: "bigint",
222
- kind: "type",
223
- value: Value,
224
- validate: Value === "int64" ? "true" : "BigInt(0) <= $input",
225
- exclusive: true,
226
- },
227
- ]
228
- : [],
229
- };
230
- },
231
- minimum: (report) => (Value) => ({
232
- number: [
233
- {
234
- name: `Minimum<${Value}>`,
235
- target: "number",
236
- kind: "minimum",
237
- value: parse_number(report)(Value),
238
- validate: `${Value} <= $input`,
239
- exclusive: ["minimum", "exclusiveMinimum"],
240
- },
241
- ],
242
- bigint: [
243
- {
244
- name: `Minimum<${Value}n>`,
245
- target: "bigint",
246
- kind: "minimum",
247
- value: (() => {
248
- const value = parse_integer(report)(false)(Value);
249
- return value === null ? null : BigInt(value);
250
- })(),
251
- validate: `${Value} <= $input`,
252
- exclusive: ["minimum", "exclusiveMinimum"],
253
- },
254
- ],
255
- }),
256
- maximum: (report) => (Value) => ({
257
- number: [
258
- {
259
- name: `Maximum<${Value}>`,
260
- target: "number",
261
- kind: "maximum",
262
- value: parse_number(report)(Value),
263
- validate: `$input <= ${Value}`,
264
- exclusive: ["maximum", "exclusiveMaximum"],
265
- },
266
- ],
267
- bigint: [
268
- {
269
- name: `Maximum<${Value}n>`,
270
- target: "bigint",
271
- kind: "maximum",
272
- value: (() => {
273
- const value = parse_integer(report)(false)(Value);
274
- return value === null ? null : BigInt(value);
275
- })(),
276
- validate: `$input <= ${Value}`,
277
- exclusive: ["maximum", "exclusiveMaximum"],
278
- },
279
- ],
280
- }),
281
- exclusiveMinimum: (report) => (Value) => ({
282
- number: [
283
- {
284
- name: `ExclusiveMinimum<${Value}>`,
285
- target: "number",
286
- kind: "exclusiveMinimum",
287
- value: parse_number(report)(Value),
288
- validate: `${Value} < $input`,
289
- exclusive: ["minimum", "exclusiveMinimum"],
290
- },
291
- ],
292
- bigint: [
293
- {
294
- name: `ExclusiveMinimum<${Value}n>`,
295
- target: "bigint",
296
- kind: "exclusiveMinimum",
297
- value: (() => {
298
- const value = parse_integer(report)(false)(Value);
299
- return value === null ? null : BigInt(value);
300
- })(),
301
- validate: `${Value} < $input`,
302
- exclusive: ["minimum", "exclusiveMinimum"],
303
- },
304
- ],
305
- }),
306
- exclusiveMaximum: (report) => (Value) => ({
307
- number: [
308
- {
309
- name: `ExclusiveMaximum<${Value}>`,
310
- target: "number",
311
- kind: "exclusiveMaximum",
312
- value: parse_number(report)(Value),
313
- validate: `$input < ${Value}`,
314
- exclusive: ["maximum", "exclusiveMaximum"],
315
- },
316
- ],
317
- bigint: [
318
- {
319
- name: `ExclusiveMaximum<${Value}n>`,
320
- target: "bigint",
321
- kind: "exclusiveMaximum",
322
- value: (() => {
323
- const value = parse_integer(report)(false)(Value);
324
- return value === null ? null : BigInt(value);
325
- })(),
326
- validate: `$input < ${Value}`,
327
- exclusive: ["maximum", "exclusiveMaximum"],
328
- },
329
- ],
330
- }),
331
- multipleOf: (report) => (Value) => ({
332
- number: [
333
- {
334
- name: `MultipleOf<${Value}>`,
335
- target: "number",
336
- kind: "multipleOf",
337
- value: parse_number(report)(Value),
338
- validate: `$input % ${Value} === 0`,
339
- exclusive: true,
340
- },
341
- ],
342
- bigint: [
343
- {
344
- name: `MultipleOf<${Value}n>`,
345
- target: "bigint",
346
- kind: "multipleOf",
347
- value: (() => {
348
- const value = parse_integer(report)(false)(Value);
349
- return value === null ? null : BigInt(value);
350
- })(),
351
- validate: `$input % ${Value}n === 0n`,
352
- exclusive: true,
353
- },
354
- ],
355
- }),
356
-
357
- /* -----------------------------------------------------------
358
- STRING
359
- ----------------------------------------------------------- */
360
- format: () => (Value) => {
361
- const matched = FORMATS.get(Value);
362
- if (matched === undefined) return {};
363
- return {
364
- string: [
365
- {
366
- name: `Format<${JSON.stringify(matched[0])}>`,
367
- target: "string",
368
- kind: "format",
369
- value: matched[0],
370
- validate: matched[1],
371
- exclusive: true,
372
- },
373
- ],
374
- };
375
- },
376
- pattern: () => (Value) => ({
377
- string: [
378
- {
379
- name: `Pattern<${JSON.stringify(Value)}>`,
380
- target: "string",
381
- kind: "pattern",
382
- value: Value,
383
- validate: `RegExp(/${Value}/).test($input)`,
384
- exclusive: ["format"],
385
- },
386
- ],
387
- }),
388
- length: (report) => (Value) => ({
389
- string: [
390
- {
391
- name: `MinLength<${Value}>`,
392
- target: "string",
393
- kind: "minLength",
394
- value: parse_number(report)(Value),
395
- validate: `${Value} <= $input.length`,
396
- exclusive: true,
397
- },
398
- {
399
- name: `MaxLength<${Value}>`,
400
- target: "string",
401
- kind: "maxLength",
402
- value: parse_number(report)(Value),
403
- validate: `$input.length <= ${Value}`,
404
- exclusive: true,
405
- },
406
- ],
407
- }),
408
- minLength: (report) => (Value) => ({
409
- string: [
410
- {
411
- name: `MinLength<${Value}>`,
412
- target: "string",
413
- kind: "minLength",
414
- value: parse_number(report)(Value),
415
- validate: `${Value} <= $input.length`,
416
- exclusive: true,
417
- },
418
- ],
419
- }),
420
- maxLength: (report) => (Value) => ({
421
- string: [
422
- {
423
- name: `MaxLength<${Value}>`,
424
- target: "string",
425
- kind: "maxLength",
426
- value: parse_number(report)(Value),
427
- validate: `$input.length <= ${Value}`,
428
- exclusive: true,
429
- },
430
- ],
431
- }),
432
- };
433
-
434
- const parse_number =
435
- (report: (msg: string) => null) =>
436
- (str: string): number | null => {
437
- const value: number = Number(str);
438
- if (isNaN(value) === true) return report(`invalid number`);
439
- return value;
440
- };
441
-
442
- const parse_integer =
443
- (report: (msg: string) => null) =>
444
- (unsigned: boolean) =>
445
- (str: string): number | null => {
446
- const value: number | null = parse_number(report)(str);
447
- if (value === null) return null;
448
- else if (Math.floor(value) !== value) return report(`invalid integer`);
449
- else if (unsigned === true && value < 0)
450
- return report(`invalid unsigned integer`);
451
- return value;
452
- };
453
-
454
- type IMetadataCommentTag =
455
- // NUMBER
456
- | IMetadataCommentTag.IType
457
- | IMetadataCommentTag.IMinimum
458
- | IMetadataCommentTag.IMaximum
459
- | IMetadataCommentTag.IExclusiveMinimum
460
- | IMetadataCommentTag.IExclusiveMaximum
461
- | IMetadataCommentTag.IMultipleOf
462
- | IMetadataCommentTag.IStep
463
- // STRING
464
- | IMetadataCommentTag.IFormat
465
- | IMetadataCommentTag.IPattern
466
- | IMetadataCommentTag.ILength
467
- | IMetadataCommentTag.IMinLength
468
- | IMetadataCommentTag.IMaxLength
469
- // ARRAY
470
- | IMetadataCommentTag.IItems
471
- | IMetadataCommentTag.IMinItems
472
- | IMetadataCommentTag.IMaxItems;
473
-
474
- namespace IMetadataCommentTag {
475
- /* -----------------------------------------------------------
476
- NUMBER
477
- ----------------------------------------------------------- */
478
- export interface IType {
479
- kind: "type";
480
- value: "int" | "uint" | "int32" | "uint32" | "int64" | "uint64" | "float";
481
- }
482
-
483
- export interface IMinimum {
484
- kind: "minimum";
485
- value: number;
486
- }
487
-
488
- export interface IMaximum {
489
- kind: "maximum";
490
- value: number;
491
- }
492
-
493
- export interface IExclusiveMinimum {
494
- kind: "exclusiveMinimum";
495
- value: number;
496
- }
497
-
498
- export interface IExclusiveMaximum {
499
- kind: "exclusiveMaximum";
500
- value: number;
501
- }
502
-
503
- export interface IMultipleOf {
504
- kind: "multipleOf";
505
- value: number;
506
- }
507
-
508
- export interface IStep {
509
- kind: "step";
510
- value: number;
511
- }
512
-
513
- /* -----------------------------------------------------------
514
- STRING
515
- ----------------------------------------------------------- */
516
- export interface IFormat {
517
- kind: "format";
518
- value: "uuid" | "email" | "url" | "ipv4" | "ipv6" | "date" | "date-time";
519
- }
520
-
521
- export interface IPattern {
522
- kind: "pattern";
523
- value: string;
524
- }
525
-
526
- export interface ILength {
527
- kind: "length";
528
- value: number;
529
- }
530
-
531
- export interface IMinLength {
532
- kind: "minLength";
533
- value: number;
534
- }
535
-
536
- export interface IMaxLength {
537
- kind: "maxLength";
538
- value: number;
539
- }
540
-
541
- /* -----------------------------------------------------------
542
- ARRAY
543
- ----------------------------------------------------------- */
544
- export interface IItems {
545
- kind: "items";
546
- value: number;
547
- }
548
-
549
- export interface IMinItems {
550
- kind: "minItems";
551
- value: number;
552
- }
553
-
554
- export interface IMaxItems {
555
- kind: "maxItems";
556
- value: number;
557
- }
558
- }
559
-
560
- const FORMATS: Map<string, [IMetadataCommentTag.IFormat["value"], string]> =
561
- new Map([
562
- [
563
- "email",
564
- [
565
- "email",
566
- `/^(([^<>()[\\]\\.,;:\\s@\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\"]+)*)|(\\".+\\"))@(([^<>()[\\]\\.,;:\\s@\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\"]{2,})$/i.test($input)`,
567
- ],
568
- ],
569
- [
570
- "uuid",
571
- [
572
- "uuid",
573
- `/^(?:[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)`,
574
- ],
575
- ],
576
- [
577
- "ipv4",
578
- [
579
- "ipv4",
580
- `/^(?: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)`,
581
- ],
582
- ],
583
- [
584
- "ipv6",
585
- [
586
- "ipv6",
587
- `/^(([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)`,
588
- ],
589
- ],
590
- [
591
- "url",
592
- [
593
- "url",
594
- `/^[a-zA-Z0-9]+:\\/\\/(?:www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/.test($input)`,
595
- ],
596
- ],
597
- ["date", ["date", `/^(\\d{4})-(\\d{2})-(\\d{2})$/.test($input)`]],
598
- ["datetime", ["date-time", `!isNaN(new Date($input).getTime())`]],
599
- ["date-time", ["date-time", `!isNaN(new Date($input).getTime())`]],
600
- ["dateTime", ["date-time", `!isNaN(new Date($input).getTime())`]],
601
- ]);
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
4
+ import { Metadata } from "../schemas/metadata/Metadata";
5
+
6
+ import { Writable } from "../typings/Writable";
7
+
8
+ import { MetadataFactory } from "./MetadataFactory";
9
+ import { MetadataTypeTagFactory } from "./MetadataTypeTagFactory";
10
+
11
+ /**
12
+ * Extremely hard coded, but no reason to maintain.
13
+ *
14
+ * @internal
15
+ */
16
+ export namespace MetadataCommentTagFactory {
17
+ export const analyze =
18
+ (errors: MetadataFactory.IError[]) =>
19
+ (metadata: Metadata) =>
20
+ (
21
+ commentList: ts.JSDocTagInfo[],
22
+ explore: MetadataFactory.IExplore,
23
+ ): void => {
24
+ // PREPARE MESSAGE CONTAINER
25
+ const messages: string[] = [];
26
+ const report = (msg: string) => {
27
+ messages.push(msg);
28
+ return null;
29
+ };
30
+ const validateReport =
31
+ (property: string | null) =>
32
+ (msg: string): false => {
33
+ messages.push(
34
+ `the property ${
35
+ property === null ? `["typia.tag"]` : `["typia.tag.${property}"]`
36
+ } ${msg}.`,
37
+ );
38
+ return false;
39
+ };
40
+
41
+ // VALIDATE AND CONSTRUCT COMMENT TAGS
42
+ for (const comment of commentList) {
43
+ const tagger: TagRecord | null = parse(report)(comment);
44
+ if (tagger === null) continue;
45
+ for (const [key, value] of Object.entries(tagger)) {
46
+ const filtered: IMetadataTypeTag[] = value.filter(
47
+ (v) => v.validate !== null,
48
+ ) as IMetadataTypeTag[];
49
+ if (key === "array") {
50
+ if (metadata.arrays.length === 0) {
51
+ report(`requires array type`);
52
+ continue;
53
+ }
54
+ for (const a of metadata.arrays) {
55
+ Writable(a).tags = a.tags.filter((x) =>
56
+ MetadataTypeTagFactory.validate(validateReport)("array")([
57
+ ...x,
58
+ ...filtered,
59
+ ]),
60
+ );
61
+ if (a.tags.length === 0) a.tags.push(filtered);
62
+ else for (const tags of a.tags) tags.push(...filtered);
63
+ }
64
+ } else {
65
+ const atomic = metadata.atomics.find((a) => a.type == key);
66
+ if (atomic === undefined)
67
+ if (key === "bigint" || key === "number") {
68
+ const opposite = key === "bigint" ? "number" : "bigint";
69
+ if (
70
+ tagger[opposite] !== undefined &&
71
+ metadata.atomics.some((a) => a.type === opposite)
72
+ )
73
+ continue;
74
+ } else if (
75
+ key === "string" &&
76
+ value[0]?.kind === "format" &&
77
+ value[0]?.value === "date-time"
78
+ )
79
+ continue;
80
+ else report(`requires ${key} type`);
81
+ else {
82
+ Writable(atomic).tags = atomic.tags.filter((x) =>
83
+ MetadataTypeTagFactory.validate(validateReport)(
84
+ key as "string",
85
+ )([...x, ...filtered]),
86
+ );
87
+ if (atomic.tags.length === 0) atomic.tags.push(filtered);
88
+ else for (const tags of atomic.tags) tags.push(...filtered);
89
+ }
90
+ }
91
+ }
92
+ }
93
+
94
+ // DO REPORT
95
+ if (messages.length !== 0)
96
+ errors.push({
97
+ name: "comment tag(s)",
98
+ explore,
99
+ messages,
100
+ });
101
+ };
102
+
103
+ const parse =
104
+ (report: (msg: string) => null) =>
105
+ (comment: ts.JSDocTagInfo): TagRecord | null => {
106
+ const parser = PARSER[comment.name];
107
+ if (parser === undefined) return {};
108
+
109
+ const text = (comment.text || [])[0]?.text;
110
+ if (text === undefined) return report(`no comment tag value`);
111
+ return parser(report)(text);
112
+ };
113
+ }
114
+
115
+ type TagRecord = {
116
+ [P in Target]?: NotDeterminedTypeTag[];
117
+ };
118
+ type Target = "bigint" | "number" | "string" | "array";
119
+ type NotDeterminedTypeTag = Omit<IMetadataTypeTag, "validate"> & {
120
+ validate: string | null;
121
+ };
122
+
123
+ const PARSER: Record<
124
+ string,
125
+ (report: (msg: string) => null) => (text: string) => {
126
+ [P in Target]?: NotDeterminedTypeTag[];
127
+ }
128
+ > = {
129
+ /* -----------------------------------------------------------
130
+ ARRAY
131
+ ----------------------------------------------------------- */
132
+ items: (report) => (Value) => ({
133
+ array: [
134
+ {
135
+ name: `MinItems<${Value}>`,
136
+ target: "array",
137
+ kind: "minItems",
138
+ value: parse_integer(report)(true)(Value),
139
+ validate: `${Value} <= $input.length`,
140
+ exclusive: true,
141
+ },
142
+ {
143
+ name: `MaxItems<${Value}>`,
144
+ target: "array",
145
+ kind: "maxItems",
146
+ value: parse_integer(report)(true)(Value),
147
+ validate: `$input.length <= ${Value}`,
148
+ exclusive: true,
149
+ },
150
+ ],
151
+ }),
152
+ minItems: (report) => (Value) => ({
153
+ array: [
154
+ {
155
+ name: `MinItems<${Value}>`,
156
+ target: "array",
157
+ kind: "minItems",
158
+ value: parse_integer(report)(true)(Value),
159
+ validate: `${Value} <= $input.length`,
160
+ exclusive: true,
161
+ },
162
+ ],
163
+ }),
164
+ maxItems: (report) => (Value) => ({
165
+ array: [
166
+ {
167
+ name: `MaxItems<${Value}>`,
168
+ target: "array",
169
+ kind: "maxItems",
170
+ value: parse_integer(report)(true)(Value),
171
+ validate: `$input.length <= ${Value}`,
172
+ exclusive: true,
173
+ },
174
+ ],
175
+ }),
176
+
177
+ /* -----------------------------------------------------------
178
+ NUMBER
179
+ ----------------------------------------------------------- */
180
+ type: () => (Value) => {
181
+ // EMENDATIONS
182
+ if (Value.startsWith("{") && Value.endsWith("}"))
183
+ Value = Value.substring(1, Value.length - 1);
184
+ if (Value === "int") Value = "int32";
185
+ else if (Value === "uint") Value = "uint32";
186
+
187
+ // MUST BE ONE OF THEM
188
+ if (
189
+ ["int32", "uint32", "int64", "uint64", "float", "double"].includes(
190
+ Value,
191
+ ) === false
192
+ )
193
+ return {};
194
+ return {
195
+ number: [
196
+ {
197
+ name: `Type<${JSON.stringify(Value)}>`,
198
+ target: "number",
199
+ kind: "type",
200
+ value: Value,
201
+ validate:
202
+ Value === "int32"
203
+ ? `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`
204
+ : Value === "uint32"
205
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`
206
+ : Value === "int64"
207
+ ? `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`
208
+ : Value === "uint64"
209
+ ? `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`
210
+ : Value === "float"
211
+ ? `-1.175494351e38 <= $input && $input <= 3.4028235e38`
212
+ : `true`,
213
+ exclusive: true,
214
+ },
215
+ ],
216
+ bigint:
217
+ Value === "int64" || "uint64"
218
+ ? [
219
+ {
220
+ name: `Type<${JSON.stringify(Value)}>`,
221
+ target: "bigint",
222
+ kind: "type",
223
+ value: Value,
224
+ validate: Value === "int64" ? "true" : "BigInt(0) <= $input",
225
+ exclusive: true,
226
+ },
227
+ ]
228
+ : [],
229
+ };
230
+ },
231
+ minimum: (report) => (Value) => ({
232
+ number: [
233
+ {
234
+ name: `Minimum<${Value}>`,
235
+ target: "number",
236
+ kind: "minimum",
237
+ value: parse_number(report)(Value),
238
+ validate: `${Value} <= $input`,
239
+ exclusive: ["minimum", "exclusiveMinimum"],
240
+ },
241
+ ],
242
+ bigint: [
243
+ {
244
+ name: `Minimum<${Value}n>`,
245
+ target: "bigint",
246
+ kind: "minimum",
247
+ value: (() => {
248
+ const value = parse_integer(report)(false)(Value);
249
+ return value === null ? null : BigInt(value);
250
+ })(),
251
+ validate: `${Value} <= $input`,
252
+ exclusive: ["minimum", "exclusiveMinimum"],
253
+ },
254
+ ],
255
+ }),
256
+ maximum: (report) => (Value) => ({
257
+ number: [
258
+ {
259
+ name: `Maximum<${Value}>`,
260
+ target: "number",
261
+ kind: "maximum",
262
+ value: parse_number(report)(Value),
263
+ validate: `$input <= ${Value}`,
264
+ exclusive: ["maximum", "exclusiveMaximum"],
265
+ },
266
+ ],
267
+ bigint: [
268
+ {
269
+ name: `Maximum<${Value}n>`,
270
+ target: "bigint",
271
+ kind: "maximum",
272
+ value: (() => {
273
+ const value = parse_integer(report)(false)(Value);
274
+ return value === null ? null : BigInt(value);
275
+ })(),
276
+ validate: `$input <= ${Value}`,
277
+ exclusive: ["maximum", "exclusiveMaximum"],
278
+ },
279
+ ],
280
+ }),
281
+ exclusiveMinimum: (report) => (Value) => ({
282
+ number: [
283
+ {
284
+ name: `ExclusiveMinimum<${Value}>`,
285
+ target: "number",
286
+ kind: "exclusiveMinimum",
287
+ value: parse_number(report)(Value),
288
+ validate: `${Value} < $input`,
289
+ exclusive: ["minimum", "exclusiveMinimum"],
290
+ },
291
+ ],
292
+ bigint: [
293
+ {
294
+ name: `ExclusiveMinimum<${Value}n>`,
295
+ target: "bigint",
296
+ kind: "exclusiveMinimum",
297
+ value: (() => {
298
+ const value = parse_integer(report)(false)(Value);
299
+ return value === null ? null : BigInt(value);
300
+ })(),
301
+ validate: `${Value} < $input`,
302
+ exclusive: ["minimum", "exclusiveMinimum"],
303
+ },
304
+ ],
305
+ }),
306
+ exclusiveMaximum: (report) => (Value) => ({
307
+ number: [
308
+ {
309
+ name: `ExclusiveMaximum<${Value}>`,
310
+ target: "number",
311
+ kind: "exclusiveMaximum",
312
+ value: parse_number(report)(Value),
313
+ validate: `$input < ${Value}`,
314
+ exclusive: ["maximum", "exclusiveMaximum"],
315
+ },
316
+ ],
317
+ bigint: [
318
+ {
319
+ name: `ExclusiveMaximum<${Value}n>`,
320
+ target: "bigint",
321
+ kind: "exclusiveMaximum",
322
+ value: (() => {
323
+ const value = parse_integer(report)(false)(Value);
324
+ return value === null ? null : BigInt(value);
325
+ })(),
326
+ validate: `$input < ${Value}`,
327
+ exclusive: ["maximum", "exclusiveMaximum"],
328
+ },
329
+ ],
330
+ }),
331
+ multipleOf: (report) => (Value) => ({
332
+ number: [
333
+ {
334
+ name: `MultipleOf<${Value}>`,
335
+ target: "number",
336
+ kind: "multipleOf",
337
+ value: parse_number(report)(Value),
338
+ validate: `$input % ${Value} === 0`,
339
+ exclusive: true,
340
+ },
341
+ ],
342
+ bigint: [
343
+ {
344
+ name: `MultipleOf<${Value}n>`,
345
+ target: "bigint",
346
+ kind: "multipleOf",
347
+ value: (() => {
348
+ const value = parse_integer(report)(false)(Value);
349
+ return value === null ? null : BigInt(value);
350
+ })(),
351
+ validate: `$input % ${Value}n === 0n`,
352
+ exclusive: true,
353
+ },
354
+ ],
355
+ }),
356
+
357
+ /* -----------------------------------------------------------
358
+ STRING
359
+ ----------------------------------------------------------- */
360
+ format: () => (Value) => {
361
+ const matched = FORMATS.get(Value);
362
+ if (matched === undefined) return {};
363
+ return {
364
+ string: [
365
+ {
366
+ name: `Format<${JSON.stringify(matched[0])}>`,
367
+ target: "string",
368
+ kind: "format",
369
+ value: matched[0],
370
+ validate: matched[1],
371
+ exclusive: true,
372
+ },
373
+ ],
374
+ };
375
+ },
376
+ pattern: () => (Value) => ({
377
+ string: [
378
+ {
379
+ name: `Pattern<${JSON.stringify(Value)}>`,
380
+ target: "string",
381
+ kind: "pattern",
382
+ value: Value,
383
+ validate: `RegExp(/${Value}/).test($input)`,
384
+ exclusive: ["format"],
385
+ },
386
+ ],
387
+ }),
388
+ length: (report) => (Value) => ({
389
+ string: [
390
+ {
391
+ name: `MinLength<${Value}>`,
392
+ target: "string",
393
+ kind: "minLength",
394
+ value: parse_number(report)(Value),
395
+ validate: `${Value} <= $input.length`,
396
+ exclusive: true,
397
+ },
398
+ {
399
+ name: `MaxLength<${Value}>`,
400
+ target: "string",
401
+ kind: "maxLength",
402
+ value: parse_number(report)(Value),
403
+ validate: `$input.length <= ${Value}`,
404
+ exclusive: true,
405
+ },
406
+ ],
407
+ }),
408
+ minLength: (report) => (Value) => ({
409
+ string: [
410
+ {
411
+ name: `MinLength<${Value}>`,
412
+ target: "string",
413
+ kind: "minLength",
414
+ value: parse_number(report)(Value),
415
+ validate: `${Value} <= $input.length`,
416
+ exclusive: true,
417
+ },
418
+ ],
419
+ }),
420
+ maxLength: (report) => (Value) => ({
421
+ string: [
422
+ {
423
+ name: `MaxLength<${Value}>`,
424
+ target: "string",
425
+ kind: "maxLength",
426
+ value: parse_number(report)(Value),
427
+ validate: `$input.length <= ${Value}`,
428
+ exclusive: true,
429
+ },
430
+ ],
431
+ }),
432
+ };
433
+
434
+ const parse_number =
435
+ (report: (msg: string) => null) =>
436
+ (str: string): number | null => {
437
+ const value: number = Number(str);
438
+ if (isNaN(value) === true) return report(`invalid number`);
439
+ return value;
440
+ };
441
+
442
+ const parse_integer =
443
+ (report: (msg: string) => null) =>
444
+ (unsigned: boolean) =>
445
+ (str: string): number | null => {
446
+ const value: number | null = parse_number(report)(str);
447
+ if (value === null) return null;
448
+ else if (Math.floor(value) !== value) return report(`invalid integer`);
449
+ else if (unsigned === true && value < 0)
450
+ return report(`invalid unsigned integer`);
451
+ return value;
452
+ };
453
+
454
+ type IMetadataCommentTag =
455
+ // NUMBER
456
+ | IMetadataCommentTag.IType
457
+ | IMetadataCommentTag.IMinimum
458
+ | IMetadataCommentTag.IMaximum
459
+ | IMetadataCommentTag.IExclusiveMinimum
460
+ | IMetadataCommentTag.IExclusiveMaximum
461
+ | IMetadataCommentTag.IMultipleOf
462
+ | IMetadataCommentTag.IStep
463
+ // STRING
464
+ | IMetadataCommentTag.IFormat
465
+ | IMetadataCommentTag.IPattern
466
+ | IMetadataCommentTag.ILength
467
+ | IMetadataCommentTag.IMinLength
468
+ | IMetadataCommentTag.IMaxLength
469
+ // ARRAY
470
+ | IMetadataCommentTag.IItems
471
+ | IMetadataCommentTag.IMinItems
472
+ | IMetadataCommentTag.IMaxItems;
473
+
474
+ namespace IMetadataCommentTag {
475
+ /* -----------------------------------------------------------
476
+ NUMBER
477
+ ----------------------------------------------------------- */
478
+ export interface IType {
479
+ kind: "type";
480
+ value: "int" | "uint" | "int32" | "uint32" | "int64" | "uint64" | "float";
481
+ }
482
+
483
+ export interface IMinimum {
484
+ kind: "minimum";
485
+ value: number;
486
+ }
487
+
488
+ export interface IMaximum {
489
+ kind: "maximum";
490
+ value: number;
491
+ }
492
+
493
+ export interface IExclusiveMinimum {
494
+ kind: "exclusiveMinimum";
495
+ value: number;
496
+ }
497
+
498
+ export interface IExclusiveMaximum {
499
+ kind: "exclusiveMaximum";
500
+ value: number;
501
+ }
502
+
503
+ export interface IMultipleOf {
504
+ kind: "multipleOf";
505
+ value: number;
506
+ }
507
+
508
+ export interface IStep {
509
+ kind: "step";
510
+ value: number;
511
+ }
512
+
513
+ /* -----------------------------------------------------------
514
+ STRING
515
+ ----------------------------------------------------------- */
516
+ export interface IFormat {
517
+ kind: "format";
518
+ value: "uuid" | "email" | "url" | "ipv4" | "ipv6" | "date" | "date-time";
519
+ }
520
+
521
+ export interface IPattern {
522
+ kind: "pattern";
523
+ value: string;
524
+ }
525
+
526
+ export interface ILength {
527
+ kind: "length";
528
+ value: number;
529
+ }
530
+
531
+ export interface IMinLength {
532
+ kind: "minLength";
533
+ value: number;
534
+ }
535
+
536
+ export interface IMaxLength {
537
+ kind: "maxLength";
538
+ value: number;
539
+ }
540
+
541
+ /* -----------------------------------------------------------
542
+ ARRAY
543
+ ----------------------------------------------------------- */
544
+ export interface IItems {
545
+ kind: "items";
546
+ value: number;
547
+ }
548
+
549
+ export interface IMinItems {
550
+ kind: "minItems";
551
+ value: number;
552
+ }
553
+
554
+ export interface IMaxItems {
555
+ kind: "maxItems";
556
+ value: number;
557
+ }
558
+ }
559
+
560
+ const FORMATS: Map<string, [IMetadataCommentTag.IFormat["value"], string]> =
561
+ new Map([
562
+ [
563
+ "email",
564
+ [
565
+ "email",
566
+ `/^(([^<>()[\\]\\.,;:\\s@\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\"]+)*)|(\\".+\\"))@(([^<>()[\\]\\.,;:\\s@\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\"]{2,})$/i.test($input)`,
567
+ ],
568
+ ],
569
+ [
570
+ "uuid",
571
+ [
572
+ "uuid",
573
+ `/^(?:[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)`,
574
+ ],
575
+ ],
576
+ [
577
+ "ipv4",
578
+ [
579
+ "ipv4",
580
+ `/^(?: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)`,
581
+ ],
582
+ ],
583
+ [
584
+ "ipv6",
585
+ [
586
+ "ipv6",
587
+ `/^(([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)`,
588
+ ],
589
+ ],
590
+ [
591
+ "url",
592
+ [
593
+ "url",
594
+ `/^[a-zA-Z0-9]+:\\/\\/(?:www.)?[-a-zA-Z0-9@:%._+~#=]{1,256}.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_+.~#?&/=]*)$/.test($input)`,
595
+ ],
596
+ ],
597
+ ["date", ["date", `/^(\\d{4})-(\\d{2})-(\\d{2})$/.test($input)`]],
598
+ ["datetime", ["date-time", `!isNaN(new Date($input).getTime())`]],
599
+ ["date-time", ["date-time", `!isNaN(new Date($input).getTime())`]],
600
+ ["dateTime", ["date-time", `!isNaN(new Date($input).getTime())`]],
601
+ ]);