typia 7.0.0-dev.20241012 → 7.0.0-dev.20241019

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 (256) hide show
  1. package/lib/factories/JsonMetadataFactory.js +3 -2
  2. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  3. package/lib/factories/MetadataCollection.d.ts +3 -3
  4. package/lib/factories/MetadataCollection.js +2 -2
  5. package/lib/factories/MetadataCollection.js.map +1 -1
  6. package/lib/factories/MetadataFactory.d.ts +2 -2
  7. package/lib/factories/MetadataFactory.js +3 -3
  8. package/lib/factories/MetadataFactory.js.map +1 -1
  9. package/lib/factories/MetadataTypeTagFactory.d.ts +3 -2
  10. package/lib/factories/MetadataTypeTagFactory.js +26 -3
  11. package/lib/factories/MetadataTypeTagFactory.js.map +1 -1
  12. package/lib/factories/ProtobufFactory.js +1266 -160
  13. package/lib/factories/ProtobufFactory.js.map +1 -1
  14. package/lib/factories/internal/metadata/IMetadataIteratorProps.d.ts +1 -0
  15. package/lib/factories/internal/metadata/MetadataHelper.js +1 -1
  16. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  17. package/lib/factories/internal/metadata/emplace_metadata_alias.d.ts +2 -2
  18. package/lib/factories/internal/metadata/emplace_metadata_object.js +5 -5
  19. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  20. package/lib/factories/internal/metadata/explore_metadata.js +2 -0
  21. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata.js +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  24. package/lib/factories/internal/metadata/iterate_metadata_alias.js +8 -2
  25. package/lib/factories/internal/metadata/iterate_metadata_alias.js.map +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_collection.js +6 -6
  27. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata_intersection.js +262 -137
  29. package/lib/factories/internal/metadata/iterate_metadata_intersection.js.map +1 -1
  30. package/lib/factories/internal/metadata/iterate_metadata_map.js +4 -2
  31. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -1
  32. package/lib/factories/internal/metadata/iterate_metadata_native.js +27 -11
  33. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  34. package/lib/factories/internal/metadata/iterate_metadata_set.js +8 -1
  35. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -1
  36. package/lib/factories/internal/metadata/iterate_metadata_sort.js +1 -1
  37. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_template.js +1 -1
  39. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -1
  40. package/lib/programmers/CheckerProgrammer.js +5 -5
  41. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  42. package/lib/programmers/RandomProgrammer.js +12 -12
  43. package/lib/programmers/RandomProgrammer.js.map +1 -1
  44. package/lib/programmers/helpers/AtomicPredicator.js +3 -3
  45. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  46. package/lib/programmers/helpers/ProtobufUtil.d.ts +6 -3
  47. package/lib/programmers/helpers/ProtobufUtil.js +216 -93
  48. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  49. package/lib/programmers/helpers/UnionExplorer.d.ts +4 -2
  50. package/lib/programmers/helpers/UnionExplorer.js +1 -1
  51. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  52. package/lib/programmers/http/HttpFormDataProgrammer.js +6 -6
  53. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  54. package/lib/programmers/internal/application_escaped.js +2 -2
  55. package/lib/programmers/internal/application_escaped.js.map +1 -1
  56. package/lib/programmers/internal/application_v30_alias.js +13 -8
  57. package/lib/programmers/internal/application_v30_alias.js.map +1 -1
  58. package/lib/programmers/internal/application_v30_native.js +17 -10
  59. package/lib/programmers/internal/application_v30_native.js.map +1 -1
  60. package/lib/programmers/internal/application_v30_object.js +16 -6
  61. package/lib/programmers/internal/application_v30_object.js.map +1 -1
  62. package/lib/programmers/internal/application_v30_schema.js +24 -17
  63. package/lib/programmers/internal/application_v30_schema.js.map +1 -1
  64. package/lib/programmers/internal/application_v31_alias.js +12 -11
  65. package/lib/programmers/internal/application_v31_alias.js.map +1 -1
  66. package/lib/programmers/internal/application_v31_native.js +17 -10
  67. package/lib/programmers/internal/application_v31_native.js.map +1 -1
  68. package/lib/programmers/internal/application_v31_object.js +13 -6
  69. package/lib/programmers/internal/application_v31_object.js.map +1 -1
  70. package/lib/programmers/internal/application_v31_schema.js +23 -16
  71. package/lib/programmers/internal/application_v31_schema.js.map +1 -1
  72. package/lib/programmers/internal/check_dynamic_key.js +4 -4
  73. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  74. package/lib/programmers/internal/check_native.js +3 -3
  75. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  76. package/lib/programmers/internal/llm_schema_escaped.js +2 -2
  77. package/lib/programmers/internal/llm_schema_escaped.js.map +1 -1
  78. package/lib/programmers/internal/llm_schema_object.js +18 -14
  79. package/lib/programmers/internal/llm_schema_object.js.map +1 -1
  80. package/lib/programmers/internal/llm_schema_station.js +8 -8
  81. package/lib/programmers/internal/llm_schema_station.js.map +1 -1
  82. package/lib/programmers/json/JsonSchemasProgrammer.js +5 -5
  83. package/lib/programmers/json/JsonSchemasProgrammer.js.map +1 -1
  84. package/lib/programmers/json/JsonStringifyProgrammer.js +18 -17
  85. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  86. package/lib/programmers/llm/LlmSchemaProgrammer.js +6 -6
  87. package/lib/programmers/llm/LlmSchemaProgrammer.js.map +1 -1
  88. package/lib/programmers/misc/MiscCloneProgrammer.js +7 -5
  89. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  90. package/lib/programmers/misc/MiscPruneProgrammer.js +1 -1
  91. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  92. package/lib/programmers/notations/NotationGeneralProgrammer.js +6 -4
  93. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  94. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +169 -220
  95. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  96. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +6 -4
  97. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  98. package/lib/programmers/protobuf/ProtobufMessageProgrammer.d.ts +1 -1
  99. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +53 -128
  100. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  101. package/lib/schemas/metadata/IMetadata.d.ts +14 -18
  102. package/lib/schemas/metadata/IMetadataAlias.d.ts +2 -7
  103. package/lib/schemas/metadata/IMetadataAliasType.d.ts +10 -0
  104. package/lib/schemas/metadata/IMetadataAliasType.js +3 -0
  105. package/lib/schemas/metadata/IMetadataAliasType.js.map +1 -0
  106. package/lib/schemas/metadata/IMetadataComponents.d.ts +2 -2
  107. package/lib/schemas/metadata/IMetadataConstantValue.d.ts +1 -1
  108. package/lib/schemas/metadata/IMetadataDictionary.d.ts +2 -2
  109. package/lib/schemas/metadata/IMetadataMap.d.ts +7 -0
  110. package/lib/schemas/metadata/{IMetadataEntry.js → IMetadataMap.js} +1 -1
  111. package/lib/schemas/metadata/IMetadataMap.js.map +1 -0
  112. package/lib/schemas/metadata/IMetadataNative.d.ts +5 -0
  113. package/lib/schemas/metadata/IMetadataNative.js +3 -0
  114. package/lib/schemas/metadata/IMetadataNative.js.map +1 -0
  115. package/lib/schemas/metadata/IMetadataSet.d.ts +6 -0
  116. package/lib/schemas/metadata/IMetadataSet.js +3 -0
  117. package/lib/schemas/metadata/IMetadataSet.js.map +1 -0
  118. package/lib/schemas/metadata/IMetadataTemplate.d.ts +1 -1
  119. package/lib/schemas/metadata/IMetadataTypeTag.d.ts +1 -1
  120. package/lib/schemas/metadata/Metadata.d.ts +6 -9
  121. package/lib/schemas/metadata/Metadata.js +136 -98
  122. package/lib/schemas/metadata/Metadata.js.map +1 -1
  123. package/lib/schemas/metadata/MetadataAlias.d.ts +8 -11
  124. package/lib/schemas/metadata/MetadataAlias.js +48 -33
  125. package/lib/schemas/metadata/MetadataAlias.js.map +1 -1
  126. package/lib/schemas/metadata/MetadataAliasType.d.ts +16 -0
  127. package/lib/schemas/metadata/MetadataAliasType.js +51 -0
  128. package/lib/schemas/metadata/MetadataAliasType.js.map +1 -0
  129. package/lib/schemas/metadata/MetadataComponents.d.ts +2 -2
  130. package/lib/schemas/metadata/MetadataComponents.js +2 -2
  131. package/lib/schemas/metadata/MetadataComponents.js.map +1 -1
  132. package/lib/schemas/metadata/MetadataConstantValue.d.ts +1 -1
  133. package/lib/schemas/metadata/MetadataMap.d.ts +14 -0
  134. package/lib/schemas/metadata/MetadataMap.js +66 -0
  135. package/lib/schemas/metadata/MetadataMap.js.map +1 -0
  136. package/lib/schemas/metadata/MetadataNative.d.ts +12 -0
  137. package/lib/schemas/metadata/MetadataNative.js +65 -0
  138. package/lib/schemas/metadata/MetadataNative.js.map +1 -0
  139. package/lib/schemas/metadata/MetadataProperty.d.ts +2 -0
  140. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  141. package/lib/schemas/metadata/MetadataSet.d.ts +13 -0
  142. package/lib/schemas/metadata/MetadataSet.js +64 -0
  143. package/lib/schemas/metadata/MetadataSet.js.map +1 -0
  144. package/lib/schemas/metadata/MetadataTemplate.d.ts +1 -1
  145. package/lib/schemas/protobuf/IProtobufProperty.d.ts +5 -0
  146. package/lib/schemas/protobuf/IProtobufProperty.js +3 -0
  147. package/lib/schemas/protobuf/IProtobufProperty.js.map +1 -0
  148. package/lib/schemas/protobuf/IProtobufPropertyType.d.ts +28 -0
  149. package/lib/schemas/protobuf/IProtobufPropertyType.js +3 -0
  150. package/lib/schemas/protobuf/IProtobufPropertyType.js.map +1 -0
  151. package/lib/schemas/protobuf/IProtobufSchema.d.ts +38 -0
  152. package/lib/schemas/protobuf/IProtobufSchema.js +3 -0
  153. package/lib/schemas/protobuf/IProtobufSchema.js.map +1 -0
  154. package/lib/tags/Example.d.ts +2 -2
  155. package/lib/tags/Examples.d.ts +2 -2
  156. package/lib/tags/JsonSchemaPlugin.d.ts +1 -1
  157. package/lib/tags/Sequence.d.ts +9 -0
  158. package/lib/tags/Sequence.js +3 -0
  159. package/lib/tags/Sequence.js.map +1 -0
  160. package/lib/tags/TagBase.d.ts +1 -1
  161. package/lib/tags/index.d.ts +1 -0
  162. package/lib/tags/index.js +1 -0
  163. package/lib/tags/index.js.map +1 -1
  164. package/lib/utils/{NameEncoder.d.ts → ProtobufNameEncoder.d.ts} +1 -1
  165. package/lib/utils/{NameEncoder.js → ProtobufNameEncoder.js} +7 -7
  166. package/lib/utils/ProtobufNameEncoder.js.map +1 -0
  167. package/package.json +1 -1
  168. package/src/factories/JsonMetadataFactory.ts +5 -2
  169. package/src/factories/MetadataCollection.ts +6 -6
  170. package/src/factories/MetadataFactory.ts +7 -7
  171. package/src/factories/MetadataTypeTagFactory.ts +31 -6
  172. package/src/factories/ProtobufFactory.ts +794 -177
  173. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +1 -0
  174. package/src/factories/internal/metadata/MetadataHelper.ts +1 -1
  175. package/src/factories/internal/metadata/emplace_metadata_alias.ts +2 -2
  176. package/src/factories/internal/metadata/emplace_metadata_object.ts +5 -5
  177. package/src/factories/internal/metadata/explore_metadata.ts +1 -0
  178. package/src/factories/internal/metadata/iterate_metadata.ts +1 -1
  179. package/src/factories/internal/metadata/iterate_metadata_alias.ts +9 -4
  180. package/src/factories/internal/metadata/iterate_metadata_collection.ts +6 -6
  181. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +163 -181
  182. package/src/factories/internal/metadata/iterate_metadata_map.ts +5 -2
  183. package/src/factories/internal/metadata/iterate_metadata_native.ts +20 -2
  184. package/src/factories/internal/metadata/iterate_metadata_set.ts +27 -11
  185. package/src/factories/internal/metadata/iterate_metadata_sort.ts +1 -1
  186. package/src/factories/internal/metadata/iterate_metadata_template.ts +1 -3
  187. package/src/programmers/CheckerProgrammer.ts +9 -7
  188. package/src/programmers/RandomProgrammer.ts +16 -14
  189. package/src/programmers/helpers/AtomicPredicator.ts +3 -3
  190. package/src/programmers/helpers/ProtobufUtil.ts +147 -44
  191. package/src/programmers/helpers/UnionExplorer.ts +62 -62
  192. package/src/programmers/http/HttpFormDataProgrammer.ts +10 -6
  193. package/src/programmers/internal/application_escaped.ts +2 -2
  194. package/src/programmers/internal/application_v30_alias.ts +18 -12
  195. package/src/programmers/internal/application_v30_native.ts +22 -12
  196. package/src/programmers/internal/application_v30_object.ts +23 -8
  197. package/src/programmers/internal/application_v30_schema.ts +31 -34
  198. package/src/programmers/internal/application_v31_alias.ts +16 -13
  199. package/src/programmers/internal/application_v31_native.ts +22 -12
  200. package/src/programmers/internal/application_v31_object.ts +19 -8
  201. package/src/programmers/internal/application_v31_schema.ts +26 -29
  202. package/src/programmers/internal/check_dynamic_key.ts +4 -4
  203. package/src/programmers/internal/check_native.ts +4 -4
  204. package/src/programmers/internal/check_union_array_like.ts +2 -1
  205. package/src/programmers/internal/llm_schema_escaped.ts +2 -2
  206. package/src/programmers/internal/llm_schema_object.ts +21 -18
  207. package/src/programmers/internal/llm_schema_station.ts +9 -11
  208. package/src/programmers/json/JsonSchemasProgrammer.ts +5 -5
  209. package/src/programmers/json/JsonStringifyProgrammer.ts +5 -5
  210. package/src/programmers/llm/LlmSchemaProgrammer.ts +6 -6
  211. package/src/programmers/misc/MiscCloneProgrammer.ts +11 -7
  212. package/src/programmers/misc/MiscPruneProgrammer.ts +1 -1
  213. package/src/programmers/notations/NotationGeneralProgrammer.ts +10 -6
  214. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +254 -308
  215. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +11 -8
  216. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +73 -95
  217. package/src/schemas/metadata/IMetadata.ts +35 -39
  218. package/src/schemas/metadata/IMetadataAlias.ts +6 -12
  219. package/src/schemas/metadata/IMetadataAliasType.ts +12 -0
  220. package/src/schemas/metadata/IMetadataArray.ts +6 -6
  221. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  222. package/src/schemas/metadata/IMetadataConstantValue.ts +1 -1
  223. package/src/schemas/metadata/IMetadataDictionary.ts +2 -2
  224. package/src/schemas/metadata/IMetadataMap.ts +8 -0
  225. package/src/schemas/metadata/IMetadataNative.ts +6 -0
  226. package/src/schemas/metadata/IMetadataObjectType.ts +13 -13
  227. package/src/schemas/metadata/IMetadataSet.ts +7 -0
  228. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  229. package/src/schemas/metadata/IMetadataTuple.ts +6 -6
  230. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  231. package/src/schemas/metadata/Metadata.ts +100 -47
  232. package/src/schemas/metadata/MetadataAlias.ts +46 -61
  233. package/src/schemas/metadata/MetadataAliasType.ts +63 -0
  234. package/src/schemas/metadata/MetadataArray.ts +49 -49
  235. package/src/schemas/metadata/MetadataComponents.ts +3 -3
  236. package/src/schemas/metadata/MetadataConstantValue.ts +1 -1
  237. package/src/schemas/metadata/MetadataMap.ts +48 -0
  238. package/src/schemas/metadata/MetadataNative.ts +44 -0
  239. package/src/schemas/metadata/MetadataProperty.ts +3 -0
  240. package/src/schemas/metadata/MetadataSet.ts +45 -0
  241. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  242. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  243. package/src/schemas/protobuf/IProtobufProperty.ts +6 -0
  244. package/src/schemas/protobuf/IProtobufPropertyType.ts +37 -0
  245. package/src/schemas/protobuf/IProtobufSchema.ts +50 -0
  246. package/src/tags/Example.ts +24 -17
  247. package/src/tags/Examples.ts +16 -16
  248. package/src/tags/JsonSchemaPlugin.ts +8 -8
  249. package/src/tags/Sequence.ts +10 -0
  250. package/src/tags/TagBase.ts +82 -76
  251. package/src/tags/index.ts +1 -0
  252. package/src/utils/{NameEncoder.ts → ProtobufNameEncoder.ts} +1 -1
  253. package/lib/schemas/metadata/IMetadataEntry.d.ts +0 -5
  254. package/lib/schemas/metadata/IMetadataEntry.js.map +0 -1
  255. package/lib/utils/NameEncoder.js.map +0 -1
  256. package/src/schemas/metadata/IMetadataEntry.ts +0 -6
