typia 7.0.0-dev.20241007 → 7.0.0-dev.20241008

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 (240) hide show
  1. package/lib/factories/ExpressionFactory.d.ts +1 -1
  2. package/lib/factories/ValueFactory.d.ts +1 -1
  3. package/lib/programmers/AssertProgrammer.d.ts +5 -2
  4. package/lib/programmers/AssertProgrammer.js +12 -5
  5. package/lib/programmers/AssertProgrammer.js.map +1 -1
  6. package/lib/programmers/ImportProgrammer.d.ts +25 -4
  7. package/lib/programmers/ImportProgrammer.js +67 -31
  8. package/lib/programmers/ImportProgrammer.js.map +1 -1
  9. package/lib/programmers/RandomProgrammer.js +48 -32
  10. package/lib/programmers/RandomProgrammer.js.map +1 -1
  11. package/lib/programmers/ValidateProgrammer.js +10 -4
  12. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  13. package/lib/programmers/functional/FunctionalAssertFunctionProgrammer.js +1 -1
  14. package/lib/programmers/functional/FunctionalAssertFunctionProgrammer.js.map +1 -1
  15. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.d.ts +1 -0
  16. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.js +14 -5
  17. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.js.map +1 -1
  18. package/lib/programmers/functional/FunctionalValidateParametersProgrammer.js +5 -1
  19. package/lib/programmers/functional/FunctionalValidateParametersProgrammer.js.map +1 -1
  20. package/lib/programmers/functional/FunctionalValidateReturnProgrammer.js +1 -0
  21. package/lib/programmers/functional/FunctionalValidateReturnProgrammer.js.map +1 -1
  22. package/lib/programmers/http/HttpAssertFormDataProgrammer.js +4 -1
  23. package/lib/programmers/http/HttpAssertFormDataProgrammer.js.map +1 -1
  24. package/lib/programmers/http/HttpAssertHeadersProgrammer.js +4 -1
  25. package/lib/programmers/http/HttpAssertHeadersProgrammer.js.map +1 -1
  26. package/lib/programmers/http/HttpAssertQueryProgrammer.js +4 -1
  27. package/lib/programmers/http/HttpAssertQueryProgrammer.js.map +1 -1
  28. package/lib/programmers/http/HttpFormDataProgrammer.js +10 -6
  29. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  30. package/lib/programmers/http/HttpHeadersProgrammer.js +10 -6
  31. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  32. package/lib/programmers/http/HttpQueryProgrammer.js +10 -6
  33. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  34. package/lib/programmers/http/HttpValidateFormDataProgrammer.js +5 -3
  35. package/lib/programmers/http/HttpValidateFormDataProgrammer.js.map +1 -1
  36. package/lib/programmers/http/HttpValidateHeadersProgrammer.js +5 -3
  37. package/lib/programmers/http/HttpValidateHeadersProgrammer.js.map +1 -1
  38. package/lib/programmers/http/HttpValidateQueryProgrammer.js +5 -3
  39. package/lib/programmers/http/HttpValidateQueryProgrammer.js.map +1 -1
  40. package/lib/programmers/json/JsonAssertParseProgrammer.js +14 -7
  41. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  42. package/lib/programmers/json/JsonAssertStringifyProgrammer.js +4 -1
  43. package/lib/programmers/json/JsonAssertStringifyProgrammer.js.map +1 -1
  44. package/lib/programmers/json/JsonIsParseProgrammer.js +10 -6
  45. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  46. package/lib/programmers/json/JsonValidateParseProgrammer.js +16 -4
  47. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  48. package/lib/programmers/json/JsonValidateStringifyProgrammer.js +7 -3
  49. package/lib/programmers/json/JsonValidateStringifyProgrammer.js.map +1 -1
  50. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +4 -1
  51. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  52. package/lib/programmers/misc/MiscAssertPruneProgrammer.js +4 -1
  53. package/lib/programmers/misc/MiscAssertPruneProgrammer.js.map +1 -1
  54. package/lib/programmers/misc/MiscCloneProgrammer.js +10 -6
  55. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  56. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +5 -3
  57. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  58. package/lib/programmers/misc/MiscValidatePruneProgrammer.js +10 -4
  59. package/lib/programmers/misc/MiscValidatePruneProgrammer.js.map +1 -1
  60. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js +4 -1
  61. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js.map +1 -1
  62. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +2 -1
  63. package/lib/programmers/notations/NotationGeneralProgrammer.js +13 -5
  64. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  65. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js +5 -3
  66. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js.map +1 -1
  67. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +4 -1
  68. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  69. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js +4 -1
  70. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js.map +1 -1
  71. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +10 -6
  72. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  73. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +5 -3
  74. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufValidateEncodeProgrammer.js +7 -3
  76. package/lib/programmers/protobuf/ProtobufValidateEncodeProgrammer.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/factories/JsonMetadataFactory.ts +63 -63
  79. package/src/factories/ProtobufFactory.ts +275 -275
  80. package/src/programmers/AssertProgrammer.ts +454 -456
  81. package/src/programmers/CheckerProgrammer.ts +1610 -1610
  82. package/src/programmers/ImportProgrammer.ts +184 -109
  83. package/src/programmers/IsProgrammer.ts +273 -273
  84. package/src/programmers/RandomProgrammer.ts +168 -149
  85. package/src/programmers/TypiaProgrammer.ts +171 -171
  86. package/src/programmers/ValidateProgrammer.ts +434 -430
  87. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +1 -1
  88. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +12 -16
  89. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +5 -12
  90. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +1 -0
  91. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  92. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -96
  93. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -96
  94. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -102
  95. package/src/programmers/http/HttpFormDataProgrammer.ts +304 -308
  96. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -404
  97. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  98. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  99. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  100. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  101. package/src/programmers/http/HttpQueryProgrammer.ts +329 -333
  102. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -90
  103. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -90
  104. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -96
  105. package/src/programmers/json/JsonApplicationProgrammer.ts +92 -92
  106. package/src/programmers/json/JsonAssertParseProgrammer.ts +103 -104
  107. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -112
  108. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -118
  109. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  110. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  111. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -95
  112. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -119
  113. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -92
  114. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -113
  115. package/src/programmers/misc/MiscCloneProgrammer.ts +1025 -1029
  116. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  117. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  118. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  119. package/src/programmers/misc/MiscPruneProgrammer.ts +725 -725
  120. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -109
  121. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -109
  122. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -98
  123. package/src/programmers/notations/NotationGeneralProgrammer.ts +977 -973
  124. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  125. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -117
  126. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -95
  127. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -99
  128. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +708 -711
  129. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +1019 -1019
  130. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  131. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  132. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -90
  133. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -114
  134. package/src/transform.ts +35 -35
  135. package/src/transformers/CallExpressionTransformer.ts +540 -540
  136. package/src/transformers/FileTransformer.ts +120 -120
  137. package/src/transformers/IProgrammerProps.ts +11 -11
  138. package/src/transformers/ITransformOptions.ts +62 -62
  139. package/src/transformers/ITransformProps.ts +9 -9
  140. package/src/transformers/ITypiaContext.ts +18 -18
  141. package/src/transformers/ImportTransformer.ts +66 -66
  142. package/src/transformers/NodeTransformer.ts +17 -17
  143. package/src/transformers/TransformerError.ts +59 -59
  144. package/src/transformers/features/AssertTransformer.ts +24 -24
  145. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  146. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  147. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  148. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  149. package/src/transformers/features/IsTransformer.ts +18 -18
  150. package/src/transformers/features/RandomTransformer.ts +41 -41
  151. package/src/transformers/features/ValidateTransformer.ts +18 -18
  152. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  153. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  154. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  155. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  156. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  157. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  158. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  159. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  160. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  161. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  162. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  163. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  164. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  165. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  166. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  167. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  168. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  169. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  170. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  171. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  172. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  173. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  174. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  175. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  176. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  177. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  178. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  179. package/src/transformers/features/json/JsonApplicationTransformer.ts +130 -130
  180. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  181. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  182. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  183. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  184. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  185. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  186. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  187. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  188. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  189. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  190. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  191. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  192. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  193. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  194. package/src/transformers/features/llm/LlmApplicationTransformer.ts +86 -86
  195. package/src/transformers/features/llm/LlmSchemaTransformer.ts +59 -59
  196. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  197. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  198. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  199. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  200. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  201. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  202. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  203. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  204. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  205. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  206. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  207. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  208. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  209. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  210. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  211. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  212. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  213. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  214. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  215. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  216. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  217. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  218. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  219. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  220. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  221. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  222. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  223. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  224. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  225. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  226. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  227. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  228. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  229. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  230. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  231. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  232. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  233. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  234. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  235. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  236. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  237. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  238. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  239. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  240. package/src/transformers/internal/GenericTransformer.ts +101 -101
