typia 6.10.2-dev.20240920 → 6.10.2

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