@@ -9,16 +9,15 @@ import { StatementFactory } from "../../factories/StatementFactory";
9
9
  import { TypeFactory } from "../../factories/TypeFactory";
10
10
 
11
11
  import { Metadata } from "../../schemas/metadata/Metadata";
12
- import { MetadataArray } from "../../schemas/metadata/MetadataArray";
13
- import { MetadataAtomic } from "../../schemas/metadata/MetadataAtomic";
14
12
  import { MetadataObjectType } from "../../schemas/metadata/MetadataObjectType";
15
13
  import { MetadataProperty } from "../../schemas/metadata/MetadataProperty";
14
+ import { IProtobufProperty } from "../../schemas/protobuf/IProtobufProperty";
15
+ import { IProtobufPropertyType } from "../../schemas/protobuf/IProtobufPropertyType";
16
+ import { IProtobufSchema } from "../../schemas/protobuf/IProtobufSchema";
16
17
 
17
18
  import { IProgrammerProps } from "../../transformers/IProgrammerProps";
18
19
  import { ITypiaContext } from "../../transformers/ITypiaContext";
19
20
 
20
- import { ProtobufAtomic } from "../../typings/ProtobufAtomic";
21
-
22
21
  import { FeatureProgrammer } from "../FeatureProgrammer";
23
22
  import { FunctionProgrammer } from "../helpers/FunctionProgrammer";
