typia 5.5.5 → 5.5.6-dev.20240319

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 (436) hide show
  1. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  2. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  3. package/lib/factories/TypeFactory.js.map +1 -1
  4. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  5. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  6. package/lib/functional/$FormDataReader/$FormDataReader.js.map +1 -1
  7. package/lib/functional/$HeadersReader/$HeadersReader.js.map +1 -1
  8. package/lib/functional/$ParameterReader/$ParameterReader.js.map +1 -1
  9. package/lib/functional/$ProtobufSizer.js.map +1 -1
  10. package/lib/functional/$QueryReader/$QueryReader.js.map +1 -1
  11. package/lib/programmers/AssertProgrammer.js +3 -1
  12. package/lib/programmers/AssertProgrammer.js.map +1 -1
  13. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  14. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  15. package/lib/programmers/IsProgrammer.js.map +1 -1
  16. package/lib/programmers/RandomProgrammer.js.map +1 -1
  17. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  18. package/lib/programmers/ValidateProgrammer.js +3 -1
  19. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  20. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  21. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  22. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  23. package/lib/programmers/internal/application_constant.js.map +1 -1
  24. package/lib/programmers/internal/application_escaped.js.map +1 -1
  25. package/lib/programmers/internal/application_object.js.map +1 -1
  26. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  27. package/lib/programmers/internal/check_number.js +2 -1
  28. package/lib/programmers/internal/check_number.js.map +1 -1
  29. package/lib/programmers/internal/check_object.js.map +1 -1
  30. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  31. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  32. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  33. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  34. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +6 -2
  35. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  36. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  37. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  38. package/lib/transformers/CallExpressionTransformer.js +1 -1
  39. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  40. package/lib/transformers/ImportTransformer.js +1 -1
  41. package/lib/transformers/ImportTransformer.js.map +1 -1
  42. package/lib/transformers/features/AssertTransformer.js.map +1 -1
  43. package/lib/transformers/features/CreateAssertTransformer.js.map +1 -1
  44. package/package.json +2 -1
  45. package/src/AssertionGuard.ts +1 -1
  46. package/src/CamelCase.ts +121 -118
  47. package/src/IRandomGenerator.ts +62 -62
  48. package/src/IValidation.ts +21 -21
  49. package/src/PascalCase.ts +121 -118
  50. package/src/Primitive.ts +136 -135
  51. package/src/Resolved.ts +119 -118
  52. package/src/SnakeCase.ts +161 -158
  53. package/src/TypeGuardError.ts +36 -36
  54. package/src/executable/TypiaGenerateWizard.ts +83 -83
  55. package/src/executable/TypiaPatchWizard.ts +42 -42
  56. package/src/executable/TypiaSetupWizard.ts +151 -151
  57. package/src/executable/setup/ArgumentParser.ts +43 -43
  58. package/src/executable/setup/CommandExecutor.ts +8 -8
  59. package/src/executable/setup/FileRetriever.ts +22 -22
  60. package/src/executable/setup/PackageManager.ts +71 -71
  61. package/src/executable/setup/PluginConfigurator.ts +69 -69
  62. package/src/executable/typia.ts +55 -55
  63. package/src/factories/CommentFactory.ts +79 -79
  64. package/src/factories/ExpressionFactory.ts +150 -150
  65. package/src/factories/IdentifierFactory.ts +70 -70
  66. package/src/factories/JsonMetadataFactory.ts +53 -53
  67. package/src/factories/LiteralFactory.ts +47 -47
  68. package/src/factories/MetadataCollection.ts +260 -260
  69. package/src/factories/MetadataCommentTagFactory.ts +461 -461
  70. package/src/factories/MetadataFactory.ts +267 -267
  71. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  72. package/src/factories/NumericRangeFactory.ts +72 -72
  73. package/src/factories/ProtobufFactory.ts +267 -267
  74. package/src/factories/StatementFactory.ts +72 -72
  75. package/src/factories/TemplateFactory.ts +56 -56
  76. package/src/factories/TypeFactory.ts +118 -118
  77. package/src/factories/ValueFactory.ts +12 -12
  78. package/src/factories/internal/metadata/MetadataHelper.ts +15 -15
  79. package/src/factories/internal/metadata/emend_metadata_atomics.ts +46 -46
  80. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  81. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +38 -38
  82. package/src/factories/internal/metadata/emplace_metadata_object.ts +176 -176
  83. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  84. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  85. package/src/factories/internal/metadata/iterate_metadata.ts +94 -94
  86. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  87. package/src/factories/internal/metadata/iterate_metadata_array.ts +70 -70
  88. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  89. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  90. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  91. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  92. package/src/factories/internal/metadata/iterate_metadata_constant.ts +48 -48
  93. package/src/factories/internal/metadata/iterate_metadata_escape.ts +52 -52
  94. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +230 -230
  95. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  96. package/src/factories/internal/metadata/iterate_metadata_native.ts +209 -209
  97. package/src/factories/internal/metadata/iterate_metadata_object.ts +33 -33
  98. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  99. package/src/factories/internal/metadata/iterate_metadata_sort.ts +72 -72
  100. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  101. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  102. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  103. package/src/functional/$FormDataReader/$FormDataReader.ts +83 -83
  104. package/src/functional/$FormDataReader/index.ts +1 -1
  105. package/src/functional/$HeadersReader/$HeadersReader.ts +26 -26
  106. package/src/functional/$HeadersReader/index.ts +1 -1
  107. package/src/functional/$ParameterReader/$ParameterReader.ts +29 -29
  108. package/src/functional/$ParameterReader/index.ts +1 -1
  109. package/src/functional/$ProtobufReader.ts +195 -195
  110. package/src/functional/$ProtobufSizer.ts +147 -147
  111. package/src/functional/$ProtobufWriter.ts +150 -150
  112. package/src/functional/$QueryReader/$QueryReader.ts +46 -46
  113. package/src/functional/$QueryReader/index.ts +1 -1
  114. package/src/functional/$any.ts +4 -4
  115. package/src/functional/$clone.ts +4 -4
  116. package/src/functional/$convention.ts +37 -37
  117. package/src/functional/$dictionary.ts +22 -22
  118. package/src/functional/$every.ts +11 -11
  119. package/src/functional/$guard.ts +21 -21
  120. package/src/functional/$is_between.ts +2 -2
  121. package/src/functional/$join.ts +46 -46
  122. package/src/functional/$number.ts +12 -12
  123. package/src/functional/$report.ts +13 -13
  124. package/src/functional/$rest.ts +3 -3
  125. package/src/functional/$stoll.ts +8 -8
  126. package/src/functional/$string.ts +43 -43
  127. package/src/functional/$strlen.ts +7 -7
  128. package/src/functional/$tail.ts +5 -5
  129. package/src/functional/$throws.ts +10 -10
  130. package/src/functional/$varint.ts +130 -130
  131. package/src/functional/$zigzag.ts +39 -39
  132. package/src/functional/IProtobufWriter.ts +18 -18
  133. package/src/functional/Namespace/functional.ts +5 -5
  134. package/src/functional/Namespace/http.ts +9 -9
  135. package/src/functional/Namespace/index.ts +76 -76
  136. package/src/functional/Namespace/json.ts +15 -15
  137. package/src/functional/Namespace/misc.ts +14 -14
  138. package/src/functional/Namespace/notations.ts +23 -23
  139. package/src/functional/Namespace/protobuf.ts +20 -20
  140. package/src/functional/is.ts +10 -10
  141. package/src/functional.ts +872 -872
  142. package/src/http.ts +1266 -1266
  143. package/src/index.ts +4 -4
  144. package/src/json.ts +754 -754
  145. package/src/misc.ts +757 -757
  146. package/src/module.ts +1024 -1024
  147. package/src/notations.ts +1020 -1020
  148. package/src/programmers/AssertProgrammer.ts +337 -335
  149. package/src/programmers/CheckerProgrammer.ts +1079 -1079
  150. package/src/programmers/FeatureProgrammer.ts +460 -460
  151. package/src/programmers/IsProgrammer.ts +235 -232
  152. package/src/programmers/RandomProgrammer.ts +888 -888
  153. package/src/programmers/TypiaProgrammer.ts +157 -157
  154. package/src/programmers/ValidateProgrammer.ts +309 -307
  155. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +130 -130
  156. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +81 -81
  157. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +77 -77
  158. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +61 -61
  159. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +73 -73
  160. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +84 -84
  161. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +113 -113
  162. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +203 -203
  163. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +107 -107
  164. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +32 -32
  165. package/src/programmers/helpers/AtomicPredicator.ts +24 -24
  166. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  167. package/src/programmers/helpers/FunctionImporeter.ts +1 -1
  168. package/src/programmers/helpers/FunctionImporter.ts +87 -87
  169. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  170. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  171. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  172. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  173. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  174. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  175. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  176. package/src/programmers/helpers/PruneJoiner.ts +141 -141
  177. package/src/programmers/helpers/RandomJoiner.ts +140 -140
  178. package/src/programmers/helpers/RandomRanger.ts +171 -171
  179. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  180. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  181. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  182. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  183. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  184. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +87 -87
  185. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +89 -89
  186. package/src/programmers/http/HttpAssertQueryProgrammer.ts +87 -87
  187. package/src/programmers/http/HttpFormDataProgrammer.ts +256 -255
  188. package/src/programmers/http/HttpHeadersProgrammer.ts +323 -322
  189. package/src/programmers/http/HttpIsFormDataProgrammer.ts +90 -90
  190. package/src/programmers/http/HttpIsHeadersProgrammer.ts +92 -92
  191. package/src/programmers/http/HttpIsQueryProgrammer.ts +90 -90
  192. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  193. package/src/programmers/http/HttpQueryProgrammer.ts +261 -260
  194. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +75 -75
  195. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +77 -77
  196. package/src/programmers/http/HttpValidateQueryProgrammer.ts +75 -75
  197. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  198. package/src/programmers/internal/application_alias.ts +74 -74
  199. package/src/programmers/internal/application_array.ts +59 -59
  200. package/src/programmers/internal/application_boolean.ts +35 -35
  201. package/src/programmers/internal/application_constant.ts +25 -25
  202. package/src/programmers/internal/application_default.ts +17 -17
  203. package/src/programmers/internal/application_default_string.ts +33 -33
  204. package/src/programmers/internal/application_escaped.ts +52 -52
  205. package/src/programmers/internal/application_native.ts +40 -40
  206. package/src/programmers/internal/application_number.ts +97 -97
  207. package/src/programmers/internal/application_object.ts +198 -198
  208. package/src/programmers/internal/application_schema.ts +165 -165
  209. package/src/programmers/internal/application_string.ts +61 -61
  210. package/src/programmers/internal/application_templates.ts +24 -24
  211. package/src/programmers/internal/application_tuple.ts +54 -54
  212. package/src/programmers/internal/check_array_length.ts +45 -45
  213. package/src/programmers/internal/check_bigint.ts +49 -49
  214. package/src/programmers/internal/check_dynamic_key.ts +174 -174
  215. package/src/programmers/internal/check_dynamic_properties.ts +211 -211
  216. package/src/programmers/internal/check_everything.ts +23 -23
  217. package/src/programmers/internal/check_native.ts +21 -21
  218. package/src/programmers/internal/check_number.ts +107 -106
  219. package/src/programmers/internal/check_object.ts +61 -60
  220. package/src/programmers/internal/check_string.ts +48 -48
  221. package/src/programmers/internal/check_template.ts +61 -61
  222. package/src/programmers/internal/check_union_array_like.ts +307 -307
  223. package/src/programmers/internal/decode_union_object.ts +99 -99
  224. package/src/programmers/internal/feature_object_entries.ts +58 -58
  225. package/src/programmers/internal/metadata_to_pattern.ts +33 -33
  226. package/src/programmers/internal/prune_object_properties.ts +60 -60
  227. package/src/programmers/internal/random_custom.ts +37 -37
  228. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  229. package/src/programmers/internal/stringify_native.ts +7 -7
  230. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  231. package/src/programmers/internal/template_to_pattern.ts +15 -15
  232. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  233. package/src/programmers/json/JsonApplicationProgrammer.ts +76 -76
  234. package/src/programmers/json/JsonAssertParseProgrammer.ts +81 -81
  235. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +67 -67
  236. package/src/programmers/json/JsonIsParseProgrammer.ts +81 -81
  237. package/src/programmers/json/JsonIsStringifyProgrammer.ts +75 -75
  238. package/src/programmers/json/JsonStringifyProgrammer.ts +900 -896
  239. package/src/programmers/json/JsonValidateParseProgrammer.ts +64 -64
  240. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +83 -83
  241. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +77 -77
  242. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +66 -66
  243. package/src/programmers/misc/MiscCloneProgrammer.ts +721 -721
  244. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  245. package/src/programmers/misc/MiscIsPruneProgrammer.ts +66 -66
  246. package/src/programmers/misc/MiscLiteralsProgrammer.ts +72 -72
  247. package/src/programmers/misc/MiscPruneProgrammer.ts +523 -523
  248. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +80 -80
  249. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +73 -73
  250. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +70 -70
  251. package/src/programmers/notations/NotationGeneralProgrammer.ts +647 -647
  252. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +71 -71
  253. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +81 -81
  254. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +87 -87
  255. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +67 -67
  256. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +619 -615
  257. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +819 -819
  258. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +90 -90
  259. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +75 -75
  260. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  261. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  262. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +83 -83
  263. package/src/protobuf.ts +999 -999
  264. package/src/reflect.ts +57 -57
  265. package/src/schemas/json/IJsonApplication.ts +9 -9
  266. package/src/schemas/json/IJsonComponents.ts +19 -19
  267. package/src/schemas/json/IJsonSchema.ts +147 -147
  268. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  269. package/src/schemas/metadata/IMetadata.ts +34 -34
  270. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  271. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  272. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  273. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  274. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  275. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  276. package/src/schemas/metadata/IMetadataConstant.ts +23 -23
  277. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  278. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  279. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  280. package/src/schemas/metadata/IMetadataObject.ts +13 -13
  281. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  282. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  283. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  284. package/src/schemas/metadata/IMetadataTypeTag.ts +15 -15
  285. package/src/schemas/metadata/Metadata.ts +631 -631
  286. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  287. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  288. package/src/schemas/metadata/MetadataArray.ts +49 -49
  289. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  290. package/src/schemas/metadata/MetadataAtomic.ts +84 -84
  291. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  292. package/src/schemas/metadata/MetadataConstant.ts +46 -46
  293. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  294. package/src/schemas/metadata/MetadataObject.ts +154 -154
  295. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  296. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  297. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  298. package/src/tags/Default.ts +15 -15
  299. package/src/tags/ExclusiveMaximum.ts +13 -13
  300. package/src/tags/ExclusiveMinimum.ts +13 -13
  301. package/src/tags/Format.ts +13 -13
  302. package/src/tags/MaxItems.ts +9 -9
  303. package/src/tags/MaxLength.ts +9 -9
  304. package/src/tags/Maximum.ts +13 -13
  305. package/src/tags/MinItems.ts +9 -9
  306. package/src/tags/MinLength.ts +9 -9
  307. package/src/tags/Minimum.ts +13 -13
  308. package/src/tags/MultipleOf.ts +15 -15
  309. package/src/tags/Pattern.ts +9 -9
  310. package/src/tags/TagBase.ts +68 -68
  311. package/src/tags/Type.ts +27 -27
  312. package/src/tags/index.ts +14 -14
  313. package/src/tags/internal/FormatCheatSheet.ts +71 -71
  314. package/src/transform.ts +35 -35
  315. package/src/transformers/CallExpressionTransformer.ts +496 -496
  316. package/src/transformers/FileTransformer.ts +91 -91
  317. package/src/transformers/IProject.ts +15 -15
  318. package/src/transformers/ITransformOptions.ts +62 -62
  319. package/src/transformers/ImportTransformer.ts +66 -66
  320. package/src/transformers/NodeTransformer.ts +13 -13
  321. package/src/transformers/TransformerError.ts +55 -55
  322. package/src/transformers/features/AssertTransformer.ts +16 -16
  323. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  324. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  325. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  326. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  327. package/src/transformers/features/IsTransformer.ts +10 -10
  328. package/src/transformers/features/RandomTransformer.ts +44 -44
  329. package/src/transformers/features/ValidateTransformer.ts +11 -11
  330. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +55 -55
  331. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +12 -12
  332. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  333. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  334. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +9 -9
  335. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  336. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +9 -9
  337. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  338. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  339. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  340. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  341. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +12 -12
  342. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  343. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  344. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +10 -10
  345. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  346. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  347. package/src/transformers/features/http/HttpFormDataTransformer.ts +9 -9
  348. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  349. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +9 -9
  350. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  351. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  352. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  353. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  354. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +10 -10
  355. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  356. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  357. package/src/transformers/features/json/JsonApplicationTransformer.ts +133 -133
  358. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  359. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  360. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  361. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  362. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  363. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  364. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  365. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  366. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  367. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  368. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  369. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  370. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  371. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  372. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  373. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  374. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  375. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  376. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  377. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  378. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  379. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  380. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  381. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  382. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  383. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  384. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  385. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  386. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  387. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  388. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  389. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  390. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  391. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  392. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  393. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  394. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  395. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  396. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  397. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  398. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  399. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  400. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  401. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  402. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  403. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  404. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  405. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  406. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  407. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  408. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  409. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  410. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  411. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  412. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  413. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  414. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +63 -63
  415. package/src/transformers/internal/GenericTransformer.ts +104 -104
  416. package/src/typings/Atomic.ts +13 -13
  417. package/src/typings/ClassProperties.ts +5 -5
  418. package/src/typings/Customizable.ts +5 -5
  419. package/src/typings/OmitNever.ts +3 -3
  420. package/src/typings/ProtobufAtomic.ts +19 -19
  421. package/src/typings/SpecialFields.ts +3 -3
  422. package/src/typings/ValidationPipe.ts +9 -9
  423. package/src/typings/Writable.ts +11 -11
  424. package/src/typings/path.d.ts +6 -0
  425. package/src/utils/ArrayUtil.ts +43 -43
  426. package/src/utils/Escaper.ts +46 -46
  427. package/src/utils/MapUtil.ts +12 -12
  428. package/src/utils/NameEncoder.ts +32 -32
  429. package/src/utils/NamingConvention/NamingConvention.ts +86 -86
  430. package/src/utils/NamingConvention/index.ts +1 -1
  431. package/src/utils/PatternUtil.ts +29 -29
  432. package/src/utils/RandomGenerator/RandomGenerator.ts +105 -105
  433. package/src/utils/RandomGenerator/index.ts +1 -1
  434. package/src/utils/Singleton.ts +16 -16
  435. package/src/utils/StringUtil/StringUtil.ts +7 -7
  436. package/src/utils/StringUtil/index.ts +1 -1
