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,814 +1,883 @@
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 { ProtobufFactory } from "../../factories/ProtobufFactory";
7
- import { StatementFactory } from "../../factories/StatementFactory";
8
- import { TypeFactory } from "../../factories/TypeFactory";
9
-
10
- import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
11
- import { Metadata } from "../../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
- import { MetadataObject } from "../../schemas/metadata/MetadataObject";
14
- import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
15
-
16
- import { IProject } from "../../transformers/IProject";
17
-
18
- import { Atomic } from "../../typings/Atomic";
19
-
20
- import { FeatureProgrammer } from "../FeatureProgrammer";
21
- import { IsProgrammer } from "../IsProgrammer";
22
- import { FunctionImporter } from "../helpers/FunctionImporeter";
23
- import { ProtobufUtil } from "../helpers/ProtobufUtil";
24
- import { ProtobufWire } from "../helpers/ProtobufWire";
25
- import { UnionPredicator } from "../helpers/UnionPredicator";
26
- import { decode_union_object } from "../internal/decode_union_object";
27
-
28
- export namespace ProtobufEncodeProgrammer {
29
- export const write =
30
- (project: IProject) =>
31
- (modulo: ts.LeftHandSideExpression) =>
32
- (type: ts.Type, name?: string): ts.ArrowFunction => {
33
- const importer = new FunctionImporter(modulo.getText());
34
- const collection = new MetadataCollection();
35
- const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
36
- project.checker,
37
- )(collection)(type);
38
-
39
- const callEncoder =
40
- (writer: string) => (factory: ts.NewExpression) =>
41
- StatementFactory.constant(
42
- writer,
43
- ts.factory.createCallExpression(
44
- ts.factory.createIdentifier("encoder"),
45
- undefined,
46
- [factory],
47
- ),
48
- );
49
-
50
- const block: ts.Statement[] = [
51
- StatementFactory.constant(
52
- "encoder",
53
- write_encoder(project)(importer)(collection)(meta),
54
- ),
55
- callEncoder("sizer")(
56
- ts.factory.createNewExpression(
57
- importer.use("Sizer"),
58
- undefined,
59
- [],
60
- ),
61
- ),
62
- callEncoder("writer")(
63
- ts.factory.createNewExpression(
64
- importer.use("Writer"),
65
- undefined,
66
- [ts.factory.createIdentifier("sizer")],
67
- ),
68
- ),
69
- ts.factory.createReturnStatement(
70
- ts.factory.createCallExpression(
71
- IdentifierFactory.access(WRITER())("buffer"),
72
- undefined,
73
- undefined,
74
- ),
75
- ),
76
- ];
77
-
78
- return ts.factory.createArrowFunction(
79
- undefined,
80
- undefined,
81
- [
82
- IdentifierFactory.parameter(
83
- "input",
84
- ts.factory.createTypeReferenceNode(
85
- name ??
86
- TypeFactory.getFullName(project.checker)(type),
87
- ),
88
- ),
89
- ],
90
- ts.factory.createTypeReferenceNode("Uint8Array"),
91
- undefined,
92
- ts.factory.createBlock(
93
- [...importer.declare(modulo, false), ...block],
94
- true,
95
- ),
96
- );
97
- };
98
-
99
- const write_encoder =
100
- (project: IProject) =>
101
- (importer: FunctionImporter) =>
102
- (collection: MetadataCollection) =>
103
- (meta: Metadata): ts.ArrowFunction => {
104
- const functors = collection
105
- .objects()
106
- .filter((obj) => ProtobufUtil.isStaticObject(obj))
107
- .map((obj) =>
108
- StatementFactory.constant(
109
- `${PREFIX}o${obj.index}`,
110
- write_object_function(project)(importer)(
111
- ts.factory.createIdentifier("input"),
112
- obj,
113
- {
114
- source: "function",
115
- from: "object",
116
- tracable: false,
117
- postfix: "",
118
- },
119
- ),
120
- ),
121
- );
122
- const main = decode(project)(importer)(null)(
123
- ts.factory.createIdentifier("input"),
124
- meta,
125
- {
126
- source: "top",
127
- from: "top",
128
- tracable: false,
129
- postfix: "",
130
- },
131
- [],
132
- );
133
- return ts.factory.createArrowFunction(
134
- undefined,
135
- undefined,
136
- [IdentifierFactory.parameter("writer")],
137
- TypeFactory.keyword("any"),
138
- undefined,
139
- ts.factory.createBlock(
140
- [
141
- ...importer.declareUnions(),
142
- ...functors,
143
- ...IsProgrammer.write_function_statements(project)(
144
- importer,
145
- )(collection),
146
- ...main.statements,
147
- ts.factory.createReturnStatement(
148
- ts.factory.createIdentifier("writer"),
149
- ),
150
- ],
151
- true,
152
- ),
153
- );
154
- };
155
-
156
- const write_object_function =
157
- (project: IProject) =>
158
- (importer: FunctionImporter) =>
159
- (
160
- input: ts.Expression,
161
- obj: MetadataObject,
162
- explore: FeatureProgrammer.IExplore,
163
- ): ts.ArrowFunction => {
164
- let index: number = 1;
165
- const body: ts.Statement[] = obj.properties
166
- .map((p) => {
167
- const block = decode(project)(importer)(index)(
168
- IdentifierFactory.access(input)(
169
- p.key.getSoleLiteral()!,
170
- ),
171
- p.value,
172
- explore,
173
- p.tags,
174
- );
175
- index += p.value.binarySize();
176
- return [
177
- ts.factory.createExpressionStatement(
178
- ts.factory.createIdentifier(
179
- `// property "${p.key.getSoleLiteral()!}"`,
180
- ),
181
- ),
182
- ...block.statements,
183
- ];
184
- })
185
- .flat();
186
-
187
- return ts.factory.createArrowFunction(
188
- undefined,
189
- undefined,
190
- [IdentifierFactory.parameter("input")],
191
- TypeFactory.keyword("any"),
192
- undefined,
193
- ts.factory.createBlock(body, true),
194
- );
195
- };
196
-
197
- /* -----------------------------------------------------------
198
- DECODERS
199
- ----------------------------------------------------------- */
200
- const decode =
201
- (project: IProject) =>
202
- (importer: FunctionImporter) =>
203
- (index: number | null) =>
204
- (
205
- input: ts.Expression,
206
- meta: Metadata,
207
- explore: FeatureProgrammer.IExplore,
208
- tags: IMetadataTag[],
209
- ): ts.Block => {
210
- const wrapper: (block: ts.Block) => ts.Block =
211
- meta.isRequired() && meta.nullable === false
212
- ? (block) => block
213
- : meta.isRequired() === false && meta.nullable === false
214
- ? (block) =>
215
- ts.factory.createBlock(
216
- [
217
- ts.factory.createIfStatement(
218
- ts.factory.createLogicalAnd(
219
- ts.factory.createInequality(
220
- ts.factory.createIdentifier(
221
- "undefined",
222
- ),
223
- input,
224
- ),
225
- ts.factory.createInequality(
226
- ts.factory.createNull(),
227
- input,
228
- ),
229
- ),
230
- block,
231
- ),
232
- ],
233
- true,
234
- )
235
- : meta.isRequired() === false
236
- ? (block) =>
237
- ts.factory.createBlock(
238
- [
239
- ts.factory.createIfStatement(
240
- ts.factory.createInequality(
241
- ts.factory.createIdentifier(
242
- "undefined",
243
- ),
244
- input,
245
- ),
246
- block,
247
- ),
248
- ],
249
- true,
250
- )
251
- : (block) =>
252
- ts.factory.createBlock(
253
- [
254
- ts.factory.createIfStatement(
255
- ts.factory.createInequality(
256
- ts.factory.createNull(),
257
- input,
258
- ),
259
- block,
260
- ),
261
- ],
262
- true,
263
- );
264
-
265
- // STARTS FROM ATOMIC TYPES
266
- const unions: IUnion[] = ProtobufUtil.getAtomics(meta).map(
267
- (type) => ({
268
- type,
269
- wire: () => null!,
270
- is: () =>
271
- ts.factory.createStrictEquality(
272
- ts.factory.createStringLiteral(type),
273
- ts.factory.createTypeOfExpression(input),
274
- ),
275
- value: (index) => decode_atomic(index!)(input, type, tags),
276
- }),
277
- );
278
-
279
- // CONSIDER BYTES
280
- if (meta.natives.length)
281
- unions.push({
282
- type: "bytes",
283
- is: () =>
284
- ExpressionFactory.isInstanceOf("Uint8Array")(input),
285
- value: (index) => decode_bytes("bytes")(index!)(input),
286
- });
287
-
288
- // CONSIDER ARRAYS
289
- if (meta.arrays.length)
290
- unions.push({
291
- type: "array",
292
- is: () => ExpressionFactory.isArray(input),
293
- value: (index) =>
294
- decode_array(project)(importer)(index!)(
295
- input,
296
- meta.arrays[0]!,
297
- {
298
- ...explore,
299
- from: "array",
300
- },
301
- tags,
302
- ),
303
- });
304
-
305
- // CONSIDER MAPS
306
- if (meta.maps.length)
307
- unions.push({
308
- type: "map",
309
- is: () => ExpressionFactory.isInstanceOf("Map")(input),
310
- value: (index) =>
311
- decode_map(project)(importer)(index!)(
312
- input,
313
- meta.maps[0]!,
314
- {
315
- ...explore,
316
- from: "array",
317
- },
318
- tags,
319
- ),
320
- });
321
-
322
- // CONSIDER OBJECTS
323
- if (meta.objects.length)
324
- unions.push({
325
- type: "object",
326
- is: () =>
327
- ExpressionFactory.isObject({
328
- checkNull: true,
329
- checkArray: false,
330
- })(input),
331
- value: (index) =>
332
- explore_objects(project)(importer)(0)(index)(
333
- input,
334
- meta.objects,
335
- {
336
- ...explore,
337
- from: "object",
338
- },
339
- tags,
340
- ),
341
- });
342
-
343
- // RETURNS
344
- if (unions.length === 1) return wrapper(unions[0]!.value(index));
345
- else
346
- return wrapper(
347
- iterate(importer)(index)(unions)(meta.getName())(input),
348
- );
349
- };
350
-
351
- const iterate =
352
- (importer: FunctionImporter) =>
353
- (index: number | null) =>
354
- (unions: IUnion[]) =>
355
- (expected: string) =>
356
- (input: ts.Expression) =>
357
- ts.factory.createBlock(
358
- [
359
- unions
360
- .map((u, i) =>
361
- ts.factory.createIfStatement(
362
- u.is(),
363
- u.value(index ? index + i : null),
364
- i === unions.length - 1
365
- ? create_throw_error(importer)(expected)(
366
- input,
367
- )
368
- : undefined,
369
- ),
370
- )
371
- .reverse()
372
- .reduce((a, b) =>
373
- ts.factory.createIfStatement(
374
- b.expression,
375
- b.thenStatement,
376
- a,
377
- ),
378
- ),
379
- ],
380
- true,
381
- );
382
-
383
- const decode_map =
384
- (project: IProject) =>
385
- (importer: FunctionImporter) =>
386
- (index: number) =>
387
- (
388
- input: ts.Expression,
389
- map: Metadata.Entry,
390
- explore: FeatureProgrammer.IExplore,
391
- tags: IMetadataTag[],
392
- ): ts.Block => {
393
- const each: ts.Statement[] = [
394
- ts.factory.createExpressionStatement(
395
- decode_tag(ProtobufWire.LEN)(index),
396
- ),
397
- ts.factory.createExpressionStatement(
398
- ts.factory.createCallExpression(
399
- IdentifierFactory.access(WRITER())("fork"),
400
- undefined,
401
- undefined,
402
- ),
403
- ),
404
- ...decode(project)(importer)(1)(
405
- ts.factory.createIdentifier("key"),
406
- map.key,
407
- explore,
408
- [],
409
- ).statements,
410
- ...decode(project)(importer)(2)(
411
- ts.factory.createIdentifier("value"),
412
- map.value,
413
- explore,
414
- tags,
415
- ).statements,
416
- ts.factory.createExpressionStatement(
417
- ts.factory.createCallExpression(
418
- IdentifierFactory.access(WRITER())("ldelim"),
419
- undefined,
420
- undefined,
421
- ),
422
- ),
423
- ];
424
- return ts.factory.createBlock(
425
- [
426
- ts.factory.createForOfStatement(
427
- undefined,
428
- StatementFactory.entry("key")("value"),
429
- input,
430
- ts.factory.createBlock(each),
431
- ),
432
- ],
433
- true,
434
- );
435
- };
436
-
437
- const decode_object =
438
- (project: IProject) =>
439
- (importer: FunctionImporter) =>
440
- (index: number | null) =>
441
- (
442
- input: ts.Expression,
443
- object: MetadataObject,
444
- explore: FeatureProgrammer.IExplore,
445
- tags: IMetadataTag[],
446
- ): ts.Block => {
447
- const top: MetadataProperty = object.properties[0]!;
448
- if (top.key.isSoleLiteral() === false)
449
- return decode_map(project)(importer)(index!)(
450
- ts.factory.createCallExpression(
451
- ts.factory.createIdentifier("Object.entries"),
452
- [],
453
- [input],
454
- ),
455
- top,
456
- explore,
457
- tags,
458
- );
459
- return ts.factory.createBlock(
460
- [
461
- ts.factory.createIdentifier(
462
- `//${index !== null ? ` ${index} -> ` : ""}${
463
- object.name
464
- }`,
465
- ),
466
- ...(index !== null
467
- ? [
468
- decode_tag(ProtobufWire.LEN)(index),
469
- ts.factory.createCallExpression(
470
- IdentifierFactory.access(WRITER())("fork"),
471
- undefined,
472
- undefined,
473
- ),
474
- ]
475
- : []),
476
- ts.factory.createCallExpression(
477
- ts.factory.createIdentifier(
478
- importer.useLocal(`${PREFIX}o${object.index}`),
479
- ),
480
- [],
481
- [input],
482
- ),
483
- ...(index !== null
484
- ? [
485
- ts.factory.createCallExpression(
486
- IdentifierFactory.access(WRITER())("ldelim"),
487
- undefined,
488
- undefined,
489
- ),
490
- ]
491
- : []),
492
- ].map((expr) => ts.factory.createExpressionStatement(expr)),
493
- true,
494
- );
495
- };
496
-
497
- const decode_array =
498
- (project: IProject) =>
499
- (importer: FunctionImporter) =>
500
- (index: number) =>
501
- (
502
- input: ts.Expression,
503
- array: MetadataArray,
504
- explore: FeatureProgrammer.IExplore,
505
- tags: IMetadataTag[],
506
- ): ts.Block => {
507
- const wire = get_standalone_wire(array.value, tags);
508
- const forLoop = (index: number | null) =>
509
- ts.factory.createForOfStatement(
510
- undefined,
511
- ts.factory.createVariableDeclarationList(
512
- [ts.factory.createVariableDeclaration("elem")],
513
- ts.NodeFlags.Const,
514
- ),
515
- input,
516
- decode(project)(importer)(index)(
517
- ts.factory.createIdentifier("elem"),
518
- array.value,
519
- explore,
520
- tags,
521
- ),
522
- );
523
- const length = (block: ts.Block) =>
524
- ts.factory.createBlock(
525
- [
526
- ts.factory.createIfStatement(
527
- ts.factory.createStrictInequality(
528
- ts.factory.createNumericLiteral(0),
529
- IdentifierFactory.access(input)("length"),
530
- ),
531
- block,
532
- ),
533
- ],
534
- true,
535
- );
536
-
537
- if (wire === ProtobufWire.LEN)
538
- return length(ts.factory.createBlock([forLoop(index)], true));
539
- return length(
540
- ts.factory.createBlock(
541
- [
542
- ts.factory.createExpressionStatement(
543
- decode_tag(ProtobufWire.LEN)(index),
544
- ),
545
- ts.factory.createExpressionStatement(
546
- ts.factory.createCallExpression(
547
- IdentifierFactory.access(WRITER())("fork"),
548
- undefined,
549
- undefined,
550
- ),
551
- ),
552
- forLoop(null),
553
- ts.factory.createExpressionStatement(
554
- ts.factory.createCallExpression(
555
- IdentifierFactory.access(WRITER())("ldelim"),
556
- undefined,
557
- undefined,
558
- ),
559
- ),
560
- ],
561
- true,
562
- ),
563
- );
564
- };
565
-
566
- const decode_atomic =
567
- (index: number | null) =>
568
- (
569
- input: ts.Expression,
570
- atomic: Atomic.Literal,
571
- tags: IMetadataTag[],
572
- ): ts.Block => {
573
- if (atomic === "string")
574
- return decode_bytes("string")(index!)(input);
575
-
576
- const out =
577
- (wire: ProtobufWire) =>
578
- (method: string): ts.Block =>
579
- ts.factory.createBlock(
580
- [
581
- ...(index !== null
582
- ? [decode_tag(wire)(index)]
583
- : []),
584
- ts.factory.createCallExpression(
585
- IdentifierFactory.access(WRITER())(method),
586
- undefined,
587
- [input],
588
- ),
589
- ].map((exp) =>
590
- ts.factory.createExpressionStatement(exp),
591
- ),
592
- true,
593
- );
594
- if (atomic === "boolean") return out(ProtobufWire.VARIANT)("bool");
595
-
596
- const type: IMetadataTag.INumberType | undefined = tags.find(
597
- (tag) => tag.kind === "type",
598
- ) as IMetadataTag.INumberType | undefined;
599
- if (atomic === "bigint")
600
- return out(ProtobufWire.VARIANT)(
601
- type?.value === "uint64" ? "uint64" : "int64",
602
- );
603
- else if (type === undefined) return out(ProtobufWire.I64)("double");
604
- else if (type.value === "float")
605
- return out(ProtobufWire.I32)("float");
606
- return out(ProtobufWire.VARIANT)(
607
- type.value === "uint32" || type.value === "uint"
608
- ? "uint32"
609
- : type.value === "int32" || type.value === "int"
610
- ? "int32"
611
- : type.value === "int64"
612
- ? "int64"
613
- : "uint64",
614
- );
615
- };
616
-
617
- const decode_bytes =
618
- (method: "bytes" | "string") =>
619
- (index: number) =>
620
- (input: ts.Expression): ts.Block =>
621
- ts.factory.createBlock(
622
- [
623
- decode_tag(ProtobufWire.LEN)(index),
624
- ts.factory.createCallExpression(
625
- IdentifierFactory.access(WRITER())(method),
626
- undefined,
627
- [input],
628
- ),
629
- ].map((expr) => ts.factory.createExpressionStatement(expr)),
630
- true,
631
- );
632
-
633
- const decode_tag =
634
- (wire: ProtobufWire) =>
635
- (index: number): ts.CallExpression =>
636
- ts.factory.createCallExpression(
637
- IdentifierFactory.access(WRITER())("uint32"),
638
- undefined,
639
- [ts.factory.createNumericLiteral((index << 3) | wire)],
640
- );
641
-
642
- const get_standalone_wire = (
643
- meta: Metadata,
644
- tags: IMetadataTag[],
645
- ): ProtobufWire => {
646
- if (
647
- meta.arrays.length ||
648
- meta.objects.length ||
649
- meta.maps.length ||
650
- meta.natives.length
651
- )
652
- return ProtobufWire.LEN;
653
-
654
- const v = ProtobufUtil.getAtomics(meta)[0]!;
655
- if (v === "string") return ProtobufWire.LEN;
656
- else if (v === "boolean" || v === "bigint") return ProtobufWire.VARIANT;
657
-
658
- const type: IMetadataTag.INumberType | undefined = tags.find(
659
- (t) => t.kind === "type",
660
- ) as IMetadataTag.INumberType | undefined;
661
- if (type === undefined) return ProtobufWire.I64;
662
- else if (type.value === "float") return ProtobufWire.I32;
663
- return ProtobufWire.VARIANT;
664
- };
665
-
666
- /* -----------------------------------------------------------
667
- EXPLORERS
668
- ----------------------------------------------------------- */
669
- const explore_objects =
670
- (project: IProject) =>
671
- (importer: FunctionImporter) =>
672
- (level: number) =>
673
- (index: number | null) =>
674
- (
675
- input: ts.Expression,
676
- targets: MetadataObject[],
677
- explore: FeatureProgrammer.IExplore,
678
- tags: IMetadataTag[],
679
- indexes?: Map<MetadataObject, number>,
680
- ): ts.Block => {
681
- if (targets.length === 1)
682
- return decode_object(project)(importer)(
683
- indexes ? indexes.get(targets[0]!)! : index,
684
- )(input, targets[0]!, explore, tags);
685
-
686
- const expected: string = `(${targets
687
- .map((t) => t.name)
688
- .join(" | ")})`;
689
-
690
- // POSSIBLE TO SPECIALIZE?
691
- const specList = UnionPredicator.object(targets);
692
- indexes ??= new Map(targets.map((t, i) => [t, index! + i]));
693
-
694
- if (specList.length === 0) {
695
- const condition: ts.Expression = decode_union_object(
696
- IsProgrammer.decode_object(importer),
697
- )((i, o, e) =>
698
- ExpressionFactory.selfCall(
699
- decode_object(project)(importer)(indexes!.get(o)!)(
700
- i,
701
- o,
702
- e,
703
- tags,
704
- ),
705
- ),
706
- )((expr) => expr)((value, expected) =>
707
- create_throw_error(importer)(expected)(value),
708
- )(input, targets, explore);
709
- return StatementFactory.block(condition);
710
- }
711
- const remained: MetadataObject[] = targets.filter(
712
- (t) => specList.find((s) => s.object === t) === undefined,
713
- );
714
-
715
- // DO SPECIALIZE
716
- const condition: ts.IfStatement = specList
717
- .filter((spec) => spec.property.key.getSoleLiteral() !== null)
718
- .map((spec, i, array) => {
719
- const key: string = spec.property.key.getSoleLiteral()!;
720
- const accessor: ts.Expression =
721
- IdentifierFactory.access(input)(key);
722
- const pred: ts.Expression = spec.neighbour
723
- ? IsProgrammer.decode(project)(importer)(
724
- accessor,
725
- spec.property.value,
726
- {
727
- ...explore,
728
- tracable: false,
729
- postfix: IdentifierFactory.postfix(key),
730
- },
731
- tags,
732
- [],
733
- )
734
- : ExpressionFactory.isRequired(accessor);
735
- return ts.factory.createIfStatement(
736
- pred,
737
- ts.factory.createReturnStatement(
738
- ExpressionFactory.selfCall(
739
- decode_object(project)(importer)(
740
- indexes!.get(spec.object)!,
741
- )(input, spec.object, explore, tags),
742
- ),
743
- ),
744
- i === array.length - 1
745
- ? remained.length
746
- ? ts.factory.createReturnStatement(
747
- ExpressionFactory.selfCall(
748
- explore_objects(project)(importer)(
749
- level + 1,
750
- )(index)(
751
- input,
752
- remained,
753
- explore,
754
- tags,
755
- indexes,
756
- ),
757
- ),
758
- )
759
- : create_throw_error(importer)(expected)(input)
760
- : undefined,
761
- );
762
- })
763
- .reverse()
764
- .reduce((a, b) =>
765
- ts.factory.createIfStatement(
766
- b.expression,
767
- b.thenStatement,
768
- a,
769
- ),
770
- );
771
-
772
- // RETURNS WITH CONDITIONS
773
- return ts.factory.createBlock([condition], true);
774
- };
775
-
776
- /* -----------------------------------------------------------
777
- CONFIGURATIONS
778
- ----------------------------------------------------------- */
779
- const PREFIX = "$pe";
780
-
781
- const create_throw_error =
782
- (importer: FunctionImporter) =>
783
- (expected: string) =>
784
- (value: ts.Expression) =>
785
- ts.factory.createExpressionStatement(
786
- ts.factory.createCallExpression(
787
- importer.use("throws"),
788
- [],
789
- [
790
- ts.factory.createObjectLiteralExpression(
791
- [
792
- ts.factory.createPropertyAssignment(
793
- "expected",
794
- ts.factory.createStringLiteral(expected),
795
- ),
796
- ts.factory.createPropertyAssignment(
797
- "value",
798
- value,
799
- ),
800
- ],
801
- true,
802
- ),
803
- ],
804
- ),
805
- );
806
- }
807
-
808
- const WRITER = () => ts.factory.createIdentifier("writer");
809
-
810
- interface IUnion {
811
- type: string;
812
- is: () => ts.Expression;
813
- value: (index: number | null) => ts.Block;
814
- }
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 { NumericRangeFactory } from "../../factories/NumericRangeFactory";
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 { FeatureProgrammer } from "../FeatureProgrammer";
22
+ import { IsProgrammer } from "../IsProgrammer";
23
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
24
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
25
+ import { ProtobufWire } from "../helpers/ProtobufWire";
26
+ import { UnionPredicator } from "../helpers/UnionPredicator";
27
+ import { decode_union_object } from "../internal/decode_union_object";
28
+
29
+ export namespace ProtobufEncodeProgrammer {
30
+ export const write =
31
+ (project: IProject) =>
32
+ (modulo: ts.LeftHandSideExpression) =>
33
+ (type: ts.Type, name?: string): ts.ArrowFunction => {
34
+ const importer = new FunctionImporter(modulo.getText());
35
+ const collection = new MetadataCollection();
36
+ const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
37
+ project.checker,
38
+ )(collection)(type);
39
+
40
+ const callEncoder =
41
+ (writer: string) => (factory: ts.NewExpression) =>
42
+ StatementFactory.constant(
43
+ writer,
44
+ ts.factory.createCallExpression(
45
+ ts.factory.createIdentifier("encoder"),
46
+ undefined,
47
+ [factory],
48
+ ),
49
+ );
50
+
51
+ const block: ts.Statement[] = [
52
+ StatementFactory.constant(
53
+ "encoder",
54
+ write_encoder(project)(importer)(collection)(meta),
55
+ ),
56
+ callEncoder("sizer")(
57
+ ts.factory.createNewExpression(
58
+ importer.use("Sizer"),
59
+ undefined,
60
+ [],
61
+ ),
62
+ ),
63
+ callEncoder("writer")(
64
+ ts.factory.createNewExpression(
65
+ importer.use("Writer"),
66
+ undefined,
67
+ [ts.factory.createIdentifier("sizer")],
68
+ ),
69
+ ),
70
+ ts.factory.createReturnStatement(
71
+ ts.factory.createCallExpression(
72
+ IdentifierFactory.access(WRITER())("buffer"),
73
+ undefined,
74
+ undefined,
75
+ ),
76
+ ),
77
+ ];
78
+
79
+ return ts.factory.createArrowFunction(
80
+ undefined,
81
+ undefined,
82
+ [
83
+ IdentifierFactory.parameter(
84
+ "input",
85
+ ts.factory.createTypeReferenceNode(
86
+ name ??
87
+ TypeFactory.getFullName(project.checker)(type),
88
+ ),
89
+ ),
90
+ ],
91
+ ts.factory.createTypeReferenceNode("Uint8Array"),
92
+ undefined,
93
+ ts.factory.createBlock(
94
+ [...importer.declare(modulo, false), ...block],
95
+ true,
96
+ ),
97
+ );
98
+ };
99
+
100
+ const write_encoder =
101
+ (project: IProject) =>
102
+ (importer: FunctionImporter) =>
103
+ (collection: MetadataCollection) =>
104
+ (meta: Metadata): ts.ArrowFunction => {
105
+ const functors = collection
106
+ .objects()
107
+ .filter((obj) => ProtobufUtil.isStaticObject(obj))
108
+ .map((obj) =>
109
+ StatementFactory.constant(
110
+ `${PREFIX}o${obj.index}`,
111
+ write_object_function(project)(importer)(
112
+ ts.factory.createIdentifier("input"),
113
+ obj,
114
+ {
115
+ source: "function",
116
+ from: "object",
117
+ tracable: false,
118
+ postfix: "",
119
+ },
120
+ ),
121
+ ),
122
+ );
123
+ const main = decode(project)(importer)(null)(
124
+ ts.factory.createIdentifier("input"),
125
+ meta,
126
+ {
127
+ source: "top",
128
+ from: "top",
129
+ tracable: false,
130
+ postfix: "",
131
+ },
132
+ );
133
+ return ts.factory.createArrowFunction(
134
+ undefined,
135
+ undefined,
136
+ [IdentifierFactory.parameter("writer")],
137
+ TypeFactory.keyword("any"),
138
+ undefined,
139
+ ts.factory.createBlock(
140
+ [
141
+ ...importer.declareUnions(),
142
+ ...functors,
143
+ ...IsProgrammer.write_function_statements(project)(
144
+ importer,
145
+ )(collection),
146
+ ...main.statements,
147
+ ts.factory.createReturnStatement(
148
+ ts.factory.createIdentifier("writer"),
149
+ ),
150
+ ],
151
+ true,
152
+ ),
153
+ );
154
+ };
155
+
156
+ const write_object_function =
157
+ (project: IProject) =>
158
+ (importer: FunctionImporter) =>
159
+ (
160
+ input: ts.Expression,
161
+ obj: MetadataObject,
162
+ explore: FeatureProgrammer.IExplore,
163
+ ): ts.ArrowFunction => {
164
+ let index: number = 1;
165
+ const body: ts.Statement[] = obj.properties
166
+ .map((p) => {
167
+ const block = decode(project)(importer)(index)(
168
+ IdentifierFactory.access(input)(
169
+ p.key.getSoleLiteral()!,
170
+ ),
171
+ p.value,
172
+ explore,
173
+ );
174
+ index += ProtobufUtil.size(p.value);
175
+ return [
176
+ ts.factory.createExpressionStatement(
177
+ ts.factory.createIdentifier(
178
+ `// property "${p.key.getSoleLiteral()!}"`,
179
+ ),
180
+ ),
181
+ ...block.statements,
182
+ ];
183
+ })
184
+ .flat();
185
+
186
+ return ts.factory.createArrowFunction(
187
+ undefined,
188
+ undefined,
189
+ [IdentifierFactory.parameter("input")],
190
+ TypeFactory.keyword("any"),
191
+ undefined,
192
+ ts.factory.createBlock(body, true),
193
+ );
194
+ };
195
+
196
+ /* -----------------------------------------------------------
197
+ DECODERS
198
+ ----------------------------------------------------------- */
199
+ const decode =
200
+ (project: IProject) =>
201
+ (importer: FunctionImporter) =>
202
+ (index: number | null) =>
203
+ (
204
+ input: ts.Expression,
205
+ meta: Metadata,
206
+ explore: FeatureProgrammer.IExplore,
207
+ ): ts.Block => {
208
+ const wrapper: (block: ts.Block) => ts.Block =
209
+ meta.isRequired() && meta.nullable === false
210
+ ? (block) => block
211
+ : meta.isRequired() === false && meta.nullable === true
212
+ ? (block) =>
213
+ ts.factory.createBlock(
214
+ [
215
+ ts.factory.createIfStatement(
216
+ ts.factory.createLogicalAnd(
217
+ ts.factory.createStrictInequality(
218
+ ts.factory.createIdentifier(
219
+ "undefined",
220
+ ),
221
+ input,
222
+ ),
223
+ ts.factory.createStrictInequality(
224
+ ts.factory.createNull(),
225
+ input,
226
+ ),
227
+ ),
228
+ block,
229
+ ),
230
+ ],
231
+ true,
232
+ )
233
+ : meta.isRequired() === false
234
+ ? (block) =>
235
+ ts.factory.createBlock(
236
+ [
237
+ ts.factory.createIfStatement(
238
+ ts.factory.createStrictInequality(
239
+ ts.factory.createIdentifier(
240
+ "undefined",
241
+ ),
242
+ input,
243
+ ),
244
+ block,
245
+ ),
246
+ ],
247
+ true,
248
+ )
249
+ : (block) =>
250
+ ts.factory.createBlock(
251
+ [
252
+ ts.factory.createIfStatement(
253
+ ts.factory.createStrictInequality(
254
+ ts.factory.createNull(),
255
+ input,
256
+ ),
257
+ block,
258
+ ),
259
+ ],
260
+ true,
261
+ );
262
+
263
+ // STARTS FROM ATOMIC TYPES
264
+ const unions: IUnion[] = [];
265
+ const numbers = ProtobufUtil.getNumbers(meta);
266
+ const bigints = ProtobufUtil.getBigints(meta);
267
+
268
+ for (const atom of ProtobufUtil.getAtomics(meta))
269
+ if (atom === "bool")
270
+ unions.push({
271
+ type: "bool",
272
+ is: () =>
273
+ ts.factory.createStrictEquality(
274
+ ts.factory.createStringLiteral("boolean"),
275
+ ts.factory.createTypeOfExpression(input),
276
+ ),
277
+ value: (index) => decode_bool(index)(input),
278
+ });
279
+ else if (
280
+ atom === "int32" ||
281
+ atom === "uint32" ||
282
+ atom === "float" ||
283
+ atom === "double"
284
+ )
285
+ unions.push(decode_number(project)(numbers)(atom)(input));
286
+ else if (atom === "int64" || atom === "uint64")
287
+ if (numbers.some((n) => n === atom))
288
+ unions.push(
289
+ decode_number(project)(numbers)(atom)(input),
290
+ );
291
+ else
292
+ unions.push(
293
+ decode_bigint(project)(bigints)(atom)(input),
294
+ );
295
+ else if (atom === "string")
296
+ unions.push({
297
+ type: "string",
298
+ is: () =>
299
+ ts.factory.createStrictEquality(
300
+ ts.factory.createStringLiteral("string"),
301
+ ts.factory.createTypeOfExpression(input),
302
+ ),
303
+ value: (index) => decode_bytes("string")(index!)(input),
304
+ });
305
+
306
+ // CONSIDER BYTES
307
+ if (meta.natives.length)
308
+ unions.push({
309
+ type: "bytes",
310
+ is: () =>
311
+ ExpressionFactory.isInstanceOf("Uint8Array")(input),
312
+ value: (index) => decode_bytes("bytes")(index!)(input),
313
+ });
314
+
315
+ // CONSIDER ARRAYS
316
+ if (meta.arrays.length)
317
+ unions.push({
318
+ type: "array",
319
+ is: () => ExpressionFactory.isArray(input),
320
+ value: (index) =>
321
+ decode_array(project)(importer)(index!)(
322
+ input,
323
+ meta.arrays[0]!,
324
+ {
325
+ ...explore,
326
+ from: "array",
327
+ },
328
+ ),
329
+ });
330
+
331
+ // CONSIDER MAPS
332
+ if (meta.maps.length)
333
+ unions.push({
334
+ type: "map",
335
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
336
+ value: (index) =>
337
+ decode_map(project)(importer)(index!)(
338
+ input,
339
+ meta.maps[0]!,
340
+ {
341
+ ...explore,
342
+ from: "array",
343
+ },
344
+ ),
345
+ });
346
+
347
+ // CONSIDER OBJECTS
348
+ if (meta.objects.length)
349
+ unions.push({
350
+ type: "object",
351
+ is: () =>
352
+ ExpressionFactory.isObject({
353
+ checkNull: true,
354
+ checkArray: false,
355
+ })(input),
356
+ value: (index) =>
357
+ explore_objects(project)(importer)(0)(index)(
358
+ input,
359
+ meta.objects,
360
+ {
361
+ ...explore,
362
+ from: "object",
363
+ },
364
+ ),
365
+ });
366
+
367
+ // RETURNS
368
+ // if (unions.length === 0) console.log(meta.getName());
369
+ if (unions.length === 1) return wrapper(unions[0]!.value(index));
370
+ else
371
+ return wrapper(
372
+ iterate(importer)(index)(unions)(meta.getName())(input),
373
+ );
374
+ };
375
+
376
+ const iterate =
377
+ (importer: FunctionImporter) =>
378
+ (index: number | null) =>
379
+ (unions: IUnion[]) =>
380
+ (expected: string) =>
381
+ (input: ts.Expression) =>
382
+ ts.factory.createBlock(
383
+ [
384
+ unions
385
+ .map((u, i) =>
386
+ ts.factory.createIfStatement(
387
+ u.is(),
388
+ u.value(index ? index + i : null),
389
+ i === unions.length - 1
390
+ ? create_throw_error(importer)(expected)(
391
+ input,
392
+ )
393
+ : undefined,
394
+ ),
395
+ )
396
+ .reverse()
397
+ .reduce((a, b) =>
398
+ ts.factory.createIfStatement(
399
+ b.expression,
400
+ b.thenStatement,
401
+ a,
402
+ ),
403
+ ),
404
+ ],
405
+ true,
406
+ );
407
+
408
+ const decode_map =
409
+ (project: IProject) =>
410
+ (importer: FunctionImporter) =>
411
+ (index: number) =>
412
+ (
413
+ input: ts.Expression,
414
+ map: Metadata.Entry,
415
+ explore: FeatureProgrammer.IExplore,
416
+ ): ts.Block => {
417
+ const each: ts.Statement[] = [
418
+ ts.factory.createExpressionStatement(
419
+ decode_tag(ProtobufWire.LEN)(index),
420
+ ),
421
+ ts.factory.createExpressionStatement(
422
+ ts.factory.createCallExpression(
423
+ IdentifierFactory.access(WRITER())("fork"),
424
+ undefined,
425
+ undefined,
426
+ ),
427
+ ),
428
+ ...decode(project)(importer)(1)(
429
+ ts.factory.createIdentifier("key"),
430
+ map.key,
431
+ explore,
432
+ ).statements,
433
+ ...decode(project)(importer)(2)(
434
+ ts.factory.createIdentifier("value"),
435
+ map.value,
436
+ explore,
437
+ ).statements,
438
+ ts.factory.createExpressionStatement(
439
+ ts.factory.createCallExpression(
440
+ IdentifierFactory.access(WRITER())("ldelim"),
441
+ undefined,
442
+ undefined,
443
+ ),
444
+ ),
445
+ ];
446
+ return ts.factory.createBlock(
447
+ [
448
+ ts.factory.createForOfStatement(
449
+ undefined,
450
+ StatementFactory.entry("key")("value"),
451
+ input,
452
+ ts.factory.createBlock(each),
453
+ ),
454
+ ],
455
+ true,
456
+ );
457
+ };
458
+
459
+ const decode_object =
460
+ (project: IProject) =>
461
+ (importer: FunctionImporter) =>
462
+ (index: number | null) =>
463
+ (
464
+ input: ts.Expression,
465
+ object: MetadataObject,
466
+ explore: FeatureProgrammer.IExplore,
467
+ ): ts.Block => {
468
+ const top: MetadataProperty = object.properties[0]!;
469
+ if (top.key.isSoleLiteral() === false)
470
+ return decode_map(project)(importer)(index!)(
471
+ ts.factory.createCallExpression(
472
+ ts.factory.createIdentifier("Object.entries"),
473
+ [],
474
+ [input],
475
+ ),
476
+ MetadataProperty.create({
477
+ ...top,
478
+ key: (() => {
479
+ const key: Metadata = Metadata.initialize();
480
+ key.atomics.push(
481
+ MetadataAtomic.create({
482
+ type: "string",
483
+ tags: [],
484
+ }),
485
+ );
486
+ return key;
487
+ })(),
488
+ }),
489
+ explore,
490
+ );
491
+ return ts.factory.createBlock(
492
+ [
493
+ ts.factory.createIdentifier(
494
+ `//${index !== null ? ` ${index} -> ` : ""}${
495
+ object.name
496
+ }`,
497
+ ),
498
+ ...(index !== null
499
+ ? [
500
+ decode_tag(ProtobufWire.LEN)(index),
501
+ ts.factory.createCallExpression(
502
+ IdentifierFactory.access(WRITER())("fork"),
503
+ undefined,
504
+ undefined,
505
+ ),
506
+ ]
507
+ : []),
508
+ ts.factory.createCallExpression(
509
+ ts.factory.createIdentifier(
510
+ importer.useLocal(`${PREFIX}o${object.index}`),
511
+ ),
512
+ [],
513
+ [input],
514
+ ),
515
+ ...(index !== null
516
+ ? [
517
+ ts.factory.createCallExpression(
518
+ IdentifierFactory.access(WRITER())("ldelim"),
519
+ undefined,
520
+ undefined,
521
+ ),
522
+ ]
523
+ : []),
524
+ ].map((expr) => ts.factory.createExpressionStatement(expr)),
525
+ true,
526
+ );
527
+ };
528
+
529
+ const decode_array =
530
+ (project: IProject) =>
531
+ (importer: FunctionImporter) =>
532
+ (index: number) =>
533
+ (
534
+ input: ts.Expression,
535
+ array: MetadataArray,
536
+ explore: FeatureProgrammer.IExplore,
537
+ ): ts.Block => {
538
+ const wire = get_standalone_wire(array.type.value);
539
+ const forLoop = (index: number | null) =>
540
+ ts.factory.createForOfStatement(
541
+ undefined,
542
+ ts.factory.createVariableDeclarationList(
543
+ [ts.factory.createVariableDeclaration("elem")],
544
+ ts.NodeFlags.Const,
545
+ ),
546
+ input,
547
+ decode(project)(importer)(index)(
548
+ ts.factory.createIdentifier("elem"),
549
+ array.type.value,
550
+ explore,
551
+ ),
552
+ );
553
+ const length = (block: ts.Block) =>
554
+ ts.factory.createBlock(
555
+ [
556
+ ts.factory.createIfStatement(
557
+ ts.factory.createStrictInequality(
558
+ ts.factory.createNumericLiteral(0),
559
+ IdentifierFactory.access(input)("length"),
560
+ ),
561
+ block,
562
+ ),
563
+ ],
564
+ true,
565
+ );
566
+
567
+ if (wire === ProtobufWire.LEN)
568
+ return length(ts.factory.createBlock([forLoop(index)], true));
569
+ return length(
570
+ ts.factory.createBlock(
571
+ [
572
+ ts.factory.createExpressionStatement(
573
+ decode_tag(ProtobufWire.LEN)(index),
574
+ ),
575
+ ts.factory.createExpressionStatement(
576
+ ts.factory.createCallExpression(
577
+ IdentifierFactory.access(WRITER())("fork"),
578
+ undefined,
579
+ undefined,
580
+ ),
581
+ ),
582
+ forLoop(null),
583
+ ts.factory.createExpressionStatement(
584
+ ts.factory.createCallExpression(
585
+ IdentifierFactory.access(WRITER())("ldelim"),
586
+ undefined,
587
+ undefined,
588
+ ),
589
+ ),
590
+ ],
591
+ true,
592
+ ),
593
+ );
594
+ };
595
+
596
+ const decode_bool = (index: number | null) => (input: ts.Expression) =>
597
+ ts.factory.createBlock(
598
+ [
599
+ ...(index !== null
600
+ ? [decode_tag(ProtobufWire.VARIANT)(index)]
601
+ : []),
602
+ ts.factory.createCallExpression(
603
+ IdentifierFactory.access(WRITER())("bool"),
604
+ undefined,
605
+ [input],
606
+ ),
607
+ ].map((exp) => ts.factory.createExpressionStatement(exp)),
608
+ true,
609
+ );
610
+
611
+ const decode_number =
612
+ (project: IProject) =>
613
+ (candidates: ProtobufAtomic.Numeric[]) =>
614
+ (type: ProtobufAtomic.Numeric) =>
615
+ (input: ts.Expression): IUnion => ({
616
+ type,
617
+ is: () =>
618
+ candidates.length === 1
619
+ ? ts.factory.createStrictEquality(
620
+ ts.factory.createStringLiteral("number"),
621
+ ts.factory.createTypeOfExpression(input),
622
+ )
623
+ : ts.factory.createLogicalAnd(
624
+ ts.factory.createStrictEquality(
625
+ ts.factory.createStringLiteral("number"),
626
+ ts.factory.createTypeOfExpression(input),
627
+ ),
628
+ NumericRangeFactory.number(project.context)(type)(
629
+ input,
630
+ ),
631
+ ),
632
+ value: (index) =>
633
+ ts.factory.createBlock(
634
+ [
635
+ ...(index !== null
636
+ ? [decode_tag(get_numeric_wire(type))(index)]
637
+ : []),
638
+ ts.factory.createCallExpression(
639
+ IdentifierFactory.access(WRITER())(type),
640
+ undefined,
641
+ [input],
642
+ ),
643
+ ].map((exp) => ts.factory.createExpressionStatement(exp)),
644
+ true,
645
+ ),
646
+ });
647
+
648
+ const decode_bigint =
649
+ (project: IProject) =>
650
+ (candidates: ProtobufAtomic.BigNumeric[]) =>
651
+ (type: ProtobufAtomic.BigNumeric) =>
652
+ (input: ts.Expression): IUnion => ({
653
+ type,
654
+ is: () =>
655
+ candidates.length === 1
656
+ ? ts.factory.createStrictEquality(
657
+ ts.factory.createStringLiteral("bigint"),
658
+ ts.factory.createTypeOfExpression(input),
659
+ )
660
+ : ts.factory.createLogicalAnd(
661
+ ts.factory.createStrictEquality(
662
+ ts.factory.createStringLiteral("bigint"),
663
+ ts.factory.createTypeOfExpression(input),
664
+ ),
665
+ NumericRangeFactory.bigint(project.context)(type)(
666
+ input,
667
+ ),
668
+ ),
669
+ value: (index) =>
670
+ ts.factory.createBlock(
671
+ [
672
+ ...(index !== null
673
+ ? [decode_tag(ProtobufWire.VARIANT)(index)]
674
+ : []),
675
+ ts.factory.createCallExpression(
676
+ IdentifierFactory.access(WRITER())(type),
677
+ undefined,
678
+ [input],
679
+ ),
680
+ ].map((exp) => ts.factory.createExpressionStatement(exp)),
681
+ true,
682
+ ),
683
+ });
684
+
685
+ const decode_bytes =
686
+ (method: "bytes" | "string") =>
687
+ (index: number) =>
688
+ (input: ts.Expression): ts.Block =>
689
+ ts.factory.createBlock(
690
+ [
691
+ decode_tag(ProtobufWire.LEN)(index),
692
+ ts.factory.createCallExpression(
693
+ IdentifierFactory.access(WRITER())(method),
694
+ undefined,
695
+ [input],
696
+ ),
697
+ ].map((expr) => ts.factory.createExpressionStatement(expr)),
698
+ true,
699
+ );
700
+
701
+ const decode_tag =
702
+ (wire: ProtobufWire) =>
703
+ (index: number): ts.CallExpression =>
704
+ ts.factory.createCallExpression(
705
+ IdentifierFactory.access(WRITER())("uint32"),
706
+ undefined,
707
+ [ts.factory.createNumericLiteral((index << 3) | wire)],
708
+ );
709
+
710
+ const get_standalone_wire = (meta: Metadata): ProtobufWire => {
711
+ if (
712
+ meta.arrays.length ||
713
+ meta.objects.length ||
714
+ meta.maps.length ||
715
+ meta.natives.length
716
+ )
717
+ return ProtobufWire.LEN;
718
+
719
+ const v = ProtobufUtil.getAtomics(meta)[0]!;
720
+ if (v === "string") return ProtobufWire.LEN;
721
+ else if (
722
+ v === "bool" ||
723
+ v === "int32" ||
724
+ v === "uint32" ||
725
+ v === "int64" ||
726
+ v === "uint64"
727
+ )
728
+ return ProtobufWire.VARIANT;
729
+ else if (v === "float") return ProtobufWire.I32;
730
+ return ProtobufWire.I64;
731
+ };
732
+
733
+ const get_numeric_wire = (type: ProtobufAtomic.Numeric) =>
734
+ type === "double"
735
+ ? ProtobufWire.I64
736
+ : type === "float"
737
+ ? ProtobufWire.I32
738
+ : ProtobufWire.VARIANT;
739
+
740
+ /* -----------------------------------------------------------
741
+ EXPLORERS
742
+ ----------------------------------------------------------- */
743
+ const explore_objects =
744
+ (project: IProject) =>
745
+ (importer: FunctionImporter) =>
746
+ (level: number) =>
747
+ (index: number | null) =>
748
+ (
749
+ input: ts.Expression,
750
+ targets: MetadataObject[],
751
+ explore: FeatureProgrammer.IExplore,
752
+ indexes?: Map<MetadataObject, number>,
753
+ ): ts.Block => {
754
+ if (targets.length === 1)
755
+ return decode_object(project)(importer)(
756
+ indexes ? indexes.get(targets[0]!)! : index,
757
+ )(input, targets[0]!, explore);
758
+
759
+ const expected: string = `(${targets
760
+ .map((t) => t.name)
761
+ .join(" | ")})`;
762
+
763
+ // POSSIBLE TO SPECIALIZE?
764
+ const specList = UnionPredicator.object(targets);
765
+ indexes ??= new Map(targets.map((t, i) => [t, index! + i]));
766
+
767
+ if (specList.length === 0) {
768
+ const condition: ts.Expression = decode_union_object(
769
+ IsProgrammer.decode_object(importer),
770
+ )((i, o, e) =>
771
+ ExpressionFactory.selfCall(
772
+ decode_object(project)(importer)(indexes!.get(o)!)(
773
+ i,
774
+ o,
775
+ e,
776
+ ),
777
+ ),
778
+ )((expr) => expr)((value, expected) =>
779
+ create_throw_error(importer)(expected)(value),
780
+ )(input, targets, explore);
781
+ return StatementFactory.block(condition);
782
+ }
783
+ const remained: MetadataObject[] = targets.filter(
784
+ (t) => specList.find((s) => s.object === t) === undefined,
785
+ );
786
+
787
+ // DO SPECIALIZE
788
+ const condition: ts.IfStatement = specList
789
+ .filter((spec) => spec.property.key.getSoleLiteral() !== null)
790
+ .map((spec, i, array) => {
791
+ const key: string = spec.property.key.getSoleLiteral()!;
792
+ const accessor: ts.Expression =
793
+ IdentifierFactory.access(input)(key);
794
+ const pred: ts.Expression = spec.neighbour
795
+ ? IsProgrammer.decode(project)(importer)(
796
+ accessor,
797
+ spec.property.value,
798
+ {
799
+ ...explore,
800
+ tracable: false,
801
+ postfix: IdentifierFactory.postfix(key),
802
+ },
803
+ )
804
+ : ExpressionFactory.isRequired(accessor);
805
+ return ts.factory.createIfStatement(
806
+ pred,
807
+ ts.factory.createReturnStatement(
808
+ ExpressionFactory.selfCall(
809
+ decode_object(project)(importer)(
810
+ indexes!.get(spec.object)!,
811
+ )(input, spec.object, explore),
812
+ ),
813
+ ),
814
+ i === array.length - 1
815
+ ? remained.length
816
+ ? ts.factory.createReturnStatement(
817
+ ExpressionFactory.selfCall(
818
+ explore_objects(project)(importer)(
819
+ level + 1,
820
+ )(index)(
821
+ input,
822
+ remained,
823
+ explore,
824
+ indexes!,
825
+ ),
826
+ ),
827
+ )
828
+ : create_throw_error(importer)(expected)(input)
829
+ : undefined,
830
+ );
831
+ })
832
+ .reverse()
833
+ .reduce((a, b) =>
834
+ ts.factory.createIfStatement(
835
+ b.expression,
836
+ b.thenStatement,
837
+ a,
838
+ ),
839
+ );
840
+
841
+ // RETURNS WITH CONDITIONS
842
+ return ts.factory.createBlock([condition], true);
843
+ };
844
+
845
+ /* -----------------------------------------------------------
846
+ CONFIGURATIONS
847
+ ----------------------------------------------------------- */
848
+ const PREFIX = "$pe";
849
+
850
+ const create_throw_error =
851
+ (importer: FunctionImporter) =>
852
+ (expected: string) =>
853
+ (value: ts.Expression) =>
854
+ ts.factory.createExpressionStatement(
855
+ ts.factory.createCallExpression(
856
+ importer.use("throws"),
857
+ [],
858
+ [
859
+ ts.factory.createObjectLiteralExpression(
860
+ [
861
+ ts.factory.createPropertyAssignment(
862
+ "expected",
863
+ ts.factory.createStringLiteral(expected),
864
+ ),
865
+ ts.factory.createPropertyAssignment(
866
+ "value",
867
+ value,
868
+ ),
869
+ ],
870
+ true,
871
+ ),
872
+ ],
873
+ ),
874
+ );
875
+ }
876
+
877
+ const WRITER = () => ts.factory.createIdentifier("writer");
878
+
879
+ interface IUnion {
880
+ type: string;
881
+ is: () => ts.Expression;
882
+ value: (index: number | null) => ts.Block;
883
+ }