24
23
  import { ProtobufUtil } from "../helpers/ProtobufUtil";
@@ -148,18 +147,10 @@ export namespace ProtobufDecodeProgrammer {
148
147
  ExpressionFactory.number(0),
149
148
  ),
150
149
  undefined,
151
- ts.factory.createCallExpression(
152
- IdentifierFactory.access(READER(), "size"),
153
- undefined,
154
- undefined,
155
- ),
150
+ callReader("size"),
156
151
  undefined,
157
152
  ts.factory.createAdd(
158
- ts.factory.createCallExpression(
159
- IdentifierFactory.access(READER(), "index"),
160
- undefined,
161
- undefined,
162
- ),
153
+ callReader("index"),
163
154
  ts.factory.createIdentifier("length"),
164
155
  ),
165
156
  ),
@@ -167,18 +158,13 @@ export namespace ProtobufDecodeProgrammer {
167
158
  ),
168
159
  ...write_object_function_body({
169
160
  context: props.context,
170
- functor: props.functor,
171
161
  condition: ts.factory.createLessThan(
172
- ts.factory.createCallExpression(
173
- IdentifierFactory.access(READER(), "index"),
174
- undefined,
175
- undefined,
176
- ),
162
+ callReader("index"),
177
163
  ts.factory.createIdentifier("length"),
178
164
  ),
179
165
  tag: "tag",
180
166
  output: "output",
181
- properties: props.object.properties,
167
+ object: props.object,
182
168
  }),
