typia 5.5.8 → 5.5.9

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