typia 5.0.0-dev.2023084 → 5.0.0

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 (584) hide show
  1. package/README.md +1 -2
  2. package/lib/IRandomGenerator.d.ts +4 -3
  3. package/lib/Resolved.d.ts +1 -1
  4. package/lib/executable/TypiaGenerateWizard.js +1 -1
  5. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  6. package/lib/executable/TypiaSetupWizard.js +1 -1
  7. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  8. package/lib/executable/setup/PackageManager.js +1 -1
  9. package/lib/executable/setup/PackageManager.js.map +1 -1
  10. package/lib/executable/setup/PluginConfigurator.js +2 -2
  11. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  12. package/lib/factories/ExpressionFactory.d.ts +3 -1
  13. package/lib/factories/ExpressionFactory.js +25 -1
  14. package/lib/factories/ExpressionFactory.js.map +1 -1
  15. package/lib/factories/IdentifierFactory.d.ts +2 -1
  16. package/lib/factories/IdentifierFactory.js +11 -0
  17. package/lib/factories/IdentifierFactory.js.map +1 -1
  18. package/lib/factories/JsonMetadataFactory.d.ts +7 -0
  19. package/lib/factories/JsonMetadataFactory.js +38 -0
  20. package/lib/factories/JsonMetadataFactory.js.map +1 -0
  21. package/lib/factories/LiteralFactory.js +6 -2
  22. package/lib/factories/LiteralFactory.js.map +1 -1
  23. package/lib/factories/MetadataCollection.d.ts +7 -7
  24. package/lib/factories/MetadataCollection.js +4 -6
  25. package/lib/factories/MetadataCollection.js.map +1 -1
  26. package/lib/factories/MetadataCommentTagFactory.js +543 -0
  27. package/lib/factories/MetadataCommentTagFactory.js.map +1 -0
  28. package/lib/factories/MetadataFactory.d.ts +22 -2
  29. package/lib/factories/MetadataFactory.js +248 -17
  30. package/lib/factories/MetadataFactory.js.map +1 -1
  31. package/lib/factories/MetadataTypeTagFactory.d.ts +7 -0
  32. package/lib/factories/MetadataTypeTagFactory.js +280 -0
  33. package/lib/factories/MetadataTypeTagFactory.js.map +1 -0
  34. package/lib/factories/NumericRangeFactory.d.ts +6 -0
  35. package/lib/factories/NumericRangeFactory.js +34 -0
  36. package/lib/factories/NumericRangeFactory.js.map +1 -0
  37. package/lib/factories/ProtobufFactory.js +137 -91
  38. package/lib/factories/ProtobufFactory.js.map +1 -1
  39. package/lib/factories/TypeFactory.d.ts +0 -1
  40. package/lib/factories/TypeFactory.js +0 -5
  41. package/lib/factories/TypeFactory.js.map +1 -1
  42. package/lib/factories/internal/metadata/emend_metadata_atomics.js +7 -1
  43. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  44. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +1 -1
  45. package/lib/factories/internal/metadata/emplace_metadata_alias.js +20 -19
  46. package/lib/factories/internal/metadata/emplace_metadata_alias.js.map +1 -1
  47. package/lib/factories/internal/metadata/emplace_metadata_array_type.d.ts +5 -0
  48. package/lib/factories/internal/metadata/emplace_metadata_array_type.js +51 -0
  49. package/lib/factories/internal/metadata/emplace_metadata_array_type.js.map +1 -0
  50. package/lib/factories/internal/metadata/emplace_metadata_object.d.ts +1 -1
  51. package/lib/factories/internal/metadata/emplace_metadata_object.js +100 -85
  52. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  53. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +2 -2
  54. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +34 -21
  55. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -1
  56. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  57. package/lib/factories/internal/metadata/explore_metadata.js +12 -12
  58. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  59. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  60. package/lib/factories/internal/metadata/iterate_metadata.js +39 -19
  61. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  62. package/lib/factories/internal/metadata/iterate_metadata_alias.d.ts +1 -1
  63. package/lib/factories/internal/metadata/iterate_metadata_alias.js +12 -10
  64. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  65. package/lib/factories/internal/metadata/iterate_metadata_array.d.ts +1 -1
  66. package/lib/factories/internal/metadata/iterate_metadata_array.js +13 -7
  67. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  68. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +2 -1
  69. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  70. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -1
  71. package/lib/factories/internal/metadata/iterate_metadata_collection.js +66 -56
  72. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  73. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.d.ts +3 -0
  74. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js +45 -0
  75. package/lib/factories/internal/metadata/iterate_metadata_comment_tags.js.map +1 -0
  76. package/lib/factories/internal/metadata/iterate_metadata_intersection.d.ts +1 -1
  77. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +175 -41
  78. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  79. package/lib/factories/internal/metadata/iterate_metadata_map.d.ts +1 -1
  80. package/lib/factories/internal/metadata/iterate_metadata_map.js +28 -15
  81. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  82. package/lib/factories/internal/metadata/iterate_metadata_object.d.ts +1 -1
  83. package/lib/factories/internal/metadata/iterate_metadata_object.js +16 -21
  84. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  85. package/lib/factories/internal/metadata/iterate_metadata_resolve.d.ts +1 -1
  86. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +28 -15
  87. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  88. package/lib/factories/internal/metadata/iterate_metadata_set.d.ts +1 -1
  89. package/lib/factories/internal/metadata/iterate_metadata_set.js +24 -11
  90. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  91. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  92. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  93. package/lib/factories/internal/metadata/iterate_metadata_template.d.ts +1 -1
  94. package/lib/factories/internal/metadata/iterate_metadata_template.js +28 -15
  95. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  96. package/lib/factories/internal/metadata/iterate_metadata_tuple.d.ts +1 -1
  97. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +12 -6
  98. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  99. package/lib/factories/internal/metadata/iterate_metadata_union.d.ts +1 -1
  100. package/lib/factories/internal/metadata/iterate_metadata_union.js +20 -7
  101. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  102. package/lib/functional/$any.js +2 -1
  103. package/lib/functional/$any.js.map +1 -1
  104. package/lib/functional/$clone.d.ts +2 -0
  105. package/lib/functional/$clone.js +8 -0
  106. package/lib/functional/$clone.js.map +1 -0
  107. package/lib/functional/Namespace.js +0 -16
  108. package/lib/functional/Namespace.js.map +1 -1
  109. package/lib/module.d.ts +2 -39
  110. package/lib/module.js +3 -17
  111. package/lib/module.js.map +1 -1
  112. package/lib/programmers/AssertProgrammer.js +28 -10
  113. package/lib/programmers/AssertProgrammer.js.map +1 -1
  114. package/lib/programmers/CheckerProgrammer.js +97 -70
  115. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  116. package/lib/programmers/FeatureProgrammer.d.ts +3 -5
  117. package/lib/programmers/FeatureProgrammer.js +7 -7
  118. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  119. package/lib/programmers/IsProgrammer.d.ts +1 -1
  120. package/lib/programmers/IsProgrammer.js +33 -22
  121. package/lib/programmers/IsProgrammer.js.map +1 -1
  122. package/lib/programmers/RandomProgrammer.js +196 -160
  123. package/lib/programmers/RandomProgrammer.js.map +1 -1
  124. package/lib/programmers/TypiaProgrammer.js +87 -28
  125. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  126. package/lib/programmers/ValidateProgrammer.js +28 -10
  127. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  128. package/lib/programmers/helpers/CloneJoiner.js +10 -2
  129. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  130. package/lib/programmers/helpers/ICheckEntry.d.ts +4 -3
  131. package/lib/programmers/helpers/ProtobufUtil.d.ts +6 -2
  132. package/lib/programmers/helpers/ProtobufUtil.js +175 -17
  133. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  134. package/lib/programmers/helpers/RandomJoiner.d.ts +3 -5
  135. package/lib/programmers/helpers/RandomJoiner.js +7 -10
  136. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  137. package/lib/programmers/helpers/RandomRanger.d.ts +5 -6
  138. package/lib/programmers/helpers/RandomRanger.js +13 -33
  139. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  140. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -8
  141. package/lib/programmers/helpers/UnionExplorer.js +46 -35
  142. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  143. package/lib/programmers/internal/application_alias.js +0 -1
  144. package/lib/programmers/internal/application_alias.js.map +1 -1
  145. package/lib/programmers/internal/application_array.js +60 -20
  146. package/lib/programmers/internal/application_array.js.map +1 -1
  147. package/lib/programmers/internal/application_escaped.d.ts +4 -0
  148. package/lib/programmers/internal/{application_resolved.js → application_escaped.js} +6 -6
  149. package/lib/programmers/internal/application_escaped.js.map +1 -0
  150. package/lib/programmers/internal/application_number.js +95 -69
  151. package/lib/programmers/internal/application_number.js.map +1 -1
  152. package/lib/programmers/internal/application_object.js +0 -3
  153. package/lib/programmers/internal/application_object.js.map +1 -1
  154. package/lib/programmers/internal/application_schema.js +41 -24
  155. package/lib/programmers/internal/application_schema.js.map +1 -1
  156. package/lib/programmers/internal/application_string.js +56 -22
  157. package/lib/programmers/internal/application_string.js.map +1 -1
  158. package/lib/programmers/internal/application_tuple.js +10 -9
  159. package/lib/programmers/internal/application_tuple.js.map +1 -1
  160. package/lib/programmers/internal/check_array_length.js +25 -25
  161. package/lib/programmers/internal/check_array_length.js.map +1 -1
  162. package/lib/programmers/internal/check_bigint.js +20 -109
  163. package/lib/programmers/internal/check_bigint.js.map +1 -1
  164. package/lib/programmers/internal/check_dynamic_properties.js +1 -1
  165. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  166. package/lib/programmers/internal/check_number.js +57 -147
  167. package/lib/programmers/internal/check_number.js.map +1 -1
  168. package/lib/programmers/internal/check_string.js +21 -33
  169. package/lib/programmers/internal/check_string.js.map +1 -1
  170. package/lib/programmers/internal/check_template.js +31 -49
  171. package/lib/programmers/internal/check_template.js.map +1 -1
  172. package/lib/programmers/internal/check_union_array_like.js +7 -6
  173. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  174. package/lib/programmers/internal/feature_object_entries.js +1 -1
  175. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  176. package/lib/programmers/internal/random_custom.js +8 -2
  177. package/lib/programmers/internal/random_custom.js.map +1 -1
  178. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +9 -5
  179. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  180. package/lib/programmers/json/JsonApplicationProgrammer.js +5 -1
  181. package/lib/programmers/json/JsonApplicationProgrammer.js.map +1 -1
  182. package/lib/programmers/json/JsonAssertParseProgrammer.js +2 -0
  183. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  184. package/lib/programmers/json/JsonIsParseProgrammer.js +2 -0
  185. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  186. package/lib/programmers/json/JsonStringifyProgrammer.js +48 -85
  187. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  188. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -0
  189. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  190. package/lib/programmers/misc/MiscCloneProgrammer.js +34 -25
  191. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  192. package/lib/programmers/{IsPruneProgrammer.d.ts → misc/MiscIsPruneProgrammer.d.ts} +2 -2
  193. package/lib/programmers/{IsPruneProgrammer.js → misc/MiscIsPruneProgrammer.js} +11 -11
  194. package/lib/programmers/misc/MiscIsPruneProgrammer.js.map +1 -0
  195. package/lib/programmers/misc/MiscLiteralsProgrammer.js +10 -5
  196. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  197. package/lib/programmers/misc/MiscPruneProgrammer.js +34 -25
  198. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  199. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +48 -48
  200. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  201. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +152 -69
  202. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  203. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +80 -85
  204. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  205. package/lib/protobuf.d.ts +34 -34
  206. package/lib/schemas/json/IJsonSchema.d.ts +10 -38
  207. package/lib/schemas/metadata/IMetadata.d.ts +9 -2
  208. package/lib/schemas/metadata/IMetadataAlias.d.ts +0 -2
  209. package/lib/schemas/metadata/IMetadataArray.d.ts +4 -6
  210. package/lib/schemas/metadata/IMetadataArrayType.d.ts +8 -0
  211. package/lib/{CustomValidatorMap.js → schemas/metadata/IMetadataArrayType.js} +1 -1
  212. package/lib/schemas/metadata/IMetadataArrayType.js.map +1 -0
  213. package/lib/schemas/metadata/IMetadataAtomic.d.ts +3 -10
  214. package/lib/schemas/metadata/IMetadataCollection.d.ts +4 -4
  215. package/lib/schemas/metadata/IMetadataProperty.d.ts +0 -2
  216. package/lib/schemas/metadata/IMetadataTuple.d.ts +4 -6
  217. package/lib/schemas/metadata/IMetadataTupleType.d.ts +8 -0
  218. package/lib/schemas/metadata/IMetadataTupleType.js +3 -0
  219. package/lib/schemas/metadata/IMetadataTupleType.js.map +1 -0
  220. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +8 -0
  221. package/lib/schemas/metadata/IMetadataTypeTag.js +3 -0
  222. package/lib/schemas/metadata/IMetadataTypeTag.js.map +1 -0
  223. package/lib/schemas/metadata/Metadata.d.ts +2 -2
  224. package/lib/schemas/metadata/Metadata.js +177 -122
  225. package/lib/schemas/metadata/Metadata.js.map +1 -1
  226. package/lib/schemas/metadata/MetadataAlias.d.ts +0 -2
  227. package/lib/schemas/metadata/MetadataAlias.js +0 -3
  228. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  229. package/lib/schemas/metadata/MetadataArray.d.ts +8 -6
  230. package/lib/schemas/metadata/MetadataArray.js +48 -19
  231. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  232. package/lib/schemas/metadata/MetadataArrayType.d.ts +14 -0
  233. package/lib/schemas/metadata/MetadataArrayType.js +36 -0
  234. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -0
  235. package/lib/schemas/metadata/MetadataAtomic.d.ts +9 -0
  236. package/lib/schemas/metadata/MetadataAtomic.js +59 -0
  237. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -0
  238. package/lib/schemas/metadata/MetadataProperty.d.ts +0 -2
  239. package/lib/schemas/metadata/MetadataProperty.js +0 -3
  240. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  241. package/lib/schemas/metadata/MetadataTuple.d.ts +8 -8
  242. package/lib/schemas/metadata/MetadataTuple.js +4 -19
  243. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  244. package/lib/schemas/metadata/MetadataTupleType.d.ts +13 -0
  245. package/lib/schemas/metadata/MetadataTupleType.js +40 -0
  246. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -0
  247. package/lib/tags/ExclusiveMaximum.d.ts +10 -8
  248. package/lib/tags/ExclusiveMinimum.d.ts +10 -8
  249. package/lib/tags/Format.d.ts +8 -8
  250. package/lib/tags/MaxItems.d.ts +8 -8
  251. package/lib/tags/MaxLength.d.ts +8 -8
  252. package/lib/tags/Maximum.d.ts +10 -8
  253. package/lib/tags/MinItems.d.ts +8 -8
  254. package/lib/tags/MinLength.d.ts +8 -8
  255. package/lib/tags/Minimum.d.ts +10 -8
  256. package/lib/tags/MultipleOf.d.ts +10 -8
  257. package/lib/tags/Pattern.d.ts +7 -8
  258. package/lib/tags/TagBase.d.ts +52 -6
  259. package/lib/tags/Type.d.ts +14 -13
  260. package/lib/tags/index.d.ts +1 -0
  261. package/lib/tags/index.js +1 -0
  262. package/lib/tags/index.js.map +1 -1
  263. package/lib/transform.d.ts +2 -1
  264. package/lib/transform.js +11 -3
  265. package/lib/transform.js.map +1 -1
  266. package/lib/transformers/CallExpressionTransformer.d.ts +1 -1
  267. package/lib/transformers/CallExpressionTransformer.js +2 -1
  268. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  269. package/lib/transformers/FileTransformer.d.ts +1 -1
  270. package/lib/transformers/FileTransformer.js +30 -7
  271. package/lib/transformers/FileTransformer.js.map +1 -1
  272. package/lib/transformers/IProject.d.ts +4 -0
  273. package/lib/transformers/NodeTransformer.d.ts +1 -1
  274. package/lib/transformers/TransformerError.d.ts +12 -0
  275. package/lib/transformers/TransformerError.js +66 -0
  276. package/lib/transformers/TransformerError.js.map +1 -0
  277. package/lib/transformers/features/AssertTransformer.d.ts +1 -0
  278. package/lib/transformers/features/CreateAssertTransformer.d.ts +1 -0
  279. package/lib/transformers/features/CreateIsTransformer.d.ts +1 -0
  280. package/lib/transformers/features/CreateRandomTransformer.js +9 -4
  281. package/lib/transformers/features/CreateRandomTransformer.js.map +1 -1
  282. package/lib/transformers/features/CreateValidateTransformer.d.ts +1 -0
  283. package/lib/transformers/features/IsTransformer.d.ts +1 -0
  284. package/lib/transformers/features/RandomTransformer.js +9 -4
  285. package/lib/transformers/features/RandomTransformer.js.map +1 -1
  286. package/lib/transformers/features/ValidateTransformer.d.ts +1 -0
  287. package/lib/transformers/features/json/JsonApplicationTransformer.js +79 -17
  288. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  289. package/lib/transformers/features/json/JsonAssertParseTransformer.d.ts +1 -0
  290. package/lib/transformers/features/json/JsonAssertStringifyTransformer.d.ts +1 -0
  291. package/lib/transformers/features/json/JsonCreateAssertParseTransformer.d.ts +1 -0
  292. package/lib/transformers/features/json/JsonCreateAssertStringifyTransformer.d.ts +1 -0
  293. package/lib/transformers/features/json/JsonCreateIsParseTransformer.d.ts +1 -0
  294. package/lib/transformers/features/json/JsonCreateIsStringifyTransformer.d.ts +1 -0
  295. package/lib/transformers/features/json/JsonCreateStringifyTransformer.d.ts +1 -0
  296. package/lib/transformers/features/json/JsonCreateValidateParseTransformer.d.ts +1 -0
  297. package/lib/transformers/features/json/JsonCreateValidateStringifyProgrammer.d.ts +1 -0
  298. package/lib/transformers/features/json/JsonIsParseTransformer.d.ts +1 -0
  299. package/lib/transformers/features/json/JsonIsStringifyTransformer.d.ts +1 -0
  300. package/lib/transformers/features/json/JsonStringifyTransformer.d.ts +1 -0
  301. package/lib/transformers/features/json/JsonValidateParseTransformer.d.ts +1 -0
  302. package/lib/transformers/features/json/JsonValidateStringifyTransformer.d.ts +1 -0
  303. package/lib/transformers/features/misc/MetadataTransformer.js +13 -5
  304. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  305. package/lib/transformers/features/misc/MiscAssertCloneTransformer.d.ts +1 -0
  306. package/lib/transformers/features/misc/MiscAssertPruneTransformer.d.ts +1 -0
  307. package/lib/transformers/features/misc/MiscCloneTransformer.d.ts +1 -0
  308. package/lib/transformers/features/misc/MiscCreateAssertCloneTransformer.d.ts +1 -0
  309. package/lib/transformers/features/misc/MiscCreateAssertPruneTransformer.d.ts +1 -0
  310. package/lib/transformers/features/misc/MiscCreateCloneTransformer.d.ts +1 -0
  311. package/lib/transformers/features/misc/MiscCreateIsCloneTransformer.d.ts +1 -0
  312. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.d.ts +1 -0
  313. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js +2 -2
  314. package/lib/transformers/features/misc/MiscCreateIsPruneTransformer.js.map +1 -1
  315. package/lib/transformers/features/misc/MiscCreatePruneTransformer.d.ts +1 -0
  316. package/lib/transformers/features/misc/MiscCreateValidateCloneTransformer.d.ts +1 -0
  317. package/lib/transformers/features/misc/MiscCreateValidatePruneTransformer.d.ts +1 -0
  318. package/lib/transformers/features/misc/MiscIsCloneTransformer.d.ts +1 -0
  319. package/lib/transformers/features/misc/MiscIsPruneTransformer.d.ts +1 -0
  320. package/lib/transformers/features/misc/MiscIsPruneTransformer.js +2 -2
  321. package/lib/transformers/features/misc/MiscIsPruneTransformer.js.map +1 -1
  322. package/lib/transformers/features/misc/MiscLiteralsTransformer.js +9 -4
  323. package/lib/transformers/features/misc/MiscLiteralsTransformer.js.map +1 -1
  324. package/lib/transformers/features/misc/MiscPruneTransformer.d.ts +1 -0
  325. package/lib/transformers/features/misc/MiscValidateCloneTransformer.d.ts +1 -0
  326. package/lib/transformers/features/misc/MiscValidatePruneTransformer.d.ts +1 -0
  327. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.d.ts +1 -0
  328. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.d.ts +1 -0
  329. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.d.ts +1 -0
  330. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.d.ts +1 -0
  331. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.d.ts +1 -0
  332. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.d.ts +1 -0
  333. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.d.ts +1 -0
  334. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.d.ts +1 -0
  335. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.d.ts +1 -0
  336. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.d.ts +1 -0
  337. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.d.ts +1 -0
  338. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.d.ts +1 -0
  339. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.d.ts +1 -0
  340. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.d.ts +1 -0
  341. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +9 -2
  342. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  343. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.d.ts +1 -0
  344. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.d.ts +1 -0
  345. package/lib/transformers/internal/GenericTransformer.js +17 -4
  346. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  347. package/lib/typings/ProtobufAtomic.d.ts +5 -0
  348. package/lib/{schemas/metadata/ICommentTag.js → typings/ProtobufAtomic.js} +1 -1
  349. package/lib/typings/ProtobufAtomic.js.map +1 -0
  350. package/lib/typings/ValidationPipe.d.ts +7 -0
  351. package/lib/{schemas/metadata/IMetadataTag.js → typings/ValidationPipe.js} +1 -1
  352. package/lib/typings/ValidationPipe.js.map +1 -0
  353. package/package.json +6 -2
  354. package/src/IRandomGenerator.ts +4 -3
  355. package/src/Primitive.ts +135 -135
  356. package/src/Resolved.ts +116 -116
  357. package/src/executable/TypiaGenerateWizard.ts +1 -1
  358. package/src/executable/TypiaSetupWizard.ts +1 -1
  359. package/src/executable/setup/PackageManager.ts +1 -1
  360. package/src/executable/setup/PluginConfigurator.ts +2 -2
  361. package/src/factories/ExpressionFactory.ts +46 -2
  362. package/src/factories/IdentifierFactory.ts +15 -0
  363. package/src/factories/JsonMetadataFactory.ts +43 -0
  364. package/src/factories/LiteralFactory.ts +11 -3
  365. package/src/factories/MetadataCollection.ts +18 -18
  366. package/src/factories/MetadataCommentTagFactory.ts +629 -0
  367. package/src/factories/MetadataFactory.ts +214 -46
  368. package/src/factories/MetadataTypeTagFactory.ts +313 -0
  369. package/src/factories/NumericRangeFactory.ts +33 -0
  370. package/src/factories/ProtobufFactory.ts +272 -268
  371. package/src/factories/TypeFactory.ts +0 -5
  372. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -35
  373. package/src/factories/internal/metadata/emplace_metadata_alias.ts +12 -11
  374. package/src/factories/internal/metadata/{emplace_metadata_array.ts → emplace_metadata_array_type.ts} +14 -7
  375. package/src/factories/internal/metadata/emplace_metadata_object.ts +20 -6
  376. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +13 -3
  377. package/src/factories/internal/metadata/explore_metadata.ts +32 -38
  378. package/src/factories/internal/metadata/iterate_metadata.ts +44 -24
  379. package/src/factories/internal/metadata/iterate_metadata_alias.ts +7 -2
  380. package/src/factories/internal/metadata/iterate_metadata_array.ts +19 -6
  381. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -63
  382. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -133
  383. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -0
  384. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +141 -28
  385. package/src/factories/internal/metadata/iterate_metadata_map.ts +20 -4
  386. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  387. package/src/factories/internal/metadata/iterate_metadata_object.ts +12 -11
  388. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -49
  389. package/src/factories/internal/metadata/iterate_metadata_set.ts +11 -2
  390. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  391. package/src/factories/internal/metadata/iterate_metadata_template.ts +12 -3
  392. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +18 -5
  393. package/src/factories/internal/metadata/iterate_metadata_union.ts +10 -7
  394. package/src/functional/$ProtobufWriter.ts +151 -151
  395. package/src/functional/$any.ts +3 -1
  396. package/src/functional/$clone.ts +4 -0
  397. package/src/functional/Namespace.ts +0 -16
  398. package/src/json.ts +648 -648
  399. package/src/misc.ts +651 -651
  400. package/src/module.ts +656 -709
  401. package/src/programmers/AssertProgrammer.ts +317 -281
  402. package/src/programmers/CheckerProgrammer.ts +1137 -1174
  403. package/src/programmers/FeatureProgrammer.ts +13 -32
  404. package/src/programmers/IsProgrammer.ts +252 -241
  405. package/src/programmers/RandomProgrammer.ts +878 -874
  406. package/src/programmers/TypiaProgrammer.ts +36 -2
  407. package/src/programmers/ValidateProgrammer.ts +346 -307
  408. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  409. package/src/programmers/helpers/CloneJoiner.ts +57 -20
  410. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  411. package/src/programmers/helpers/ICheckEntry.ts +4 -3
  412. package/src/programmers/helpers/ProtobufUtil.ts +125 -29
  413. package/src/programmers/helpers/RandomJoiner.ts +11 -33
  414. package/src/programmers/helpers/RandomRanger.ts +16 -51
  415. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  416. package/src/programmers/helpers/UnionExplorer.ts +46 -51
  417. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  418. package/src/programmers/internal/application_alias.ts +0 -1
  419. package/src/programmers/internal/application_array.ts +33 -10
  420. package/src/programmers/internal/application_default_string.ts +37 -37
  421. package/src/programmers/internal/{application_resolved.ts → application_escaped.ts} +55 -55
  422. package/src/programmers/internal/application_number.ts +76 -70
  423. package/src/programmers/internal/application_object.ts +0 -3
  424. package/src/programmers/internal/application_schema.ts +175 -157
  425. package/src/programmers/internal/application_string.ts +33 -27
  426. package/src/programmers/internal/application_tuple.ts +12 -11
  427. package/src/programmers/internal/check_array_length.ts +34 -28
  428. package/src/programmers/internal/check_bigint.ts +26 -91
  429. package/src/programmers/internal/check_dynamic_properties.ts +1 -2
  430. package/src/programmers/internal/check_number.ts +83 -236
  431. package/src/programmers/internal/check_string.ts +37 -17
  432. package/src/programmers/internal/check_template.ts +17 -12
  433. package/src/programmers/internal/check_union_array_like.ts +4 -18
  434. package/src/programmers/internal/feature_object_entries.ts +12 -18
  435. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  436. package/src/programmers/internal/random_custom.ts +11 -3
  437. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  438. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +9 -5
  439. package/src/programmers/json/JsonApplicationProgrammer.ts +6 -3
  440. package/src/programmers/json/JsonAssertParseProgrammer.ts +7 -2
  441. package/src/programmers/json/JsonIsParseProgrammer.ts +7 -2
  442. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -995
  443. package/src/programmers/json/JsonValidateParseProgrammer.ts +7 -2
  444. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +1 -1
  445. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  446. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -775
  447. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  448. package/src/programmers/{IsPruneProgrammer.ts → misc/MiscIsPruneProgrammer.ts} +7 -7
  449. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -64
  450. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -544
  451. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  452. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  453. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -673
  454. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -814
  455. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  456. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +23 -36
  457. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  458. package/src/protobuf.ts +881 -881
  459. package/src/schemas/json/IJsonSchema.ts +11 -38
  460. package/src/schemas/metadata/IMetadata.ts +34 -27
  461. package/src/schemas/metadata/IMetadataAlias.ts +0 -2
  462. package/src/schemas/metadata/IMetadataArray.ts +4 -7
  463. package/src/schemas/metadata/IMetadataArrayType.ts +10 -0
  464. package/src/schemas/metadata/IMetadataAtomic.ts +3 -10
  465. package/src/schemas/metadata/IMetadataCollection.ts +4 -4
  466. package/src/schemas/metadata/IMetadataDictionary.ts +4 -4
  467. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  468. package/src/schemas/metadata/IMetadataProperty.ts +0 -2
  469. package/src/schemas/metadata/IMetadataTuple.ts +4 -7
  470. package/src/schemas/metadata/IMetadataTupleType.ts +10 -0
  471. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -0
  472. package/src/schemas/metadata/Metadata.ts +685 -643
  473. package/src/schemas/metadata/MetadataAlias.ts +0 -5
  474. package/src/schemas/metadata/MetadataArray.ts +28 -34
  475. package/src/schemas/metadata/MetadataArrayType.ts +57 -0
  476. package/src/schemas/metadata/MetadataAtomic.ts +42 -0
  477. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  478. package/src/schemas/metadata/MetadataProperty.ts +0 -5
  479. package/src/schemas/metadata/MetadataTuple.ts +9 -35
  480. package/src/schemas/metadata/MetadataTupleType.ts +67 -0
  481. package/src/tags/ExclusiveMaximum.ts +13 -8
  482. package/src/tags/ExclusiveMinimum.ts +13 -8
  483. package/src/tags/Format.ts +21 -20
  484. package/src/tags/MaxItems.ts +9 -8
  485. package/src/tags/MaxLength.ts +9 -8
  486. package/src/tags/Maximum.ts +13 -8
  487. package/src/tags/MinItems.ts +9 -8
  488. package/src/tags/MinLength.ts +9 -8
  489. package/src/tags/Minimum.ts +13 -8
  490. package/src/tags/MultipleOf.ts +15 -10
  491. package/src/tags/Pattern.ts +8 -8
  492. package/src/tags/TagBase.ts +64 -13
  493. package/src/tags/Type.ts +26 -29
  494. package/src/tags/index.ts +1 -0
  495. package/src/transform.ts +13 -5
  496. package/src/transformers/CallExpressionTransformer.ts +6 -3
  497. package/src/transformers/FileTransformer.ts +23 -13
  498. package/src/transformers/IProject.ts +4 -0
  499. package/src/transformers/NodeTransformer.ts +1 -1
  500. package/src/transformers/TransformerError.ts +55 -0
  501. package/src/transformers/features/CreateRandomTransformer.ts +11 -7
  502. package/src/transformers/features/RandomTransformer.ts +11 -7
  503. package/src/transformers/features/json/JsonApplicationTransformer.ts +116 -111
  504. package/src/transformers/features/misc/MetadataTransformer.ts +61 -53
  505. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +2 -2
  506. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +2 -2
  507. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +11 -7
  508. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +9 -7
  509. package/src/transformers/internal/GenericTransformer.ts +17 -10
  510. package/src/typings/Atomic.ts +1 -0
  511. package/src/typings/ProtobufAtomic.ts +19 -0
  512. package/src/typings/ValidationPipe.ts +9 -0
  513. package/src/utils/RandomGenerator.ts +83 -83
  514. package/lib/CustomValidatorMap.d.ts +0 -110
  515. package/lib/CustomValidatorMap.js.map +0 -1
  516. package/lib/factories/MetadataTagFactory.d.ts +0 -6
  517. package/lib/factories/MetadataTagFactory.js +0 -312
  518. package/lib/factories/MetadataTagFactory.js.map +0 -1
  519. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +0 -5
  520. package/lib/factories/internal/metadata/emplace_metadata_array.js +0 -38
  521. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +0 -1
  522. package/lib/factories/internal/metadata/iterate_metadata_tag.d.ts +0 -2
  523. package/lib/factories/internal/metadata/iterate_metadata_tag.js +0 -50
  524. package/lib/factories/internal/metadata/iterate_metadata_tag.js.map +0 -1
  525. package/lib/functional/$is_custom.d.ts +0 -2
  526. package/lib/functional/$is_custom.js +0 -13
  527. package/lib/functional/$is_custom.js.map +0 -1
  528. package/lib/functional/$is_date.d.ts +0 -1
  529. package/lib/functional/$is_date.js +0 -7
  530. package/lib/functional/$is_date.js.map +0 -1
  531. package/lib/functional/$is_datetime.d.ts +0 -1
  532. package/lib/functional/$is_datetime.js +0 -8
  533. package/lib/functional/$is_datetime.js.map +0 -1
  534. package/lib/functional/$is_email.d.ts +0 -1
  535. package/lib/functional/$is_email.js +0 -7
  536. package/lib/functional/$is_email.js.map +0 -1
  537. package/lib/functional/$is_ipv4.d.ts +0 -1
  538. package/lib/functional/$is_ipv4.js +0 -7
  539. package/lib/functional/$is_ipv4.js.map +0 -1
  540. package/lib/functional/$is_ipv6.d.ts +0 -1
  541. package/lib/functional/$is_ipv6.js +0 -7
  542. package/lib/functional/$is_ipv6.js.map +0 -1
  543. package/lib/functional/$is_url.d.ts +0 -1
  544. package/lib/functional/$is_url.js +0 -7
  545. package/lib/functional/$is_url.js.map +0 -1
  546. package/lib/functional/$is_uuid.d.ts +0 -1
  547. package/lib/functional/$is_uuid.js +0 -7
  548. package/lib/functional/$is_uuid.js.map +0 -1
  549. package/lib/programmers/IsPruneProgrammer.js.map +0 -1
  550. package/lib/programmers/internal/application_resolved.d.ts +0 -4
  551. package/lib/programmers/internal/application_resolved.js.map +0 -1
  552. package/lib/programmers/internal/check_array.js +0 -44
  553. package/lib/programmers/internal/check_array.js.map +0 -1
  554. package/lib/programmers/internal/check_custom.d.ts +0 -1
  555. package/lib/programmers/internal/check_custom.js +0 -30
  556. package/lib/programmers/internal/check_custom.js.map +0 -1
  557. package/lib/programmers/internal/check_string_tags.d.ts +0 -1
  558. package/lib/programmers/internal/check_string_tags.js +0 -89
  559. package/lib/programmers/internal/check_string_tags.js.map +0 -1
  560. package/lib/programmers/internal/get_comment_tags.d.ts +0 -1
  561. package/lib/programmers/internal/get_comment_tags.js +0 -25
  562. package/lib/programmers/internal/get_comment_tags.js.map +0 -1
  563. package/lib/schemas/metadata/ICommentTag.d.ts +0 -4
  564. package/lib/schemas/metadata/ICommentTag.js.map +0 -1
  565. package/lib/schemas/metadata/IMetadataTag.d.ts +0 -63
  566. package/lib/schemas/metadata/IMetadataTag.js.map +0 -1
  567. package/src/CustomValidatorMap.ts +0 -126
  568. package/src/factories/MetadataTagFactory.ts +0 -366
  569. package/src/factories/internal/metadata/iterate_metadata_tag.ts +0 -31
  570. package/src/functional/$is_custom.ts +0 -14
  571. package/src/functional/$is_date.ts +0 -3
  572. package/src/functional/$is_datetime.ts +0 -2
  573. package/src/functional/$is_email.ts +0 -4
  574. package/src/functional/$is_ipv4.ts +0 -4
  575. package/src/functional/$is_ipv6.ts +0 -4
  576. package/src/functional/$is_url.ts +0 -4
  577. package/src/functional/$is_uuid.ts +0 -4
  578. package/src/programmers/internal/check_array.ts +0 -30
  579. package/src/programmers/internal/check_custom.ts +0 -31
  580. package/src/programmers/internal/check_string_tags.ts +0 -67
  581. package/src/programmers/internal/get_comment_tags.ts +0 -23
  582. package/src/schemas/metadata/ICommentTag.ts +0 -4
  583. package/src/schemas/metadata/IMetadataTag.ts +0 -112
  584. /package/lib/{programmers/internal/check_array.d.ts → factories/MetadataCommentTagFactory.d.ts} +0 -0