183
169
  ts.factory.createReturnStatement(
184
170
  ts.factory.createIdentifier("output"),
@@ -190,35 +176,32 @@ export namespace ProtobufDecodeProgrammer {
190
176
 
191
177
  const write_object_function_body = (props: {
192
178
  context: ITypiaContext;
193
- functor: FunctionProgrammer;
194
179
  condition: ts.Expression;
195
180
  tag: string;
196
181
  output: string;
197
- properties: MetadataProperty[];
182
+ object: MetadataObjectType;
198
183
  }): ts.Statement[] => {
199
- let index: number = 1;
200
- const clauses: ts.CaseClause[] = props.properties
201
- .map((p) => {
202
- const clause = decode_property({
184
+ if (props.object.properties.some((p) => p.of_protobuf_ === undefined))
185
+ ProtobufFactory.emplaceObject(props.object);
186
+ const clauses: ts.CaseClause[] = props.object.properties
187
+ .map((p) =>
188
+ decode_property({
203
189
  context: props.context,
204
- functor: props.functor,
205
- index,
206
190
  accessor: IdentifierFactory.access(
207
191
  ts.factory.createIdentifier(props.output),
208
192
  p.key.getSoleLiteral()!,
209
193
  ),
194
+ protobuf: p.of_protobuf_!,
210
195
  metadata: p.value,
211
- });
212
- index += ProtobufUtil.size(p.value);
213
- return clause;
214
- })
196
+ }),
197
+ )
215
198
  .flat();
216
199
  return [
217
200
  StatementFactory.constant({
218
201
  name: props.output,
219
202
  value: ts.factory.createAsExpression(
220
203
  ts.factory.createObjectLiteralExpression(
221
- props.properties
204
+ props.object.properties
222
205
  .filter(
223
206
  (p) =>
224
207
  !(
@@ -242,11 +225,7 @@ export namespace ProtobufDecodeProgrammer {
242
225
  ts.factory.createBlock([
243
226
  StatementFactory.constant({
244
227
  name: props.tag,
245
- value: ts.factory.createCallExpression(
246
- IdentifierFactory.access(READER(), "uint32"),
247
- undefined,
248
- undefined,
249
- ),
228
+ value: callReader("uint32"),
250
229
  }),
251
230
  ts.factory.createSwitchStatement(
252
231
  ts.factory.createUnsignedRightShift(
@@ -257,16 +236,12 @@ export namespace ProtobufDecodeProgrammer {
257
236
  ...clauses,
258
237
  ts.factory.createDefaultClause([
259
238
  ts.factory.createExpressionStatement(
260
- ts.factory.createCallExpression(
261
- IdentifierFactory.access(READER(), "skipType"),
262
- undefined,
263
- [
264
- ts.factory.createBitwiseAnd(
265
- ts.factory.createIdentifier(props.tag),
266
- ExpressionFactory.number(7),
267
- ),
268
- ],
269
- ),
239
+ callReader("skipType", [
240
+ ts.factory.createBitwiseAnd(
241
+ ts.factory.createIdentifier(props.tag),
242
+ ExpressionFactory.number(7),
243
+ ),
244
+ ]),
270
245
  ),
271
246
  ts.factory.createBreakStatement(),
272
247
  ]),
@@ -319,32 +294,43 @@ export namespace ProtobufDecodeProgrammer {
319
294
  );
320
295
 
321
296
  /* -----------------------------------------------------------
322
- DECODERS
323
- ----------------------------------------------------------- */
297
+ DECODERS
298
+ ----------------------------------------------------------- */
324
299
  const decode_property = (props: {
325
300
  context: ITypiaContext;
326
- functor: FunctionProgrammer;
327
- index: number;
328
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
329
301
  metadata: Metadata;
330
- }): ts.CaseClause[] => {
331
- const clauses: ts.CaseClause[] = [];
332
- const emplace = (name: string, value: ts.Expression | ts.Statement[]) =>
333
- clauses.push(
334
- ts.factory.createCaseClause(
335
- ExpressionFactory.number(props.index++),
336
- Array.isArray(value)
337
- ? [
338
- ts.factory.createExpressionStatement(
339
- ts.factory.createIdentifier(`// type: ${name}`),
340
- ),
341
- ...value,
342
- ts.factory.createBreakStatement(),
343
- ]
302
+ protobuf: IProtobufProperty;
303
+ accessor: ts.Expression;
304
+ }): ts.CaseClause[] =>
305
+ props.protobuf.union.map((schema) =>
306
+ decode_property_type({
307
+ context: props.context,
308
+ accessor: props.accessor,
309
+ schema,
310
+ required:
311
+ props.metadata.isRequired() && props.metadata.nullable === false,
312
+ }),
313
+ );
314
+
315
+ const decode_property_type = (props: {
316
+ context: ITypiaContext;
317
+ accessor: ts.Expression;
318
+ schema: IProtobufPropertyType;
319
+ required: boolean;
320
+ }): ts.CaseClause => {
321
+ const out = (
322
+ title: string,
323
+ value: ts.Expression | ts.Statement[],
324
+ ): ts.CaseClause =>
325
+ ts.factory.createCaseClause(
326
+ ExpressionFactory.number(props.schema.index),
327
+ [
328
+ ts.factory.createExpressionStatement(
329
+ ts.factory.createIdentifier(`// ${title}`),
330
+ ),
331
+ ...(Array.isArray(value)
332
+ ? value
344
333
  : [
345
- ts.factory.createExpressionStatement(
346
- ts.factory.createIdentifier(`// ${name}`),
347
- ),
348
334
  ts.factory.createExpressionStatement(
349
335
  ts.factory.createBinaryExpression(
350
336
  props.accessor,
@@ -352,96 +338,111 @@ export namespace ProtobufDecodeProgrammer {
352
338
  value,
353
339
  ),
354
340
  ),
355
- ts.factory.createBreakStatement(),
356
- ],
357
- ),
358
- );
359
-
360
- const required: boolean =
361
- props.metadata.isRequired() && !props.metadata.nullable;
362
- for (const atomic of ProtobufUtil.getAtomics(props.metadata))
363
- emplace(
364
- atomic,
365
- decode_atomic({
366
- metadata: props.metadata,
367
- type: atomic,
368
- }),
341
+ ]),
342
+ ts.factory.createBreakStatement(),
343
+ ],
369
344
  );
370
- if (props.metadata.natives.length) emplace("bytes", decode_bytes("bytes"));
371
- for (const array of props.metadata.arrays)
372
- emplace(
373
- `Array<${array.type.value.getName()}>`,
345
+ // ATOMICS
346
+ if (props.schema.type === "bytes") return out("bytes", callReader("bytes"));
347
+ else if (props.schema.type === "bool")
348
+ return out("bool", callReader("bool"));
349
+ else if (props.schema.type === "bigint")
350
+ return out(props.schema.name, callReader(props.schema.name));
351
+ else if (props.schema.type === "number")
352
+ return out(props.schema.name, decode_number(props.schema));
353
+ else if (props.schema.type === "string")
354
+ return out("string", callReader("string"));
355
+ // INSTANCES
356
+ else if (props.schema.type === "array")
357
+ return out(
358
+ `Array<${props.schema.array.value.getName()}>`,
374
359
  decode_array({
375
360
  accessor: props.accessor,
376
- array,
377
- required,
361
+ schema: props.schema,
362
+ required: props.required,
378
363
  }),
379
364
  );
380
- for (const entry of props.metadata.maps)
381
- emplace(
382
- `Map<string, ${entry.value.getName()}>`,
383
- decode_map({
384
- context: props.context,
385
- functor: props.functor,
386
- accessor: props.accessor,
387
- entry,
388
- required,
365
+ else if (props.schema.type === "object")
366
+ return out(
367
+ props.schema.object.name,
368
+ decode_regular_object({
369
+ top: false,
370
+ object: props.schema.object,
389
371
  }),
390
372
  );
391
- for (const object of props.metadata.objects)
392
- emplace(
393
- object.type.name,
394
- ProtobufUtil.isStaticObject(object.type)
395
- ? decode_regular_object({
396
- top: false,
397
- object: object.type,
398
- })
399
- : decode_dynamic_object({
400
- context: props.context,
401
- functor: props.functor,
402
- accessor: props.accessor,
403
- object: object.type,
404
- required,
405
- }),
406
- );
407
- return clauses;
408
- };
409
-
410
- const decode_atomic = (props: {
411
- metadata: Metadata;
412
- type: ProtobufAtomic;
413
- }): ts.Expression => {
414
- if (props.type === "string") return decode_bytes("string");
415
-
416
- const call: ts.CallExpression = ts.factory.createCallExpression(
417
- IdentifierFactory.access(READER(), props.type),
418
- undefined,
419
- undefined,
373
+ else if (props.schema.type === "map")
374
+ if (props.schema.map instanceof MetadataObjectType) {
375
+ const key: Metadata = props.schema.map.properties[0]!.key;
376
+ const value: Metadata = props.schema.map.properties[0]!.value;
377
+ return out(
378
+ `Record<${key.getName()}, ${value.getName()}>`,
379
+ decode_map({
380
+ context: props.context,
381
+ accessor: props.accessor,
382
+ schema: props.schema,
383
+ required: props.required,
384
+ key,
385
+ value,
386
+ initializer: ts.factory.createObjectLiteralExpression([]),
387
+ setter: () =>
388
+ ts.factory.createBinaryExpression(
389
+ ts.factory.createElementAccessExpression(
390
+ props.accessor,
391
+ ts.factory.createIdentifier("entry.key"),
392
+ ),
393
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
394
+ ts.factory.createIdentifier("entry.value"),
395
+ ),
396
+ }),
397
+ );
398
+ } else {
399
+ const key: Metadata = props.schema.map.key;
400
+ const value: Metadata = props.schema.map.value;
401
+ return out(
402
+ `Map<${key.getName()}, ${value.getName()}>`,
403
+ decode_map({
404
+ context: props.context,
405
+ accessor: props.accessor,
406
+ schema: props.schema,
407
+ required: props.required,
408
+ key,
409
+ value,
410
+ initializer: ts.factory.createNewExpression(
411
+ ts.factory.createIdentifier("Map"),
412
+ [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
413
+ [],
414
+ ),
415
+ setter: () =>
416
+ ts.factory.createCallExpression(
417
+ IdentifierFactory.access(props.accessor, "set"),
418
+ undefined,
419
+ [
420
+ ts.factory.createIdentifier("entry.key"),
421
+ ts.factory.createIdentifier("entry.value"),
422
+ ],
423
+ ),
424
+ }),
425
+ );
426
+ }
427
+ throw new Error(
428
+ "Error on ProtobufDecodeProgrammer.write(): unknown property type",
420
429
  );
421
- if (props.type !== "int64" && props.type !== "uint64") return call;
430
+ };
422
431
 
423
- const isNumber: boolean = ProtobufUtil.getNumbers(props.metadata).some(
424
- (n) => n === props.type,
425
- );
426
- return isNumber
432
+ const decode_number = (schema: IProtobufSchema.INumber): ts.Expression => {
433
+ const value = callReader(schema.name);
434
+ return schema.name === "int64" || schema.name === "uint64"
427
435
  ? ts.factory.createCallExpression(
428
436
  ts.factory.createIdentifier("Number"),
429
437
  undefined,
430
- [call],
438
+ [value],
431
439
  )
432
- : call;
440
+ : value;
433
441
  };
434
442
 
435
- const decode_bytes = (method: "bytes" | "string"): ts.Expression =>
436
- ts.factory.createCallExpression(
437
- IdentifierFactory.access(READER(), method),
438
- undefined,
439
- undefined,
440
- );
441
-
442
443
  const decode_array = (props: {
443
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
444
- array: MetadataArray;
444
+ accessor: ts.Expression;
445
+ schema: IProtobufSchema.IArray;
445
446
  required: boolean;
446
447
  }): ts.Statement[] => {
447
448
  const statements: Array<ts.Expression | ts.Statement> = [];
@@ -456,24 +457,8 @@ export namespace ProtobufDecodeProgrammer {
456
457
  ),
457
458
  ),
458
459
  );
459
- const atomics = ProtobufUtil.getAtomics(props.array.type.value);
460
- const decoder = atomics.length
461
- ? () =>
462
- decode_atomic({
463
- metadata: props.array.type.value,
464
- type: atomics[0]!,
465
- })
466
- : props.array.type.value.natives.length
467
- ? () => decode_bytes("bytes")
468
- : props.array.type.value.objects.length
469
- ? () =>
470
- decode_regular_object({
471
- top: false,
472
- object: props.array.type.value.objects[0]!.type,
473
- })
474
- : null;
475
- if (decoder === null) throw new Error("Never reach here.");
476
- else if (atomics.length && atomics[0] !== "string") {
460
+ const decoder: ts.Expression = decode_array_value(props.schema.value);
461
+ if (["bool", "bigint", "number"].includes(props.schema.value.type)) {
477
462
  statements.push(
478
463
  ts.factory.createIfStatement(
479
464
  ts.factory.createStrictEquality(
@@ -488,32 +473,20 @@ export namespace ProtobufDecodeProgrammer {
488
473
  StatementFactory.constant({
489
474
  name: "piece",
490
475
  value: ts.factory.createAdd(
491
- ts.factory.createCallExpression(
492
- IdentifierFactory.access(READER(), "uint32"),
493
- undefined,
494
- undefined,
495
- ),
496
- ts.factory.createCallExpression(
497
- IdentifierFactory.access(READER(), "index"),
498
- undefined,
499
- undefined,
500
- ),
476
+ callReader("uint32"),
477
+ callReader("index"),
501
478
  ),
502
479
  }),
503
480
  ts.factory.createWhileStatement(
504
481
  ts.factory.createLessThan(
505
- ts.factory.createCallExpression(
506
- IdentifierFactory.access(READER(), "index"),
507
- undefined,
508
- undefined,
509
- ),
482
+ callReader("index"),
510
483
  ts.factory.createIdentifier("piece"),
511
484
  ),
512
485
  ts.factory.createExpressionStatement(
513
486
  ts.factory.createCallExpression(
514
487
  IdentifierFactory.access(props.accessor, "push"),
515
488
  undefined,
516
- [decoder()],
489
+ [decoder],
517
490
  ),
518
491
  ),
519
492
  ),
@@ -524,7 +497,7 @@ export namespace ProtobufDecodeProgrammer {
524
497
  ts.factory.createCallExpression(
525
498
  IdentifierFactory.access(props.accessor, "push"),
526
499
  undefined,
527
- [decoder()],
500
+ [decoder],
528
501
  ),
529
502
  ),
530
503
  ),
@@ -534,7 +507,7 @@ export namespace ProtobufDecodeProgrammer {
534
507
  ts.factory.createCallExpression(
535
508
  IdentifierFactory.access(props.accessor, "push"),
536
509
  undefined,
537
- [decoder()],
510
+ [decoder],
538
511
  ),
539
512
  );
540
513
  return statements.map((stmt) =>
@@ -551,158 +524,131 @@ export namespace ProtobufDecodeProgrammer {
551
524
  undefined,
552
525
  [
553
526
  ts.factory.createIdentifier("reader"),
554
- ...(props.top
555
- ? []
556
- : [
557
- ts.factory.createCallExpression(
558
- IdentifierFactory.access(READER(), "uint32"),
559
- undefined,
560
- undefined,
561
- ),
562
- ]),
527
+ ...(props.top ? [] : [callReader("uint32")]),
563
528
  ],
564
529
  );
565
530
 
566
- const decode_dynamic_object = (props: {
567
- context: ITypiaContext;
568
- functor: FunctionProgrammer;
569
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
570
- object: MetadataObjectType;
571
- required: boolean;
572
- }): ts.Statement[] => {
573
- const top: MetadataProperty = props.object.properties[0]!;
574
- return decode_entry({
575
- context: props.context,
576
- functor: props.functor,
577
- initializer: () =>
578
- ts.factory.createBinaryExpression(
579
- props.accessor,
580
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
581
- ts.factory.createObjectLiteralExpression(),
582
- ),
583
- setter: () =>
584
- ts.factory.createBinaryExpression(
585
- ts.factory.createElementAccessExpression(
586
- props.accessor,
587
- ts.factory.createIdentifier("entry.key"),
588
- ),
589
- ts.factory.createToken(ts.SyntaxKind.EqualsToken),
590
- ts.factory.createIdentifier("entry.value"),
591
- ),
592
- entry: MetadataProperty.create({
593
- ...top,
594
- key: (() => {
595
- const key: Metadata = Metadata.initialize();
596
- key.atomics.push(
597
- MetadataAtomic.create({
598
- type: "string",
599
- tags: [],
600
- }),
601
- );
602
- return key;
603
- })(),
604
- }),
605
- required: props.required,
606
- });
607
- };
608
-
609
531
  const decode_map = (props: {
610
532
  context: ITypiaContext;
611
- functor: FunctionProgrammer;
612
- accessor: ts.ElementAccessExpression | ts.PropertyAccessExpression;
613
- entry: Metadata.Entry;
533
+ accessor: ts.Expression;
534
+ key: Metadata;
535
+ value: Metadata;
536
+ schema: IProtobufSchema.IMap;
537
+ initializer: ts.Expression;
614
538
  required: boolean;
615
- }): ts.Statement[] =>
616
- decode_entry({
617
- context: props.context,
618
- functor: props.functor,
619
- initializer: () =>
620
- ts.factory.createBinaryExpression(
621
- props.accessor,
622
- ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
623
- ts.factory.createNewExpression(
624
- ts.factory.createIdentifier("Map"),
625
- [TypeFactory.keyword("any"), TypeFactory.keyword("any")],
626
- [],
627
- ),
628
- ),
629
- setter: () =>
630
- ts.factory.createCallExpression(
631
- IdentifierFactory.access(props.accessor, "set"),
632
- undefined,
633
- [
634
- ts.factory.createIdentifier("entry.key"),
635
- ts.factory.createIdentifier("entry.value"),
636
- ],
637
- ),
638
- entry: props.entry,
639
- required: props.required,
640
- });
641
-
642
- const decode_entry = (props: {
643
- context: ITypiaContext;
644
- functor: FunctionProgrammer;
645
- initializer: () => ts.Expression;
646
539
  setter: () => ts.Expression;
647
- entry: Metadata.Entry;
648
- required: boolean;
649
540
  }): ts.Statement[] => {
650
- const statements: ts.Statement[] = [
651
- ...(props.required
652
- ? []
653
- : [ts.factory.createExpressionStatement(props.initializer())]),
541
+ const statements: Array<ts.Expression | ts.Statement> = [
542
+ ...(props.required === true
543
+ ? [
544
+ ts.factory.createBinaryExpression(
545
+ props.accessor,
546
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
547
+ props.initializer,
548
+ ),
549
+ ]
550
+ : []),
654
551
  StatementFactory.constant({
655
552
  name: "piece",
656
- value: ts.factory.createAdd(
657
- ts.factory.createCallExpression(
658
- IdentifierFactory.access(READER(), "uint32"),
659
- undefined,
660
- undefined,
661
- ),
662
- ts.factory.createCallExpression(
663
- IdentifierFactory.access(READER(), "index"),
664
- undefined,
665
- undefined,
666
- ),
667
- ),
553
+ value: ts.factory.createAdd(callReader("uint32"), callReader("index")),
668
554
  }),
669
555
  ...write_object_function_body({
670
556
  context: props.context,
671
- functor: props.functor,
672
557
  condition: ts.factory.createLessThan(
673
- ts.factory.createCallExpression(
674
- IdentifierFactory.access(READER(), "index"),
675
- undefined,
676
- undefined,
677
- ),
558
+ callReader("index"),
678
559
  ts.factory.createIdentifier("piece"),
679
560
  ),
680
561
  tag: "kind",
681
562
  output: "entry",
682
- properties: [
683
- MetadataProperty.create({
684
- key: MetadataFactory.soleLiteral("key"),
685
- value: props.entry.key,
686
- description: null,
687
- jsDocTags: [],
688
- }),
689
- MetadataProperty.create({
690
- key: MetadataFactory.soleLiteral("value"),
691
- value: props.entry.value,
692
- description: null,
693
- jsDocTags: [],
694
- }),
695
- ],
563
+ object: createObjectType([
564
+ {
565
+ key: "key",
566
+ value: props.key,
567
+ },
568
+ {
569
+ key: "value",
570
+ value: props.value,
571
+ },
572
+ ]),
696
573
  }),
697
- ts.factory.createExpressionStatement(props.setter()),
574
+ ...(props.required === false
575
+ ? [
576
+ ts.factory.createBinaryExpression(
577
+ props.accessor,
578
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionEqualsToken),
579
+ props.initializer,
580
+ ),
581
+ ]
582
+ : []),
583
+ props.setter(),
698
584
  ];
699
585
  return [
700
586
  ts.factory.createExpressionStatement(
701
- ExpressionFactory.selfCall(ts.factory.createBlock(statements, true)),
587
+ ExpressionFactory.selfCall(
588
+ ts.factory.createBlock(
589
+ statements.map((stmt) =>
590
+ ts.isExpression(stmt)
591
+ ? ts.factory.createExpressionStatement(stmt)
592
+ : stmt,
593
+ ),
594
+ true,
595
+ ),
596
+ ),
702
597
  ),
703
598
  ];
704
599
  };
600
+
601
+ const decode_array_value = (
602
+ schema: IProtobufSchema.IArray["value"],
603
+ ): ts.Expression => {
604
+ if (schema.type === "bytes") return callReader("bytes");
605
+ else if (schema.type === "bool") return callReader("bool");
606
+ else if (schema.type === "bigint") return callReader(schema.name);
607
+ else if (schema.type === "number") return decode_number(schema);
608
+ else if (schema.type === "string") return callReader("string");
609
+ else if (schema.type === "object")
610
+ return decode_regular_object({
611
+ top: false,
612
+ object: schema.object,
613
+ });
614
+ throw new Error("unreachable condition");
615
+ };
705
616
  }
706
617
 
707
618
  const PREFIX = "$pd";
708
- const READER = () => ts.factory.createIdentifier("reader");
619
+ const callReader = (
620
+ method: string,
621
+ args?: ts.Expression[],
622
+ ): ts.CallExpression =>
623
+ ts.factory.createCallExpression(
624
+ IdentifierFactory.access(ts.factory.createIdentifier("reader"), method),
625
+ undefined,
626
+ args,
627
+ );
628
+ const createObjectType = (
629
+ definitions: Array<{
630
+ key: string;
631
+ value: Metadata;
632
+ }>,
633
+ ): MetadataObjectType => {
634
+ const properties: MetadataProperty[] = definitions.map((def) =>
635
+ MetadataProperty.create({
636
+ key: MetadataFactory.soleLiteral(def.key),
637
+ value: def.value,
638
+ description: null,
639
+ jsDocTags: [],
640
+ }),
641
+ );
642
+ const obj: MetadataObjectType = MetadataObjectType.create({
643
+ name: "object.o" + Math.random().toString().slice(2),
644
+ properties,
645
+ description: undefined,
646
+ jsDocTags: [],
647
+ index: -1,
648
+ validated: true,
649
+ recursive: false,
650
+ nullables: [false],
651
+ });
652
+ ProtobufFactory.emplaceObject(obj);
653
+ return obj;
654
+ };