typia 5.0.0-dev.20230810 → 5.0.0-dev.20230814

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 (190) hide show
  1. package/lib/factories/MetadataCollection.js +1 -0
  2. package/lib/factories/MetadataCollection.js.map +1 -1
  3. package/lib/factories/MetadataFactory.js +27 -0
  4. package/lib/factories/MetadataFactory.js.map +1 -1
  5. package/lib/factories/ProtobufFactory.d.ts +0 -2
  6. package/lib/factories/ProtobufFactory.js +55 -111
  7. package/lib/factories/ProtobufFactory.js.map +1 -1
  8. package/lib/factories/StatementFactory.d.ts +1 -0
  9. package/lib/factories/StatementFactory.js +5 -0
  10. package/lib/factories/StatementFactory.js.map +1 -1
  11. package/lib/factories/internal/metadata/explore_metadata.js +3 -7
  12. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  13. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +1 -0
  14. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  15. package/lib/functional/$strlen.d.ts +1 -0
  16. package/lib/functional/$strlen.js +13 -0
  17. package/lib/functional/$strlen.js.map +1 -0
  18. package/lib/functional/Namespace.js +19 -3
  19. package/lib/functional/Namespace.js.map +1 -1
  20. package/lib/json.js +4 -4
  21. package/lib/json.js.map +1 -1
  22. package/lib/misc.js +8 -8
  23. package/lib/misc.js.map +1 -1
  24. package/lib/programmers/CheckerProgrammer.js +0 -5
  25. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  26. package/lib/programmers/FeatureProgrammer.d.ts +3 -3
  27. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  28. package/lib/programmers/helpers/ProtobufUtil.d.ts +5 -0
  29. package/lib/programmers/helpers/ProtobufUtil.js +82 -0
  30. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -0
  31. package/lib/programmers/helpers/ProtobufWire.d.ts +25 -0
  32. package/lib/{schemas/protobuf/IProtocolMap.js → programmers/helpers/ProtobufWire.js} +1 -1
  33. package/lib/programmers/helpers/ProtobufWire.js.map +1 -0
  34. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +253 -5
  35. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  36. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +23 -37
  37. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  38. package/lib/programmers/protobuf/ProtobufSizeProgrammer.d.ts +5 -0
  39. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js +409 -0
  40. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js.map +1 -0
  41. package/lib/protobuf.js +9 -1
  42. package/lib/protobuf.js.map +1 -1
  43. package/lib/schemas/metadata/Metadata.js +11 -0
  44. package/lib/schemas/metadata/Metadata.js.map +1 -1
  45. package/lib/transformers/CallExpressionTransformer.js +26 -22
  46. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  47. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.js +1 -1
  48. package/lib/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.js.map +1 -1
  49. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.js +1 -1
  50. package/lib/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.js.map +1 -1
  51. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.js +1 -3
  52. package/lib/transformers/features/protobuf/CreateProtobufDecodeTransformer.js.map +1 -1
  53. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.js +1 -3
  54. package/lib/transformers/features/protobuf/CreateProtobufEncodeTransformer.js.map +1 -1
  55. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.js +1 -1
  56. package/lib/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.js.map +1 -1
  57. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.js +1 -1
  58. package/lib/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.js.map +1 -1
  59. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.d.ts +3 -0
  60. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js +10 -0
  61. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js.map +1 -0
  62. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.js +1 -1
  63. package/lib/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.js.map +1 -1
  64. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.js +1 -1
  65. package/lib/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.js.map +1 -1
  66. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.js +1 -1
  67. package/lib/transformers/features/protobuf/ProtobufAssertDecodeTransformer.js.map +1 -1
  68. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.js +1 -1
  69. package/lib/transformers/features/protobuf/ProtobufAssertEncodeTransformer.js.map +1 -1
  70. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js +1 -1
  71. package/lib/transformers/features/protobuf/ProtobufDecodeTransformer.js.map +1 -1
  72. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js +1 -1
  73. package/lib/transformers/features/protobuf/ProtobufEncodeTransformer.js.map +1 -1
  74. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js +1 -1
  75. package/lib/transformers/features/protobuf/ProtobufIsDecodeTransformer.js.map +1 -1
  76. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js +1 -1
  77. package/lib/transformers/features/protobuf/ProtobufIsEncodeTransformer.js.map +1 -1
  78. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.d.ts +1 -1
  79. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js +7 -7
  80. package/lib/transformers/features/protobuf/ProtobufMessageTransformer.js.map +1 -1
  81. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.d.ts +3 -0
  82. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js +10 -0
  83. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js.map +1 -0
  84. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.js +1 -1
  85. package/lib/transformers/features/protobuf/ProtobufValidateDecodeTransformer.js.map +1 -1
  86. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.js +1 -1
  87. package/lib/transformers/features/protobuf/ProtobufValidateEncodeTransformer.js.map +1 -1
  88. package/package.json +2 -1
  89. package/src/factories/MetadataCollection.ts +5 -0
  90. package/src/factories/MetadataFactory.ts +4 -0
  91. package/src/factories/ProtobufFactory.ts +106 -90
  92. package/src/factories/StatementFactory.ts +16 -0
  93. package/src/factories/internal/metadata/explore_metadata.ts +4 -6
  94. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +1 -0
  95. package/src/functional/$strlen.ts +7 -0
  96. package/src/functional/Namespace.ts +32 -17
  97. package/src/json.ts +4 -4
  98. package/src/misc.ts +8 -8
  99. package/src/programmers/CheckerProgrammer.ts +0 -9
  100. package/src/programmers/FeatureProgrammer.ts +5 -3
  101. package/src/programmers/helpers/ProtobufUtil.ts +24 -0
  102. package/src/programmers/helpers/ProtobufWire.ts +28 -0
  103. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +446 -5
  104. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +12 -8
  105. package/src/programmers/protobuf/ProtobufSizeProgrammer.ts +716 -0
  106. package/src/protobuf.ts +29 -0
  107. package/src/schemas/metadata/Metadata.ts +26 -0
  108. package/src/transformers/CallExpressionTransformer.ts +32 -28
  109. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +3 -1
  110. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +3 -1
  111. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +3 -4
  112. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +3 -4
  113. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +3 -1
  114. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +3 -1
  115. package/src/transformers/features/protobuf/CreateProtobufSizeTransformer.ts +9 -0
  116. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +3 -1
  117. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +3 -1
  118. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +1 -1
  119. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +1 -1
  120. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +1 -1
  121. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +1 -1
  122. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +1 -1
  123. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +1 -1
  124. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +3 -3
  125. package/src/transformers/features/protobuf/ProtobufSizeTransformer.ts +9 -0
  126. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +3 -1
  127. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +3 -1
  128. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +0 -16
  129. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +0 -173
  130. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +0 -1
  131. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +0 -3
  132. package/lib/factories/internal/protocols/emplace_protocol_object.js +0 -47
  133. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +0 -1
  134. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +0 -4
  135. package/lib/factories/internal/protocols/emplace_protocol_property.js +0 -20
  136. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +0 -1
  137. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +0 -3
  138. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +0 -69
  139. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +0 -1
  140. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +0 -2
  141. package/lib/factories/internal/protocols/iterate_protocol_constant.js +0 -30
  142. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +0 -1
  143. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +0 -3
  144. package/lib/factories/internal/protocols/iterate_protocol_main.js +0 -17
  145. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +0 -1
  146. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +0 -4
  147. package/lib/factories/internal/protocols/iterate_protocol_map.js +0 -75
  148. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +0 -1
  149. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +0 -5
  150. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +0 -190
  151. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +0 -1
  152. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +0 -2
  153. package/lib/factories/internal/protocols/iterate_protocol_native.js +0 -33
  154. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +0 -1
  155. package/lib/factories/internal/protocols/iterate_protocol_never.d.ts +0 -1
  156. package/lib/factories/internal/protocols/iterate_protocol_never.js +0 -6
  157. package/lib/factories/internal/protocols/iterate_protocol_never.js.map +0 -1
  158. package/lib/factories/internal/protocols/iterate_protocol_object.d.ts +0 -4
  159. package/lib/factories/internal/protocols/iterate_protocol_object.js +0 -157
  160. package/lib/factories/internal/protocols/iterate_protocol_object.js.map +0 -1
  161. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +0 -5
  162. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +0 -25
  163. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +0 -1
  164. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +0 -3
  165. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +0 -46
  166. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +0 -1
  167. package/lib/schemas/protobuf/IProtocolMap.d.ts +0 -5
  168. package/lib/schemas/protobuf/IProtocolMap.js.map +0 -1
  169. package/lib/schemas/protobuf/IProtocolMessage.d.ts +0 -5
  170. package/lib/schemas/protobuf/IProtocolMessage.js +0 -3
  171. package/lib/schemas/protobuf/IProtocolMessage.js.map +0 -1
  172. package/lib/schemas/protobuf/IProtocolProperty.d.ts +0 -12
  173. package/lib/schemas/protobuf/IProtocolProperty.js +0 -3
  174. package/lib/schemas/protobuf/IProtocolProperty.js.map +0 -1
  175. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +0 -180
  176. package/src/factories/internal/protocols/emplace_protocol_object.ts +0 -25
  177. package/src/factories/internal/protocols/emplace_protocol_property.ts +0 -12
  178. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +0 -34
  179. package/src/factories/internal/protocols/iterate_protocol_constant.ts +0 -27
  180. package/src/factories/internal/protocols/iterate_protocol_main.ts +0 -19
  181. package/src/factories/internal/protocols/iterate_protocol_map.ts +0 -58
  182. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +0 -96
  183. package/src/factories/internal/protocols/iterate_protocol_native.ts +0 -34
  184. package/src/factories/internal/protocols/iterate_protocol_never.ts +0 -1
  185. package/src/factories/internal/protocols/iterate_protocol_object.ts +0 -110
  186. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +0 -34
  187. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +0 -29
  188. package/src/schemas/protobuf/IProtocolMap.ts +0 -5
  189. package/src/schemas/protobuf/IProtocolMessage.ts +0 -6
  190. package/src/schemas/protobuf/IProtocolProperty.ts +0 -13
