typia 6.6.2 → 6.7.0-dev.20240802

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