typia 5.0.0-dev.20230824 → 5.0.0-dev.20230828

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 (493) hide show
  1. package/README.md +1 -2
  2. package/lib/IRandomGenerator.d.ts +4 -3
  3. package/lib/executable/TypiaGenerateWizard.js +1 -1
  4. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  5. package/lib/executable/TypiaSetupWizard.js +1 -1
  6. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  7. package/lib/executable/setup/PackageManager.js +1 -1
  8. package/lib/executable/setup/PackageManager.js.map +1 -1
  9. package/lib/executable/setup/PluginConfigurator.js +2 -2
  10. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  11. package/lib/factories/ExpressionFactory.d.ts +1 -1
  12. package/lib/factories/ExpressionFactory.js +3 -3
  13. package/lib/factories/ExpressionFactory.js.map +1 -1
  14. package/lib/factories/JsonMetadataFactory.d.ts +7 -0
  15. package/lib/factories/JsonMetadataFactory.js +38 -0
  16. package/lib/factories/JsonMetadataFactory.js.map +1 -0
  17. package/lib/factories/LiteralFactory.js +6 -2
  18. package/lib/factories/LiteralFactory.js.map +1 -1
  19. package/lib/factories/MetadataCollection.js +0 -2
  20. package/lib/factories/MetadataCollection.js.map +1 -1
  21. package/lib/factories/MetadataCommentTagFactory.js +543 -0
  22. package/lib/factories/MetadataCommentTagFactory.js.map +1 -0
  23. package/lib/factories/MetadataFactory.d.ts +22 -2
  24. package/lib/factories/MetadataFactory.js +221 -17
  25. package/lib/factories/MetadataFactory.js.map +1 -1
  26. package/lib/factories/MetadataTypeTagFactory.d.ts +7 -0
  27. package/lib/factories/MetadataTypeTagFactory.js +280 -0
  28. package/lib/factories/MetadataTypeTagFactory.js.map +1 -0
  29. package/lib/factories/NumericRangeFactory.d.ts +6 -0
  30. package/lib/factories/NumericRangeFactory.js +34 -0
  31. package/lib/factories/NumericRangeFactory.js.map +1 -0
  32. package/lib/factories/ProtobufFactory.js +109 -73
  33. package/lib/factories/ProtobufFactory.js.map +1 -1
  34. package/lib/factories/TypeFactory.d.ts +0 -1
  35. package/lib/factories/TypeFactory.js +0 -5
  36. package/lib/factories/TypeFactory.js.map +1 -1
  37. package/lib/factories/internal/metadata/emend_metadata_atomics.js +7 -1
  38. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  39. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +1 -1
  40. package/lib/factories/internal/metadata/emplace_metadata_alias.js +20 -19
  41. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  42. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +1 -1
  43. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +20 -7
  44. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -1
  45. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
  46. package/lib/factories/internal/metadata/emplace_metadata_object.js +100 -85
  47. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  48. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +1 -1
  49. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +34 -21
  50. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  51. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  52. package/lib/factories/internal/metadata/explore_metadata.js +12 -12
  53. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  54. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  55. package/lib/factories/internal/metadata/iterate_metadata.js +39 -19
  56. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  57. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +1 -1
  58. package/lib/factories/internal/metadata/iterate_metadata_alias.js +12 -10
  59. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  60. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
  61. package/lib/factories/internal/metadata/iterate_metadata_array.js +11 -9
  62. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  63. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +2 -1
  64. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -1
  66. package/lib/factories/internal/metadata/iterate_metadata_collection.js +47 -45
  67. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  68. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +2 -1
  69. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +17 -22
  70. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -1
  71. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +1 -1
  72. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +147 -135
  73. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  74. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
  75. package/lib/factories/internal/metadata/iterate_metadata_map.js +28 -15
  76. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  77. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
  78. package/lib/factories/internal/metadata/iterate_metadata_object.js +16 -14
  79. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  80. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
  81. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +28 -15
  82. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  83. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
  84. package/lib/factories/internal/metadata/iterate_metadata_set.js +24 -11
  85. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  86. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
  87. package/lib/factories/internal/metadata/iterate_metadata_template.js +28 -15
  88. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  89. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
  90. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +11 -9
  91. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  92. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
  93. package/lib/factories/internal/metadata/iterate_metadata_union.js +20 -7
  94. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  95. package/lib/functional/Namespace.js +0 -16
  96. package/lib/functional/Namespace.js.map +1 -1
  97. package/lib/programmers/AssertProgrammer.js +28 -8
  98. package/lib/programmers/AssertProgrammer.js.map +1 -1
  99. package/lib/programmers/CheckerProgrammer.js +78 -60
  100. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  101. package/lib/programmers/FeatureProgrammer.d.ts +4 -6
  102. package/lib/programmers/FeatureProgrammer.js +7 -7
  103. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  104. package/lib/programmers/IsProgrammer.d.ts +1 -1
  105. package/lib/programmers/IsProgrammer.js +33 -20
  106. package/lib/programmers/IsProgrammer.js.map +1 -1
  107. package/lib/programmers/RandomProgrammer.js +163 -138
  108. package/lib/programmers/RandomProgrammer.js.map +1 -1
  109. package/lib/programmers/TypiaProgrammer.js +58 -28
  110. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  111. package/lib/programmers/ValidateProgrammer.js +28 -8
  112. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  113. package/lib/programmers/helpers/CloneJoiner.js +10 -2
  114. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  115. package/lib/programmers/helpers/ICheckEntry.d.ts +3 -2
  116. package/lib/programmers/helpers/ProtobufUtil.d.ts +6 -2
  117. package/lib/programmers/helpers/ProtobufUtil.js +175 -17
  118. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  119. package/lib/programmers/helpers/RandomJoiner.d.ts +3 -5
  120. package/lib/programmers/helpers/RandomJoiner.js +7 -10
  121. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  122. package/lib/programmers/helpers/RandomRanger.d.ts +5 -6
  123. package/lib/programmers/helpers/RandomRanger.js +13 -33
  124. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  125. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -8
  126. package/lib/programmers/helpers/UnionExplorer.js +6 -6
  127. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  128. package/lib/programmers/internal/application_alias.js +0 -1
  129. package/lib/programmers/internal/application_alias.js.map +1 -1
  130. package/lib/programmers/internal/application_array.js +60 -20
  131. package/lib/programmers/internal/application_array.js.map +1 -1
  132. package/lib/programmers/internal/application_escaped.d.ts +4 -0
  133. package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +4 -4
  134. package/lib/programmers/internal/application_escaped.js.map +1 -0
  135. package/lib/programmers/internal/application_number.js +95 -69
  136. package/lib/programmers/internal/application_number.js.map +1 -1
  137. package/lib/programmers/internal/application_object.js +0 -3
  138. package/lib/programmers/internal/application_object.js.map +1 -1
  139. package/lib/programmers/internal/application_schema.js +41 -24
  140. package/lib/programmers/internal/application_schema.js.map +1 -1
  141. package/lib/programmers/internal/application_string.js +56 -22
  142. package/lib/programmers/internal/application_string.js.map +1 -1
  143. package/lib/programmers/internal/check_array_length.js +25 -25
  144. package/lib/programmers/internal/check_array_length.js.map +1 -1
  145. package/lib/programmers/internal/check_bigint.js +13 -116
  146. package/lib/programmers/internal/check_bigint.js.map +1 -1
  147. package/lib/programmers/internal/check_dynamic_properties.js +1 -1
  148. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  149. package/lib/programmers/internal/check_number.js +62 -163
  150. package/lib/programmers/internal/check_number.js.map +1 -1
  151. package/lib/programmers/internal/check_string.js +16 -52
  152. package/lib/programmers/internal/check_string.js.map +1 -1
  153. package/lib/programmers/internal/check_template.js +16 -1
  154. package/lib/programmers/internal/check_template.js.map +1 -1
  155. package/lib/programmers/internal/check_union_array_like.js +4 -4
  156. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  157. package/lib/programmers/internal/feature_object_entries.js +1 -1
  158. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  159. package/lib/programmers/internal/random_custom.js +2 -2
  160. package/lib/programmers/internal/random_custom.js.map +1 -1
  161. package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
  162. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  163. package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
  164. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  165. package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
  166. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  167. package/lib/programmers/json/JsonStringifyProgrammer.js +41 -78
  168. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  169. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
  170. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  171. package/lib/programmers/misc/MiscCloneProgrammer.js +26 -17
  172. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  173. package/lib/programmers/{IsPruneProgrammer.d.ts → misc/MiscIsPruneProgrammer.d.ts} +2 -2
  174. package/lib/programmers/{IsPruneProgrammer.js → misc/MiscIsPruneProgrammer.js} +11 -11
  175. package/lib/programmers/misc/MiscIsPruneProgrammer.js.map +1 -0
  176. package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
  177. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  178. package/lib/programmers/misc/MiscPruneProgrammer.js +23 -14
  179. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  180. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +24 -44
  181. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  182. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +138 -65
  183. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  184. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +59 -85
  185. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  186. package/lib/schemas/json/IJsonSchema.d.ts +10 -38
  187. package/lib/schemas/metadata/IMetadataAlias.d.ts +0 -2
  188. package/lib/schemas/metadata/IMetadataProperty.d.ts +0 -2
  189. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +2 -0
  190. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  191. package/lib/schemas/metadata/Metadata.js +29 -29
  192. package/lib/schemas/metadata/Metadata.js.map +1 -1
  193. package/lib/schemas/metadata/MetadataAlias.d.ts +0 -2
  194. package/lib/schemas/metadata/MetadataAlias.js +0 -3
  195. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  196. package/lib/schemas/metadata/MetadataArray.d.ts +2 -0
  197. package/lib/schemas/metadata/MetadataArray.js +45 -2
  198. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  199. package/lib/schemas/metadata/MetadataAtomic.d.ts +9 -0
  200. package/lib/schemas/metadata/MetadataAtomic.js +59 -0
  201. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -0
  202. package/lib/schemas/metadata/MetadataProperty.d.ts +0 -2
  203. package/lib/schemas/metadata/MetadataProperty.js +0 -3
  204. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  205. package/lib/schemas/metadata/MetadataTuple.d.ts +4 -2
  206. package/lib/schemas/metadata/MetadataTuple.js +1 -2
  207. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  208. package/lib/tags/ExclusiveMaximum.d.ts +10 -8
  209. package/lib/tags/ExclusiveMinimum.d.ts +10 -8
  210. package/lib/tags/Format.d.ts +8 -8
  211. package/lib/tags/MaxItems.d.ts +8 -8
  212. package/lib/tags/MaxLength.d.ts +8 -8
  213. package/lib/tags/Maximum.d.ts +10 -8
  214. package/lib/tags/MinItems.d.ts +8 -8
  215. package/lib/tags/MinLength.d.ts +8 -8
  216. package/lib/tags/Minimum.d.ts +10 -8
  217. package/lib/tags/MultipleOf.d.ts +10 -8
  218. package/lib/tags/Pattern.d.ts +7 -8
  219. package/lib/tags/TagBase.d.ts +10 -6
  220. package/lib/tags/Type.d.ts +14 -13
  221. package/lib/tags/index.d.ts +1 -0
  222. package/lib/tags/index.js +1 -0
  223. package/lib/tags/index.js.map +1 -1
  224. package/lib/transform.d.ts +2 -1
  225. package/lib/transform.js +11 -3
  226. package/lib/transform.js.map +1 -1
  227. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  228. package/lib/transformers/CallExpressionTransformer.js +2 -1
  229. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  230. package/lib/transformers/FileTransformer.js +18 -6
  231. package/lib/transformers/FileTransformer.js.map +1 -1
  232. package/lib/transformers/IProject.d.ts +3 -0
  233. package/lib/transformers/NodeTransformer.d.ts +1 -1
  234. package/lib/transformers/TransformerError.d.ts +12 -0
  235. package/lib/transformers/TransformerError.js +66 -0
  236. package/lib/transformers/TransformerError.js.map +1 -0
  237. package/lib/transformers/features/AssertTransformer.d.ts +1 -0
  238. package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
  239. package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
  240. package/lib/transformers/features/CreateRandomTransformer.js +9 -4
  241. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  242. package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
  243. package/lib/transformers/features/IsTransformer.d.ts +1 -0
  244. package/lib/transformers/features/RandomTransformer.js +9 -4
  245. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  246. package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
  247. package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -19
  248. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  249. package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
  250. package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
  251. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
  252. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
  253. package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
  254. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
  255. package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
  256. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
  257. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
  258. package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
  259. package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
  260. package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
  261. package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
  262. package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
  263. package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
  264. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  265. package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
  266. package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
  267. package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
  268. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
  269. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
  270. package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
  271. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
  272. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
  273. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js +2 -2
  274. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js.map +1 -1
  275. package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
  276. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
  277. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
  278. package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
  279. package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
  280. package/lib/transformers/features/misc/MiscIsPruneTransformer.js +2 -2
  281. package/lib/transformers/features/misc/MiscIsPruneTransformer.js.map +1 -1
  282. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
  283. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  284. package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
  285. package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
  286. package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
  287. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
  288. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
  289. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
  290. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
  291. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
  292. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
  293. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
  294. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
  295. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
  296. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
  297. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
  298. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
  299. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
  300. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
  301. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
  302. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  303. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
  304. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
  305. package/lib/transformers/internal/GenericTransformer.js +17 -4
  306. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  307. package/lib/typings/ProtobufAtomic.d.ts +5 -0
  308. package/lib/{schemas/metadata/ICommentTag.js → typings/ProtobufAtomic.js} +1 -1
  309. package/lib/typings/ProtobufAtomic.js.map +1 -0
  310. package/lib/typings/ValidationPipe.d.ts +7 -0
  311. package/lib/{schemas/metadata/IMetadataCommentTag.js → typings/ValidationPipe.js} +1 -1
  312. package/lib/typings/ValidationPipe.js.map +1 -0
  313. package/package.json +4 -2
  314. package/src/IRandomGenerator.ts +4 -3
  315. package/src/executable/TypiaGenerateWizard.ts +1 -1
  316. package/src/executable/TypiaSetupWizard.ts +1 -1
  317. package/src/executable/setup/PackageManager.ts +1 -1
  318. package/src/executable/setup/PluginConfigurator.ts +2 -2
  319. package/src/factories/ExpressionFactory.ts +4 -4
  320. package/src/factories/JsonMetadataFactory.ts +43 -0
  321. package/src/factories/LiteralFactory.ts +11 -3
  322. package/src/factories/MetadataCollection.ts +0 -6
  323. package/src/factories/MetadataCommentTagFactory.ts +629 -0
  324. package/src/factories/MetadataFactory.ts +169 -7
  325. package/src/factories/MetadataTypeTagFactory.ts +313 -0
  326. package/src/factories/NumericRangeFactory.ts +33 -0
  327. package/src/factories/ProtobufFactory.ts +106 -99
  328. package/src/factories/TypeFactory.ts +0 -5
  329. package/src/factories/internal/metadata/emend_metadata_atomics.ts +6 -1
  330. package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -11
  331. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +12 -5
  332. package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -6
  333. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +12 -2
  334. package/src/factories/internal/metadata/explore_metadata.ts +5 -11
  335. package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
  336. package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
  337. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -2
  338. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +2 -1
  339. package/src/factories/internal/metadata/iterate_metadata_collection.ts +30 -29
  340. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +22 -27
  341. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +44 -25
  342. package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
  343. package/src/factories/internal/metadata/iterate_metadata_object.ts +2 -1
  344. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +15 -12
  345. package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
  346. package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
  347. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -2
  348. package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
  349. package/src/functional/Namespace.ts +0 -16
  350. package/src/programmers/AssertProgrammer.ts +57 -21
  351. package/src/programmers/CheckerProgrammer.ts +51 -120
  352. package/src/programmers/FeatureProgrammer.ts +15 -34
  353. package/src/programmers/IsProgrammer.ts +53 -42
  354. package/src/programmers/RandomProgrammer.ts +223 -242
  355. package/src/programmers/TypiaProgrammer.ts +27 -2
  356. package/src/programmers/ValidateProgrammer.ts +60 -21
  357. package/src/programmers/helpers/CloneJoiner.ts +57 -20
  358. package/src/programmers/helpers/ICheckEntry.ts +3 -2
  359. package/src/programmers/helpers/ProtobufUtil.ts +113 -17
  360. package/src/programmers/helpers/RandomJoiner.ts +11 -37
  361. package/src/programmers/helpers/RandomRanger.ts +16 -51
  362. package/src/programmers/helpers/UnionExplorer.ts +1 -20
  363. package/src/programmers/internal/application_alias.ts +0 -1
  364. package/src/programmers/internal/application_array.ts +32 -10
  365. package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +1 -1
  366. package/src/programmers/internal/application_number.ts +76 -70
  367. package/src/programmers/internal/application_object.ts +0 -3
  368. package/src/programmers/internal/application_schema.ts +40 -22
  369. package/src/programmers/internal/application_string.ts +33 -27
  370. package/src/programmers/internal/check_array_length.ts +34 -28
  371. package/src/programmers/internal/check_bigint.ts +25 -118
  372. package/src/programmers/internal/check_dynamic_properties.ts +1 -2
  373. package/src/programmers/internal/check_number.ts +81 -261
  374. package/src/programmers/internal/check_string.ts +28 -39
  375. package/src/programmers/internal/check_template.ts +17 -1
  376. package/src/programmers/internal/check_union_array_like.ts +1 -16
  377. package/src/programmers/internal/feature_object_entries.ts +12 -18
  378. package/src/programmers/internal/random_custom.ts +3 -3
  379. package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
  380. package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
  381. package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
  382. package/src/programmers/json/JsonStringifyProgrammer.ts +32 -73
  383. package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
  384. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
  385. package/src/programmers/misc/MiscCloneProgrammer.ts +24 -35
  386. package/src/programmers/{IsPruneProgrammer.ts → misc/MiscIsPruneProgrammer.ts} +7 -7
  387. package/src/programmers/misc/MiscLiteralsProgrammer.ts +11 -6
  388. package/src/programmers/misc/MiscPruneProgrammer.ts +16 -20
  389. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +34 -68
  390. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +153 -98
  391. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +6 -36
  392. package/src/schemas/json/IJsonSchema.ts +11 -38
  393. package/src/schemas/metadata/IMetadataAlias.ts +0 -2
  394. package/src/schemas/metadata/IMetadataProperty.ts +0 -2
  395. package/src/schemas/metadata/IMetadataTypeTag.ts +2 -0
  396. package/src/schemas/metadata/Metadata.ts +32 -46
  397. package/src/schemas/metadata/MetadataAlias.ts +0 -5
  398. package/src/schemas/metadata/MetadataArray.ts +21 -3
  399. package/src/schemas/metadata/MetadataAtomic.ts +42 -0
  400. package/src/schemas/metadata/MetadataProperty.ts +0 -5
  401. package/src/schemas/metadata/MetadataTuple.ts +5 -4
  402. package/src/tags/ExclusiveMaximum.ts +13 -8
  403. package/src/tags/ExclusiveMinimum.ts +13 -8
  404. package/src/tags/Format.ts +21 -20
  405. package/src/tags/MaxItems.ts +9 -8
  406. package/src/tags/MaxLength.ts +9 -8
  407. package/src/tags/Maximum.ts +13 -8
  408. package/src/tags/MinItems.ts +9 -8
  409. package/src/tags/MinLength.ts +9 -8
  410. package/src/tags/Minimum.ts +13 -8
  411. package/src/tags/MultipleOf.ts +15 -10
  412. package/src/tags/Pattern.ts +8 -8
  413. package/src/tags/TagBase.ts +18 -13
  414. package/src/tags/Type.ts +26 -29
  415. package/src/tags/index.ts +1 -0
  416. package/src/transform.ts +13 -5
  417. package/src/transformers/CallExpressionTransformer.ts +6 -3
  418. package/src/transformers/FileTransformer.ts +25 -13
  419. package/src/transformers/IProject.ts +3 -0
  420. package/src/transformers/NodeTransformer.ts +1 -1
  421. package/src/transformers/TransformerError.ts +55 -0
  422. package/src/transformers/features/CreateRandomTransformer.ts +11 -7
  423. package/src/transformers/features/RandomTransformer.ts +11 -7
  424. package/src/transformers/features/json/JsonApplicationTransformer.ts +39 -35
  425. package/src/transformers/features/misc/MetadataTransformer.ts +18 -10
  426. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +2 -2
  427. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +2 -2
  428. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
  429. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
  430. package/src/transformers/internal/GenericTransformer.ts +17 -10
  431. package/src/typings/ProtobufAtomic.ts +19 -0
  432. package/src/typings/ValidationPipe.ts +9 -0
  433. package/lib/factories/MetadataTagFactory.d.ts +0 -6
  434. package/lib/factories/MetadataTagFactory.js +0 -312
  435. package/lib/factories/MetadataTagFactory.js.map +0 -1
  436. package/lib/factories/internal/metadata/iterate_metadata_type_tags.d.ts +0 -3
  437. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js +0 -157
  438. package/lib/factories/internal/metadata/iterate_metadata_type_tags.js.map +0 -1
  439. package/lib/functional/$is_custom.d.ts +0 -2
  440. package/lib/functional/$is_custom.js +0 -13
  441. package/lib/functional/$is_custom.js.map +0 -1
  442. package/lib/functional/$is_date.d.ts +0 -1
  443. package/lib/functional/$is_date.js +0 -7
  444. package/lib/functional/$is_date.js.map +0 -1
  445. package/lib/functional/$is_datetime.d.ts +0 -1
  446. package/lib/functional/$is_datetime.js +0 -8
  447. package/lib/functional/$is_datetime.js.map +0 -1
  448. package/lib/functional/$is_email.d.ts +0 -1
  449. package/lib/functional/$is_email.js +0 -7
  450. package/lib/functional/$is_email.js.map +0 -1
  451. package/lib/functional/$is_ipv4.d.ts +0 -1
  452. package/lib/functional/$is_ipv4.js +0 -7
  453. package/lib/functional/$is_ipv4.js.map +0 -1
  454. package/lib/functional/$is_ipv6.d.ts +0 -1
  455. package/lib/functional/$is_ipv6.js +0 -7
  456. package/lib/functional/$is_ipv6.js.map +0 -1
  457. package/lib/functional/$is_url.d.ts +0 -1
  458. package/lib/functional/$is_url.js +0 -7
  459. package/lib/functional/$is_url.js.map +0 -1
  460. package/lib/functional/$is_uuid.d.ts +0 -1
  461. package/lib/functional/$is_uuid.js +0 -7
  462. package/lib/functional/$is_uuid.js.map +0 -1
  463. package/lib/programmers/IsPruneProgrammer.js.map +0 -1
  464. package/lib/programmers/internal/application_resolved.d.ts +0 -4
  465. package/lib/programmers/internal/application_resolved.js.map +0 -1
  466. package/lib/programmers/internal/check_array_tags.js +0 -39
  467. package/lib/programmers/internal/check_array_tags.js.map +0 -1
  468. package/lib/programmers/internal/check_string_tags.d.ts +0 -1
  469. package/lib/programmers/internal/check_string_tags.js +0 -89
  470. package/lib/programmers/internal/check_string_tags.js.map +0 -1
  471. package/lib/programmers/internal/get_comment_tags.d.ts +0 -1
  472. package/lib/programmers/internal/get_comment_tags.js +0 -25
  473. package/lib/programmers/internal/get_comment_tags.js.map +0 -1
  474. package/lib/schemas/metadata/ICommentTag.d.ts +0 -4
  475. package/lib/schemas/metadata/ICommentTag.js.map +0 -1
  476. package/lib/schemas/metadata/IMetadataCommentTag.d.ts +0 -63
  477. package/lib/schemas/metadata/IMetadataCommentTag.js.map +0 -1
  478. package/src/factories/MetadataTagFactory.ts +0 -365
  479. package/src/factories/internal/metadata/iterate_metadata_type_tags.ts +0 -183
  480. package/src/functional/$is_custom.ts +0 -14
  481. package/src/functional/$is_date.ts +0 -3
  482. package/src/functional/$is_datetime.ts +0 -2
  483. package/src/functional/$is_email.ts +0 -4
  484. package/src/functional/$is_ipv4.ts +0 -4
  485. package/src/functional/$is_ipv6.ts +0 -4
  486. package/src/functional/$is_url.ts +0 -4
  487. package/src/functional/$is_uuid.ts +0 -4
  488. package/src/programmers/internal/check_array_tags.ts +0 -45
  489. package/src/programmers/internal/check_string_tags.ts +0 -67
  490. package/src/programmers/internal/get_comment_tags.ts +0 -23
  491. package/src/schemas/metadata/ICommentTag.ts +0 -4
  492. package/src/schemas/metadata/IMetadataCommentTag.ts +0 -112
  493. /package/lib/{programmers/internal/check_array_tags.d.ts → factories/MetadataCommentTagFactory.d.ts} +0 -0