@@ -1,615 +1,619 @@
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/FunctionImporter";
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(modulo.getText());
30
- const collection: MetadataCollection = new MetadataCollection();
31
- const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
32
- project.checker,
33
- project.context,
34
- )(collection)(type);
35
-
36
- const functors = collection
37
- .objects()
38
- .filter((obj) => ProtobufUtil.isStaticObject(obj))
39
- .map((obj) =>
40
- StatementFactory.constant(
41
- `${PREFIX}o${obj.index}`,
42
- write_object_function(project)(importer)(obj),
43
- ),
44
- );
45
- const reader = StatementFactory.constant(
46
- "reader",
47
- ts.factory.createNewExpression(importer.use("Reader"), undefined, [
48
- ts.factory.createIdentifier("input"),
49
- ]),
50
- );
51
-
52
- return ts.factory.createArrowFunction(
53
- undefined,
54
- undefined,
55
- [
56
- IdentifierFactory.parameter(
57
- "input",
58
- ts.factory.createTypeReferenceNode("Uint8Array"),
59
- ),
60
- ],
61
- ts.factory.createImportTypeNode(
62
- ts.factory.createLiteralTypeNode(
63
- ts.factory.createStringLiteral("typia"),
64
- ),
65
- undefined,
66
- ts.factory.createIdentifier("Resolved"),
67
- [
68
- ts.factory.createTypeReferenceNode(
69
- name ?? TypeFactory.getFullName(project.checker)(type),
70
- ),
71
- ],
72
- false,
73
- ),
74
- undefined,
75
- ts.factory.createBlock(
76
- [
77
- ...importer.declare(modulo),
78
- ...functors,
79
- reader,
80
- ts.factory.createReturnStatement(
81
- decode_regular_object(true)(meta.objects[0]!),
82
- ),
83
- ],
84
- true,
85
- ),
86
- );
87
- };
88
-
89
- const write_object_function =
90
- (project: IProject) =>
91
- (importer: FunctionImporter) =>
92
- (obj: MetadataObject): ts.ArrowFunction =>
93
- ts.factory.createArrowFunction(
94
- undefined,
95
- undefined,
96
- [
97
- IdentifierFactory.parameter("reader"),
98
- IdentifierFactory.parameter(
99
- "length",
100
- TypeFactory.keyword("number"),
101
- ExpressionFactory.number(-1),
102
- ),
103
- ],
104
- TypeFactory.keyword("any"),
105
- undefined,
106
- ts.factory.createBlock(
107
- [
108
- ts.factory.createExpressionStatement(
109
- ts.factory.createBinaryExpression(
110
- ts.factory.createIdentifier("length"),
111
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
112
- ts.factory.createConditionalExpression(
113
- ts.factory.createLessThan(
114
- ts.factory.createIdentifier("length"),
115
- ExpressionFactory.number(0),
116
- ),
117
- undefined,
118
- ts.factory.createCallExpression(
119
- IdentifierFactory.access(READER())("size"),
120
- undefined,
121
- undefined,
122
- ),
123
- undefined,
124
- ts.factory.createAdd(
125
- ts.factory.createCallExpression(
126
- IdentifierFactory.access(READER())("index"),
127
- undefined,
128
- undefined,
129
- ),
130
- ts.factory.createIdentifier("length"),
131
- ),
132
- ),
133
- ),
134
- ),
135
- ...write_object_function_body(project)(importer)({
136
- condition: ts.factory.createLessThan(
137
- ts.factory.createCallExpression(
138
- IdentifierFactory.access(READER())("index"),
139
- undefined,
140
- undefined,
141
- ),
142
- ts.factory.createIdentifier("length"),
143
- ),
144
- tag: "tag",
145
- output: "output",
146
- })(obj.properties),
147
- ts.factory.createReturnStatement(
148
- ts.factory.createIdentifier("output"),
149
- ),
150
- ],
151
- true,
152
- ),
153
- );
154
-
155
- const write_object_function_body =
156
- (project: IProject) =>
157
- (importer: FunctionImporter) =>
158
- (props: { condition: ts.Expression; tag: string; output: string }) =>
159
- (properties: MetadataProperty[]): ts.Statement[] => {
160
- let i: number = 1;
161
- const clauses: ts.CaseClause[] = properties
162
- .map((p) => {
163
- const clause = decode_property(project)(importer)(i)(
164
- IdentifierFactory.access(ts.factory.createIdentifier(props.output))(
165
- p.key.getSoleLiteral()!,
166
- ),
167
- p.value,
168
- );
169
- i += ProtobufUtil.size(p.value);
170
- return clause;
171
- })
172
- .flat();
173
- return [
174
- StatementFactory.constant(
175
- props.output,
176
- ts.factory.createAsExpression(
177
- ts.factory.createObjectLiteralExpression(
178
- properties
179
- .filter(
180
- (p) =>
181
- !(
182
- project.compilerOptions.exactOptionalPropertyTypes ===
183
- true && p.value.optional === true
184
- ),
185
- )
186
- .map((p) =>
187
- ts.factory.createPropertyAssignment(
188
- IdentifierFactory.identifier(p.key.getSoleLiteral()!),
189
- write_property_default_value(p.value),
190
- ),
191
- ),
192
- true,
193
- ),
194
- TypeFactory.keyword("any"),
195
- ),
196
- ),
197
- ts.factory.createWhileStatement(
198
- props.condition,
199
- ts.factory.createBlock([
200
- StatementFactory.constant(
201
- props.tag,
202
- ts.factory.createCallExpression(
203
- IdentifierFactory.access(READER())("uint32"),
204
- undefined,
205
- undefined,
206
- ),
207
- ),
208
- ts.factory.createSwitchStatement(
209
- ts.factory.createUnsignedRightShift(
210
- ts.factory.createIdentifier(props.tag),
211
- ExpressionFactory.number(3),
212
- ),
213
- ts.factory.createCaseBlock([
214
- ...clauses,
215
- ts.factory.createDefaultClause([
216
- ts.factory.createExpressionStatement(
217
- ts.factory.createCallExpression(
218
- IdentifierFactory.access(READER())("skipType"),
219
- undefined,
220
- [
221
- ts.factory.createBitwiseAnd(
222
- ts.factory.createIdentifier(props.tag),
223
- ExpressionFactory.number(7),
224
- ),
225
- ],
226
- ),
227
- ),
228
- ts.factory.createBreakStatement(),
229
- ]),
230
- ]),
231
- ),
232
- ]),
233
- ),
234
- ];
235
- };
236
-
237
- const write_property_default_value = (value: Metadata) =>
238
- ts.factory.createAsExpression(
239
- value.nullable
240
- ? ts.factory.createNull()
241
- : value.isRequired() === false
242
- ? ts.factory.createIdentifier("undefined")
243
- : value.arrays.length
244
- ? ts.factory.createArrayLiteralExpression()
245
- : value.maps.length
246
- ? ts.factory.createNewExpression(
247
- ts.factory.createIdentifier("Map"),
248
- undefined,
249
- [],
250
- )
251
- : value.natives.length
252
- ? ts.factory.createNewExpression(
253
- ts.factory.createIdentifier("Uint8Array"),
254
- undefined,
255
- [],
256
- )
257
- : value.atomics.some((a) => a.type === "string") ||
258
- value.constants.some(
259
- (c) => c.type === "string" && c.values.some((v) => v === ""),
260
- ) ||
261
- value.templates.some(
262
- (tpl) => 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 = (name: string) => (v: ts.Expression | ts.Statement[]) =>
285
- clauses.push(
286
- ts.factory.createCaseClause(
287
- ExpressionFactory.number(index++),
288
- Array.isArray(v)
289
- ? [
290
- ts.factory.createExpressionStatement(
291
- ts.factory.createIdentifier(`// type: ${name}`),
292
- ),
293
- ...v,
294
- ts.factory.createBreakStatement(),
295
- ]
296
- : [
297
- ts.factory.createExpressionStatement(
298
- ts.factory.createIdentifier(`// ${name}`),
299
- ),
300
- ts.factory.createExpressionStatement(
301
- ts.factory.createBinaryExpression(
302
- accessor,
303
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
304
- v,
305
- ),
306
- ),
307
- ts.factory.createBreakStatement(),
308
- ],
309
- ),
310
- );
311
-
312
- const required: boolean = meta.isRequired() && !meta.nullable;
313
- for (const atomic of ProtobufUtil.getAtomics(meta))
314
- emplace(atomic)(decode_atomic(meta)(atomic));
315
- if (meta.natives.length) emplace("bytes")(decode_bytes("bytes"));
316
- for (const array of meta.arrays)
317
- emplace(`Array<${array.type.value.getName()}>`)(
318
- decode_array(accessor, array, required),
319
- );
320
- for (const map of meta.maps)
321
- emplace(`Map<string, ${map.value.getName()}>`)(
322
- decode_map(project)(importer)(accessor, map, required),
323
- );
324
- for (const obj of meta.objects)
325
- emplace(obj.name)(
326
- ProtobufUtil.isStaticObject(obj)
327
- ? decode_regular_object(false)(obj)
328
- : decode_dynamic_object(project)(importer)(accessor, obj, required),
329
- );
330
- return clauses;
331
- };
332
-
333
- const decode_atomic =
334
- (meta: Metadata) =>
335
- (atomic: ProtobufAtomic): ts.Expression => {
336
- if (atomic === "string") return decode_bytes("string");
337
-
338
- const call: ts.CallExpression = ts.factory.createCallExpression(
339
- IdentifierFactory.access(ts.factory.createIdentifier("reader"))(atomic),
340
- undefined,
341
- undefined,
342
- );
343
- if (atomic !== "int64" && atomic !== "uint64") return call;
344
-
345
- const isNumber: boolean = ProtobufUtil.getNumbers(meta).some(
346
- (n) => n === atomic,
347
- );
348
- return isNumber
349
- ? ts.factory.createCallExpression(
350
- ts.factory.createIdentifier("Number"),
351
- undefined,
352
- [call],
353
- )
354
- : call;
355
- };
356
-
357
- const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
358
- ts.factory.createCallExpression(
359
- IdentifierFactory.access(ts.factory.createIdentifier("reader"))(method),
360
- undefined,
361
- undefined,
362
- );
363
-
364
- const decode_array = (
365
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
366
- array: MetadataArray,
367
- required: boolean,
368
- ): ts.Statement[] => {
369
- const statements: Array<ts.Expression | ts.Statement> = [];
370
- if (required === false)
371
- statements.push(
372
- ts.factory.createBinaryExpression(
373
- accessor,
374
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
375
- ts.factory.createAsExpression(
376
- ts.factory.createArrayLiteralExpression(),
377
- ts.factory.createTypeReferenceNode("any[]"),
378
- ),
379
- ),
380
- );
381
- const atomics = ProtobufUtil.getAtomics(array.type.value);
382
- const decoder = atomics.length
383
- ? () => decode_atomic(array.type.value)(atomics[0]!)
384
- : array.type.value.natives.length
385
- ? () => decode_bytes("bytes")
386
- : array.type.value.objects.length
387
- ? () => decode_regular_object(false)(array.type.value.objects[0]!)
388
- : null;
389
- if (decoder === null) throw new Error("Never reach here.");
390
- else if (atomics.length && atomics[0] !== "string") {
391
- statements.push(
392
- ts.factory.createIfStatement(
393
- ts.factory.createStrictEquality(
394
- ExpressionFactory.number(2),
395
- ts.factory.createBitwiseAnd(
396
- ts.factory.createIdentifier("tag"),
397
- ExpressionFactory.number(7),
398
- ),
399
- ),
400
- ts.factory.createBlock(
401
- [
402
- StatementFactory.constant(
403
- "piece",
404
- ts.factory.createAdd(
405
- ts.factory.createCallExpression(
406
- IdentifierFactory.access(READER())("uint32"),
407
- undefined,
408
- undefined,
409
- ),
410
- ts.factory.createCallExpression(
411
- IdentifierFactory.access(READER())("index"),
412
- undefined,
413
- undefined,
414
- ),
415
- ),
416
- ),
417
- ts.factory.createWhileStatement(
418
- ts.factory.createLessThan(
419
- ts.factory.createCallExpression(
420
- IdentifierFactory.access(READER())("index"),
421
- undefined,
422
- undefined,
423
- ),
424
- ts.factory.createIdentifier("piece"),
425
- ),
426
- ts.factory.createExpressionStatement(
427
- ts.factory.createCallExpression(
428
- IdentifierFactory.access(accessor)("push"),
429
- undefined,
430
- [decoder()],
431
- ),
432
- ),
433
- ),
434
- ],
435
- true,
436
- ),
437
- ts.factory.createExpressionStatement(
438
- ts.factory.createCallExpression(
439
- IdentifierFactory.access(accessor)("push"),
440
- undefined,
441
- [decoder()],
442
- ),
443
- ),
444
- ),
445
- );
446
- } else
447
- statements.push(
448
- ts.factory.createCallExpression(
449
- IdentifierFactory.access(accessor)("push"),
450
- undefined,
451
- [decoder()],
452
- ),
453
- );
454
- return statements.map((stmt) =>
455
- ts.isExpression(stmt) ? ts.factory.createExpressionStatement(stmt) : stmt,
456
- );
457
- };
458
-
459
- const decode_regular_object =
460
- (top: boolean) =>
461
- (obj: MetadataObject): ts.Expression =>
462
- ts.factory.createCallExpression(
463
- ts.factory.createIdentifier(`${PREFIX}o${obj.index}`),
464
- undefined,
465
- [
466
- ts.factory.createIdentifier("reader"),
467
- ...(top
468
- ? []
469
- : [
470
- ts.factory.createCallExpression(
471
- IdentifierFactory.access(READER())("uint32"),
472
- undefined,
473
- undefined,
474
- ),
475
- ]),
476
- ],
477
- );
478
-
479
- const decode_dynamic_object =
480
- (project: IProject) =>
481
- (importer: FunctionImporter) =>
482
- (
483
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
484
- obj: MetadataObject,
485
- required: boolean,
486
- ): ts.Statement[] => {
487
- const top = obj.properties[0]!;
488
- return decode_entry(project)(importer)({
489
- initializer: () =>
490
- ts.factory.createBinaryExpression(
491
- accessor,
492
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
493
- ts.factory.createObjectLiteralExpression(),
494
- ),
495
- setter: () =>
496
- ts.factory.createBinaryExpression(
497
- ts.factory.createElementAccessExpression(
498
- accessor,
499
- ts.factory.createIdentifier("entry.key"),
500
- ),
501
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
502
- ts.factory.createIdentifier("entry.value"),
503
- ),
504
- })(
505
- MetadataProperty.create({
506
- ...top,
507
- key: (() => {
508
- const key: Metadata = Metadata.initialize();
509
- key.atomics.push(
510
- MetadataAtomic.create({
511
- type: "string",
512
- tags: [],
513
- }),
514
- );
515
- return key;
516
- })(),
517
- }),
518
- required,
519
- );
520
- };
521
-
522
- const decode_map =
523
- (project: IProject) =>
524
- (importer: FunctionImporter) =>
525
- (
526
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
527
- map: Metadata.Entry,
528
- required: boolean,
529
- ): ts.Statement[] =>
530
- decode_entry(project)(importer)({
531
- initializer: () =>
532
- ts.factory.createBinaryExpression(
533
- accessor,
534
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
535
- ts.factory.createNewExpression(
536
- ts.factory.createIdentifier("Map"),
537
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
538
- [],
539
- ),
540
- ),
541
- setter: () =>
542
- ts.factory.createCallExpression(
543
- IdentifierFactory.access(accessor)("set"),
544
- undefined,
545
- [
546
- ts.factory.createIdentifier("entry.key"),
547
- ts.factory.createIdentifier("entry.value"),
548
- ],
549
- ),
550
- })(map, required);
551
-
552
- const decode_entry =
553
- (project: IProject) =>
554
- (importer: FunctionImporter) =>
555
- (props: {
556
- initializer: () => ts.Expression;
557
- setter: () => ts.Expression;
558
- }) =>
559
- (map: Metadata.Entry, required: boolean): ts.Statement[] => {
560
- const statements: ts.Statement[] = [
561
- ...(required
562
- ? []
563
- : [ts.factory.createExpressionStatement(props.initializer())]),
564
- StatementFactory.constant(
565
- "piece",
566
- ts.factory.createAdd(
567
- ts.factory.createCallExpression(
568
- IdentifierFactory.access(READER())("uint32"),
569
- undefined,
570
- undefined,
571
- ),
572
- ts.factory.createCallExpression(
573
- IdentifierFactory.access(READER())("index"),
574
- undefined,
575
- undefined,
576
- ),
577
- ),
578
- ),
579
- ...write_object_function_body(project)(importer)({
580
- condition: ts.factory.createLessThan(
581
- ts.factory.createCallExpression(
582
- IdentifierFactory.access(READER())("index"),
583
- undefined,
584
- undefined,
585
- ),
586
- ts.factory.createIdentifier("piece"),
587
- ),
588
- tag: "kind",
589
- output: "entry",
590
- })([
591
- MetadataProperty.create({
592
- key: MetadataFactory.soleLiteral("key"),
593
- value: map.key,
594
- description: null,
595
- jsDocTags: [],
596
- }),
597
- MetadataProperty.create({
598
- key: MetadataFactory.soleLiteral("value"),
599
- value: map.value,
600
- description: null,
601
- jsDocTags: [],
602
- }),
603
- ]),
604
- ts.factory.createExpressionStatement(props.setter()),
605
- ];
606
- return [
607
- ts.factory.createExpressionStatement(
608
- ExpressionFactory.selfCall(ts.factory.createBlock(statements, true)),
609
- ),
610
- ];
611
- };
612
- }
613
-
614
- const PREFIX = "$pd";
615
- 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/FunctionImporter";
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(modulo.getText());
30
+ const collection: MetadataCollection = new MetadataCollection();
31
+ const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
32
+ project.checker,
33
+ project.context,
34
+ )(collection)(type);
35
+
36
+ const functors = collection
37
+ .objects()
38
+ .filter((obj) => ProtobufUtil.isStaticObject(obj))
39
+ .map((obj) =>
40
+ StatementFactory.constant(
41
+ `${PREFIX}o${obj.index}`,
42
+ write_object_function(project)(importer)(obj),
43
+ ),
44
+ );
45
+ const reader = StatementFactory.constant(
46
+ "reader",
47
+ ts.factory.createNewExpression(importer.use("Reader"), undefined, [
48
+ ts.factory.createIdentifier("input"),
49
+ ]),
50
+ );
51
+
52
+ return ts.factory.createArrowFunction(
53
+ undefined,
54
+ undefined,
55
+ [
56
+ IdentifierFactory.parameter(
57
+ "input",
58
+ ts.factory.createTypeReferenceNode("Uint8Array"),
59
+ ),
60
+ ],
61
+ ts.factory.createImportTypeNode(
62
+ ts.factory.createLiteralTypeNode(
63
+ ts.factory.createStringLiteral("typia"),
64
+ ),
65
+ undefined,
66
+ ts.factory.createIdentifier("Resolved"),
67
+ [
68
+ ts.factory.createTypeReferenceNode(
69
+ name ?? TypeFactory.getFullName(project.checker)(type),
70
+ ),
71
+ ],
72
+ false,
73
+ ),
74
+ undefined,
75
+ ts.factory.createBlock(
76
+ [
77
+ ...importer.declare(modulo),
78
+ ...functors,
79
+ reader,
80
+ ts.factory.createReturnStatement(
81
+ decode_regular_object(true)(meta.objects[0]!),
82
+ ),
83
+ ],
84
+ true,
85
+ ),
86
+ );
87
+ };
88
+
89
+ const write_object_function =
90
+ (project: IProject) =>
91
+ (importer: FunctionImporter) =>
92
+ (obj: MetadataObject): ts.ArrowFunction =>
93
+ ts.factory.createArrowFunction(
94
+ undefined,
95
+ undefined,
96
+ [
97
+ IdentifierFactory.parameter("reader"),
98
+ IdentifierFactory.parameter(
99
+ "length",
100
+ TypeFactory.keyword("number"),
101
+ ExpressionFactory.number(-1),
102
+ ),
103
+ ],
104
+ TypeFactory.keyword("any"),
105
+ undefined,
106
+ ts.factory.createBlock(
107
+ [
108
+ ts.factory.createExpressionStatement(
109
+ ts.factory.createBinaryExpression(
110
+ ts.factory.createIdentifier("length"),
111
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
112
+ ts.factory.createConditionalExpression(
113
+ ts.factory.createLessThan(
114
+ ts.factory.createIdentifier("length"),
115
+ ExpressionFactory.number(0),
116
+ ),
117
+ undefined,
118
+ ts.factory.createCallExpression(
119
+ IdentifierFactory.access(READER())("size"),
120
+ undefined,
121
+ undefined,
122
+ ),
123
+ undefined,
124
+ ts.factory.createAdd(
125
+ ts.factory.createCallExpression(
126
+ IdentifierFactory.access(READER())("index"),
127
+ undefined,
128
+ undefined,
129
+ ),
130
+ ts.factory.createIdentifier("length"),
131
+ ),
132
+ ),
133
+ ),
134
+ ),
135
+ ...write_object_function_body(project)(importer)({
136
+ condition: ts.factory.createLessThan(
137
+ ts.factory.createCallExpression(
138
+ IdentifierFactory.access(READER())("index"),
139
+ undefined,
140
+ undefined,
141
+ ),
142
+ ts.factory.createIdentifier("length"),
143
+ ),
144
+ tag: "tag",
145
+ output: "output",
146
+ })(obj.properties),
147
+ ts.factory.createReturnStatement(
148
+ ts.factory.createIdentifier("output"),
149
+ ),
150
+ ],
151
+ true,
152
+ ),
153
+ );
154
+
155
+ const write_object_function_body =
156
+ (project: IProject) =>
157
+ (importer: FunctionImporter) =>
158
+ (props: { condition: ts.Expression; tag: string; output: string }) =>
159
+ (properties: MetadataProperty[]): ts.Statement[] => {
160
+ let i: number = 1;
161
+ const clauses: ts.CaseClause[] = properties
162
+ .map((p) => {
163
+ const clause = decode_property(project)(importer)(i)(
164
+ IdentifierFactory.access(ts.factory.createIdentifier(props.output))(
165
+ p.key.getSoleLiteral()!,
166
+ ),
167
+ p.value,
168
+ );
169
+ i += ProtobufUtil.size(p.value);
170
+ return clause;
171
+ })
172
+ .flat();
173
+ return [
174
+ StatementFactory.constant(
175
+ props.output,
176
+ ts.factory.createAsExpression(
177
+ ts.factory.createObjectLiteralExpression(
178
+ properties
179
+ .filter(
180
+ (p) =>
181
+ !(
182
+ project.compilerOptions.exactOptionalPropertyTypes ===
183
+ true && p.value.optional === true
184
+ ),
185
+ )
186
+ .map((p) =>
187
+ ts.factory.createPropertyAssignment(
188
+ IdentifierFactory.identifier(p.key.getSoleLiteral()!),
189
+ write_property_default_value(p.value),
190
+ ),
191
+ ),
192
+ true,
193
+ ),
194
+ TypeFactory.keyword("any"),
195
+ ),
196
+ ),
197
+ ts.factory.createWhileStatement(
198
+ props.condition,
199
+ ts.factory.createBlock([
200
+ StatementFactory.constant(
201
+ props.tag,
202
+ ts.factory.createCallExpression(
203
+ IdentifierFactory.access(READER())("uint32"),
204
+ undefined,
205
+ undefined,
206
+ ),
207
+ ),
208
+ ts.factory.createSwitchStatement(
209
+ ts.factory.createUnsignedRightShift(
210
+ ts.factory.createIdentifier(props.tag),
211
+ ExpressionFactory.number(3),
212
+ ),
213
+ ts.factory.createCaseBlock([
214
+ ...clauses,
215
+ ts.factory.createDefaultClause([
216
+ ts.factory.createExpressionStatement(
217
+ ts.factory.createCallExpression(
218
+ IdentifierFactory.access(READER())("skipType"),
219
+ undefined,
220
+ [
221
+ ts.factory.createBitwiseAnd(
222
+ ts.factory.createIdentifier(props.tag),
223
+ ExpressionFactory.number(7),
224
+ ),
225
+ ],
226
+ ),
227
+ ),
228
+ ts.factory.createBreakStatement(),
229
+ ]),
230
+ ]),
231
+ ),
232
+ ]),
233
+ ),
234
+ ];
235
+ };
236
+
237
+ const write_property_default_value = (value: Metadata) =>
238
+ ts.factory.createAsExpression(
239
+ value.nullable
240
+ ? ts.factory.createNull()
241
+ : value.isRequired() === false
242
+ ? ts.factory.createIdentifier("undefined")
243
+ : value.arrays.length
244
+ ? ts.factory.createArrayLiteralExpression()
245
+ : value.maps.length
246
+ ? ts.factory.createNewExpression(
247
+ ts.factory.createIdentifier("Map"),
248
+ undefined,
249
+ [],
250
+ )
251
+ : value.natives.length
252
+ ? ts.factory.createNewExpression(
253
+ ts.factory.createIdentifier("Uint8Array"),
254
+ undefined,
255
+ [],
256
+ )
257
+ : value.atomics.some((a) => a.type === "string") ||
258
+ value.constants.some(
259
+ (c) =>
260
+ c.type === "string" && c.values.some((v) => v === ""),
261
+ ) ||
262
+ value.templates.some(
263
+ (tpl) =>
264
+ tpl.length === 1 && tpl[0]!.getName() === "string",
265
+ )
266
+ ? ts.factory.createStringLiteral("")
267
+ : value.objects.length &&
268
+ value.objects.some(
269
+ (obj) => !ProtobufUtil.isStaticObject(obj),
270
+ )
271
+ ? ts.factory.createObjectLiteralExpression()
272
+ : ts.factory.createIdentifier("undefined"),
273
+ TypeFactory.keyword("any"),
274
+ );
275
+
276
+ /* -----------------------------------------------------------
277
+ DECODERS
278
+ ----------------------------------------------------------- */
279
+ const decode_property =
280
+ (project: IProject) =>
281
+ (importer: FunctionImporter) =>
282
+ (index: number) =>
283
+ (
284
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
285
+ meta: Metadata,
286
+ ): ts.CaseClause[] => {
287
+ const clauses: ts.CaseClause[] = [];
288
+ const emplace = (name: string) => (v: ts.Expression | ts.Statement[]) =>
289
+ clauses.push(
290
+ ts.factory.createCaseClause(
291
+ ExpressionFactory.number(index++),
292
+ Array.isArray(v)
293
+ ? [
294
+ ts.factory.createExpressionStatement(
295
+ ts.factory.createIdentifier(`// type: ${name}`),
296
+ ),
297
+ ...v,
298
+ ts.factory.createBreakStatement(),
299
+ ]
300
+ : [
301
+ ts.factory.createExpressionStatement(
302
+ ts.factory.createIdentifier(`// ${name}`),
303
+ ),
304
+ ts.factory.createExpressionStatement(
305
+ ts.factory.createBinaryExpression(
306
+ accessor,
307
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
308
+ v,
309
+ ),
310
+ ),
311
+ ts.factory.createBreakStatement(),
312
+ ],
313
+ ),
314
+ );
315
+
316
+ const required: boolean = meta.isRequired() && !meta.nullable;
317
+ for (const atomic of ProtobufUtil.getAtomics(meta))
318
+ emplace(atomic)(decode_atomic(meta)(atomic));
319
+ if (meta.natives.length) emplace("bytes")(decode_bytes("bytes"));
320
+ for (const array of meta.arrays)
321
+ emplace(`Array<${array.type.value.getName()}>`)(
322
+ decode_array(accessor, array, required),
323
+ );
324
+ for (const map of meta.maps)
325
+ emplace(`Map<string, ${map.value.getName()}>`)(
326
+ decode_map(project)(importer)(accessor, map, required),
327
+ );
328
+ for (const obj of meta.objects)
329
+ emplace(obj.name)(
330
+ ProtobufUtil.isStaticObject(obj)
331
+ ? decode_regular_object(false)(obj)
332
+ : decode_dynamic_object(project)(importer)(accessor, obj, required),
333
+ );
334
+ return clauses;
335
+ };
336
+
337
+ const decode_atomic =
338
+ (meta: Metadata) =>
339
+ (atomic: ProtobufAtomic): ts.Expression => {
340
+ if (atomic === "string") return decode_bytes("string");
341
+
342
+ const call: ts.CallExpression = ts.factory.createCallExpression(
343
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(atomic),
344
+ undefined,
345
+ undefined,
346
+ );
347
+ if (atomic !== "int64" && atomic !== "uint64") return call;
348
+
349
+ const isNumber: boolean = ProtobufUtil.getNumbers(meta).some(
350
+ (n) => n === atomic,
351
+ );
352
+ return isNumber
353
+ ? ts.factory.createCallExpression(
354
+ ts.factory.createIdentifier("Number"),
355
+ undefined,
356
+ [call],
357
+ )
358
+ : call;
359
+ };
360
+
361
+ const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
362
+ ts.factory.createCallExpression(
363
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(method),
364
+ undefined,
365
+ undefined,
366
+ );
367
+
368
+ const decode_array = (
369
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
370
+ array: MetadataArray,
371
+ required: boolean,
372
+ ): ts.Statement[] => {
373
+ const statements: Array<ts.Expression | ts.Statement> = [];
374
+ if (required === false)
375
+ statements.push(
376
+ ts.factory.createBinaryExpression(
377
+ accessor,
378
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
379
+ ts.factory.createAsExpression(
380
+ ts.factory.createArrayLiteralExpression(),
381
+ ts.factory.createTypeReferenceNode("any[]"),
382
+ ),
383
+ ),
384
+ );
385
+ const atomics = ProtobufUtil.getAtomics(array.type.value);
386
+ const decoder = atomics.length
387
+ ? () => decode_atomic(array.type.value)(atomics[0]!)
388
+ : array.type.value.natives.length
389
+ ? () => decode_bytes("bytes")
390
+ : array.type.value.objects.length
391
+ ? () => decode_regular_object(false)(array.type.value.objects[0]!)
392
+ : null;
393
+ if (decoder === null) throw new Error("Never reach here.");
394
+ else if (atomics.length && atomics[0] !== "string") {
395
+ statements.push(
396
+ ts.factory.createIfStatement(
397
+ ts.factory.createStrictEquality(
398
+ ExpressionFactory.number(2),
399
+ ts.factory.createBitwiseAnd(
400
+ ts.factory.createIdentifier("tag"),
401
+ ExpressionFactory.number(7),
402
+ ),
403
+ ),
404
+ ts.factory.createBlock(
405
+ [
406
+ StatementFactory.constant(
407
+ "piece",
408
+ ts.factory.createAdd(
409
+ ts.factory.createCallExpression(
410
+ IdentifierFactory.access(READER())("uint32"),
411
+ undefined,
412
+ undefined,
413
+ ),
414
+ ts.factory.createCallExpression(
415
+ IdentifierFactory.access(READER())("index"),
416
+ undefined,
417
+ undefined,
418
+ ),
419
+ ),
420
+ ),
421
+ ts.factory.createWhileStatement(
422
+ ts.factory.createLessThan(
423
+ ts.factory.createCallExpression(
424
+ IdentifierFactory.access(READER())("index"),
425
+ undefined,
426
+ undefined,
427
+ ),
428
+ ts.factory.createIdentifier("piece"),
429
+ ),
430
+ ts.factory.createExpressionStatement(
431
+ ts.factory.createCallExpression(
432
+ IdentifierFactory.access(accessor)("push"),
433
+ undefined,
434
+ [decoder()],
435
+ ),
436
+ ),
437
+ ),
438
+ ],
439
+ true,
440
+ ),
441
+ ts.factory.createExpressionStatement(
442
+ ts.factory.createCallExpression(
443
+ IdentifierFactory.access(accessor)("push"),
444
+ undefined,
445
+ [decoder()],
446
+ ),
447
+ ),
448
+ ),
449
+ );
450
+ } else
451
+ statements.push(
452
+ ts.factory.createCallExpression(
453
+ IdentifierFactory.access(accessor)("push"),
454
+ undefined,
455
+ [decoder()],
456
+ ),
457
+ );
458
+ return statements.map((stmt) =>
459
+ ts.isExpression(stmt) ? ts.factory.createExpressionStatement(stmt) : stmt,
460
+ );
461
+ };
462
+
463
+ const decode_regular_object =
464
+ (top: boolean) =>
465
+ (obj: MetadataObject): ts.Expression =>
466
+ ts.factory.createCallExpression(
467
+ ts.factory.createIdentifier(`${PREFIX}o${obj.index}`),
468
+ undefined,
469
+ [
470
+ ts.factory.createIdentifier("reader"),
471
+ ...(top
472
+ ? []
473
+ : [
474
+ ts.factory.createCallExpression(
475
+ IdentifierFactory.access(READER())("uint32"),
476
+ undefined,
477
+ undefined,
478
+ ),
479
+ ]),
480
+ ],
481
+ );
482
+
483
+ const decode_dynamic_object =
484
+ (project: IProject) =>
485
+ (importer: FunctionImporter) =>
486
+ (
487
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
488
+ obj: MetadataObject,
489
+ required: boolean,
490
+ ): ts.Statement[] => {
491
+ const top = obj.properties[0]!;
492
+ return decode_entry(project)(importer)({
493
+ initializer: () =>
494
+ ts.factory.createBinaryExpression(
495
+ accessor,
496
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
497
+ ts.factory.createObjectLiteralExpression(),
498
+ ),
499
+ setter: () =>
500
+ ts.factory.createBinaryExpression(
501
+ ts.factory.createElementAccessExpression(
502
+ accessor,
503
+ ts.factory.createIdentifier("entry.key"),
504
+ ),
505
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
506
+ ts.factory.createIdentifier("entry.value"),
507
+ ),
508
+ })(
509
+ MetadataProperty.create({
510
+ ...top,
511
+ key: (() => {
512
+ const key: Metadata = Metadata.initialize();
513
+ key.atomics.push(
514
+ MetadataAtomic.create({
515
+ type: "string",
516
+ tags: [],
517
+ }),
518
+ );
519
+ return key;
520
+ })(),
521
+ }),
522
+ required,
523
+ );
524
+ };
525
+
526
+ const decode_map =
527
+ (project: IProject) =>
528
+ (importer: FunctionImporter) =>
529
+ (
530
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
531
+ map: Metadata.Entry,
532
+ required: boolean,
533
+ ): ts.Statement[] =>
534
+ decode_entry(project)(importer)({
535
+ initializer: () =>
536
+ ts.factory.createBinaryExpression(
537
+ accessor,
538
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
539
+ ts.factory.createNewExpression(
540
+ ts.factory.createIdentifier("Map"),
541
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
542
+ [],
543
+ ),
544
+ ),
545
+ setter: () =>
546
+ ts.factory.createCallExpression(
547
+ IdentifierFactory.access(accessor)("set"),
548
+ undefined,
549
+ [
550
+ ts.factory.createIdentifier("entry.key"),
551
+ ts.factory.createIdentifier("entry.value"),
552
+ ],
553
+ ),
554
+ })(map, required);
555
+
556
+ const decode_entry =
557
+ (project: IProject) =>
558
+ (importer: FunctionImporter) =>
559
+ (props: {
560
+ initializer: () => ts.Expression;
561
+ setter: () => ts.Expression;
562
+ }) =>
563
+ (map: Metadata.Entry, required: boolean): ts.Statement[] => {
564
+ const statements: ts.Statement[] = [
565
+ ...(required
566
+ ? []
567
+ : [ts.factory.createExpressionStatement(props.initializer())]),
568
+ StatementFactory.constant(
569
+ "piece",
570
+ ts.factory.createAdd(
571
+ ts.factory.createCallExpression(
572
+ IdentifierFactory.access(READER())("uint32"),
573
+ undefined,
574
+ undefined,
575
+ ),
576
+ ts.factory.createCallExpression(
577
+ IdentifierFactory.access(READER())("index"),
578
+ undefined,
579
+ undefined,
580
+ ),
581
+ ),
582
+ ),
583
+ ...write_object_function_body(project)(importer)({
584
+ condition: ts.factory.createLessThan(
585
+ ts.factory.createCallExpression(
586
+ IdentifierFactory.access(READER())("index"),
587
+ undefined,
588
+ undefined,
589
+ ),
590
+ ts.factory.createIdentifier("piece"),
591
+ ),
592
+ tag: "kind",
593
+ output: "entry",
594
+ })([
595
+ MetadataProperty.create({
596
+ key: MetadataFactory.soleLiteral("key"),
597
+ value: map.key,
598
+ description: null,
599
+ jsDocTags: [],
600
+ }),
601
+ MetadataProperty.create({
602
+ key: MetadataFactory.soleLiteral("value"),
603
+ value: map.value,
604
+ description: null,
605
+ jsDocTags: [],
606
+ }),
607
+ ]),
608
+ ts.factory.createExpressionStatement(props.setter()),
609
+ ];
610
+ return [
611
+ ts.factory.createExpressionStatement(
612
+ ExpressionFactory.selfCall(ts.factory.createBlock(statements, true)),
613
+ ),
614
+ ];
615
+ };
616
+ }
617
+
618
+ const PREFIX = "$pd";
619
+ const READER = () => ts.factory.createIdentifier("reader");