@@ -1,711 +1,708 @@
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 { IProgrammerProps } from "../../transformers/IProgrammerProps";
18
- import { ITypiaContext } from "../../transformers/ITypiaContext";
19
-
20
- import { ProtobufAtomic } from "../../typings/ProtobufAtomic";
21
-
22
- import { FeatureProgrammer } from "../FeatureProgrammer";
23
- import { FunctionProgrammer } from "../helpers/FunctionProgrammer";
24
- import { ProtobufUtil } from "../helpers/ProtobufUtil";
25
-
26
- export namespace ProtobufDecodeProgrammer {
27
- export const decompose = (props: {
28
- context: ITypiaContext;
29
- modulo: ts.LeftHandSideExpression;
30
- functor: FunctionProgrammer;
31
- type: ts.Type;
32
- name: string | undefined;
33
- }): FeatureProgrammer.IDecomposed => {
34
- const collection: MetadataCollection = new MetadataCollection();
35
- const meta: Metadata = ProtobufFactory.metadata({
36
- method: props.modulo.getText(),
37
- checker: props.context.checker,
38
- transformer: props.context.transformer,
39
- collection,
40
- type: props.type,
41
- });
42
- return {
43
- functions: Object.fromEntries(
44
- collection
45
- .objects()
46
- .filter((object) => ProtobufUtil.isStaticObject(object))
47
- .map((object) => [
48
- `${PREFIX}o${object.index}`,
49
- StatementFactory.constant({
50
- name: props.functor.useLocal(`${PREFIX}o${object.index}`),
51
- value: write_object_function({
52
- context: props.context,
53
- functor: props.functor,
54
- object,
55
- }),
56
- }),
57
- ]),
58
- ),
59
- statements: [],
60
- arrow: ts.factory.createArrowFunction(
61
- undefined,
62
- undefined,
63
- [
64
- IdentifierFactory.parameter(
65
- "input",
66
- ts.factory.createTypeReferenceNode("Uint8Array"),
67
- ),
68
- ],
69
- ts.factory.createImportTypeNode(
70
- ts.factory.createLiteralTypeNode(
71
- ts.factory.createStringLiteral("typia"),
72
- ),
73
- undefined,
74
- ts.factory.createIdentifier("Resolved"),
75
- [
76
- ts.factory.createTypeReferenceNode(
77
- props.name ??
78
- TypeFactory.getFullName({
79
- checker: props.context.checker,
80
- type: props.type,
81
- }),
82
- ),
83
- ],
84
- ),
85
- undefined,
86
- ts.factory.createBlock(
87
- [
88
- StatementFactory.constant({
89
- name: "reader",
90
- value: ts.factory.createNewExpression(
91
- props.context.importer.internal("ProtobufReader"),
92
- undefined,
93
- [ts.factory.createIdentifier("input")],
94
- ),
95
- }),
96
- ts.factory.createReturnStatement(
97
- decode_regular_object({
98
- top: true,
99
- object: meta.objects[0]!,
100
- }),
101
- ),
102
- ],
103
- true,
104
- ),
105
- ),
106
- };
107
- };
108
-
109
- export const write = (props: IProgrammerProps): ts.CallExpression => {
110
- const functor: FunctionProgrammer = new FunctionProgrammer(
111
- props.modulo.getText(),
112
- );
113
- const result: FeatureProgrammer.IDecomposed = decompose({
114
- ...props,
115
- functor,
116
- });
117
- return FeatureProgrammer.writeDecomposed({
118
- modulo: props.modulo,
119
- functor,
120
- result,
121
- });
122
- };
123
-
124
- const write_object_function = (props: {
125
- context: ITypiaContext;
126
- functor: FunctionProgrammer;
127
- object: MetadataObject;
128
- }): ts.ArrowFunction =>
129
- ts.factory.createArrowFunction(
130
- undefined,
131
- undefined,
132
- [
133
- IdentifierFactory.parameter("reader"),
134
- IdentifierFactory.parameter(
135
- "length",
136
- TypeFactory.keyword("number"),
137
- ExpressionFactory.number(-1),
138
- ),
139
- ],
140
- TypeFactory.keyword("any"),
141
- undefined,
142
- ts.factory.createBlock(
143
- [
144
- ts.factory.createExpressionStatement(
145
- ts.factory.createBinaryExpression(
146
- ts.factory.createIdentifier("length"),
147
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
148
- ts.factory.createConditionalExpression(
149
- ts.factory.createLessThan(
150
- ts.factory.createIdentifier("length"),
151
- ExpressionFactory.number(0),
152
- ),
153
- undefined,
154
- ts.factory.createCallExpression(
155
- IdentifierFactory.access(READER(), "size"),
156
- undefined,
157
- undefined,
158
- ),
159
- undefined,
160
- ts.factory.createAdd(
161
- ts.factory.createCallExpression(
162
- IdentifierFactory.access(READER(), "index"),
163
- undefined,
164
- undefined,
165
- ),
166
- ts.factory.createIdentifier("length"),
167
- ),
168
- ),
169
- ),
170
- ),
171
- ...write_object_function_body({
172
- context: props.context,
173
- functor: props.functor,
174
- condition: ts.factory.createLessThan(
175
- ts.factory.createCallExpression(
176
- IdentifierFactory.access(READER(), "index"),
177
- undefined,
178
- undefined,
179
- ),
180
- ts.factory.createIdentifier("length"),
181
- ),
182
- tag: "tag",
183
- output: "output",
184
- properties: props.object.properties,
185
- }),
186
- ts.factory.createReturnStatement(
187
- ts.factory.createIdentifier("output"),
188
- ),
189
- ],
190
- true,
191
- ),
192
- );
193
-
194
- const write_object_function_body = (props: {
195
- context: ITypiaContext;
196
- functor: FunctionProgrammer;
197
- condition: ts.Expression;
198
- tag: string;
199
- output: string;
200
- properties: MetadataProperty[];
201
- }): ts.Statement[] => {
202
- let index: number = 1;
203
- const clauses: ts.CaseClause[] = props.properties
204
- .map((p) => {
205
- const clause = decode_property({
206
- context: props.context,
207
- functor: props.functor,
208
- index,
209
- accessor: IdentifierFactory.access(
210
- ts.factory.createIdentifier(props.output),
211
- p.key.getSoleLiteral()!,
212
- ),
213
- metadata: p.value,
214
- });
215
- index += ProtobufUtil.size(p.value);
216
- return clause;
217
- })
218
- .flat();
219
- return [
220
- StatementFactory.constant({
221
- name: props.output,
222
- value: ts.factory.createAsExpression(
223
- ts.factory.createObjectLiteralExpression(
224
- props.properties
225
- .filter(
226
- (p) =>
227
- !(
228
- props.context.compilerOptions.exactOptionalPropertyTypes ===
229
- true && p.value.optional === true
230
- ),
231
- )
232
- .map((p) =>
233
- ts.factory.createPropertyAssignment(
234
- IdentifierFactory.identifier(p.key.getSoleLiteral()!),
235
- write_property_default_value(p.value),
236
- ),
237
- ),
238
- true,
239
- ),
240
- TypeFactory.keyword("any"),
241
- ),
242
- }),
243
- ts.factory.createWhileStatement(
244
- props.condition,
245
- ts.factory.createBlock([
246
- StatementFactory.constant({
247
- name: props.tag,
248
- value: ts.factory.createCallExpression(
249
- IdentifierFactory.access(READER(), "uint32"),
250
- undefined,
251
- undefined,
252
- ),
253
- }),
254
- ts.factory.createSwitchStatement(
255
- ts.factory.createUnsignedRightShift(
256
- ts.factory.createIdentifier(props.tag),
257
- ExpressionFactory.number(3),
258
- ),
259
- ts.factory.createCaseBlock([
260
- ...clauses,
261
- ts.factory.createDefaultClause([
262
- ts.factory.createExpressionStatement(
263
- ts.factory.createCallExpression(
264
- IdentifierFactory.access(READER(), "skipType"),
265
- undefined,
266
- [
267
- ts.factory.createBitwiseAnd(
268
- ts.factory.createIdentifier(props.tag),
269
- ExpressionFactory.number(7),
270
- ),
271
- ],
272
- ),
273
- ),
274
- ts.factory.createBreakStatement(),
275
- ]),
276
- ]),
277
- ),
278
- ]),
279
- ),
280
- ];
281
- };
282
-
283
- const write_property_default_value = (value: Metadata) =>
284
- ts.factory.createAsExpression(
285
- value.nullable
286
- ? ts.factory.createNull()
287
- : value.isRequired() === false
288
- ? ts.factory.createIdentifier("undefined")
289
- : value.arrays.length
290
- ? ts.factory.createArrayLiteralExpression()
291
- : value.maps.length
292
- ? ts.factory.createNewExpression(
293
- ts.factory.createIdentifier("Map"),
294
- undefined,
295
- [],
296
- )
297
- : value.natives.length
298
- ? ts.factory.createNewExpression(
299
- ts.factory.createIdentifier("Uint8Array"),
300
- undefined,
301
- [],
302
- )
303
- : value.atomics.some((a) => a.type === "string") ||
304
- value.constants.some(
305
- (c) =>
306
- c.type === "string" &&
307
- c.values.some((v) => v.value === ""),
308
- ) ||
309
- value.templates.some(
310
- (tpl) =>
311
- tpl.row.length === 1 &&
312
- tpl.row[0]!.getName() === "string",
313
- )
314
- ? ts.factory.createStringLiteral("")
315
- : value.objects.length &&
316
- value.objects.some(
317
- (obj) => !ProtobufUtil.isStaticObject(obj),
318
- )
319
- ? ts.factory.createObjectLiteralExpression()
320
- : ts.factory.createIdentifier("undefined"),
321
- TypeFactory.keyword("any"),
322
- );
323
-
324
- /* -----------------------------------------------------------
325
- DECODERS
326
- ----------------------------------------------------------- */
327
- const decode_property = (props: {
328
- context: ITypiaContext;
329
- functor: FunctionProgrammer;
330
- index: number;
331
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
332
- metadata: Metadata;
333
- }): ts.CaseClause[] => {
334
- const clauses: ts.CaseClause[] = [];
335
- const emplace = (name: string, value: ts.Expression | ts.Statement[]) =>
336
- clauses.push(
337
- ts.factory.createCaseClause(
338
- ExpressionFactory.number(props.index++),
339
- Array.isArray(value)
340
- ? [
341
- ts.factory.createExpressionStatement(
342
- ts.factory.createIdentifier(`// type: ${name}`),
343
- ),
344
- ...value,
345
- ts.factory.createBreakStatement(),
346
- ]
347
- : [
348
- ts.factory.createExpressionStatement(
349
- ts.factory.createIdentifier(`// ${name}`),
350
- ),
351
- ts.factory.createExpressionStatement(
352
- ts.factory.createBinaryExpression(
353
- props.accessor,
354
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
355
- value,
356
- ),
357
- ),
358
- ts.factory.createBreakStatement(),
359
- ],
360
- ),
361
- );
362
-
363
- const required: boolean =
364
- props.metadata.isRequired() && !props.metadata.nullable;
365
- for (const atomic of ProtobufUtil.getAtomics(props.metadata))
366
- emplace(
367
- atomic,
368
- decode_atomic({
369
- metadata: props.metadata,
370
- type: atomic,
371
- }),
372
- );
373
- if (props.metadata.natives.length) emplace("bytes", decode_bytes("bytes"));
374
- for (const array of props.metadata.arrays)
375
- emplace(
376
- `Array<${array.type.value.getName()}>`,
377
- decode_array({
378
- accessor: props.accessor,
379
- array,
380
- required,
381
- }),
382
- );
383
- for (const entry of props.metadata.maps)
384
- emplace(
385
- `Map<string, ${entry.value.getName()}>`,
386
- decode_map({
387
- context: props.context,
388
- functor: props.functor,
389
- accessor: props.accessor,
390
- entry,
391
- required,
392
- }),
393
- );
394
- for (const object of props.metadata.objects)
395
- emplace(
396
- object.name,
397
- ProtobufUtil.isStaticObject(object)
398
- ? decode_regular_object({
399
- top: false,
400
- object,
401
- })
402
- : decode_dynamic_object({
403
- context: props.context,
404
- functor: props.functor,
405
- accessor: props.accessor,
406
- object,
407
- required,
408
- }),
409
- );
410
- return clauses;
411
- };
412
-
413
- const decode_atomic = (props: {
414
- metadata: Metadata;
415
- type: ProtobufAtomic;
416
- }): ts.Expression => {
417
- if (props.type === "string") return decode_bytes("string");
418
-
419
- const call: ts.CallExpression = ts.factory.createCallExpression(
420
- IdentifierFactory.access(READER(), props.type),
421
- undefined,
422
- undefined,
423
- );
424
- if (props.type !== "int64" && props.type !== "uint64") return call;
425
-
426
- const isNumber: boolean = ProtobufUtil.getNumbers(props.metadata).some(
427
- (n) => n === props.type,
428
- );
429
- return isNumber
430
- ? ts.factory.createCallExpression(
431
- ts.factory.createIdentifier("Number"),
432
- undefined,
433
- [call],
434
- )
435
- : call;
436
- };
437
-
438
- const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
439
- ts.factory.createCallExpression(
440
- IdentifierFactory.access(READER(), method),
441
- undefined,
442
- undefined,
443
- );
444
-
445
- const decode_array = (props: {
446
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
447
- array: MetadataArray;
448
- required: boolean;
449
- }): ts.Statement[] => {
450
- const statements: Array<ts.Expression | ts.Statement> = [];
451
- if (props.required === false)
452
- statements.push(
453
- ts.factory.createBinaryExpression(
454
- props.accessor,
455
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
456
- ts.factory.createAsExpression(
457
- ts.factory.createArrayLiteralExpression(),
458
- ts.factory.createTypeReferenceNode("any[]"),
459
- ),
460
- ),
461
- );
462
- const atomics = ProtobufUtil.getAtomics(props.array.type.value);
463
- const decoder = atomics.length
464
- ? () =>
465
- decode_atomic({
466
- metadata: props.array.type.value,
467
- type: atomics[0]!,
468
- })
469
- : props.array.type.value.natives.length
470
- ? () => decode_bytes("bytes")
471
- : props.array.type.value.objects.length
472
- ? () =>
473
- decode_regular_object({
474
- top: false,
475
- object: props.array.type.value.objects[0]!,
476
- })
477
- : null;
478
- if (decoder === null) throw new Error("Never reach here.");
479
- else if (atomics.length && atomics[0] !== "string") {
480
- statements.push(
481
- ts.factory.createIfStatement(
482
- ts.factory.createStrictEquality(
483
- ExpressionFactory.number(2),
484
- ts.factory.createBitwiseAnd(
485
- ts.factory.createIdentifier("tag"),
486
- ExpressionFactory.number(7),
487
- ),
488
- ),
489
- ts.factory.createBlock(
490
- [
491
- StatementFactory.constant({
492
- name: "piece",
493
- value: ts.factory.createAdd(
494
- ts.factory.createCallExpression(
495
- IdentifierFactory.access(READER(), "uint32"),
496
- undefined,
497
- undefined,
498
- ),
499
- ts.factory.createCallExpression(
500
- IdentifierFactory.access(READER(), "index"),
501
- undefined,
502
- undefined,
503
- ),
504
- ),
505
- }),
506
- ts.factory.createWhileStatement(
507
- ts.factory.createLessThan(
508
- ts.factory.createCallExpression(
509
- IdentifierFactory.access(READER(), "index"),
510
- undefined,
511
- undefined,
512
- ),
513
- ts.factory.createIdentifier("piece"),
514
- ),
515
- ts.factory.createExpressionStatement(
516
- ts.factory.createCallExpression(
517
- IdentifierFactory.access(props.accessor, "push"),
518
- undefined,
519
- [decoder()],
520
- ),
521
- ),
522
- ),
523
- ],
524
- true,
525
- ),
526
- ts.factory.createExpressionStatement(
527
- ts.factory.createCallExpression(
528
- IdentifierFactory.access(props.accessor, "push"),
529
- undefined,
530
- [decoder()],
531
- ),
532
- ),
533
- ),
534
- );
535
- } else
536
- statements.push(
537
- ts.factory.createCallExpression(
538
- IdentifierFactory.access(props.accessor, "push"),
539
- undefined,
540
- [decoder()],
541
- ),
542
- );
543
- return statements.map((stmt) =>
544
- ts.isExpression(stmt) ? ts.factory.createExpressionStatement(stmt) : stmt,
545
- );
546
- };
547
-
548
- const decode_regular_object = (props: {
549
- top: boolean;
550
- object: MetadataObject;
551
- }): ts.Expression =>
552
- ts.factory.createCallExpression(
553
- ts.factory.createIdentifier(`${PREFIX}o${props.object.index}`),
554
- undefined,
555
- [
556
- ts.factory.createIdentifier("reader"),
557
- ...(props.top
558
- ? []
559
- : [
560
- ts.factory.createCallExpression(
561
- IdentifierFactory.access(READER(), "uint32"),
562
- undefined,
563
- undefined,
564
- ),
565
- ]),
566
- ],
567
- );
568
-
569
- const decode_dynamic_object = (props: {
570
- context: ITypiaContext;
571
- functor: FunctionProgrammer;
572
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
573
- object: MetadataObject;
574
- required: boolean;
575
- }): ts.Statement[] => {
576
- const top: MetadataProperty = props.object.properties[0]!;
577
- return decode_entry({
578
- context: props.context,
579
- functor: props.functor,
580
- initializer: () =>
581
- ts.factory.createBinaryExpression(
582
- props.accessor,
583
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
584
- ts.factory.createObjectLiteralExpression(),
585
- ),
586
- setter: () =>
587
- ts.factory.createBinaryExpression(
588
- ts.factory.createElementAccessExpression(
589
- props.accessor,
590
- ts.factory.createIdentifier("entry.key"),
591
- ),
592
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
593
- ts.factory.createIdentifier("entry.value"),
594
- ),
595
- entry: MetadataProperty.create({
596
- ...top,
597
- key: (() => {
598
- const key: Metadata = Metadata.initialize();
599
- key.atomics.push(
600
- MetadataAtomic.create({
601
- type: "string",
602
- tags: [],
603
- }),
604
- );
605
- return key;
606
- })(),
607
- }),
608
- required: props.required,
609
- });
610
- };
611
-
612
- const decode_map = (props: {
613
- context: ITypiaContext;
614
- functor: FunctionProgrammer;
615
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
616
- entry: Metadata.Entry;
617
- required: boolean;
618
- }): ts.Statement[] =>
619
- decode_entry({
620
- context: props.context,
621
- functor: props.functor,
622
- initializer: () =>
623
- ts.factory.createBinaryExpression(
624
- props.accessor,
625
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
626
- ts.factory.createNewExpression(
627
- ts.factory.createIdentifier("Map"),
628
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
629
- [],
630
- ),
631
- ),
632
- setter: () =>
633
- ts.factory.createCallExpression(
634
- IdentifierFactory.access(props.accessor, "set"),
635
- undefined,
636
- [
637
- ts.factory.createIdentifier("entry.key"),
638
- ts.factory.createIdentifier("entry.value"),
639
- ],
640
- ),
641
- entry: props.entry,
642
- required: props.required,
643
- });
644
-
645
- const decode_entry = (props: {
646
- context: ITypiaContext;
647
- functor: FunctionProgrammer;
648
- initializer: () => ts.Expression;
649
- setter: () => ts.Expression;
650
- entry: Metadata.Entry;
651
- required: boolean;
652
- }): ts.Statement[] => {
653
- const statements: ts.Statement[] = [
654
- ...(props.required
655
- ? []
656
- : [ts.factory.createExpressionStatement(props.initializer())]),
657
- StatementFactory.constant({
658
- name: "piece",
659
- value: ts.factory.createAdd(
660
- ts.factory.createCallExpression(
661
- IdentifierFactory.access(READER(), "uint32"),
662
- undefined,
663
- undefined,
664
- ),
665
- ts.factory.createCallExpression(
666
- IdentifierFactory.access(READER(), "index"),
667
- undefined,
668
- undefined,
669
- ),
670
- ),
671
- }),
672
- ...write_object_function_body({
673
- context: props.context,
674
- functor: props.functor,
675
- condition: ts.factory.createLessThan(
676
- ts.factory.createCallExpression(
677
- IdentifierFactory.access(READER(), "index"),
678
- undefined,
679
- undefined,
680
- ),
681
- ts.factory.createIdentifier("piece"),
682
- ),
683
- tag: "kind",
684
- output: "entry",
685
- properties: [
686
- MetadataProperty.create({
687
- key: MetadataFactory.soleLiteral("key"),
688
- value: props.entry.key,
689
- description: null,
690
- jsDocTags: [],
691
- }),
692
- MetadataProperty.create({
693
- key: MetadataFactory.soleLiteral("value"),
694
- value: props.entry.value,
695
- description: null,
696
- jsDocTags: [],
697
- }),
698
- ],
699
- }),
700
- ts.factory.createExpressionStatement(props.setter()),
701
- ];
702
- return [
703
- ts.factory.createExpressionStatement(
704
- ExpressionFactory.selfCall(ts.factory.createBlock(statements, true)),
705
- ),
706
- ];
707
- };
708
- }
709
-
710
- const PREFIX = "$pd";
711
- 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 { IProgrammerProps } from "../../transformers/IProgrammerProps";
18
+ import { ITypiaContext } from "../../transformers/ITypiaContext";
19
+
20
+ import { ProtobufAtomic } from "../../typings/ProtobufAtomic";
21
+
22
+ import { FeatureProgrammer } from "../FeatureProgrammer";
23
+ import { FunctionProgrammer } from "../helpers/FunctionProgrammer";
24
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
25
+
26
+ export namespace ProtobufDecodeProgrammer {
27
+ export const decompose = (props: {
28
+ context: ITypiaContext;
29
+ modulo: ts.LeftHandSideExpression;
30
+ functor: FunctionProgrammer;
31
+ type: ts.Type;
32
+ name: string | undefined;
33
+ }): FeatureProgrammer.IDecomposed => {
34
+ const collection: MetadataCollection = new MetadataCollection();
35
+ const meta: Metadata = ProtobufFactory.metadata({
36
+ method: props.modulo.getText(),
37
+ checker: props.context.checker,
38
+ transformer: props.context.transformer,
39
+ collection,
40
+ type: props.type,
41
+ });
42
+ return {
43
+ functions: Object.fromEntries(
44
+ collection
45
+ .objects()
46
+ .filter((object) => ProtobufUtil.isStaticObject(object))
47
+ .map((object) => [
48
+ `${PREFIX}o${object.index}`,
49
+ StatementFactory.constant({
50
+ name: props.functor.useLocal(`${PREFIX}o${object.index}`),
51
+ value: write_object_function({
52
+ context: props.context,
53
+ functor: props.functor,
54
+ object,
55
+ }),
56
+ }),
57
+ ]),
58
+ ),
59
+ statements: [],
60
+ arrow: ts.factory.createArrowFunction(
61
+ undefined,
62
+ undefined,
63
+ [
64
+ IdentifierFactory.parameter(
65
+ "input",
66
+ ts.factory.createTypeReferenceNode("Uint8Array"),
67
+ ),
68
+ ],
69
+ props.context.importer.type({
70
+ file: "typia",
71
+ name: "Resolved",
72
+ arguments: [
73
+ ts.factory.createTypeReferenceNode(
74
+ props.name ??
75
+ TypeFactory.getFullName({
76
+ checker: props.context.checker,
77
+ type: props.type,
78
+ }),
79
+ ),
80
+ ],
81
+ }),
82
+ undefined,
83
+ ts.factory.createBlock(
84
+ [
85
+ StatementFactory.constant({
86
+ name: "reader",
87
+ value: ts.factory.createNewExpression(
88
+ props.context.importer.internal("ProtobufReader"),
89
+ undefined,
90
+ [ts.factory.createIdentifier("input")],
91
+ ),
92
+ }),
93
+ ts.factory.createReturnStatement(
94
+ decode_regular_object({
95
+ top: true,
96
+ object: meta.objects[0]!,
97
+ }),
98
+ ),
99
+ ],
100
+ true,
101
+ ),
102
+ ),
103
+ };
104
+ };
105
+
106
+ export const write = (props: IProgrammerProps): ts.CallExpression => {
107
+ const functor: FunctionProgrammer = new FunctionProgrammer(
108
+ props.modulo.getText(),
109
+ );
110
+ const result: FeatureProgrammer.IDecomposed = decompose({
111
+ ...props,
112
+ functor,
113
+ });
114
+ return FeatureProgrammer.writeDecomposed({
115
+ modulo: props.modulo,
116
+ functor,
117
+ result,
118
+ });
119
+ };
120
+
121
+ const write_object_function = (props: {
122
+ context: ITypiaContext;
123
+ functor: FunctionProgrammer;
124
+ object: MetadataObject;
125
+ }): ts.ArrowFunction =>
126
+ ts.factory.createArrowFunction(
127
+ undefined,
128
+ undefined,
129
+ [
130
+ IdentifierFactory.parameter("reader"),
131
+ IdentifierFactory.parameter(
132
+ "length",
133
+ TypeFactory.keyword("number"),
134
+ ExpressionFactory.number(-1),
135
+ ),
136
+ ],
137
+ TypeFactory.keyword("any"),
138
+ undefined,
139
+ ts.factory.createBlock(
140
+ [
141
+ ts.factory.createExpressionStatement(
142
+ ts.factory.createBinaryExpression(
143
+ ts.factory.createIdentifier("length"),
144
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
145
+ ts.factory.createConditionalExpression(
146
+ ts.factory.createLessThan(
147
+ ts.factory.createIdentifier("length"),
148
+ ExpressionFactory.number(0),
149
+ ),
150
+ undefined,
151
+ ts.factory.createCallExpression(
152
+ IdentifierFactory.access(READER(), "size"),
153
+ undefined,
154
+ undefined,
155
+ ),
156
+ undefined,
157
+ ts.factory.createAdd(
158
+ ts.factory.createCallExpression(
159
+ IdentifierFactory.access(READER(), "index"),
160
+ undefined,
161
+ undefined,
162
+ ),
163
+ ts.factory.createIdentifier("length"),
164
+ ),
165
+ ),
166
+ ),
167
+ ),
168
+ ...write_object_function_body({
169
+ context: props.context,
170
+ functor: props.functor,
171
+ condition: ts.factory.createLessThan(
172
+ ts.factory.createCallExpression(
173
+ IdentifierFactory.access(READER(), "index"),
174
+ undefined,
175
+ undefined,
176
+ ),
177
+ ts.factory.createIdentifier("length"),
178
+ ),
179
+ tag: "tag",
180
+ output: "output",
181
+ properties: props.object.properties,
182
+ }),
183
+ ts.factory.createReturnStatement(
184
+ ts.factory.createIdentifier("output"),
185
+ ),
186
+ ],
187
+ true,
188
+ ),
189
+ );
190
+
191
+ const write_object_function_body = (props: {
192
+ context: ITypiaContext;
193
+ functor: FunctionProgrammer;
194
+ condition: ts.Expression;
195
+ tag: string;
196
+ output: string;
197
+ properties: MetadataProperty[];
198
+ }): ts.Statement[] => {
199
+ let index: number = 1;
200
+ const clauses: ts.CaseClause[] = props.properties
201
+ .map((p) => {
202
+ const clause = decode_property({
203
+ context: props.context,
204
+ functor: props.functor,
205
+ index,
206
+ accessor: IdentifierFactory.access(
207
+ ts.factory.createIdentifier(props.output),
208
+ p.key.getSoleLiteral()!,
209
+ ),
210
+ metadata: p.value,
211
+ });
212
+ index += ProtobufUtil.size(p.value);
213
+ return clause;
214
+ })
215
+ .flat();
216
+ return [
217
+ StatementFactory.constant({
218
+ name: props.output,
219
+ value: ts.factory.createAsExpression(
220
+ ts.factory.createObjectLiteralExpression(
221
+ props.properties
222
+ .filter(
223
+ (p) =>
224
+ !(
225
+ props.context.compilerOptions.exactOptionalPropertyTypes ===
226
+ true && p.value.optional === true
227
+ ),
228
+ )
229
+ .map((p) =>
230
+ ts.factory.createPropertyAssignment(
231
+ IdentifierFactory.identifier(p.key.getSoleLiteral()!),
232
+ write_property_default_value(p.value),
233
+ ),
234
+ ),
235
+ true,
236
+ ),
237
+ TypeFactory.keyword("any"),
238
+ ),
239
+ }),
240
+ ts.factory.createWhileStatement(
241
+ props.condition,
242
+ ts.factory.createBlock([
243
+ StatementFactory.constant({
244
+ name: props.tag,
245
+ value: ts.factory.createCallExpression(
246
+ IdentifierFactory.access(READER(), "uint32"),
247
+ undefined,
248
+ undefined,
249
+ ),
250
+ }),
251
+ ts.factory.createSwitchStatement(
252
+ ts.factory.createUnsignedRightShift(
253
+ ts.factory.createIdentifier(props.tag),
254
+ ExpressionFactory.number(3),
255
+ ),
256
+ ts.factory.createCaseBlock([
257
+ ...clauses,
258
+ ts.factory.createDefaultClause([
259
+ ts.factory.createExpressionStatement(
260
+ ts.factory.createCallExpression(
261
+ IdentifierFactory.access(READER(), "skipType"),
262
+ undefined,
263
+ [
264
+ ts.factory.createBitwiseAnd(
265
+ ts.factory.createIdentifier(props.tag),
266
+ ExpressionFactory.number(7),
267
+ ),
268
+ ],
269
+ ),
270
+ ),
271
+ ts.factory.createBreakStatement(),
272
+ ]),
273
+ ]),
274
+ ),
275
+ ]),
276
+ ),
277
+ ];
278
+ };
279
+
280
+ const write_property_default_value = (value: Metadata) =>
281
+ ts.factory.createAsExpression(
282
+ value.nullable
283
+ ? ts.factory.createNull()
284
+ : value.isRequired() === false
285
+ ? ts.factory.createIdentifier("undefined")
286
+ : value.arrays.length
287
+ ? ts.factory.createArrayLiteralExpression()
288
+ : value.maps.length
289
+ ? ts.factory.createNewExpression(
290
+ ts.factory.createIdentifier("Map"),
291
+ undefined,
292
+ [],
293
+ )
294
+ : value.natives.length
295
+ ? ts.factory.createNewExpression(
296
+ ts.factory.createIdentifier("Uint8Array"),
297
+ undefined,
298
+ [],
299
+ )
300
+ : value.atomics.some((a) => a.type === "string") ||
301
+ value.constants.some(
302
+ (c) =>
303
+ c.type === "string" &&
304
+ c.values.some((v) => v.value === ""),
305
+ ) ||
306
+ value.templates.some(
307
+ (tpl) =>
308
+ tpl.row.length === 1 &&
309
+ tpl.row[0]!.getName() === "string",
310
+ )
311
+ ? ts.factory.createStringLiteral("")
312
+ : value.objects.length &&
313
+ value.objects.some(
314
+ (obj) => !ProtobufUtil.isStaticObject(obj),
315
+ )
316
+ ? ts.factory.createObjectLiteralExpression()
317
+ : ts.factory.createIdentifier("undefined"),
318
+ TypeFactory.keyword("any"),
319
+ );
320
+
321
+ /* -----------------------------------------------------------
322
+ DECODERS
323
+ ----------------------------------------------------------- */
324
+ const decode_property = (props: {
325
+ context: ITypiaContext;
326
+ functor: FunctionProgrammer;
327
+ index: number;
328
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
329
+ metadata: Metadata;
330
+ }): ts.CaseClause[] => {
331
+ const clauses: ts.CaseClause[] = [];
332
+ const emplace = (name: string, value: ts.Expression | ts.Statement[]) =>
333
+ clauses.push(
334
+ ts.factory.createCaseClause(
335
+ ExpressionFactory.number(props.index++),
336
+ Array.isArray(value)
337
+ ? [
338
+ ts.factory.createExpressionStatement(
339
+ ts.factory.createIdentifier(`// type: ${name}`),
340
+ ),
341
+ ...value,
342
+ ts.factory.createBreakStatement(),
343
+ ]
344
+ : [
345
+ ts.factory.createExpressionStatement(
346
+ ts.factory.createIdentifier(`// ${name}`),
347
+ ),
348
+ ts.factory.createExpressionStatement(
349
+ ts.factory.createBinaryExpression(
350
+ props.accessor,
351
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
352
+ value,
353
+ ),
354
+ ),
355
+ ts.factory.createBreakStatement(),
356
+ ],
357
+ ),
358
+ );
359
+
360
+ const required: boolean =
361
+ props.metadata.isRequired() && !props.metadata.nullable;
362
+ for (const atomic of ProtobufUtil.getAtomics(props.metadata))
363
+ emplace(
364
+ atomic,
365
+ decode_atomic({
366
+ metadata: props.metadata,
367
+ type: atomic,
368
+ }),
369
+ );
370
+ if (props.metadata.natives.length) emplace("bytes", decode_bytes("bytes"));
371
+ for (const array of props.metadata.arrays)
372
+ emplace(
373
+ `Array<${array.type.value.getName()}>`,
374
+ decode_array({
375
+ accessor: props.accessor,
376
+ array,
377
+ required,
378
+ }),
379
+ );
380
+ for (const entry of props.metadata.maps)
381
+ emplace(
382
+ `Map<string, ${entry.value.getName()}>`,
383
+ decode_map({
384
+ context: props.context,
385
+ functor: props.functor,
386
+ accessor: props.accessor,
387
+ entry,
388
+ required,
389
+ }),
390
+ );
391
+ for (const object of props.metadata.objects)
392
+ emplace(
393
+ object.name,
394
+ ProtobufUtil.isStaticObject(object)
395
+ ? decode_regular_object({
396
+ top: false,
397
+ object,
398
+ })
399
+ : decode_dynamic_object({
400
+ context: props.context,
401
+ functor: props.functor,
402
+ accessor: props.accessor,
403
+ object,
404
+ required,
405
+ }),
406
+ );
407
+ return clauses;
408
+ };
409
+
410
+ const decode_atomic = (props: {
411
+ metadata: Metadata;
412
+ type: ProtobufAtomic;
413
+ }): ts.Expression => {
414
+ if (props.type === "string") return decode_bytes("string");
415
+
416
+ const call: ts.CallExpression = ts.factory.createCallExpression(
417
+ IdentifierFactory.access(READER(), props.type),
418
+ undefined,
419
+ undefined,
420
+ );
421
+ if (props.type !== "int64" && props.type !== "uint64") return call;
422
+
423
+ const isNumber: boolean = ProtobufUtil.getNumbers(props.metadata).some(
424
+ (n) => n === props.type,
425
+ );
426
+ return isNumber
427
+ ? ts.factory.createCallExpression(
428
+ ts.factory.createIdentifier("Number"),
429
+ undefined,
430
+ [call],
431
+ )
432
+ : call;
433
+ };
434
+
435
+ const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
436
+ ts.factory.createCallExpression(
437
+ IdentifierFactory.access(READER(), method),
438
+ undefined,
439
+ undefined,
440
+ );
441
+
442
+ const decode_array = (props: {
443
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
444
+ array: MetadataArray;
445
+ required: boolean;
446
+ }): ts.Statement[] => {
447
+ const statements: Array<ts.Expression | ts.Statement> = [];
448
+ if (props.required === false)
449
+ statements.push(
450
+ ts.factory.createBinaryExpression(
451
+ props.accessor,
452
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
453
+ ts.factory.createAsExpression(
454
+ ts.factory.createArrayLiteralExpression(),
455
+ ts.factory.createTypeReferenceNode("any[]"),
456
+ ),
457
+ ),
458
+ );
459
+ const atomics = ProtobufUtil.getAtomics(props.array.type.value);
460
+ const decoder = atomics.length
461
+ ? () =>
462
+ decode_atomic({
463
+ metadata: props.array.type.value,
464
+ type: atomics[0]!,
465
+ })
466
+ : props.array.type.value.natives.length
467
+ ? () => decode_bytes("bytes")
468
+ : props.array.type.value.objects.length
469
+ ? () =>
470
+ decode_regular_object({
471
+ top: false,
472
+ object: props.array.type.value.objects[0]!,
473
+ })
474
+ : null;
475
+ if (decoder === null) throw new Error("Never reach here.");
476
+ else if (atomics.length && atomics[0] !== "string") {
477
+ statements.push(
478
+ ts.factory.createIfStatement(
479
+ ts.factory.createStrictEquality(
480
+ ExpressionFactory.number(2),
481
+ ts.factory.createBitwiseAnd(
482
+ ts.factory.createIdentifier("tag"),
483
+ ExpressionFactory.number(7),
484
+ ),
485
+ ),
486
+ ts.factory.createBlock(
487
+ [
488
+ StatementFactory.constant({
489
+ name: "piece",
490
+ value: ts.factory.createAdd(
491
+ ts.factory.createCallExpression(
492
+ IdentifierFactory.access(READER(), "uint32"),
493
+ undefined,
494
+ undefined,
495
+ ),
496
+ ts.factory.createCallExpression(
497
+ IdentifierFactory.access(READER(), "index"),
498
+ undefined,
499
+ undefined,
500
+ ),
501
+ ),
502
+ }),
503
+ ts.factory.createWhileStatement(
504
+ ts.factory.createLessThan(
505
+ ts.factory.createCallExpression(
506
+ IdentifierFactory.access(READER(), "index"),
507
+ undefined,
508
+ undefined,
509
+ ),
510
+ ts.factory.createIdentifier("piece"),
511
+ ),
512
+ ts.factory.createExpressionStatement(
513
+ ts.factory.createCallExpression(
514
+ IdentifierFactory.access(props.accessor, "push"),
515
+ undefined,
516
+ [decoder()],
517
+ ),
518
+ ),
519
+ ),
520
+ ],
521
+ true,
522
+ ),
523
+ ts.factory.createExpressionStatement(
524
+ ts.factory.createCallExpression(
525
+ IdentifierFactory.access(props.accessor, "push"),
526
+ undefined,
527
+ [decoder()],
528
+ ),
529
+ ),
530
+ ),
531
+ );
532
+ } else
533
+ statements.push(
534
+ ts.factory.createCallExpression(
535
+ IdentifierFactory.access(props.accessor, "push"),
536
+ undefined,
537
+ [decoder()],
538
+ ),
539
+ );
540
+ return statements.map((stmt) =>
541
+ ts.isExpression(stmt) ? ts.factory.createExpressionStatement(stmt) : stmt,
542
+ );
543
+ };
544
+
545
+ const decode_regular_object = (props: {
546
+ top: boolean;
547
+ object: MetadataObject;
548
+ }): ts.Expression =>
549
+ ts.factory.createCallExpression(
550
+ ts.factory.createIdentifier(`${PREFIX}o${props.object.index}`),
551
+ undefined,
552
+ [
553
+ ts.factory.createIdentifier("reader"),
554
+ ...(props.top
555
+ ? []
556
+ : [
557
+ ts.factory.createCallExpression(
558
+ IdentifierFactory.access(READER(), "uint32"),
559
+ undefined,
560
+ undefined,
561
+ ),
562
+ ]),
563
+ ],
564
+ );
565
+
566
+ const decode_dynamic_object = (props: {
567
+ context: ITypiaContext;
568
+ functor: FunctionProgrammer;
569
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
570
+ object: MetadataObject;
571
+ required: boolean;
572
+ }): ts.Statement[] => {
573
+ const top: MetadataProperty = props.object.properties[0]!;
574
+ return decode_entry({
575
+ context: props.context,
576
+ functor: props.functor,
577
+ initializer: () =>
578
+ ts.factory.createBinaryExpression(
579
+ props.accessor,
580
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
581
+ ts.factory.createObjectLiteralExpression(),
582
+ ),
583
+ setter: () =>
584
+ ts.factory.createBinaryExpression(
585
+ ts.factory.createElementAccessExpression(
586
+ props.accessor,
587
+ ts.factory.createIdentifier("entry.key"),
588
+ ),
589
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
590
+ ts.factory.createIdentifier("entry.value"),
591
+ ),
592
+ entry: MetadataProperty.create({
593
+ ...top,
594
+ key: (() => {
595
+ const key: Metadata = Metadata.initialize();
596
+ key.atomics.push(
597
+ MetadataAtomic.create({
598
+ type: "string",
599
+ tags: [],
600
+ }),
601
+ );
602
+ return key;
603
+ })(),
604
+ }),
605
+ required: props.required,
606
+ });
607
+ };
608
+
609
+ const decode_map = (props: {
610
+ context: ITypiaContext;
611
+ functor: FunctionProgrammer;
612
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
613
+ entry: Metadata.Entry;
614
+ required: boolean;
615
+ }): ts.Statement[] =>
616
+ decode_entry({
617
+ context: props.context,
618
+ functor: props.functor,
619
+ initializer: () =>
620
+ ts.factory.createBinaryExpression(
621
+ props.accessor,
622
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
623
+ ts.factory.createNewExpression(
624
+ ts.factory.createIdentifier("Map"),
625
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
626
+ [],
627
+ ),
628
+ ),
629
+ setter: () =>
630
+ ts.factory.createCallExpression(
631
+ IdentifierFactory.access(props.accessor, "set"),
632
+ undefined,
633
+ [
634
+ ts.factory.createIdentifier("entry.key"),
635
+ ts.factory.createIdentifier("entry.value"),
636
+ ],
637
+ ),
638
+ entry: props.entry,
639
+ required: props.required,
640
+ });
641
+
642
+ const decode_entry = (props: {
643
+ context: ITypiaContext;
644
+ functor: FunctionProgrammer;
645
+ initializer: () => ts.Expression;
646
+ setter: () => ts.Expression;
647
+ entry: Metadata.Entry;
648
+ required: boolean;
649
+ }): ts.Statement[] => {
650
+ const statements: ts.Statement[] = [
651
+ ...(props.required
652
+ ? []
653
+ : [ts.factory.createExpressionStatement(props.initializer())]),
654
+ StatementFactory.constant({
655
+ name: "piece",
656
+ value: ts.factory.createAdd(
657
+ ts.factory.createCallExpression(
658
+ IdentifierFactory.access(READER(), "uint32"),
659
+ undefined,
660
+ undefined,
661
+ ),
662
+ ts.factory.createCallExpression(
663
+ IdentifierFactory.access(READER(), "index"),
664
+ undefined,
665
+ undefined,
666
+ ),
667
+ ),
668
+ }),
669
+ ...write_object_function_body({
670
+ context: props.context,
671
+ functor: props.functor,
672
+ condition: ts.factory.createLessThan(
673
+ ts.factory.createCallExpression(
674
+ IdentifierFactory.access(READER(), "index"),
675
+ undefined,
676
+ undefined,
677
+ ),
678
+ ts.factory.createIdentifier("piece"),
679
+ ),
680
+ tag: "kind",
681
+ output: "entry",
682
+ properties: [
683
+ MetadataProperty.create({
684
+ key: MetadataFactory.soleLiteral("key"),
685
+ value: props.entry.key,
686
+ description: null,
687
+ jsDocTags: [],
688
+ }),
689
+ MetadataProperty.create({
690
+ key: MetadataFactory.soleLiteral("value"),
691
+ value: props.entry.value,
692
+ description: null,
693
+ jsDocTags: [],
694
+ }),
695
+ ],
696
+ }),
697
+ ts.factory.createExpressionStatement(props.setter()),
698
+ ];
699
+ return [
700
+ ts.factory.createExpressionStatement(
701
+ ExpressionFactory.selfCall(ts.factory.createBlock(statements, true)),
702
+ ),
703
+ ];
704
+ };
705
+ }
706
+
707
+ const PREFIX = "$pd";
708
+ const READER = () => ts.factory.createIdentifier("reader");