@@ -1,35 +1,74 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../schemas/metadata/Metadata";
4
+ import { MetadataAlias } from "../schemas/metadata/MetadataAlias";
5
+ import { MetadataArrayType } from "../schemas/metadata/MetadataArrayType";
6
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
7
+ import { MetadataTupleType } from "../schemas/metadata/MetadataTupleType";
4
8
  import { explore_metadata } from "./internal/metadata/explore_metadata";
5
9
  import { iterate_metadata_collection } from "./internal/metadata/iterate_metadata_collection";
6
10
  import { iterate_metadata_sort } from "./internal/metadata/iterate_metadata_sort";
7
11
 
12
+ import { ValidationPipe } from "../typings/ValidationPipe";
13
+
8
14
  import { MetadataCollection } from "./MetadataCollection";
9
15
 
10
16
  export namespace MetadataFactory {
17
+ export type Validator = (meta: Metadata, explore: IExplore) => string[];
18
+
11
19
  export interface IOptions {
12
20
  escape: boolean;
13
21
  constant: boolean;
14
22
  absorb: boolean;
15
- validate?: (meta: Metadata) => void;
23
+ validate?: Validator;
24
+ onError?: (node: ts.Node | undefined, message: string) => void;
25
+ }
26
+
27
+ export interface IExplore {
28
+ top: boolean;
29
+ object: MetadataObject | null;
30
+ property: string | object | null;
31
+ nested: null | MetadataAlias | MetadataArrayType | MetadataTupleType;
32
+ escaped: boolean;
33
+ aliased: boolean;
34
+ }
35
+
36
+ export interface IError {
37
+ name: string;
38
+ explore: IExplore;
39
+ messages: string[];
16
40
  }
17
41
 
18
42
  export const analyze =
19
43
  (checker: ts.TypeChecker) =>
20
44
  (options: IOptions) =>
21
45
  (collection: MetadataCollection) =>
22
- (type: ts.Type | null): Metadata => {
46
+ (type: ts.Type | null): ValidationPipe<Metadata, IError> => {
47
+ const errors: IError[] = [];
23
48
  const meta: Metadata = explore_metadata(checker)(options)(
24
49
  collection,
25
- )(type, false);
26
- iterate_metadata_collection(collection);
50
+ )(errors)(type, {
51
+ top: true,
52
+ object: null,
53
+ property: null,
54
+ nested: null,
55
+ escaped: false,
56
+ aliased: false,
57
+ });
58
+ iterate_metadata_collection(errors)(collection);
27
59
  iterate_metadata_sort(collection)(meta);
28
60
 
29
61
  if (options.validate)
30
- for (const elem of collection.entire_) options.validate(elem);
31
- collection.entire_.clear();
32
- return meta;
62
+ errors.push(...validate(options)(options.validate)(meta));
63
+ return errors.length
64
+ ? {
65
+ success: false,
66
+ errors,
67
+ }
68
+ : {
69
+ success: true,
70
+ data: meta,
71
+ };
33
72
  };
34
73
 
35
74
  /**
@@ -43,4 +82,127 @@ export namespace MetadataFactory {
43
82
  });
44
83
  return meta;
45
84
  };
85
+
86
+ const validate =
87
+ (options: IOptions) =>
88
+ (functor: Validator) =>
89
+ (meta: Metadata): IError[] => {
90
+ const visitor: IValidationVisitor = {
91
+ functor,
92
+ errors: [],
93
+ objects: new Set(),
94
+ arrays: new Set(),
95
+ tuples: new Set(),
96
+ aliases: new Set(),
97
+ };
98
+ validateMeta(options)(visitor)(meta, {
99
+ object: null,
100
+ property: null,
101
+ nested: null,
102
+ top: true,
103
+ aliased: false,
104
+ escaped: false,
105
+ });
106
+ return visitor.errors;
107
+ };
108
+
109
+ const validateMeta =
110
+ (options: IOptions) =>
111
+ (visitor: IValidationVisitor) =>
112
+ (meta: Metadata, explore: IExplore) => {
113
+ const result: Set<string> = new Set(visitor.functor(meta, explore));
114
+ if (result.size)
115
+ visitor.errors.push({
116
+ name: meta.getName(),
117
+ explore: { ...explore },
118
+ messages: [...result],
119
+ });
120
+
121
+ for (const alias of meta.aliases)
122
+ validateAlias(options)(visitor)(alias, explore);
123
+ for (const array of meta.arrays)
124
+ validateArray(options)(visitor)(array.type, explore);
125
+ for (const tuple of meta.tuples)
126
+ validateTuple(options)(visitor)(tuple.type, explore);
127
+ for (const obj of meta.objects)
128
+ validateObject(options)(visitor)(obj);
129
+
130
+ if (options.escape === true && meta.escaped !== null)
131
+ validateMeta(options)(visitor)(meta.escaped.returns, {
132
+ ...explore,
133
+ escaped: true,
134
+ });
135
+ };
136
+
137
+ const validateAlias =
138
+ (options: IOptions) =>
139
+ (visitor: IValidationVisitor) =>
140
+ (alias: MetadataAlias, explore: IExplore) => {
141
+ if (visitor.aliases.has(alias)) return;
142
+ visitor.aliases.add(alias);
143
+
144
+ validateMeta(options)(visitor)(alias.value, {
145
+ ...explore,
146
+ nested: alias,
147
+ aliased: true,
148
+ });
149
+ };
150
+
151
+ const validateArray =
152
+ (options: IOptions) =>
153
+ (visitor: IValidationVisitor) =>
154
+ (array: MetadataArrayType, explore: IExplore) => {
155
+ if (visitor.arrays.has(array)) return;
156
+ visitor.arrays.add(array);
157
+
158
+ validateMeta(options)(visitor)(array.value, {
159
+ ...explore,
160
+ nested: array,
161
+ top: false,
162
+ });
163
+ };
164
+
165
+ const validateTuple =
166
+ (options: IOptions) =>
167
+ (visitor: IValidationVisitor) =>
168
+ (tuple: MetadataTupleType, explore: IExplore) => {
169
+ if (visitor.tuples.has(tuple)) return;
170
+ visitor.tuples.add(tuple);
171
+
172
+ for (const elem of tuple.elements)
173
+ validateMeta(options)(visitor)(elem, {
174
+ ...explore,
175
+ nested: tuple,
176
+ top: false,
177
+ });
178
+ };
179
+
180
+ const validateObject =
181
+ (options: IOptions) =>
182
+ (visitor: IValidationVisitor) =>
183
+ (object: MetadataObject) => {
184
+ if (visitor.objects.has(object)) return;
185
+ visitor.objects.add(object);
186
+
187
+ for (const property of object.properties)
188
+ validateMeta(options)(visitor)(property.value, {
189
+ object,
190
+ property: property.value.isSoleLiteral()
191
+ ? property.value.getSoleLiteral()!
192
+ : {},
193
+ nested: null,
194
+ top: false,
195
+ aliased: false,
196
+ escaped: false,
197
+ });
198
+ };
199
+
200
+ interface IValidationVisitor {
201
+ functor: Validator;
202
+ errors: IError[];
203
+ objects: Set<MetadataObject>;
204
+ arrays: Set<MetadataArrayType>;
205
+ tuples: Set<MetadataTupleType>;
206
+ aliases: Set<MetadataAlias>;
207
+ }
46
208
  }
@@ -0,0 +1,313 @@
1
+ import { IMetadataTypeTag } from "../schemas/metadata/IMetadataTypeTag";
2
+ import { Metadata } from "../schemas/metadata/Metadata";
3
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
4
+ import { MetadataProperty } from "../schemas/metadata/MetadataProperty";
5
+
6
+ import { MetadataFactory } from "./MetadataFactory";
7
+
8
+ export namespace MetadataTypeTagFactory {
9
+ export const analyze =
10
+ (errors: MetadataFactory.IError[]) =>
11
+ (type: "bigint" | "number" | "string" | "array") =>
12
+ (
13
+ objects: MetadataObject[],
14
+ explore: MetadataFactory.IExplore,
15
+ ): IMetadataTypeTag[] => {
16
+ const messages: string[] = [];
17
+ const report =
18
+ (property: string | null) =>
19
+ (msg: string): false => {
20
+ messages.push(
21
+ `the property ${
22
+ property === null
23
+ ? `["typia.tag"]`
24
+ : `["typia.tag.${property}"]`
25
+ } ${msg}.`,
26
+ );
27
+ return false;
28
+ };
29
+
30
+ //----
31
+ // VALIDATION PROCESS
32
+ //----
33
+ const filtered: MetadataObject[] = objects.filter((obj) => {
34
+ // ONLY ONE PROPERTY
35
+ if (obj.properties.length !== 1) return false;
36
+
37
+ // THE TAG.TYPE PROPERTY MUST BE
38
+ const top: MetadataProperty = obj.properties[0]!;
39
+ if (
40
+ top.key.getSoleLiteral() !== "typia.tag" ||
41
+ top.value.size() !== 1 ||
42
+ top.value.objects.length !== 1
43
+ )
44
+ return false;
45
+ else if (top.value.optional === false)
46
+ return report(null)("must be optional object");
47
+
48
+ // CHECK LIST OF PROPERTIES
49
+ const tag: MetadataObject = top.value.objects[0]!;
50
+ const statics: string[] = tag.properties
51
+ .map((p) => p.key.getSoleLiteral()!)
52
+ .filter((str) => str !== null);
53
+ if (FIELDS.some((f) => !statics.includes(f)))
54
+ return report(null)(
55
+ `must have four properties - ${FIELDS.map(
56
+ (str) => `'${str}'`,
57
+ ).join(", ")}`,
58
+ );
59
+
60
+ const each: boolean[] = tag.properties.map((p) => {
61
+ const key: string | null = p.key.getSoleLiteral();
62
+ if (key === null) return true;
63
+ else if (FIELDS.includes(key) === false) return true;
64
+ return validate_property(report)(key, p.value);
65
+ });
66
+ return each.every((v) => v === true);
67
+ });
68
+ if (filtered.length === 0) return [];
69
+
70
+ //----
71
+ // CONSTRUCT TYPE TAGS
72
+ //----
73
+ // CREATE 1ST
74
+ const tagList: Array<ITypeTag | null> = filtered.map(
75
+ create_metadata_type_tag(report),
76
+ );
77
+
78
+ const output: IMetadataTypeTag[] = [];
79
+ for (const tag of tagList)
80
+ if (tag !== null)
81
+ output.push({
82
+ target: tag.target.some((str) => str === type)
83
+ ? type
84
+ : null!,
85
+ name: tag.name,
86
+ kind: tag.kind,
87
+ value: tag.value,
88
+ validate: tag.validate[type]!,
89
+ exclusive: tag.exclusive,
90
+ });
91
+ validate(report)(type)(output);
92
+
93
+ if (messages.length > 0) {
94
+ errors.push({
95
+ name: [type, ...objects.map((o) => o.name)].join(" & "),
96
+ explore,
97
+ messages,
98
+ });
99
+ return [];
100
+ }
101
+ return output;
102
+ };
103
+
104
+ export const validate =
105
+ (report: (property: string | null) => (msg: string) => false) =>
106
+ (type: "bigint" | "number" | "string" | "array") =>
107
+ (tagList: IMetadataTypeTag[]): boolean => {
108
+ let success: boolean = true;
109
+ for (const tag of tagList)
110
+ if (tag.target !== type) {
111
+ success &&= report(null)(
112
+ `target must constains ${type} type`,
113
+ );
114
+ }
115
+
116
+ tagList.forEach((tag, i) => {
117
+ if (tag.exclusive === false) return;
118
+ else if (tag.exclusive === true) {
119
+ const some: boolean = tagList.some(
120
+ (opposite, j) => i !== j && opposite.kind === tag.kind,
121
+ );
122
+ if (some === true)
123
+ success &&= report(null)(
124
+ `kind '${tag.kind}' can't be duplicated`,
125
+ );
126
+ } else if (Array.isArray(tag.exclusive)) {
127
+ const some: IMetadataTypeTag | undefined = tagList.find(
128
+ (opposite, j) =>
129
+ i !== j &&
130
+ opposite.kind === tag.kind &&
131
+ (tag.exclusive as string[]).includes(opposite.name),
132
+ );
133
+ if (some !== undefined)
134
+ success ??= report(null)(
135
+ `kind '${tag.kind}' can't be used with '${some.name}'`,
136
+ );
137
+ }
138
+ });
139
+ return success;
140
+ };
141
+
142
+ const validate_property =
143
+ (report: (property: string | null) => (msg: string) => false) =>
144
+ (key: string, value: Metadata): boolean => {
145
+ if (
146
+ // TARGET
147
+ key === "target" &&
148
+ (value.constants.length !== 1 ||
149
+ value.constants[0]!.values.length !== value.size() ||
150
+ value.constants[0]!.values.some(
151
+ (v) =>
152
+ v !== "bigint" &&
153
+ v !== "number" &&
154
+ v !== "string" &&
155
+ v !== "array",
156
+ ))
157
+ )
158
+ return report(key)(
159
+ `must be one of 'bigint', 'number', 'string', 'array'`,
160
+ );
161
+ else if (
162
+ // KIND
163
+ key === "kind" &&
164
+ (value.size() !== 1 ||
165
+ value.constants.length !== 1 ||
166
+ value.constants[0]!.type !== "string" ||
167
+ value.constants[0]!.values.length !== 1)
168
+ )
169
+ return report(key)("must be a string literal type");
170
+ else if (
171
+ // VALUE
172
+ key === "value" &&
173
+ (value.size() > 1 ||
174
+ (value.size() !== 0 &&
175
+ (value.constants.length !== 1 ||
176
+ value.constants[0]!.values.length !== 1)))
177
+ )
178
+ return report(key)(
179
+ "must be a constant literal type or undefined value",
180
+ );
181
+ else if (key === "exclusive")
182
+ return get_exclusive(report)(key)(value) !== null;
183
+ else if (key === "validate") {
184
+ //----
185
+ // VALIDATE
186
+ //----
187
+ // STRING CASE
188
+ const single: boolean =
189
+ value.size() === 1 &&
190
+ value.constants.length === 1 &&
191
+ value.constants[0]!.type === "string" &&
192
+ value.constants[0]!.values.length === 1;
193
+ if (single === true) return true;
194
+
195
+ // RECORD<TARGET, STRING>
196
+ const target: string[] | undefined =
197
+ value.objects[0]?.properties
198
+ .map((p) => p.key.getSoleLiteral()!)
199
+ .filter((str) => str !== null) as string[] | undefined;
200
+ if (target === undefined)
201
+ return report("target")(
202
+ `must be one of 'bigint', 'number', 'string', 'array'`,
203
+ );
204
+ const variadic: boolean =
205
+ value.size() === 1 &&
206
+ value.objects.length === 1 &&
207
+ value.objects[0]!.properties.every(
208
+ (vp) =>
209
+ vp.value.size() === 1 &&
210
+ vp.value.isRequired() &&
211
+ vp.value.nullable === false &&
212
+ vp.value.constants.length === 1 &&
213
+ vp.value.constants[0]!.type === "string" &&
214
+ vp.value.constants[0]!.values.length === 1 &&
215
+ target.includes(vp.key.getSoleLiteral()!),
216
+ );
217
+ if (variadic === false)
218
+ return report(key)(
219
+ `must be a string literal type or Record<Target, string> type.`,
220
+ );
221
+ }
222
+ return true;
223
+ };
224
+
225
+ const create_metadata_type_tag =
226
+ (report: (property: string | null) => (msg: string) => false) =>
227
+ (obj: MetadataObject): ITypeTag | null => {
228
+ const find = (key: string): MetadataProperty | undefined =>
229
+ obj.properties[0]?.value.objects[0]?.properties.find(
230
+ (p) => p.key.getSoleLiteral() === key,
231
+ );
232
+
233
+ const target = find("target")!.value.constants[0]!
234
+ .values as ITypeTag["target"];
235
+ const kind: string = find("kind")!.value.constants[0]!
236
+ .values[0] as string;
237
+ const value: boolean | bigint | number | string | undefined =
238
+ find("value")?.value.constants[0]?.values[0];
239
+ const exclusive: string[] | boolean | null = get_exclusive(report)(
240
+ "exclusive",
241
+ )(find("exclusive")?.value);
242
+ if (exclusive === null) return null;
243
+
244
+ const validate: Record<string, string> = (() => {
245
+ const validate = find("validate")!.value;
246
+ if (validate.constants.length)
247
+ return Object.fromEntries(
248
+ target.map((t) => [
249
+ t,
250
+ validate.constants[0]!.values[0] as string,
251
+ ]),
252
+ );
253
+ return Object.fromEntries(
254
+ validate.objects[0]!.properties.map((p) => [
255
+ p.key.getSoleLiteral()!,
256
+ p.value.constants[0]!.values[0]! as string,
257
+ ]),
258
+ );
259
+ })();
260
+
261
+ return {
262
+ name: obj.name,
263
+ target,
264
+ kind,
265
+ value,
266
+ validate,
267
+ exclusive: exclusive ?? false,
268
+ };
269
+ };
270
+
271
+ const get_exclusive =
272
+ (report: (property: string | null) => (msg: string) => false) =>
273
+ (key: string) =>
274
+ (value: Metadata | undefined): boolean | string[] | null => {
275
+ if (value === undefined) return false;
276
+ else if (
277
+ value.size() === 1 &&
278
+ value.constants.length === 1 &&
279
+ value.constants[0]!.type === "boolean" &&
280
+ value.constants[0]!.values.length === 1
281
+ )
282
+ return value.constants[0]!.values[0]! as boolean;
283
+ else if (
284
+ value.size() === 1 &&
285
+ value.tuples.length === 1 &&
286
+ value.tuples[0]!.type.elements.every(
287
+ (elem) =>
288
+ elem.size() === 1 &&
289
+ elem.constants.length === 1 &&
290
+ elem.constants[0]!.type === "string" &&
291
+ elem.constants[0]!.values.length === 1,
292
+ )
293
+ )
294
+ return value.tuples[0]!.type.elements.map(
295
+ (elem) => elem.constants[0]!.values[0]! as string,
296
+ );
297
+ report(key)(
298
+ "must a boolean literal type or a tuple of string literal types.",
299
+ );
300
+ return null;
301
+ };
302
+ }
303
+
304
+ interface ITypeTag {
305
+ name: string;
306
+ target: Array<"bigint" | "number" | "string" | "array">;
307
+ kind: string;
308
+ value?: boolean | bigint | number | string;
309
+ validate: Record<string, string>;
310
+ exclusive: boolean | string[];
311
+ }
312
+
313
+ const FIELDS = ["target", "kind", "value", "validate"];
@@ -0,0 +1,33 @@
1
+ import ts from "typescript";
2
+
3
+ import { ProtobufAtomic } from "../typings/ProtobufAtomic";
4
+
5
+ import { ExpressionFactory } from "./ExpressionFactory";
6
+
7
+ export namespace NumericRangeFactory {
8
+ export const number =
9
+ (context: ts.TransformationContext) =>
10
+ (type: ProtobufAtomic.Numeric) =>
11
+ (input: ts.Expression): ts.Expression =>
12
+ ExpressionFactory.transpile(context)(NUMBER_TEXT[type])(input);
13
+
14
+ export const bigint =
15
+ (context: ts.TransformationContext) =>
16
+ (type: ProtobufAtomic.BigNumeric) =>
17
+ (input: ts.Expression): ts.Expression =>
18
+ ExpressionFactory.transpile(context)(BIGINT_TEXT[type])(input);
19
+ }
20
+
21
+ const NUMBER_TEXT = {
22
+ int32: `Math.floor($input) === $input && -2147483648 <= $input && $input <= 2147483647`,
23
+ uint32: `Math.floor($input) === $input && 0 <= $input && $input <= 4294967295`,
24
+ int64: `Math.floor($input) === $input && -9223372036854775808 <= $input && $input <= 9223372036854775807`,
25
+ uint64: `Math.floor($input) === $input && 0 <= $input && $input <= 18446744073709551615`,
26
+ float: `-1.175494351e38 <= $input && $input <= 3.4028235e38`,
27
+ double: `true`,
28
+ };
29
+
30
+ const BIGINT_TEXT = {
31
+ int64: `true`,
32
+ uint64: `BigInt(0) <= $input`,
33
+ };