@@ -1,673 +1,655 @@
1
- import ts from "typescript";
2
-
3
- import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
- import { MetadataCollection } from "../../factories/MetadataCollection";
6
- import { MetadataFactory } from "../../factories/MetadataFactory";
7
- import { ProtobufFactory } from "../../factories/ProtobufFactory";
8
- import { StatementFactory } from "../../factories/StatementFactory";
9
- import { TypeFactory } from "../../factories/TypeFactory";
10
-
11
- import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
12
- import { Metadata } from "../../schemas/metadata/Metadata";
13
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
14
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
15
- import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
16
-
17
- import { IProject } from "../../transformers/IProject";
18
-
19
- import { Atomic } from "../../typings/Atomic";
20
-
21
- import { FunctionImporter } from "../helpers/FunctionImporeter";
22
- import { ProtobufUtil } from "../helpers/ProtobufUtil";
23
-
24
- export namespace ProtobufDecodeProgrammer {
25
- export const write =
26
- (project: IProject) =>
27
- (modulo: ts.LeftHandSideExpression) =>
28
- (type: ts.Type, name?: string): ts.ArrowFunction => {
29
- const importer: FunctionImporter = new FunctionImporter(
30
- modulo.getText(),
31
- );
32
- const collection: MetadataCollection = new MetadataCollection();
33
- const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
34
- project.checker,
35
- )(collection)(type);
36
-
37
- const functors = collection
38
- .objects()
39
- .filter((obj) => ProtobufUtil.isStaticObject(obj))
40
- .map((obj) =>
41
- StatementFactory.constant(
42
- `${PREFIX}o${obj.index}`,
43
- write_object_function(project)(importer)(obj),
44
- ),
45
- );
46
- const reader = StatementFactory.constant(
47
- "reader",
48
- ts.factory.createNewExpression(
49
- importer.use("Reader"),
50
- undefined,
51
- [ts.factory.createIdentifier("input")],
52
- ),
53
- );
54
-
55
- return ts.factory.createArrowFunction(
56
- undefined,
57
- undefined,
58
- [
59
- IdentifierFactory.parameter(
60
- "input",
61
- ts.factory.createTypeReferenceNode("Uint8Array"),
62
- ),
63
- ],
64
- ts.factory.createTypeReferenceNode(
65
- `typia.Resolved<${
66
- name ?? TypeFactory.getFullName(project.checker)(type)
67
- }>`,
68
- ),
69
- undefined,
70
- ts.factory.createBlock(
71
- [
72
- ...importer.declare(modulo),
73
- ...functors,
74
- reader,
75
- ts.factory.createReturnStatement(
76
- decode_regular_object(true)(meta.objects[0]!),
77
- ),
78
- ],
79
- true,
80
- ),
81
- );
82
- };
83
-
84
- const write_object_function =
85
- (project: IProject) =>
86
- (importer: FunctionImporter) =>
87
- (obj: MetadataObject): ts.ArrowFunction =>
88
- ts.factory.createArrowFunction(
89
- undefined,
90
- undefined,
91
- [
92
- IdentifierFactory.parameter("reader"),
93
- IdentifierFactory.parameter(
94
- "length",
95
- TypeFactory.keyword("number"),
96
- ts.factory.createNumericLiteral(-1),
97
- ),
98
- ],
99
- TypeFactory.keyword("any"),
100
- undefined,
101
- ts.factory.createBlock(
102
- [
103
- ts.factory.createExpressionStatement(
104
- ts.factory.createBinaryExpression(
105
- ts.factory.createIdentifier("length"),
106
- ts.factory.createToken(
107
- ts.SyntaxKind.EqualsToken,
108
- ),
109
- ts.factory.createConditionalExpression(
110
- ts.factory.createLessThan(
111
- ts.factory.createIdentifier("length"),
112
- ts.factory.createNumericLiteral(0),
113
- ),
114
- undefined,
115
- ts.factory.createCallExpression(
116
- IdentifierFactory.access(READER())(
117
- "size",
118
- ),
119
- undefined,
120
- undefined,
121
- ),
122
- undefined,
123
- ts.factory.createAdd(
124
- ts.factory.createCallExpression(
125
- IdentifierFactory.access(READER())(
126
- "index",
127
- ),
128
- undefined,
129
- undefined,
130
- ),
131
- ts.factory.createIdentifier("length"),
132
- ),
133
- ),
134
- ),
135
- ),
136
- ...write_object_function_body(project)(importer)({
137
- condition: ts.factory.createLessThan(
138
- ts.factory.createCallExpression(
139
- IdentifierFactory.access(READER())("index"),
140
- undefined,
141
- undefined,
142
- ),
143
- ts.factory.createIdentifier("length"),
144
- ),
145
- tag: "tag",
146
- output: "output",
147
- })(obj.properties),
148
- ts.factory.createReturnStatement(
149
- ts.factory.createIdentifier("output"),
150
- ),
151
- ],
152
- true,
153
- ),
154
- );
155
-
156
- const write_object_function_body =
157
- (project: IProject) =>
158
- (importer: FunctionImporter) =>
159
- (props: { condition: ts.Expression; tag: string; output: string }) =>
160
- (properties: MetadataProperty[]): ts.Statement[] => {
161
- let i: number = 1;
162
- const clauses: ts.CaseClause[] = properties
163
- .map((p) => {
164
- const clause = decode_property(project)(importer)(i)(
165
- IdentifierFactory.access(
166
- ts.factory.createIdentifier(props.output),
167
- )(p.key.getSoleLiteral()!),
168
- p.value,
169
- p.tags,
170
- );
171
- i += p.value.binarySize();
172
- return clause;
173
- })
174
- .flat();
175
- return [
176
- StatementFactory.constant(
177
- props.output,
178
- ts.factory.createObjectLiteralExpression(
179
- properties.map((p) =>
180
- ts.factory.createPropertyAssignment(
181
- IdentifierFactory.identifier(
182
- p.key.getSoleLiteral()!,
183
- ),
184
- write_property_default_value(p.value),
185
- ),
186
- ),
187
- true,
188
- ),
189
- ),
190
- ts.factory.createWhileStatement(
191
- props.condition,
192
- ts.factory.createBlock([
193
- StatementFactory.constant(
194
- props.tag,
195
- ts.factory.createCallExpression(
196
- IdentifierFactory.access(READER())("uint32"),
197
- undefined,
198
- undefined,
199
- ),
200
- ),
201
- ts.factory.createSwitchStatement(
202
- ts.factory.createUnsignedRightShift(
203
- ts.factory.createIdentifier(props.tag),
204
- ts.factory.createNumericLiteral(3),
205
- ),
206
- ts.factory.createCaseBlock([
207
- ...clauses,
208
- ts.factory.createDefaultClause([
209
- ts.factory.createExpressionStatement(
210
- ts.factory.createCallExpression(
211
- IdentifierFactory.access(READER())(
212
- "skipType",
213
- ),
214
- undefined,
215
- [
216
- ts.factory.createBitwiseAnd(
217
- ts.factory.createIdentifier(
218
- props.tag,
219
- ),
220
- ts.factory.createNumericLiteral(
221
- 7,
222
- ),
223
- ),
224
- ],
225
- ),
226
- ),
227
- ts.factory.createBreakStatement(),
228
- ]),
229
- ]),
230
- ),
231
- ]),
232
- ),
233
- ];
234
- };
235
-
236
- const write_property_default_value = (value: Metadata) =>
237
- ts.factory.createAsExpression(
238
- value.nullable
239
- ? ts.factory.createNull()
240
- : value.isRequired() === false
241
- ? ts.factory.createIdentifier("undefined")
242
- : value.arrays.length
243
- ? ts.factory.createArrayLiteralExpression()
244
- : value.maps.length
245
- ? ts.factory.createNewExpression(
246
- ts.factory.createIdentifier("Map"),
247
- undefined,
248
- [],
249
- )
250
- : value.natives.length
251
- ? ts.factory.createNewExpression(
252
- ts.factory.createIdentifier("Uint8Array"),
253
- undefined,
254
- [],
255
- )
256
- : value.atomics.some((a) => a.type === "string") ||
257
- value.constants.some(
258
- (c) =>
259
- c.type === "string" && c.values.some((v) => v === ""),
260
- ) ||
261
- value.templates.some(
262
- (tpl) =>
263
- tpl.length === 1 && tpl[0]!.getName() === "string",
264
- )
265
- ? ts.factory.createStringLiteral("")
266
- : value.objects.length &&
267
- value.objects.some((obj) => !ProtobufUtil.isStaticObject(obj))
268
- ? ts.factory.createObjectLiteralExpression()
269
- : ts.factory.createIdentifier("undefined"),
270
- TypeFactory.keyword("any"),
271
- );
272
-
273
- /* -----------------------------------------------------------
274
- DECODERS
275
- ----------------------------------------------------------- */
276
- const decode_property =
277
- (project: IProject) =>
278
- (importer: FunctionImporter) =>
279
- (index: number) =>
280
- (
281
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
282
- meta: Metadata,
283
- tags: IMetadataTag[],
284
- ): ts.CaseClause[] => {
285
- const clauses: ts.CaseClause[] = [];
286
- const emplace =
287
- (name: string) => (v: ts.Expression | ts.Statement[]) =>
288
- clauses.push(
289
- ts.factory.createCaseClause(
290
- ts.factory.createNumericLiteral(index++),
291
- Array.isArray(v)
292
- ? [
293
- ts.factory.createExpressionStatement(
294
- ts.factory.createIdentifier(
295
- `// type: ${name}`,
296
- ),
297
- ),
298
- ...v,
299
- ts.factory.createBreakStatement(),
300
- ]
301
- : [
302
- ts.factory.createExpressionStatement(
303
- ts.factory.createIdentifier(
304
- `// ${name}`,
305
- ),
306
- ),
307
- ts.factory.createExpressionStatement(
308
- ts.factory.createBinaryExpression(
309
- accessor,
310
- ts.factory.createToken(
311
- ts.SyntaxKind.EqualsToken,
312
- ),
313
- v,
314
- ),
315
- ),
316
- ts.factory.createBreakStatement(),
317
- ],
318
- ),
319
- );
320
-
321
- const required: boolean = meta.isRequired() && !meta.nullable;
322
- for (const atomic of ProtobufUtil.getAtomics(meta))
323
- emplace(atomic)(decode_atomic(atomic, tags));
324
- if (meta.natives.length) emplace("bytes")(decode_bytes("bytes"));
325
- for (const array of meta.arrays)
326
- emplace(`Array<${array.value.getName()}>`)(
327
- decode_array(accessor, array, required, tags),
328
- );
329
- for (const map of meta.maps)
330
- emplace(`Map<string, ${map.value.getName()}>`)(
331
- decode_map(project)(importer)(
332
- accessor,
333
- map,
334
- required,
335
- tags,
336
- ),
337
- );
338
- for (const obj of meta.objects)
339
- emplace(obj.name)(
340
- ProtobufUtil.isStaticObject(obj)
341
- ? decode_regular_object(false)(obj)
342
- : decode_dynamic_object(project)(importer)(
343
- accessor,
344
- obj,
345
- required,
346
- ),
347
- );
348
- return clauses;
349
- };
350
-
351
- const decode_atomic = (
352
- atomic: Atomic.Literal,
353
- tags: IMetadataTag[],
354
- ): ts.Expression => {
355
- if (atomic === "string") return decode_bytes("string");
356
- const method =
357
- atomic === "bigint"
358
- ? tags.find((t) => t.kind === "type" && t.value === "uint64")
359
- ? "uint64"
360
- : "int64"
361
- : atomic === "number"
362
- ? (() => {
363
- const type = tags.find((t) => t.kind === "type");
364
- if (type === undefined) return "double";
365
- return type.value === "int" || type.value === "int32"
366
- ? "int32"
367
- : type.value === "uint" || type.value === "uint32"
368
- ? "uint32"
369
- : type.value === "int64"
370
- ? "int64"
371
- : type.value === "uint64"
372
- ? "uint64"
373
- : type.value === "float"
374
- ? "float"
375
- : "double";
376
- })()
377
- : "bool";
378
- const call = ts.factory.createCallExpression(
379
- IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
380
- method,
381
- ),
382
- undefined,
383
- undefined,
384
- );
385
- return atomic === "number" &&
386
- (method === "int64" || method === "uint64")
387
- ? ts.factory.createCallExpression(
388
- ts.factory.createIdentifier("Number"),
389
- undefined,
390
- [call],
391
- )
392
- : call;
393
- };
394
-
395
- const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
396
- ts.factory.createCallExpression(
397
- IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
398
- method,
399
- ),
400
- undefined,
401
- undefined,
402
- );
403
-
404
- const decode_array = (
405
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
406
- array: MetadataArray,
407
- required: boolean,
408
- tags: IMetadataTag[],
409
- ): ts.Statement[] => {
410
- const statements: Array<ts.Expression | ts.Statement> = [];
411
- if (required === false)
412
- statements.push(
413
- ts.factory.createBinaryExpression(
414
- accessor,
415
- ts.factory.createToken(
416
- ts.SyntaxKind.QuestionQuestionEqualsToken,
417
- ),
418
- ts.factory.createAsExpression(
419
- ts.factory.createArrayLiteralExpression(),
420
- ts.factory.createTypeReferenceNode("any[]"),
421
- ),
422
- ),
423
- );
424
- const atomics = ProtobufUtil.getAtomics(array.value);
425
- const decoder = atomics.length
426
- ? () => decode_atomic(atomics[0]!, tags)
427
- : array.value.natives.length
428
- ? () => decode_bytes("bytes")
429
- : array.value.objects.length
430
- ? () => decode_regular_object(false)(array.value.objects[0]!)
431
- : null;
432
- if (decoder === null) throw new Error("Never reach here.");
433
- else if (atomics.length && atomics[0] !== "string") {
434
- statements.push(
435
- ts.factory.createIfStatement(
436
- ts.factory.createStrictEquality(
437
- ts.factory.createNumericLiteral(2),
438
- ts.factory.createBitwiseAnd(
439
- ts.factory.createIdentifier("tag"),
440
- ts.factory.createNumericLiteral(7),
441
- ),
442
- ),
443
- ts.factory.createBlock(
444
- [
445
- StatementFactory.constant(
446
- "piece",
447
- ts.factory.createAdd(
448
- ts.factory.createCallExpression(
449
- IdentifierFactory.access(READER())(
450
- "uint32",
451
- ),
452
- undefined,
453
- undefined,
454
- ),
455
- ts.factory.createCallExpression(
456
- IdentifierFactory.access(READER())(
457
- "index",
458
- ),
459
- undefined,
460
- undefined,
461
- ),
462
- ),
463
- ),
464
- ts.factory.createWhileStatement(
465
- ts.factory.createLessThan(
466
- ts.factory.createCallExpression(
467
- IdentifierFactory.access(READER())(
468
- "index",
469
- ),
470
- undefined,
471
- undefined,
472
- ),
473
- ts.factory.createIdentifier("piece"),
474
- ),
475
- ts.factory.createExpressionStatement(
476
- ts.factory.createCallExpression(
477
- IdentifierFactory.access(accessor)(
478
- "push",
479
- ),
480
- undefined,
481
- [decoder()],
482
- ),
483
- ),
484
- ),
485
- ],
486
- true,
487
- ),
488
- ts.factory.createExpressionStatement(
489
- ts.factory.createCallExpression(
490
- IdentifierFactory.access(accessor)("push"),
491
- undefined,
492
- [decoder()],
493
- ),
494
- ),
495
- ),
496
- );
497
- } else
498
- statements.push(
499
- ts.factory.createCallExpression(
500
- IdentifierFactory.access(accessor)("push"),
501
- undefined,
502
- [decoder()],
503
- ),
504
- );
505
- return statements.map((stmt) =>
506
- ts.isExpression(stmt)
507
- ? ts.factory.createExpressionStatement(stmt)
508
- : stmt,
509
- );
510
- };
511
-
512
- const decode_regular_object =
513
- (top: boolean) =>
514
- (obj: MetadataObject): ts.Expression =>
515
- ts.factory.createCallExpression(
516
- ts.factory.createIdentifier(`${PREFIX}o${obj.index}`),
517
- undefined,
518
- [
519
- ts.factory.createIdentifier("reader"),
520
- ...(top
521
- ? []
522
- : [
523
- ts.factory.createCallExpression(
524
- IdentifierFactory.access(READER())("uint32"),
525
- undefined,
526
- undefined,
527
- ),
528
- ]),
529
- ],
530
- );
531
-
532
- const decode_dynamic_object =
533
- (project: IProject) =>
534
- (importer: FunctionImporter) =>
535
- (
536
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
537
- obj: MetadataObject,
538
- required: boolean,
539
- ): ts.Statement[] => {
540
- const top = obj.properties[0]!;
541
- return decode_entry(project)(importer)({
542
- initializer: () =>
543
- ts.factory.createBinaryExpression(
544
- accessor,
545
- ts.factory.createToken(
546
- ts.SyntaxKind.QuestionQuestionEqualsToken,
547
- ),
548
- ts.factory.createObjectLiteralExpression(),
549
- ),
550
- setter: () =>
551
- ts.factory.createBinaryExpression(
552
- ts.factory.createElementAccessExpression(
553
- accessor,
554
- ts.factory.createIdentifier("entry.key"),
555
- ),
556
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
557
- ts.factory.createIdentifier("entry.value"),
558
- ),
559
- })(top, required, top.tags);
560
- };
561
-
562
- const decode_map =
563
- (project: IProject) =>
564
- (importer: FunctionImporter) =>
565
- (
566
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
567
- map: Metadata.Entry,
568
- required: boolean,
569
- tags: IMetadataTag[],
570
- ): ts.Statement[] =>
571
- decode_entry(project)(importer)({
572
- initializer: () =>
573
- ts.factory.createBinaryExpression(
574
- accessor,
575
- ts.factory.createToken(
576
- ts.SyntaxKind.QuestionQuestionEqualsToken,
577
- ),
578
- ts.factory.createNewExpression(
579
- ts.factory.createIdentifier("Map"),
580
- [
581
- TypeFactory.keyword("any"),
582
- TypeFactory.keyword("any"),
583
- ],
584
- [],
585
- ),
586
- ),
587
- setter: () =>
588
- ts.factory.createCallExpression(
589
- IdentifierFactory.access(accessor)("set"),
590
- undefined,
591
- [
592
- ts.factory.createIdentifier("entry.key"),
593
- ts.factory.createIdentifier("entry.value"),
594
- ],
595
- ),
596
- })(map, required, tags);
597
-
598
- const decode_entry =
599
- (project: IProject) =>
600
- (importer: FunctionImporter) =>
601
- (props: {
602
- initializer: () => ts.Expression;
603
- setter: () => ts.Expression;
604
- }) =>
605
- (
606
- map: Metadata.Entry,
607
- required: boolean,
608
- tags: IMetadataTag[],
609
- ): ts.Statement[] => {
610
- const statements: ts.Statement[] = [
611
- ...(required
612
- ? []
613
- : [
614
- ts.factory.createExpressionStatement(
615
- props.initializer(),
616
- ),
617
- ]),
618
- StatementFactory.constant(
619
- "piece",
620
- ts.factory.createAdd(
621
- ts.factory.createCallExpression(
622
- IdentifierFactory.access(READER())("uint32"),
623
- undefined,
624
- undefined,
625
- ),
626
- ts.factory.createCallExpression(
627
- IdentifierFactory.access(READER())("index"),
628
- undefined,
629
- undefined,
630
- ),
631
- ),
632
- ),
633
- ...write_object_function_body(project)(importer)({
634
- condition: ts.factory.createLessThan(
635
- ts.factory.createCallExpression(
636
- IdentifierFactory.access(READER())("index"),
637
- undefined,
638
- undefined,
639
- ),
640
- ts.factory.createIdentifier("piece"),
641
- ),
642
- tag: "kind",
643
- output: "entry",
644
- })([
645
- MetadataProperty.create({
646
- key: MetadataFactory.soleLiteral("key"),
647
- value: map.key,
648
- description: null,
649
- tags: [],
650
- jsDocTags: [],
651
- }),
652
- MetadataProperty.create({
653
- key: MetadataFactory.soleLiteral("value"),
654
- value: map.value,
655
- description: null,
656
- tags,
657
- jsDocTags: [],
658
- }),
659
- ]),
660
- ts.factory.createExpressionStatement(props.setter()),
661
- ];
662
- return [
663
- ts.factory.createExpressionStatement(
664
- ExpressionFactory.selfCall(
665
- ts.factory.createBlock(statements, true),
666
- ),
667
- ),
668
- ];
669
- };
670
- }
671
-
672
- const PREFIX = "$pd";
673
- const READER = () => ts.factory.createIdentifier("reader");
1
+ import ts from "typescript";
2
+
3
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
+ import { MetadataCollection } from "../../factories/MetadataCollection";
6
+ import { MetadataFactory } from "../../factories/MetadataFactory";
7
+ import { ProtobufFactory } from "../../factories/ProtobufFactory";
8
+ import { StatementFactory } from "../../factories/StatementFactory";
9
+ import { TypeFactory } from "../../factories/TypeFactory";
10
+
11
+ import { Metadata } from "../../schemas/metadata/Metadata";
12
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
+ import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic";
14
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
15
+ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
16
+
17
+ import { IProject } from "../../transformers/IProject";
18
+
19
+ import { ProtobufAtomic } from "../../typings/ProtobufAtomic";
20
+
21
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
22
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
23
+
24
+ export namespace ProtobufDecodeProgrammer {
25
+ export const write =
26
+ (project: IProject) =>
27
+ (modulo: ts.LeftHandSideExpression) =>
28
+ (type: ts.Type, name?: string): ts.ArrowFunction => {
29
+ const importer: FunctionImporter = new FunctionImporter(
30
+ modulo.getText(),
31
+ );
32
+ const collection: MetadataCollection = new MetadataCollection();
33
+ const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
34
+ project.checker,
35
+ )(collection)(type);
36
+
37
+ const functors = collection
38
+ .objects()
39
+ .filter((obj) => ProtobufUtil.isStaticObject(obj))
40
+ .map((obj) =>
41
+ StatementFactory.constant(
42
+ `${PREFIX}o${obj.index}`,
43
+ write_object_function(project)(importer)(obj),
44
+ ),
45
+ );
46
+ const reader = StatementFactory.constant(
47
+ "reader",
48
+ ts.factory.createNewExpression(
49
+ importer.use("Reader"),
50
+ undefined,
51
+ [ts.factory.createIdentifier("input")],
52
+ ),
53
+ );
54
+
55
+ return ts.factory.createArrowFunction(
56
+ undefined,
57
+ undefined,
58
+ [
59
+ IdentifierFactory.parameter(
60
+ "input",
61
+ ts.factory.createTypeReferenceNode("Uint8Array"),
62
+ ),
63
+ ],
64
+ ts.factory.createTypeReferenceNode(
65
+ `typia.Resolved<${
66
+ name ?? TypeFactory.getFullName(project.checker)(type)
67
+ }>`,
68
+ ),
69
+ undefined,
70
+ ts.factory.createBlock(
71
+ [
72
+ ...importer.declare(modulo),
73
+ ...functors,
74
+ reader,
75
+ ts.factory.createReturnStatement(
76
+ decode_regular_object(true)(meta.objects[0]!),
77
+ ),
78
+ ],
79
+ true,
80
+ ),
81
+ );
82
+ };
83
+
84
+ const write_object_function =
85
+ (project: IProject) =>
86
+ (importer: FunctionImporter) =>
87
+ (obj: MetadataObject): ts.ArrowFunction =>
88
+ ts.factory.createArrowFunction(
89
+ undefined,
90
+ undefined,
91
+ [
92
+ IdentifierFactory.parameter("reader"),
93
+ IdentifierFactory.parameter(
94
+ "length",
95
+ TypeFactory.keyword("number"),
96
+ ts.factory.createNumericLiteral(-1),
97
+ ),
98
+ ],
99
+ TypeFactory.keyword("any"),
100
+ undefined,
101
+ ts.factory.createBlock(
102
+ [
103
+ ts.factory.createExpressionStatement(
104
+ ts.factory.createBinaryExpression(
105
+ ts.factory.createIdentifier("length"),
106
+ ts.factory.createToken(
107
+ ts.SyntaxKind.EqualsToken,
108
+ ),
109
+ ts.factory.createConditionalExpression(
110
+ ts.factory.createLessThan(
111
+ ts.factory.createIdentifier("length"),
112
+ ts.factory.createNumericLiteral(0),
113
+ ),
114
+ undefined,
115
+ ts.factory.createCallExpression(
116
+ IdentifierFactory.access(READER())(
117
+ "size",
118
+ ),
119
+ undefined,
120
+ undefined,
121
+ ),
122
+ undefined,
123
+ ts.factory.createAdd(
124
+ ts.factory.createCallExpression(
125
+ IdentifierFactory.access(READER())(
126
+ "index",
127
+ ),
128
+ undefined,
129
+ undefined,
130
+ ),
131
+ ts.factory.createIdentifier("length"),
132
+ ),
133
+ ),
134
+ ),
135
+ ),
136
+ ...write_object_function_body(project)(importer)({
137
+ condition: ts.factory.createLessThan(
138
+ ts.factory.createCallExpression(
139
+ IdentifierFactory.access(READER())("index"),
140
+ undefined,
141
+ undefined,
142
+ ),
143
+ ts.factory.createIdentifier("length"),
144
+ ),
145
+ tag: "tag",
146
+ output: "output",
147
+ })(obj.properties),
148
+ ts.factory.createReturnStatement(
149
+ ts.factory.createIdentifier("output"),
150
+ ),
151
+ ],
152
+ true,
153
+ ),
154
+ );
155
+
156
+ const write_object_function_body =
157
+ (project: IProject) =>
158
+ (importer: FunctionImporter) =>
159
+ (props: { condition: ts.Expression; tag: string; output: string }) =>
160
+ (properties: MetadataProperty[]): ts.Statement[] => {
161
+ let i: number = 1;
162
+ const clauses: ts.CaseClause[] = properties
163
+ .map((p) => {
164
+ const clause = decode_property(project)(importer)(i)(
165
+ IdentifierFactory.access(
166
+ ts.factory.createIdentifier(props.output),
167
+ )(p.key.getSoleLiteral()!),
168
+ p.value,
169
+ );
170
+ i += ProtobufUtil.size(p.value);
171
+ return clause;
172
+ })
173
+ .flat();
174
+ return [
175
+ StatementFactory.constant(
176
+ props.output,
177
+ ts.factory.createObjectLiteralExpression(
178
+ properties.map((p) =>
179
+ ts.factory.createPropertyAssignment(
180
+ IdentifierFactory.identifier(
181
+ p.key.getSoleLiteral()!,
182
+ ),
183
+ write_property_default_value(p.value),
184
+ ),
185
+ ),
186
+ true,
187
+ ),
188
+ ),
189
+ ts.factory.createWhileStatement(
190
+ props.condition,
191
+ ts.factory.createBlock([
192
+ StatementFactory.constant(
193
+ props.tag,
194
+ ts.factory.createCallExpression(
195
+ IdentifierFactory.access(READER())("uint32"),
196
+ undefined,
197
+ undefined,
198
+ ),
199
+ ),
200
+ ts.factory.createSwitchStatement(
201
+ ts.factory.createUnsignedRightShift(
202
+ ts.factory.createIdentifier(props.tag),
203
+ ts.factory.createNumericLiteral(3),
204
+ ),
205
+ ts.factory.createCaseBlock([
206
+ ...clauses,
207
+ ts.factory.createDefaultClause([
208
+ ts.factory.createExpressionStatement(
209
+ ts.factory.createCallExpression(
210
+ IdentifierFactory.access(READER())(
211
+ "skipType",
212
+ ),
213
+ undefined,
214
+ [
215
+ ts.factory.createBitwiseAnd(
216
+ ts.factory.createIdentifier(
217
+ props.tag,
218
+ ),
219
+ ts.factory.createNumericLiteral(
220
+ 7,
221
+ ),
222
+ ),
223
+ ],
224
+ ),
225
+ ),
226
+ ts.factory.createBreakStatement(),
227
+ ]),
228
+ ]),
229
+ ),
230
+ ]),
231
+ ),
232
+ ];
233
+ };
234
+
235
+ const write_property_default_value = (value: Metadata) =>
236
+ ts.factory.createAsExpression(
237
+ value.nullable
238
+ ? ts.factory.createNull()
239
+ : value.isRequired() === false
240
+ ? ts.factory.createIdentifier("undefined")
241
+ : value.arrays.length
242
+ ? ts.factory.createArrayLiteralExpression()
243
+ : value.maps.length
244
+ ? ts.factory.createNewExpression(
245
+ ts.factory.createIdentifier("Map"),
246
+ undefined,
247
+ [],
248
+ )
249
+ : value.natives.length
250
+ ? ts.factory.createNewExpression(
251
+ ts.factory.createIdentifier("Uint8Array"),
252
+ undefined,
253
+ [],
254
+ )
255
+ : value.atomics.some((a) => a.type === "string") ||
256
+ value.constants.some(
257
+ (c) =>
258
+ c.type === "string" && c.values.some((v) => v === ""),
259
+ ) ||
260
+ value.templates.some(
261
+ (tpl) =>
262
+ tpl.length === 1 && tpl[0]!.getName() === "string",
263
+ )
264
+ ? ts.factory.createStringLiteral("")
265
+ : value.objects.length &&
266
+ value.objects.some((obj) => !ProtobufUtil.isStaticObject(obj))
267
+ ? ts.factory.createObjectLiteralExpression()
268
+ : ts.factory.createIdentifier("undefined"),
269
+ TypeFactory.keyword("any"),
270
+ );
271
+
272
+ /* -----------------------------------------------------------
273
+ DECODERS
274
+ ----------------------------------------------------------- */
275
+ const decode_property =
276
+ (project: IProject) =>
277
+ (importer: FunctionImporter) =>
278
+ (index: number) =>
279
+ (
280
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
281
+ meta: Metadata,
282
+ ): ts.CaseClause[] => {
283
+ const clauses: ts.CaseClause[] = [];
284
+ const emplace =
285
+ (name: string) => (v: ts.Expression | ts.Statement[]) =>
286
+ clauses.push(
287
+ ts.factory.createCaseClause(
288
+ ts.factory.createNumericLiteral(index++),
289
+ Array.isArray(v)
290
+ ? [
291
+ ts.factory.createExpressionStatement(
292
+ ts.factory.createIdentifier(
293
+ `// type: ${name}`,
294
+ ),
295
+ ),
296
+ ...v,
297
+ ts.factory.createBreakStatement(),
298
+ ]
299
+ : [
300
+ ts.factory.createExpressionStatement(
301
+ ts.factory.createIdentifier(
302
+ `// ${name}`,
303
+ ),
304
+ ),
305
+ ts.factory.createExpressionStatement(
306
+ ts.factory.createBinaryExpression(
307
+ accessor,
308
+ ts.factory.createToken(
309
+ ts.SyntaxKind.EqualsToken,
310
+ ),
311
+ v,
312
+ ),
313
+ ),
314
+ ts.factory.createBreakStatement(),
315
+ ],
316
+ ),
317
+ );
318
+
319
+ const required: boolean = meta.isRequired() && !meta.nullable;
320
+ for (const atomic of ProtobufUtil.getAtomics(meta))
321
+ emplace(atomic)(decode_atomic(meta)(atomic));
322
+ if (meta.natives.length) emplace("bytes")(decode_bytes("bytes"));
323
+ for (const array of meta.arrays)
324
+ emplace(`Array<${array.type.value.getName()}>`)(
325
+ decode_array(accessor, array, required),
326
+ );
327
+ for (const map of meta.maps)
328
+ emplace(`Map<string, ${map.value.getName()}>`)(
329
+ decode_map(project)(importer)(accessor, map, required),
330
+ );
331
+ for (const obj of meta.objects)
332
+ emplace(obj.name)(
333
+ ProtobufUtil.isStaticObject(obj)
334
+ ? decode_regular_object(false)(obj)
335
+ : decode_dynamic_object(project)(importer)(
336
+ accessor,
337
+ obj,
338
+ required,
339
+ ),
340
+ );
341
+ return clauses;
342
+ };
343
+
344
+ const decode_atomic =
345
+ (meta: Metadata) =>
346
+ (atomic: ProtobufAtomic): ts.Expression => {
347
+ if (atomic === "string") return decode_bytes("string");
348
+
349
+ const call: ts.CallExpression = ts.factory.createCallExpression(
350
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
351
+ atomic,
352
+ ),
353
+ undefined,
354
+ undefined,
355
+ );
356
+ if (atomic !== "int64" && atomic !== "uint64") return call;
357
+
358
+ const isNumber: boolean = ProtobufUtil.getNumbers(meta).some(
359
+ (n) => n === atomic,
360
+ );
361
+ return isNumber
362
+ ? ts.factory.createCallExpression(
363
+ ts.factory.createIdentifier("Number"),
364
+ undefined,
365
+ [call],
366
+ )
367
+ : call;
368
+ };
369
+
370
+ const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
371
+ ts.factory.createCallExpression(
372
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
373
+ method,
374
+ ),
375
+ undefined,
376
+ undefined,
377
+ );
378
+
379
+ const decode_array = (
380
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
381
+ array: MetadataArray,
382
+ required: boolean,
383
+ ): ts.Statement[] => {
384
+ const statements: Array<ts.Expression | ts.Statement> = [];
385
+ if (required === false)
386
+ statements.push(
387
+ ts.factory.createBinaryExpression(
388
+ accessor,
389
+ ts.factory.createToken(
390
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
391
+ ),
392
+ ts.factory.createAsExpression(
393
+ ts.factory.createArrayLiteralExpression(),
394
+ ts.factory.createTypeReferenceNode("any[]"),
395
+ ),
396
+ ),
397
+ );
398
+ const atomics = ProtobufUtil.getAtomics(array.type.value);
399
+ const decoder = atomics.length
400
+ ? () => decode_atomic(array.type.value)(atomics[0]!)
401
+ : array.type.value.natives.length
402
+ ? () => decode_bytes("bytes")
403
+ : array.type.value.objects.length
404
+ ? () => decode_regular_object(false)(array.type.value.objects[0]!)
405
+ : null;
406
+ if (decoder === null) throw new Error("Never reach here.");
407
+ else if (atomics.length && atomics[0] !== "string") {
408
+ statements.push(
409
+ ts.factory.createIfStatement(
410
+ ts.factory.createStrictEquality(
411
+ ts.factory.createNumericLiteral(2),
412
+ ts.factory.createBitwiseAnd(
413
+ ts.factory.createIdentifier("tag"),
414
+ ts.factory.createNumericLiteral(7),
415
+ ),
416
+ ),
417
+ ts.factory.createBlock(
418
+ [
419
+ StatementFactory.constant(
420
+ "piece",
421
+ ts.factory.createAdd(
422
+ ts.factory.createCallExpression(
423
+ IdentifierFactory.access(READER())(
424
+ "uint32",
425
+ ),
426
+ undefined,
427
+ undefined,
428
+ ),
429
+ ts.factory.createCallExpression(
430
+ IdentifierFactory.access(READER())(
431
+ "index",
432
+ ),
433
+ undefined,
434
+ undefined,
435
+ ),
436
+ ),
437
+ ),
438
+ ts.factory.createWhileStatement(
439
+ ts.factory.createLessThan(
440
+ ts.factory.createCallExpression(
441
+ IdentifierFactory.access(READER())(
442
+ "index",
443
+ ),
444
+ undefined,
445
+ undefined,
446
+ ),
447
+ ts.factory.createIdentifier("piece"),
448
+ ),
449
+ ts.factory.createExpressionStatement(
450
+ ts.factory.createCallExpression(
451
+ IdentifierFactory.access(accessor)(
452
+ "push",
453
+ ),
454
+ undefined,
455
+ [decoder()],
456
+ ),
457
+ ),
458
+ ),
459
+ ],
460
+ true,
461
+ ),
462
+ ts.factory.createExpressionStatement(
463
+ ts.factory.createCallExpression(
464
+ IdentifierFactory.access(accessor)("push"),
465
+ undefined,
466
+ [decoder()],
467
+ ),
468
+ ),
469
+ ),
470
+ );
471
+ } else
472
+ statements.push(
473
+ ts.factory.createCallExpression(
474
+ IdentifierFactory.access(accessor)("push"),
475
+ undefined,
476
+ [decoder()],
477
+ ),
478
+ );
479
+ return statements.map((stmt) =>
480
+ ts.isExpression(stmt)
481
+ ? ts.factory.createExpressionStatement(stmt)
482
+ : stmt,
483
+ );
484
+ };
485
+
486
+ const decode_regular_object =
487
+ (top: boolean) =>
488
+ (obj: MetadataObject): ts.Expression =>
489
+ ts.factory.createCallExpression(
490
+ ts.factory.createIdentifier(`${PREFIX}o${obj.index}`),
491
+ undefined,
492
+ [
493
+ ts.factory.createIdentifier("reader"),
494
+ ...(top
495
+ ? []
496
+ : [
497
+ ts.factory.createCallExpression(
498
+ IdentifierFactory.access(READER())("uint32"),
499
+ undefined,
500
+ undefined,
501
+ ),
502
+ ]),
503
+ ],
504
+ );
505
+
506
+ const decode_dynamic_object =
507
+ (project: IProject) =>
508
+ (importer: FunctionImporter) =>
509
+ (
510
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
511
+ obj: MetadataObject,
512
+ required: boolean,
513
+ ): ts.Statement[] => {
514
+ const top = obj.properties[0]!;
515
+ return decode_entry(project)(importer)({
516
+ initializer: () =>
517
+ ts.factory.createBinaryExpression(
518
+ accessor,
519
+ ts.factory.createToken(
520
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
521
+ ),
522
+ ts.factory.createObjectLiteralExpression(),
523
+ ),
524
+ setter: () =>
525
+ ts.factory.createBinaryExpression(
526
+ ts.factory.createElementAccessExpression(
527
+ accessor,
528
+ ts.factory.createIdentifier("entry.key"),
529
+ ),
530
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
531
+ ts.factory.createIdentifier("entry.value"),
532
+ ),
533
+ })(
534
+ MetadataProperty.create({
535
+ ...top,
536
+ key: (() => {
537
+ const key: Metadata = Metadata.initialize();
538
+ key.atomics.push(
539
+ MetadataAtomic.create({
540
+ type: "string",
541
+ tags: [],
542
+ }),
543
+ );
544
+ return key;
545
+ })(),
546
+ }),
547
+ required,
548
+ );
549
+ };
550
+
551
+ const decode_map =
552
+ (project: IProject) =>
553
+ (importer: FunctionImporter) =>
554
+ (
555
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
556
+ map: Metadata.Entry,
557
+ required: boolean,
558
+ ): ts.Statement[] =>
559
+ decode_entry(project)(importer)({
560
+ initializer: () =>
561
+ ts.factory.createBinaryExpression(
562
+ accessor,
563
+ ts.factory.createToken(
564
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
565
+ ),
566
+ ts.factory.createNewExpression(
567
+ ts.factory.createIdentifier("Map"),
568
+ [
569
+ TypeFactory.keyword("any"),
570
+ TypeFactory.keyword("any"),
571
+ ],
572
+ [],
573
+ ),
574
+ ),
575
+ setter: () =>
576
+ ts.factory.createCallExpression(
577
+ IdentifierFactory.access(accessor)("set"),
578
+ undefined,
579
+ [
580
+ ts.factory.createIdentifier("entry.key"),
581
+ ts.factory.createIdentifier("entry.value"),
582
+ ],
583
+ ),
584
+ })(map, required);
585
+
586
+ const decode_entry =
587
+ (project: IProject) =>
588
+ (importer: FunctionImporter) =>
589
+ (props: {
590
+ initializer: () => ts.Expression;
591
+ setter: () => ts.Expression;
592
+ }) =>
593
+ (map: Metadata.Entry, required: boolean): ts.Statement[] => {
594
+ const statements: ts.Statement[] = [
595
+ ...(required
596
+ ? []
597
+ : [
598
+ ts.factory.createExpressionStatement(
599
+ props.initializer(),
600
+ ),
601
+ ]),
602
+ StatementFactory.constant(
603
+ "piece",
604
+ ts.factory.createAdd(
605
+ ts.factory.createCallExpression(
606
+ IdentifierFactory.access(READER())("uint32"),
607
+ undefined,
608
+ undefined,
609
+ ),
610
+ ts.factory.createCallExpression(
611
+ IdentifierFactory.access(READER())("index"),
612
+ undefined,
613
+ undefined,
614
+ ),
615
+ ),
616
+ ),
617
+ ...write_object_function_body(project)(importer)({
618
+ condition: ts.factory.createLessThan(
619
+ ts.factory.createCallExpression(
620
+ IdentifierFactory.access(READER())("index"),
621
+ undefined,
622
+ undefined,
623
+ ),
624
+ ts.factory.createIdentifier("piece"),
625
+ ),
626
+ tag: "kind",
627
+ output: "entry",
628
+ })([
629
+ MetadataProperty.create({
630
+ key: MetadataFactory.soleLiteral("key"),
631
+ value: map.key,
632
+ description: null,
633
+ jsDocTags: [],
634
+ }),
635
+ MetadataProperty.create({
636
+ key: MetadataFactory.soleLiteral("value"),
637
+ value: map.value,
638
+ description: null,
639
+ jsDocTags: [],
640
+ }),
641
+ ]),
642
+ ts.factory.createExpressionStatement(props.setter()),
643
+ ];
644
+ return [
645
+ ts.factory.createExpressionStatement(
646
+ ExpressionFactory.selfCall(
647
+ ts.factory.createBlock(statements, true),
648
+ ),
649
+ ),
650
+ ];
651
+ };
652
+ }
653
+
654
+ const PREFIX = "$pd";
655
+ const READER = () => ts.factory.createIdentifier("reader");