typia 6.10.2-dev.20240920 → 6.10.2

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