typia 5.0.0-dev.20230821 → 5.0.0-dev.20230822

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 (236) hide show
  1. package/lib/factories/MetadataFactory.js +9 -0
  2. package/lib/factories/MetadataFactory.js.map +1 -1
  3. package/lib/factories/ProtobufFactory.js +8 -0
  4. package/lib/factories/ProtobufFactory.js.map +1 -1
  5. package/lib/functional/$ProtobufReader.d.ts +2 -0
  6. package/lib/functional/$ProtobufReader.js +14 -3
  7. package/lib/functional/$ProtobufReader.js.map +1 -1
  8. package/lib/functional/$ProtobufSizer.js +1 -1
  9. package/lib/functional/$ProtobufSizer.js.map +1 -1
  10. package/lib/functional/$ProtobufWriter.js +0 -1
  11. package/lib/functional/$ProtobufWriter.js.map +1 -1
  12. package/lib/programmers/helpers/ProtobufUtil.d.ts +3 -1
  13. package/lib/programmers/helpers/ProtobufUtil.js +5 -1
  14. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  15. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -3
  16. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  17. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +2 -3
  18. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  19. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +357 -6
  20. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  21. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +15 -60
  22. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  23. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +1 -1
  24. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  25. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -1
  26. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  27. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +3 -4
  28. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  29. package/lib/protobuf.d.ts +8 -9
  30. package/lib/protobuf.js +7 -0
  31. package/lib/protobuf.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/factories/ExpressionFactory.ts +115 -115
  34. package/src/factories/MetadataCollection.ts +269 -269
  35. package/src/factories/MetadataFactory.ts +46 -34
  36. package/src/factories/MetadataTagFactory.ts +364 -364
  37. package/src/factories/ProtobufFactory.ts +266 -251
  38. package/src/factories/StatementFactory.ts +72 -72
  39. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  40. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  41. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  42. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  43. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  44. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  45. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  46. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  47. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  48. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  49. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  50. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  51. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  52. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  53. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -84
  54. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  55. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  56. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  57. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  58. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  59. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  60. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  61. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  62. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  63. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  64. package/src/functional/$ProtobufReader.ts +201 -188
  65. package/src/functional/$ProtobufSizer.ts +147 -144
  66. package/src/functional/$ProtobufWriter.ts +152 -152
  67. package/src/functional/$number.ts +13 -13
  68. package/src/functional/$strlen.ts +7 -7
  69. package/src/functional/$varint.ts +130 -130
  70. package/src/functional/$zigzag.ts +39 -39
  71. package/src/functional/IProtobufWriter.ts +18 -18
  72. package/src/functional/Namespace.ts +149 -149
  73. package/src/json.ts +648 -648
  74. package/src/misc.ts +651 -651
  75. package/src/module.ts +708 -708
  76. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  77. package/src/programmers/FeatureProgrammer.ts +497 -497
  78. package/src/programmers/IsProgrammer.ts +239 -239
  79. package/src/programmers/IsPruneProgrammer.ts +73 -73
  80. package/src/programmers/RandomProgrammer.ts +578 -578
  81. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  82. package/src/programmers/helpers/CloneJoiner.ts +107 -107
  83. package/src/programmers/helpers/FunctionImporeter.ts +89 -89
  84. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  85. package/src/programmers/helpers/ProtobufUtil.ts +29 -24
  86. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  87. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  88. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  89. package/src/programmers/helpers/RandomRanger.ts +208 -208
  90. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  91. package/src/programmers/helpers/UnionExplorer.ts +310 -310
  92. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  93. package/src/programmers/helpers/disable_function_importer_declare.ts +27 -27
  94. package/src/programmers/internal/application_alias.ts +66 -66
  95. package/src/programmers/internal/application_array.ts +30 -30
  96. package/src/programmers/internal/application_constant.ts +26 -26
  97. package/src/programmers/internal/application_default.ts +17 -17
  98. package/src/programmers/internal/application_default_string.ts +33 -33
  99. package/src/programmers/internal/application_native.ts +39 -39
  100. package/src/programmers/internal/application_number.ts +81 -81
  101. package/src/programmers/internal/application_object.ts +165 -165
  102. package/src/programmers/internal/application_resolved.ts +55 -55
  103. package/src/programmers/internal/application_schema.ts +157 -157
  104. package/src/programmers/internal/application_string.ts +44 -44
  105. package/src/programmers/internal/application_templates.ts +25 -25
  106. package/src/programmers/internal/application_tuple.ts +57 -57
  107. package/src/programmers/internal/check_array.ts +30 -30
  108. package/src/programmers/internal/check_array_length.ts +35 -35
  109. package/src/programmers/internal/check_bigint.ts +110 -110
  110. package/src/programmers/internal/check_custom.ts +31 -31
  111. package/src/programmers/internal/check_number.ts +258 -258
  112. package/src/programmers/internal/check_string.ts +25 -25
  113. package/src/programmers/internal/check_string_tags.ts +67 -67
  114. package/src/programmers/internal/check_template.ts +56 -56
  115. package/src/programmers/internal/check_union_array_like.ts +329 -329
  116. package/src/programmers/internal/decode_union_object.ts +84 -84
  117. package/src/programmers/internal/feature_object_entries.ts +63 -63
  118. package/src/programmers/internal/get_comment_tags.ts +23 -23
  119. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  120. package/src/programmers/internal/prune_object_properties.ts +60 -60
  121. package/src/programmers/internal/random_custom.ts +29 -29
  122. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  123. package/src/programmers/internal/template_to_pattern.ts +15 -15
  124. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  125. package/src/programmers/json/JsonApplicationProgrammer.ts +47 -47
  126. package/src/programmers/json/JsonAssertParseProgrammer.ts +66 -66
  127. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  128. package/src/programmers/json/JsonIsParseProgrammer.ts +72 -72
  129. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  130. package/src/programmers/json/JsonStringifyProgrammer.ts +987 -987
  131. package/src/programmers/json/JsonValidateParseProgrammer.ts +63 -70
  132. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  133. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  134. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  135. package/src/programmers/misc/MiscCloneProgrammer.ts +587 -587
  136. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  137. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  138. package/src/programmers/misc/MiscPruneProgrammer.ts +542 -542
  139. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  140. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  141. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +66 -69
  142. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  143. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +653 -38
  144. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +812 -920
  145. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +75 -75
  146. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  147. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +178 -178
  148. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -83
  149. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  150. package/src/protobuf.ts +249 -239
  151. package/src/schemas/json/IJsonApplication.ts +8 -8
  152. package/src/schemas/json/IJsonComponents.ts +33 -33
  153. package/src/schemas/json/IJsonSchema.ts +133 -133
  154. package/src/schemas/metadata/ICommentTag.ts +4 -4
  155. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  156. package/src/schemas/metadata/IMetadata.ts +28 -28
  157. package/src/schemas/metadata/IMetadataAlias.ts +14 -14
  158. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  159. package/src/schemas/metadata/IMetadataArray.ts +10 -10
  160. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  161. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  162. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  163. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  164. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  165. package/src/schemas/metadata/IMetadataProperty.ts +11 -11
  166. package/src/schemas/metadata/IMetadataResolved.ts +6 -6
  167. package/src/schemas/metadata/IMetadataTag.ts +112 -112
  168. package/src/schemas/metadata/IMetadataTuple.ts +10 -10
  169. package/src/schemas/metadata/Metadata.ts +637 -637
  170. package/src/schemas/metadata/MetadataAlias.ts +66 -66
  171. package/src/schemas/metadata/MetadataArray.ts +55 -55
  172. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  173. package/src/schemas/metadata/MetadataObject.ts +139 -139
  174. package/src/schemas/metadata/MetadataProperty.ts +64 -64
  175. package/src/schemas/metadata/MetadataResolved.ts +51 -51
  176. package/src/schemas/metadata/MetadataTuple.ts +58 -58
  177. package/src/transformers/CallExpressionTransformer.ts +240 -240
  178. package/src/transformers/features/AssertTransformer.ts +11 -11
  179. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  180. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  181. package/src/transformers/features/CreateRandomTransformer.ts +39 -39
  182. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  183. package/src/transformers/features/IsTransformer.ts +11 -11
  184. package/src/transformers/features/RandomTransformer.ts +42 -42
  185. package/src/transformers/features/ValidateTransformer.ts +11 -11
  186. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  187. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  188. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  189. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  190. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  191. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  192. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  193. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  194. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  195. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  196. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  197. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  198. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  199. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  200. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  201. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  202. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  203. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  204. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  205. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  206. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  207. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  208. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  209. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  210. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  211. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  212. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  213. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  214. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  215. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +28 -28
  216. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  217. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  218. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  219. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  220. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  221. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  222. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  223. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  224. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  225. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  226. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  227. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  228. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  229. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  230. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  231. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  232. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  233. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +31 -31
  234. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  235. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  236. package/src/utils/NameEncoder.ts +32 -32