@@ -0,0 +1,716 @@
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 { ProtobufFactory } from "../../factories/ProtobufFactory";
7
+ import { StatementFactory } from "../../factories/StatementFactory";
8
+ import { TypeFactory } from "../../factories/TypeFactory";
9
+
10
+ import { $strlen } from "../../functional/$strlen";
11
+
12
+ import { IJsDocTagInfo } from "../../schemas/metadata/IJsDocTagInfo";
13
+ import { IMetadataTag } from "../../schemas/metadata/IMetadataTag";
14
+ import { Metadata } from "../../schemas/metadata/Metadata";
15
+ import { MetadataArray } from "../../schemas/metadata/MetadataArray";
16
+ import { MetadataObject } from "../../schemas/metadata/MetadataObject";
17
+ import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
18
+ import { MetadataTuple } from "../../schemas/metadata/MetadataTuple";
19
+
20
+ import { IProject } from "../../transformers/IProject";
21
+
22
+ import { Atomic } from "../../typings/Atomic";
23
+
24
+ import { FeatureProgrammer } from "../FeatureProgrammer";
25
+ import { IsProgrammer } from "../IsProgrammer";
26
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
27
+ import { ProtobufUtil } from "../helpers/ProtobufUtil";
28
+ import { UnionExplorer } from "../helpers/UnionExplorer";
29
+ import { check_native } from "../internal/check_native";
30
+ import { decode_union_object } from "../internal/decode_union_object";
31
+
32
+ export namespace ProtobufSizeProgrammer {
33
+ export const write =
34
+ (project: IProject) => (modulo: ts.LeftHandSideExpression) => {
35
+ const importer: FunctionImporter = new FunctionImporter();
36
+ const copnfig: FeatureProgrammer.IConfig = configure(
37
+ modulo.getText(),
38
+ )(project)(importer);
39
+ return FeatureProgrammer.write(project)({
40
+ ...copnfig,
41
+ addition: (collection) => [
42
+ ...IsProgrammer.write_function_statements(project)(
43
+ importer,
44
+ )(collection),
45
+ ...importer.declare(modulo),
46
+ ],
47
+ })(importer);
48
+ };
49
+
50
+ const write_object_function_body =
51
+ (project: IProject) =>
52
+ (config: FeatureProgrammer.IConfig) =>
53
+ (importer: FunctionImporter) =>
54
+ (obj: MetadataObject): ts.ConciseBody => {
55
+ const explore: FeatureProgrammer.IExplore = {
56
+ tracable: false,
57
+ source: "function",
58
+ from: "object",
59
+ postfix: "",
60
+ };
61
+ if (obj.properties.some((p) => !p.key.isSoleLiteral())) {
62
+ const p = obj.properties[0]!;
63
+ return write_map_function_body(project)(config)(importer)(
64
+ ts.factory.createIdentifier("input"),
65
+ p,
66
+ explore,
67
+ p.tags,
68
+ );
69
+ }
70
+
71
+ const zero = ts.factory.createNumericLiteral(0);
72
+ const compute = (p: MetadataProperty) => {
73
+ const input = IdentifierFactory.access(
74
+ ts.factory.createIdentifier("input"),
75
+ )(p.key.getSoleLiteral()!);
76
+ const output = ts.factory.createAdd(
77
+ ts.factory.createNumericLiteral(4),
78
+ decode(project)(config)(importer)(
79
+ input,
80
+ p.value,
81
+ explore,
82
+ p.tags,
83
+ ),
84
+ );
85
+ if (p.value.isRequired() === true && p.value.nullable === false)
86
+ return output;
87
+ else if (
88
+ p.value.isRequired() === true &&
89
+ p.value.nullable === true
90
+ )
91
+ return ts.factory.createConditionalExpression(
92
+ ts.factory.createStrictInequality(
93
+ ts.factory.createNull(),
94
+ input,
95
+ ),
96
+ undefined,
97
+ output,
98
+ undefined,
99
+ zero,
100
+ );
101
+ else if (
102
+ p.value.isRequired() === false &&
103
+ p.value.nullable === false
104
+ )
105
+ return ts.factory.createConditionalExpression(
106
+ ts.factory.createStrictInequality(
107
+ ts.factory.createIdentifier("undefined"),
108
+ input,
109
+ ),
110
+ undefined,
111
+ output,
112
+ undefined,
113
+ zero,
114
+ );
115
+ else
116
+ return ts.factory.createConditionalExpression(
117
+ ts.factory.createLogicalAnd(
118
+ ts.factory.createStrictInequality(
119
+ ts.factory.createIdentifier("undefined"),
120
+ input,
121
+ ),
122
+ ts.factory.createStrictInequality(
123
+ ts.factory.createNull(),
124
+ input,
125
+ ),
126
+ ),
127
+ undefined,
128
+ output,
129
+ undefined,
130
+ zero,
131
+ );
132
+ };
133
+
134
+ return obj.properties
135
+ .map((p) => compute(p))
136
+ .reduce((a, b) => ts.factory.createAdd(a, b));
137
+ };
138
+
139
+ const write_map_function_body =
140
+ (project: IProject) =>
141
+ (config: FeatureProgrammer.IConfig) =>
142
+ (importer: FunctionImporter) =>
143
+ (
144
+ input: ts.Expression,
145
+ entry: Metadata.Entry,
146
+ explore: FeatureProgrammer.IExplore,
147
+ tags: IMetadataTag[],
148
+ ): ts.Block => {
149
+ const key = ts.factory.createIdentifier("key");
150
+ const value = ts.factory.createIdentifier("value");
151
+ const tuple = ts.factory.createVariableDeclarationList(
152
+ [
153
+ ts.factory.createVariableDeclaration(
154
+ ts.factory.createArrayBindingPattern([
155
+ ts.factory.createBindingElement(
156
+ undefined,
157
+ undefined,
158
+ key,
159
+ ),
160
+ ts.factory.createBindingElement(
161
+ undefined,
162
+ undefined,
163
+ value,
164
+ ),
165
+ ]),
166
+ ),
167
+ ],
168
+ ts.NodeFlags.Const,
169
+ );
170
+ const block = ts.factory.createBlock(
171
+ [
172
+ decode_atomic(importer)(key, "string", []),
173
+ decode(project)(config)(importer)(
174
+ value,
175
+ entry.value,
176
+ explore,
177
+ tags,
178
+ ),
179
+ ].map((expr) =>
180
+ ts.factory.createExpressionStatement(
181
+ ts.factory.createBinaryExpression(
182
+ ts.factory.createIdentifier("size"),
183
+ ts.factory.createToken(
184
+ ts.SyntaxKind.PlusEqualsToken,
185
+ ),
186
+ expr,
187
+ ),
188
+ ),
189
+ ),
190
+ true,
191
+ );
192
+
193
+ return ts.factory.createBlock([
194
+ StatementFactory.mut(
195
+ "size",
196
+ ts.factory.createNumericLiteral(0),
197
+ ),
198
+ ts.factory.createForOfStatement(undefined, tuple, input, block),
199
+ ts.factory.createReturnStatement(
200
+ ts.factory.createIdentifier("size"),
201
+ ),
202
+ ]);
203
+ };
204
+
205
+ /* -----------------------------------------------------------
206
+ DECODERS
207
+ ----------------------------------------------------------- */
208
+ const decode =
209
+ (project: IProject) =>
210
+ (config: FeatureProgrammer.IConfig) =>
211
+ (importer: FunctionImporter) =>
212
+ (
213
+ input: ts.Expression,
214
+ meta: Metadata,
215
+ explore: FeatureProgrammer.IExplore,
216
+ tags: IMetadataTag[],
217
+ ): ts.Expression => {
218
+ // STARTS FROM ATOMIC TYPES
219
+ const unions: IUnion[] = ProtobufUtil.atomics(meta).map((type) => ({
220
+ type,
221
+ is: () =>
222
+ ts.factory.createStrictEquality(
223
+ ts.factory.createStringLiteral(type),
224
+ ts.factory.createTypeOfExpression(input),
225
+ ),
226
+ value: () => decode_atomic(importer)(input, type, tags),
227
+ }));
228
+
229
+ // CONSIDER ARRAYS
230
+ if (meta.arrays.length) {
231
+ const value: () => ts.Expression =
232
+ meta.arrays.length === 1
233
+ ? () =>
234
+ decode_array(project)(config)(importer)(
235
+ input,
236
+ meta.arrays[0]!,
237
+ explore,
238
+ tags,
239
+ )
240
+ : () =>
241
+ explore_arrays(project)(config)(importer)(
242
+ input,
243
+ meta.arrays,
244
+ explore,
245
+ tags,
246
+ );
247
+ unions.push({
248
+ type: "array",
249
+ is: () => ExpressionFactory.isArray(input),
250
+ value,
251
+ });
252
+ }
253
+
254
+ // CONSIDER OBJECTS
255
+ if (meta.objects.length)
256
+ unions.push({
257
+ type: "object",
258
+ is: () =>
259
+ ExpressionFactory.isObject({
260
+ checkNull: true,
261
+ checkArray: false,
262
+ })(input),
263
+ value: () =>
264
+ explore_objects(project)(config)(importer)(
265
+ input,
266
+ meta,
267
+ explore,
268
+ ),
269
+ });
270
+
271
+ // CONSIDER MAPS
272
+ if (meta.maps.length)
273
+ unions.push({
274
+ type: "map",
275
+ is: () => ExpressionFactory.isInstanceOf("Map")(input),
276
+ value: () =>
277
+ decode_map(project)(config)(importer)(
278
+ input,
279
+ meta.maps[0]!,
280
+ explore,
281
+ tags,
282
+ ),
283
+ });
284
+
285
+ // CONSIDER BINARY
286
+ if (meta.natives.length && meta.natives[0] === "Uint8Array")
287
+ unions.push({
288
+ type: "native",
289
+ is: () => check_native("Uint8Array")(input),
290
+ value: () => decode_binary(input),
291
+ });
292
+
293
+ return unions.length === 1
294
+ ? unions[0]!.value()
295
+ : ts.factory.createCallExpression(
296
+ ts.factory.createArrowFunction(
297
+ undefined,
298
+ undefined,
299
+ [],
300
+ undefined,
301
+ undefined,
302
+ iterate(importer, input, unions, meta.getName()),
303
+ ),
304
+ undefined,
305
+ undefined,
306
+ );
307
+ };
308
+
309
+ const iterate = (
310
+ importer: FunctionImporter,
311
+ input: ts.Expression,
312
+ unions: IUnion[],
313
+ expected: string,
314
+ ) =>
315
+ ts.factory.createBlock(
316
+ [
317
+ ...unions.map((u) =>
318
+ ts.factory.createIfStatement(
319
+ u.is(),
320
+ ts.factory.createReturnStatement(u.value()),
321
+ ),
322
+ ),
323
+ create_throw_error(importer)(expected)(input),
324
+ ],
325
+ true,
326
+ );
327
+
328
+ const decode_atomic =
329
+ (importer: FunctionImporter) =>
330
+ (input: ts.Expression, type: Atomic.Literal, tags: IMetadataTag[]) =>
331
+ type === "string"
332
+ ? ts.factory.createAdd(
333
+ ts.factory.createNumericLiteral(4),
334
+ ts.factory.createCallExpression(
335
+ importer.use("strlen"),
336
+ undefined,
337
+ [input],
338
+ ),
339
+ )
340
+ : ts.factory.createNumericLiteral(
341
+ computeAtomicLength(type)(tags)!,
342
+ );
343
+
344
+ const decode_array =
345
+ (project: IProject) =>
346
+ (config: FeatureProgrammer.IConfig) =>
347
+ (importer: FunctionImporter) =>
348
+ (
349
+ input: ts.Expression,
350
+ array: MetadataArray,
351
+ explore: FeatureProgrammer.IExplore,
352
+ tags: IMetadataTag[],
353
+ ): ts.Expression => {
354
+ const header = (expr: ts.Expression) =>
355
+ ts.factory.createAdd(ts.factory.createNumericLiteral(4), expr);
356
+ if (array.value.isBinaryUnion() === false) {
357
+ const length: number | null = computeFixedLength(array.value)(
358
+ tags,
359
+ );
360
+ if (length !== null)
361
+ return header(
362
+ ts.factory.createMultiply(
363
+ IdentifierFactory.access(input)("length"),
364
+ ts.factory.createNumericLiteral(length),
365
+ ),
366
+ );
367
+ }
368
+ return header(
369
+ ts.factory.createCallExpression(
370
+ ts.factory.createCallExpression(
371
+ IdentifierFactory.access(input)("map"),
372
+ undefined,
373
+ [
374
+ ts.factory.createArrowFunction(
375
+ undefined,
376
+ undefined,
377
+ [IdentifierFactory.parameter("elem")],
378
+ undefined,
379
+ undefined,
380
+ decode(project)(config)(importer)(
381
+ ts.factory.createIdentifier("elem"),
382
+ array.value,
383
+ explore,
384
+ tags,
385
+ ),
386
+ ),
387
+ ],
388
+ ),
389
+ undefined,
390
+ [
391
+ ts.factory.createArrowFunction(
392
+ undefined,
393
+ undefined,
394
+ [
395
+ IdentifierFactory.parameter("a"),
396
+ IdentifierFactory.parameter("b"),
397
+ ],
398
+ undefined,
399
+ undefined,
400
+ ts.factory.createAdd(
401
+ ts.factory.createIdentifier("a"),
402
+ ts.factory.createIdentifier("b"),
403
+ ),
404
+ ),
405
+ ts.factory.createNumericLiteral(0),
406
+ ],
407
+ ),
408
+ );
409
+ };
410
+
411
+ const decode_object = (importer: FunctionImporter) =>
412
+ FeatureProgrammer.decode_object({
413
+ trace: false,
414
+ path: false,
415
+ prefix: PREFIX,
416
+ })(importer);
417
+
418
+ const decode_binary = (input: ts.Expression): ts.Expression =>
419
+ ts.factory.createCallExpression(
420
+ IdentifierFactory.access(input)("writeBytes"),
421
+ undefined,
422
+ [input],
423
+ );
424
+
425
+ const decode_map =
426
+ (project: IProject) =>
427
+ (config: FeatureProgrammer.IConfig) =>
428
+ (importer: FunctionImporter) =>
429
+ (
430
+ input: ts.Expression,
431
+ entry: Metadata.Entry,
432
+ explore: FeatureProgrammer.IExplore,
433
+ tags: IMetadataTag[],
434
+ ): ts.Expression => {
435
+ return ts.factory.createCallExpression(
436
+ ts.factory.createArrowFunction(
437
+ undefined,
438
+ undefined,
439
+ [],
440
+ TypeFactory.keyword("any"),
441
+ undefined,
442
+ write_map_function_body(project)(config)(importer)(
443
+ input,
444
+ entry,
445
+ explore,
446
+ tags,
447
+ ),
448
+ ),
449
+ undefined,
450
+ undefined,
451
+ );
452
+ };
453
+
454
+ /* -----------------------------------------------------------
455
+ EXPLORERS
456
+ ----------------------------------------------------------- */
457
+ const explore_objects =
458
+ (_project: IProject) =>
459
+ (config: FeatureProgrammer.IConfig) =>
460
+ (importer: FunctionImporter) =>
461
+ (
462
+ input: ts.Expression,
463
+ meta: Metadata,
464
+ explore: FeatureProgrammer.IExplore,
465
+ ) =>
466
+ meta.objects.length === 1
467
+ ? decode_object(importer)(input, meta.objects[0]!, explore)
468
+ : ts.factory.createCallExpression(
469
+ ts.factory.createIdentifier(
470
+ importer.useLocal(
471
+ `${config.prefix}u${meta.union_index!}`,
472
+ ),
473
+ ),
474
+ undefined,
475
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
476
+ );
477
+
478
+ const explore_arrays =
479
+ (project: IProject) =>
480
+ (config: FeatureProgrammer.IConfig) =>
481
+ (importer: FunctionImporter) =>
482
+ (
483
+ input: ts.Expression,
484
+ elements: MetadataArray[],
485
+ explore: FeatureProgrammer.IExplore,
486
+ tags: IMetadataTag[],
487
+ ): ts.Expression =>
488
+ explore_array_like_union_types(config)(importer)(
489
+ UnionExplorer.array({
490
+ checker: IsProgrammer.decode(project)(importer),
491
+ decoder: decode_array(project)(config)(importer),
492
+ empty: ts.factory.createStringLiteral("[]"),
493
+ success: ts.factory.createTrue(),
494
+ failure: (input, expected) =>
495
+ create_throw_error(importer)(expected)(input),
496
+ }),
497
+ )(input, elements, explore, tags);
498
+
499
+ const explore_array_like_union_types =
500
+ (config: FeatureProgrammer.IConfig) =>
501
+ (importer: FunctionImporter) =>
502
+ <T extends MetadataArray | MetadataTuple>(
503
+ factory: (
504
+ parameters: ts.ParameterDeclaration[],
505
+ ) => (
506
+ input: ts.Expression,
507
+ elements: T[],
508
+ explore: FeatureProgrammer.IExplore,
509
+ tags: IMetadataTag[],
510
+ jsDocTags: IJsDocTagInfo[],
511
+ ) => ts.ArrowFunction,
512
+ ) =>
513
+ (
514
+ input: ts.Expression,
515
+ elements: T[],
516
+ explore: FeatureProgrammer.IExplore,
517
+ tags: IMetadataTag[],
518
+ ): ts.Expression => {
519
+ const arrow =
520
+ (parameters: ts.ParameterDeclaration[]) =>
521
+ (explore: FeatureProgrammer.IExplore) =>
522
+ (input: ts.Expression): ts.ArrowFunction =>
523
+ factory(parameters)(input, elements, explore, tags, []);
524
+ if (elements.every((e) => e.recursive === false))
525
+ ts.factory.createCallExpression(
526
+ arrow([])(explore)(input),
527
+ undefined,
528
+ [],
529
+ );
530
+
531
+ explore = {
532
+ ...explore,
533
+ source: "function",
534
+ from: "array",
535
+ };
536
+ return ts.factory.createCallExpression(
537
+ ts.factory.createIdentifier(
538
+ importer.emplaceUnion(
539
+ config.prefix,
540
+ elements.map((e) => e.name).join(" | "),
541
+ () =>
542
+ arrow(
543
+ FeatureProgrammer.parameterDeclarations(config)(
544
+ TypeFactory.keyword("any"),
545
+ )(ts.factory.createIdentifier("input")),
546
+ )({
547
+ ...explore,
548
+ postfix: "",
549
+ })(ts.factory.createIdentifier("input")),
550
+ ),
551
+ ),
552
+ undefined,
553
+ FeatureProgrammer.argumentsArray(config)(explore)(input),
554
+ );
555
+ };
556
+
557
+ /* -----------------------------------------------------------
558
+ CONFIGURATIONS
559
+ ----------------------------------------------------------- */
560
+ const PREFIX = "$ps";
561
+
562
+ const configure =
563
+ (method: string) =>
564
+ (project: IProject) =>
565
+ (importer: FunctionImporter): FeatureProgrammer.IConfig => {
566
+ const config: FeatureProgrammer.IConfig<ts.Expression> = {
567
+ types: {
568
+ input: (type, name) =>
569
+ ts.factory.createTypeReferenceNode(
570
+ name ??
571
+ TypeFactory.getFullName(project.checker)(type),
572
+ ),
573
+ output: (type, name) =>
574
+ ts.factory.createTypeReferenceNode(
575
+ `typia.Primitive<${
576
+ name ??
577
+ TypeFactory.getFullName(project.checker)(type)
578
+ }>`,
579
+ ),
580
+ },
581
+ prefix: PREFIX,
582
+ trace: false,
583
+ path: false,
584
+ initializer: initializer(method),
585
+ decoder: () => decode(project)(config)(importer),
586
+ objector: {
587
+ checker: () => IsProgrammer.decode(project)(importer),
588
+ decoder: () => decode_object(importer),
589
+ joiner: (_input, _entries, obj) =>
590
+ write_object_function_body(project)(config)(importer)(
591
+ obj,
592
+ ),
593
+ unionizer: decode_union_object(
594
+ IsProgrammer.decode_object(importer),
595
+ )(decode_object(importer))((exp) => exp)(
596
+ (input, expected) =>
597
+ create_throw_error(importer)(expected)(input),
598
+ ),
599
+ failure: (input, expected) =>
600
+ create_throw_error(importer)(expected)(input),
601
+ },
602
+ generator: {
603
+ arrays: () => () => [],
604
+ tuples: () => () => [],
605
+ },
606
+ };
607
+ return config;
608
+ };
609
+
610
+ const initializer =
611
+ (method: string): FeatureProgrammer.IConfig["initializer"] =>
612
+ ({ checker }) =>
613
+ (type) => {
614
+ const collection: MetadataCollection = new MetadataCollection();
615
+ const meta: Metadata =
616
+ ProtobufFactory.metadata(method)(checker)(collection)(type);
617
+ return [collection, meta];
618
+ };
619
+
620
+ const create_throw_error =
621
+ (importer: FunctionImporter) =>
622
+ (expected: string) =>
623
+ (value: ts.Expression) =>
624
+ ts.factory.createExpressionStatement(
625
+ ts.factory.createCallExpression(
626
+ importer.use("throws"),
627
+ [],
628
+ [
629
+ ts.factory.createObjectLiteralExpression(
630
+ [
631
+ ts.factory.createPropertyAssignment(
632
+ "expected",
633
+ ts.factory.createStringLiteral(expected),
634
+ ),
635
+ ts.factory.createPropertyAssignment(
636
+ "value",
637
+ value,
638
+ ),
639
+ ],
640
+ true,
641
+ ),
642
+ ],
643
+ ),
644
+ );
645
+ }
646
+
647
+ const computeFixedLength =
648
+ (meta: Metadata) =>
649
+ (tags: IMetadataTag[]): number | null => {
650
+ if (meta.fixed_ !== undefined) return meta.fixed_;
651
+ return (meta.fixed_ = (() => {
652
+ if (
653
+ meta.isRequired() === false ||
654
+ meta.nullable ||
655
+ meta.natives.length ||
656
+ meta.maps.length ||
657
+ meta.isBinaryUnion()
658
+ )
659
+ return null;
660
+ else if (meta.arrays.length)
661
+ return computeFixedLength(meta.arrays[0]!.value)(tags);
662
+
663
+ const atomics = new Set([
664
+ ...meta.atomics,
665
+ ...meta.constants.map((c) => c.type),
666
+ ...meta.templates.map(() => "string" as const),
667
+ ]);
668
+ if (atomics.size)
669
+ return computeAtomicLength(Array.from(atomics)[0]!)(tags);
670
+ else if (meta.objects.length) {
671
+ const obj: MetadataObject = meta.objects[0]!;
672
+ if (obj.properties.some((p) => !p.key.isSoleLiteral()))
673
+ return null;
674
+ else if (
675
+ obj.properties.some(
676
+ (p) => computeFixedLength(p.value)(p.tags) === null,
677
+ )
678
+ )
679
+ return null;
680
+ return obj.properties
681
+ .map(
682
+ (p) =>
683
+ $strlen(p.key.getSoleLiteral()!) +
684
+ computeFixedLength(p.value)(p.tags)!,
685
+ )
686
+ .reduce((a, b) => a + b, 0);
687
+ }
688
+ return null;
689
+ })());
690
+ };
691
+
692
+ const computeAtomicLength =
693
+ (type: Atomic.Literal) =>
694
+ (tags: IMetadataTag[]): number | null => {
695
+ if (type === "string") return null;
696
+ else if (type === "boolean") return 1;
697
+ else if (type === "bigint") return 8;
698
+
699
+ const shorter = tags.find((tag) => tag.kind === "type") as
700
+ | IMetadataTag.INumberType
701
+ | undefined;
702
+ return shorter &&
703
+ (shorter.value === "int" ||
704
+ shorter.value === "uint" ||
705
+ shorter.value === "int32" ||
706
+ shorter.value === "uint32" ||
707
+ shorter.value === "float")
708
+ ? 4
709
+ : 8;
710
+ };
711
+
712
+ interface IUnion {
713
+ type: string;
714
+ is: () => ts.Expression;
715
+ value: () => ts.Expression;
716
+ }