typia 5.0.0-dev.20230821 → 5.0.0-dev.20230823

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