@@ -1,38 +1,653 @@
1
- import ts from "typescript";
2
-
3
- import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
- import { TypeFactory } from "../../factories/TypeFactory";
5
-
6
- import { IProject } from "../../transformers/IProject";
7
-
8
- export namespace ProtobufDecodeProgrammer {
9
- export const write =
10
- (project: IProject) =>
11
- (modulo: ts.LeftHandSideExpression) =>
12
- (type: ts.Type, name?: string): ts.ArrowFunction => {
13
- project;
14
- modulo;
15
- type;
16
- name;
17
-
18
- // @todo
19
- return ts.factory.createArrowFunction(
20
- undefined,
21
- undefined,
22
- [
23
- IdentifierFactory.parameter(
24
- "input",
25
- ts.factory.createTypeReferenceNode("Uint8Array"),
26
- undefined,
27
- ),
28
- ],
29
- ts.factory.createTypeReferenceNode(
30
- `typia.Primitive<${
31
- name ?? TypeFactory.getFullName(project.checker)(type)
32
- }>`,
33
- ),
34
- undefined,
35
- ts.factory.createIdentifier("({})"),
36
- );
37
- };
38
- }
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 { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
12
+ import { Metadata } from "../../schemas/metadata/Metadata";
13
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
14
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
15
+ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
16
+
17
+ import { IProject } from "../../transformers/IProject";
18
+
19
+ import { Atomic } from "../../typings/Atomic";
20
+
21
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
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();
30
+ const collection: MetadataCollection = new MetadataCollection();
31
+ const meta: Metadata = ProtobufFactory.metadata(modulo.getText())(
32
+ project.checker,
33
+ )(collection)(type);
34
+
35
+ const functors = collection
36
+ .objects()
37
+ .filter((obj) => ProtobufUtil.isStaticObject(obj))
38
+ .map((obj) =>
39
+ StatementFactory.constant(
40
+ `${PREFIX}o${obj.index}`,
41
+ write_object_function(project)(importer)(obj),
42
+ ),
43
+ );
44
+ const reader = StatementFactory.constant(
45
+ "reader",
46
+ ts.factory.createNewExpression(
47
+ importer.use("Reader"),
48
+ undefined,
49
+ [ts.factory.createIdentifier("input")],
50
+ ),
51
+ );
52
+
53
+ return ts.factory.createArrowFunction(
54
+ undefined,
55
+ undefined,
56
+ [
57
+ IdentifierFactory.parameter(
58
+ "input",
59
+ ts.factory.createTypeReferenceNode("Uint8Array"),
60
+ ),
61
+ ],
62
+ ts.factory.createTypeReferenceNode(
63
+ name ?? TypeFactory.getFullName(project.checker)(type),
64
+ ),
65
+ undefined,
66
+ ts.factory.createBlock(
67
+ [
68
+ ...importer.declare(modulo),
69
+ ...functors,
70
+ reader,
71
+ ts.factory.createReturnStatement(
72
+ decode_regular_object(true)(meta.objects[0]!),
73
+ ),
74
+ ],
75
+ true,
76
+ ),
77
+ );
78
+ };
79
+
80
+ const write_object_function =
81
+ (project: IProject) =>
82
+ (importer: FunctionImporter) =>
83
+ (obj: MetadataObject): ts.ArrowFunction =>
84
+ ts.factory.createArrowFunction(
85
+ undefined,
86
+ undefined,
87
+ [
88
+ IdentifierFactory.parameter("reader"),
89
+ IdentifierFactory.parameter(
90
+ "length",
91
+ TypeFactory.keyword("number"),
92
+ ts.factory.createNumericLiteral(-1),
93
+ ),
94
+ ],
95
+ TypeFactory.keyword("any"),
96
+ undefined,
97
+ ts.factory.createBlock(
98
+ [
99
+ ts.factory.createExpressionStatement(
100
+ ts.factory.createBinaryExpression(
101
+ ts.factory.createIdentifier("length"),
102
+ ts.factory.createToken(
103
+ ts.SyntaxKind.EqualsToken,
104
+ ),
105
+ ts.factory.createConditionalExpression(
106
+ ts.factory.createLessThan(
107
+ ts.factory.createIdentifier("length"),
108
+ ts.factory.createNumericLiteral(0),
109
+ ),
110
+ undefined,
111
+ ts.factory.createCallExpression(
112
+ IdentifierFactory.access(READER())(
113
+ "size",
114
+ ),
115
+ undefined,
116
+ undefined,
117
+ ),
118
+ undefined,
119
+ ts.factory.createAdd(
120
+ ts.factory.createCallExpression(
121
+ IdentifierFactory.access(READER())(
122
+ "index",
123
+ ),
124
+ undefined,
125
+ undefined,
126
+ ),
127
+ ts.factory.createIdentifier("length"),
128
+ ),
129
+ ),
130
+ ),
131
+ ),
132
+ ...write_object_function_body(project)(importer)({
133
+ condition: ts.factory.createLessThan(
134
+ ts.factory.createCallExpression(
135
+ IdentifierFactory.access(READER())("index"),
136
+ undefined,
137
+ undefined,
138
+ ),
139
+ ts.factory.createIdentifier("length"),
140
+ ),
141
+ tag: "tag",
142
+ output: "output",
143
+ })(obj.properties),
144
+ ts.factory.createReturnStatement(
145
+ ts.factory.createIdentifier("output"),
146
+ ),
147
+ ],
148
+ true,
149
+ ),
150
+ );
151
+
152
+ const write_object_function_body =
153
+ (project: IProject) =>
154
+ (importer: FunctionImporter) =>
155
+ (props: { condition: ts.Expression; tag: string; output: string }) =>
156
+ (properties: MetadataProperty[]): ts.Statement[] => {
157
+ let i: number = 1;
158
+ const clauses: ts.CaseClause[] = properties
159
+ .map((p) => {
160
+ const clause = decode_property(project)(importer)(i)(
161
+ IdentifierFactory.access(
162
+ ts.factory.createIdentifier(props.output),
163
+ )(p.key.getSoleLiteral()!),
164
+ p.value,
165
+ p.tags,
166
+ );
167
+ i += p.value.binarySize();
168
+ return clause;
169
+ })
170
+ .flat();
171
+ return [
172
+ StatementFactory.constant(
173
+ props.output,
174
+ ts.factory.createObjectLiteralExpression(
175
+ properties.map((p) =>
176
+ ts.factory.createPropertyAssignment(
177
+ IdentifierFactory.identifier(
178
+ p.key.getSoleLiteral()!,
179
+ ),
180
+ write_property_default_value(p.value),
181
+ ),
182
+ ),
183
+ true,
184
+ ),
185
+ ),
186
+ ts.factory.createWhileStatement(
187
+ props.condition,
188
+ ts.factory.createBlock([
189
+ StatementFactory.constant(
190
+ props.tag,
191
+ ts.factory.createCallExpression(
192
+ IdentifierFactory.access(READER())("uint32"),
193
+ undefined,
194
+ undefined,
195
+ ),
196
+ ),
197
+ ts.factory.createSwitchStatement(
198
+ ts.factory.createUnsignedRightShift(
199
+ ts.factory.createIdentifier(props.tag),
200
+ ts.factory.createNumericLiteral(3),
201
+ ),
202
+ ts.factory.createCaseBlock([
203
+ ...clauses,
204
+ ts.factory.createDefaultClause([
205
+ ts.factory.createExpressionStatement(
206
+ ts.factory.createCallExpression(
207
+ IdentifierFactory.access(READER())(
208
+ "skipType",
209
+ ),
210
+ undefined,
211
+ [
212
+ ts.factory.createBitwiseAnd(
213
+ ts.factory.createIdentifier(
214
+ props.tag,
215
+ ),
216
+ ts.factory.createNumericLiteral(
217
+ 7,
218
+ ),
219
+ ),
220
+ ],
221
+ ),
222
+ ),
223
+ ts.factory.createBreakStatement(),
224
+ ]),
225
+ ]),
226
+ ),
227
+ ]),
228
+ ),
229
+ ];
230
+ };
231
+
232
+ const write_property_default_value = (value: Metadata) =>
233
+ ts.factory.createAsExpression(
234
+ value.nullable
235
+ ? ts.factory.createNull()
236
+ : value.isRequired() === false
237
+ ? ts.factory.createIdentifier("undefined")
238
+ : value.arrays.length
239
+ ? ts.factory.createArrayLiteralExpression()
240
+ : value.maps.length
241
+ ? ts.factory.createNewExpression(
242
+ ts.factory.createIdentifier("Map"),
243
+ undefined,
244
+ [],
245
+ )
246
+ : value.natives.length
247
+ ? ts.factory.createNewExpression(
248
+ ts.factory.createIdentifier("Uint8Array"),
249
+ undefined,
250
+ [],
251
+ )
252
+ : value.atomics.some((str) => str === "string") ||
253
+ value.constants.some(
254
+ (c) =>
255
+ c.type === "string" && c.values.some((v) => v === ""),
256
+ ) ||
257
+ value.templates.some(
258
+ (tpl) =>
259
+ tpl.length === 1 && tpl[0]!.getName() === "string",
260
+ )
261
+ ? ts.factory.createStringLiteral("")
262
+ : value.objects.length &&
263
+ value.objects.some((obj) => !ProtobufUtil.isStaticObject(obj))
264
+ ? ts.factory.createObjectLiteralExpression()
265
+ : ts.factory.createIdentifier("undefined"),
266
+ TypeFactory.keyword("any"),
267
+ );
268
+
269
+ /* -----------------------------------------------------------
270
+ DECODERS
271
+ ----------------------------------------------------------- */
272
+ const decode_property =
273
+ (project: IProject) =>
274
+ (importer: FunctionImporter) =>
275
+ (index: number) =>
276
+ (
277
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
278
+ meta: Metadata,
279
+ tags: IMetadataTag[],
280
+ ): ts.CaseClause[] => {
281
+ const clauses: ts.CaseClause[] = [];
282
+ const emplace = (v: ts.Expression | ts.Statement[]) =>
283
+ clauses.push(
284
+ ts.factory.createCaseClause(
285
+ ts.factory.createNumericLiteral(index++),
286
+ Array.isArray(v)
287
+ ? [...v, ts.factory.createBreakStatement()]
288
+ : [
289
+ ts.factory.createExpressionStatement(
290
+ ts.factory.createBinaryExpression(
291
+ accessor,
292
+ ts.factory.createToken(
293
+ ts.SyntaxKind.EqualsToken,
294
+ ),
295
+ v,
296
+ ),
297
+ ),
298
+ ts.factory.createBreakStatement(),
299
+ ],
300
+ ),
301
+ );
302
+
303
+ const required: boolean = meta.isRequired() && !meta.nullable;
304
+ for (const atomic of ProtobufUtil.getAtomics(meta))
305
+ emplace(decode_atomic(atomic, tags));
306
+ if (meta.natives.length) emplace(decode_bytes("bytes"));
307
+ for (const array of meta.arrays)
308
+ emplace(decode_array(accessor, array, required, tags));
309
+ for (const map of meta.maps)
310
+ emplace(
311
+ decode_map(project)(importer)(
312
+ accessor,
313
+ map,
314
+ required,
315
+ tags,
316
+ ),
317
+ );
318
+ for (const obj of meta.objects)
319
+ emplace(
320
+ ProtobufUtil.isStaticObject(obj)
321
+ ? decode_regular_object(false)(obj)
322
+ : decode_dynamic_object(project)(importer)(
323
+ accessor,
324
+ obj,
325
+ required,
326
+ ),
327
+ );
328
+ return clauses;
329
+ };
330
+
331
+ const decode_atomic = (
332
+ atomic: Atomic.Literal,
333
+ tags: IMetadataTag[],
334
+ ): ts.Expression => {
335
+ if (atomic === "string") return decode_bytes("string");
336
+ const method =
337
+ atomic === "bigint"
338
+ ? tags.find((t) => t.kind === "type" && t.value === "uint64")
339
+ ? "uint64"
340
+ : "int64"
341
+ : atomic === "number"
342
+ ? (() => {
343
+ const type = tags.find((t) => t.kind === "type");
344
+ if (type === undefined) return "double";
345
+ return type.value === "int" || type.value === "int32"
346
+ ? "int32"
347
+ : type.value === "uint" || type.value === "uint32"
348
+ ? "uint32"
349
+ : type.value === "int64"
350
+ ? "int64"
351
+ : type.value === "uint64"
352
+ ? "uint64"
353
+ : type.value === "float"
354
+ ? "float"
355
+ : "double";
356
+ })()
357
+ : "bool";
358
+ const call = ts.factory.createCallExpression(
359
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
360
+ method,
361
+ ),
362
+ undefined,
363
+ undefined,
364
+ );
365
+ return atomic === "number" &&
366
+ (method === "int64" || method === "uint64")
367
+ ? ts.factory.createCallExpression(
368
+ ts.factory.createIdentifier("Number"),
369
+ undefined,
370
+ [call],
371
+ )
372
+ : call;
373
+ };
374
+
375
+ const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
376
+ ts.factory.createCallExpression(
377
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"))(
378
+ method,
379
+ ),
380
+ undefined,
381
+ undefined,
382
+ );
383
+
384
+ const decode_array = (
385
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
386
+ array: MetadataArray,
387
+ required: boolean,
388
+ tags: IMetadataTag[],
389
+ ): ts.Statement[] => {
390
+ const statements: Array<ts.Expression | ts.Statement> = [];
391
+ if (required === false)
392
+ statements.push(
393
+ ts.factory.createBinaryExpression(
394
+ accessor,
395
+ ts.factory.createToken(
396
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
397
+ ),
398
+ ts.factory.createAsExpression(
399
+ ts.factory.createArrayLiteralExpression(),
400
+ ts.factory.createTypeReferenceNode("any[]"),
401
+ ),
402
+ ),
403
+ );
404
+ const atomics = ProtobufUtil.getAtomics(array.value);
405
+ const decoder = atomics.length
406
+ ? () => decode_atomic(atomics[0]!, tags)
407
+ : array.value.natives.length
408
+ ? () => decode_bytes("bytes")
409
+ : array.value.objects.length
410
+ ? () => decode_regular_object(false)(array.value.objects[0]!)
411
+ : null;
412
+ if (decoder === null) throw new Error("Never reach here.");
413
+ else if (atomics.length && atomics[0] !== "string") {
414
+ statements.push(
415
+ ts.factory.createIfStatement(
416
+ ts.factory.createStrictEquality(
417
+ ts.factory.createNumericLiteral(2),
418
+ ts.factory.createBitwiseAnd(
419
+ ts.factory.createIdentifier("tag"),
420
+ ts.factory.createNumericLiteral(7),
421
+ ),
422
+ ),
423
+ ts.factory.createBlock(
424
+ [
425
+ StatementFactory.constant(
426
+ "piece",
427
+ ts.factory.createAdd(
428
+ ts.factory.createCallExpression(
429
+ IdentifierFactory.access(READER())(
430
+ "uint32",
431
+ ),
432
+ undefined,
433
+ undefined,
434
+ ),
435
+ ts.factory.createCallExpression(
436
+ IdentifierFactory.access(READER())(
437
+ "index",
438
+ ),
439
+ undefined,
440
+ undefined,
441
+ ),
442
+ ),
443
+ ),
444
+ ts.factory.createWhileStatement(
445
+ ts.factory.createLessThan(
446
+ ts.factory.createCallExpression(
447
+ IdentifierFactory.access(READER())(
448
+ "index",
449
+ ),
450
+ undefined,
451
+ undefined,
452
+ ),
453
+ ts.factory.createIdentifier("piece"),
454
+ ),
455
+ ts.factory.createExpressionStatement(
456
+ ts.factory.createCallExpression(
457
+ IdentifierFactory.access(accessor)(
458
+ "push",
459
+ ),
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)
487
+ ? ts.factory.createExpressionStatement(stmt)
488
+ : stmt,
489
+ );
490
+ };
491
+
492
+ const decode_regular_object =
493
+ (top: boolean) =>
494
+ (obj: MetadataObject): ts.Expression =>
495
+ ts.factory.createCallExpression(
496
+ ts.factory.createIdentifier(`${PREFIX}o${obj.index}`),
497
+ undefined,
498
+ [
499
+ ts.factory.createIdentifier("reader"),
500
+ ...(top
501
+ ? []
502
+ : [
503
+ ts.factory.createCallExpression(
504
+ IdentifierFactory.access(READER())("uint32"),
505
+ undefined,
506
+ undefined,
507
+ ),
508
+ ]),
509
+ ],
510
+ );
511
+
512
+ const decode_dynamic_object =
513
+ (project: IProject) =>
514
+ (importer: FunctionImporter) =>
515
+ (
516
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
517
+ obj: MetadataObject,
518
+ required: boolean,
519
+ ): ts.Statement[] => {
520
+ const top = obj.properties[0]!;
521
+ return decode_entry(project)(importer)({
522
+ initializer: () =>
523
+ ts.factory.createBinaryExpression(
524
+ accessor,
525
+ ts.factory.createToken(
526
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
527
+ ),
528
+ ts.factory.createObjectLiteralExpression(),
529
+ ),
530
+ setter: () =>
531
+ ts.factory.createBinaryExpression(
532
+ ts.factory.createElementAccessExpression(
533
+ accessor,
534
+ ts.factory.createIdentifier("entry.key"),
535
+ ),
536
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
537
+ ts.factory.createIdentifier("entry.value"),
538
+ ),
539
+ })(top, required, top.tags);
540
+ };
541
+
542
+ const decode_map =
543
+ (project: IProject) =>
544
+ (importer: FunctionImporter) =>
545
+ (
546
+ accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression,
547
+ map: Metadata.Entry,
548
+ required: boolean,
549
+ tags: IMetadataTag[],
550
+ ): ts.Statement[] =>
551
+ decode_entry(project)(importer)({
552
+ initializer: () =>
553
+ ts.factory.createBinaryExpression(
554
+ accessor,
555
+ ts.factory.createToken(
556
+ ts.SyntaxKind.QuestionQuestionEqualsToken,
557
+ ),
558
+ ts.factory.createNewExpression(
559
+ ts.factory.createIdentifier("Map"),
560
+ [
561
+ TypeFactory.keyword("any"),
562
+ TypeFactory.keyword("any"),
563
+ ],
564
+ [],
565
+ ),
566
+ ),
567
+ setter: () =>
568
+ ts.factory.createCallExpression(
569
+ IdentifierFactory.access(accessor)("set"),
570
+ undefined,
571
+ [
572
+ ts.factory.createIdentifier("entry.key"),
573
+ ts.factory.createIdentifier("entry.value"),
574
+ ],
575
+ ),
576
+ })(map, required, tags);
577
+
578
+ const decode_entry =
579
+ (project: IProject) =>
580
+ (importer: FunctionImporter) =>
581
+ (props: {
582
+ initializer: () => ts.Expression;
583
+ setter: () => ts.Expression;
584
+ }) =>
585
+ (
586
+ map: Metadata.Entry,
587
+ required: boolean,
588
+ tags: IMetadataTag[],
589
+ ): ts.Statement[] => {
590
+ const statements: ts.Statement[] = [
591
+ ...(required
592
+ ? []
593
+ : [
594
+ ts.factory.createExpressionStatement(
595
+ props.initializer(),
596
+ ),
597
+ ]),
598
+ StatementFactory.constant(
599
+ "piece",
600
+ ts.factory.createAdd(
601
+ ts.factory.createCallExpression(
602
+ IdentifierFactory.access(READER())("uint32"),
603
+ undefined,
604
+ undefined,
605
+ ),
606
+ ts.factory.createCallExpression(
607
+ IdentifierFactory.access(READER())("index"),
608
+ undefined,
609
+ undefined,
610
+ ),
611
+ ),
612
+ ),
613
+ ...write_object_function_body(project)(importer)({
614
+ condition: ts.factory.createLessThan(
615
+ ts.factory.createCallExpression(
616
+ IdentifierFactory.access(READER())("index"),
617
+ undefined,
618
+ undefined,
619
+ ),
620
+ ts.factory.createIdentifier("piece"),
621
+ ),
622
+ tag: "kind",
623
+ output: "entry",
624
+ })([
625
+ MetadataProperty.create({
626
+ key: MetadataFactory.soleLiteral("key"),
627
+ value: map.key,
628
+ description: null,
629
+ tags: [],
630
+ jsDocTags: [],
631
+ }),
632
+ MetadataProperty.create({
633
+ key: MetadataFactory.soleLiteral("value"),
634
+ value: map.value,
635
+ description: null,
636
+ tags,
637
+ jsDocTags: [],
638
+ }),
639
+ ]),
640
+ ts.factory.createExpressionStatement(props.setter()),
641
+ ];
642
+ return [
643
+ ts.factory.createExpressionStatement(
644
+ ExpressionFactory.selfCall(
645
+ ts.factory.createBlock(statements, true),
646
+ ),
647
+ ),
648
+ ];
649
+ };
650
+ }
651
+
652
+ const PREFIX = "$pd";
653
+ const READER = () => ts.factory.createIdentifier("reader");