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,251 +1,266 @@
1
- import ts from "typescript";
2
-
3
- import { Metadata } from "../schemas/metadata/Metadata";
4
- import { MetadataObject } from "../schemas/metadata/MetadataObject";
5
-
6
- import { Escaper } from "../utils/Escaper";
7
-
8
- import { MetadataCollection } from "./MetadataCollection";
9
- import { MetadataFactory } from "./MetadataFactory";
10
-
11
- export namespace ProtobufFactory {
12
- export const metadata =
13
- (method: string) =>
14
- (checker: ts.TypeChecker) =>
15
- (collection: MetadataCollection) =>
16
- (type: ts.Type) => {
17
- // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
18
- const top: Metadata = MetadataFactory.analyze(checker)({
19
- resolve: false,
20
- constant: true,
21
- absorb: true,
22
- validate: validate(method),
23
- })(collection)(type);
24
-
25
- // TOP LEVEL TYPE MUST BE A SINGLE OBJECT
26
- const onlyObject: boolean =
27
- top.size() === 1 &&
28
- top.objects.length === 1 &&
29
- top.objects[0]!.properties.every((p) =>
30
- p.key.isSoleLiteral(),
31
- ) &&
32
- top.isRequired() === true &&
33
- top.nullable === false;
34
- if (onlyObject === false)
35
- throw new Error(
36
- `${prefix(
37
- method,
38
- )} target type must be a sole and static object.`,
39
- );
40
-
41
- return top;
42
- };
43
-
44
- const validate = (method: string) => (meta: Metadata) => {
45
- //----
46
- // NOT SUPPORTED TYPES
47
- //----
48
- // PROHIBIT ANY TYPE
49
- if (meta.any) throw notSupportedError({ method })("any type");
50
- // PROHIBIT FUNCTIONAL TYPE
51
- else if (meta.functional)
52
- throw notSupportedError({ method })("functional type");
53
- // PROHIBIT TUPLE TYPE
54
- else if (meta.tuples.length)
55
- throw notSupportedError({ method })("tuple type");
56
- // PROHIBIT SET TYPE
57
- else if (meta.sets.length)
58
- throw notSupportedError({ method })("Set type");
59
- // NATIVE TYPE, BUT NOT Uint8Array
60
- else if (meta.natives.length) {
61
- const banned = meta.natives
62
- .map((n) => [n, BANNED_NATIVE_TYPES.get(n)] as const)
63
- .filter(([_n, b]) => b !== undefined)[0];
64
- if (banned !== undefined)
65
- throw notSupportedError({ method })(
66
- banned[1] === null
67
- ? banned[0]
68
- : `${banned[0]}. Use ${banned[1]} instead.`,
69
- );
70
- }
71
- //----
72
- // ARRRAY CASES
73
- //----
74
- // DO NOT ALLOW MULTI-DIMENTIONAL ARRAY
75
- else if (
76
- meta.arrays.length &&
77
- meta.arrays.some((array) => !!array.value.arrays.length)
78
- )
79
- throw notSupportedError({ method })("two dimenstional array type");
80
- // CHILD OF ARRAY TYPE MUST BE REQUIRED
81
- else if (
82
- meta.arrays.length &&
83
- meta.arrays.some(
84
- (array) =>
85
- array.value.isRequired() === false ||
86
- array.value.nullable === true,
87
- )
88
- )
89
- throw notSupportedError({ method })("optional type in array");
90
- // UNION IN ARRAY
91
- else if (
92
- meta.arrays.length &&
93
- meta.arrays.some((a) => a.value.size() > 1)
94
- )
95
- throw notSupportedError({ method })("union type in array");
96
- // UNION WITH ARRAY
97
- else if (meta.size() > 1 && meta.arrays.length)
98
- throw notSupportedError({ method })("union type with array type");
99
- //----
100
- // OBJECT CASES
101
- //----
102
- // EMPTY PROPERTY
103
- else if (
104
- meta.objects.length &&
105
- meta.objects.some((obj) => obj.properties.length === 0)
106
- )
107
- throw notSupportedError({ method })("empty object type");
108
- // MULTIPLE DYNAMIC KEY TYPED PROPERTIES
109
- else if (
110
- meta.objects.length &&
111
- meta.objects.some(
112
- (obj) =>
113
- obj.properties.filter((p) => !p.key.isSoleLiteral())
114
- .length > 1,
115
- )
116
- )
117
- throw notSupportedError({ method })(
118
- "object type with multiple dynamic key typed properties. Keep only one.",
119
- );
120
- // STATIC AND DYNAMIC PROPERTIES ARE COMPATIBLE
121
- else if (
122
- meta.objects.length &&
123
- meta.objects.some(
124
- (obj) =>
125
- obj.properties.some((p) => p.key.isSoleLiteral()) &&
126
- obj.properties.some((p) => !p.key.isSoleLiteral()),
127
- )
128
- )
129
- throw notSupportedError({ method })(
130
- "object type with mixed static and dynamic key typed properties. Keep statics or dynamic only.",
131
- );
132
- // STATIC PROPERTY, BUT INVALID KEY NAME
133
- else if (
134
- meta.objects.length &&
135
- meta.objects.some((obj) =>
136
- obj.properties.some(
137
- (p) =>
138
- p.key.isSoleLiteral() &&
139
- !Escaper.variable(p.key.getSoleLiteral()!),
140
- ),
141
- )
142
- )
143
- throw notSupportedError({ method })(
144
- `object type with invalid static key name.`,
145
- );
146
- // DYNAMIC OBJECT, BUT PROPERTY VALUE TYPE IS ARRAY
147
- else if (
148
- meta.objects.length &&
149
- isDynamicObject(meta.objects[0]!) &&
150
- meta.objects[0]!.properties.some((p) => !!p.value.arrays.length)
151
- )
152
- throw notSupportedError({ method })(
153
- "dynamic object with array value type",
154
- );
155
- // UNION WITH DYNAMIC OBJECT
156
- else if (
157
- meta.size() > 1 &&
158
- meta.objects.length &&
159
- isDynamicObject(meta.objects[0]!)
160
- )
161
- throw notSupportedError({ method })(
162
- "union type with dynamic object type",
163
- );
164
- // UNION IN DYNAMIC PROPERTY VALUE
165
- else if (
166
- meta.objects.length &&
167
- meta.objects.some(
168
- (obj) =>
169
- isDynamicObject(obj) &&
170
- obj.properties.some((p) => p.value.isBinaryUnion()),
171
- )
172
- )
173
- throw notSupportedError({ method })(
174
- "union type in dynamic property",
175
- );
176
- //----
177
- // MAP CASES
178
- //----
179
- // MAP TYPE, BUT PROPERTY KEY TYPE IS NOT STRING
180
- else if (
181
- meta.maps.length &&
182
- meta.maps.some(
183
- (m) =>
184
- m.key.isBinaryUnion() ||
185
- (m.key.atomics.find((v) => v === "string") === undefined &&
186
- m.key.constants.find((c) => c.type === "string") ===
187
- undefined),
188
- )
189
- )
190
- throw notSupportedError({ method })("non-string key typed map");
191
- // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
192
- else if (
193
- meta.maps.length &&
194
- meta.maps.some(
195
- (m) => m.key.isRequired() === false || m.key.nullable,
196
- )
197
- )
198
- throw notSupportedError({ method })("optional key typed map");
199
- // MAP TYPE, BUT VALUE TYPE IS ARRAY
200
- else if (
201
- meta.maps.length &&
202
- meta.maps.some((m) => !!m.value.arrays.length)
203
- )
204
- throw notSupportedError({ method })(
205
- "map type with array value type",
206
- );
207
- // UNION WITH MAP
208
- else if (meta.size() > 1 && meta.maps.length)
209
- throw notSupportedError({ method })("union type with map type");
210
- // UNION IN MAP
211
- else if (
212
- meta.maps.length &&
213
- meta.maps.some((m) => m.value.isBinaryUnion())
214
- )
215
- throw notSupportedError({ method })("union type in map");
216
- };
217
- }
218
-
219
- const prefix = (method: string) => `Error on typia.protobuf.${method}():`;
220
-
221
- const notSupportedError = (p: { method: string }) => (title: string) =>
222
- new Error(
223
- `${prefix(p.method)}: protocol buffer does not support ${title}.`,
224
- );
225
-
226
- const isDynamicObject = (obj: MetadataObject): boolean =>
227
- obj.properties[0]!.key.isSoleLiteral() === false;
228
-
229
- const BANNED_NATIVE_TYPES: Map<string, string | null> = new Map([
230
- ["Date", "string"],
231
- ["Boolean", "boolean"],
232
- ["BigInt", "bigint"],
233
- ["Number", "number"],
234
- ["String", "string"],
235
- ...[
236
- "Buffer",
237
- "Uint8ClampedArray",
238
- "Uint16Array",
239
- "Uint32Array",
240
- "BigUint64Array",
241
- "Int8Array",
242
- "Int16Array",
243
- "Int32Array",
244
- "BigInt64Array",
245
- "Float32Array",
246
- "Float64Array",
247
- "DataView",
248
- "ArrayBuffer",
249
- "SharedArrayBuffer",
250
- ].map((name) => [name, "Uint8Array"] as const),
251
- ]);
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../schemas/metadata/Metadata";
4
+ import { MetadataObject } from "../schemas/metadata/MetadataObject";
5
+
6
+ import { ProtobufUtil } from "../programmers/helpers/ProtobufUtil";
7
+
8
+ import { Escaper } from "../utils/Escaper";
9
+
10
+ import { MetadataCollection } from "./MetadataCollection";
11
+ import { MetadataFactory } from "./MetadataFactory";
12
+
13
+ export namespace ProtobufFactory {
14
+ export const metadata =
15
+ (method: string) =>
16
+ (checker: ts.TypeChecker) =>
17
+ (collection: MetadataCollection) =>
18
+ (type: ts.Type) => {
19
+ // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
20
+ const top: Metadata = MetadataFactory.analyze(checker)({
21
+ resolve: false,
22
+ constant: true,
23
+ absorb: true,
24
+ validate: validate(method),
25
+ })(collection)(type);
26
+
27
+ // TOP LEVEL TYPE MUST BE A SINGLE OBJECT
28
+ const onlyObject: boolean =
29
+ top.size() === 1 &&
30
+ top.objects.length === 1 &&
31
+ top.objects[0]!.properties.every((p) =>
32
+ p.key.isSoleLiteral(),
33
+ ) &&
34
+ top.isRequired() === true &&
35
+ top.nullable === false;
36
+ if (onlyObject === false)
37
+ throw new Error(
38
+ `${prefix(
39
+ method,
40
+ )} target type must be a sole and static object.`,
41
+ );
42
+
43
+ return top;
44
+ };
45
+
46
+ const validate = (method: string) => (meta: Metadata) => {
47
+ //----
48
+ // NOT SUPPORTED TYPES
49
+ //----
50
+ // PROHIBIT ANY TYPE
51
+ if (meta.any) throw notSupportedError({ method })("any type");
52
+ // PROHIBIT FUNCTIONAL TYPE
53
+ else if (meta.functional)
54
+ throw notSupportedError({ method })("functional type");
55
+ // PROHIBIT TUPLE TYPE
56
+ else if (meta.tuples.length)
57
+ throw notSupportedError({ method })("tuple type");
58
+ // PROHIBIT SET TYPE
59
+ else if (meta.sets.length)
60
+ throw notSupportedError({ method })("Set type");
61
+ // NATIVE TYPE, BUT NOT Uint8Array
62
+ else if (meta.natives.length) {
63
+ const banned = meta.natives
64
+ .map((n) => [n, BANNED_NATIVE_TYPES.get(n)] as const)
65
+ .filter(([_n, b]) => b !== undefined)[0];
66
+ if (banned !== undefined)
67
+ throw notSupportedError({ method })(
68
+ banned[1] === null
69
+ ? banned[0]
70
+ : `${banned[0]}. Use ${banned[1]} instead.`,
71
+ );
72
+ }
73
+ //----
74
+ // ARRRAY CASES
75
+ //----
76
+ // DO NOT ALLOW MULTI-DIMENTIONAL ARRAY
77
+ else if (
78
+ meta.arrays.length &&
79
+ meta.arrays.some((array) => !!array.value.arrays.length)
80
+ )
81
+ throw notSupportedError({ method })("two dimenstional array type");
82
+ // CHILD OF ARRAY TYPE MUST BE REQUIRED
83
+ else if (
84
+ meta.arrays.length &&
85
+ meta.arrays.some(
86
+ (array) =>
87
+ array.value.isRequired() === false ||
88
+ array.value.nullable === true,
89
+ )
90
+ )
91
+ throw notSupportedError({ method })("optional type in array");
92
+ // UNION IN ARRAY
93
+ else if (
94
+ meta.arrays.length &&
95
+ meta.arrays.some((a) => a.value.size() > 1)
96
+ )
97
+ throw notSupportedError({ method })("union type in array");
98
+ // DO DYNAMIC OBJECT IN ARRAY
99
+ else if (
100
+ meta.arrays.length &&
101
+ meta.arrays.some(
102
+ (a) =>
103
+ a.value.maps.length ||
104
+ (a.value.objects.length &&
105
+ a.value.objects.some(
106
+ (o) => ProtobufUtil.isStaticObject(o) === false,
107
+ )),
108
+ )
109
+ )
110
+ throw notSupportedError({ method })("dynamic object in array");
111
+ // UNION WITH ARRAY
112
+ else if (meta.size() > 1 && meta.arrays.length)
113
+ throw notSupportedError({ method })("union type with array type");
114
+ //----
115
+ // OBJECT CASES
116
+ //----
117
+ // EMPTY PROPERTY
118
+ else if (
119
+ meta.objects.length &&
120
+ meta.objects.some((obj) => obj.properties.length === 0)
121
+ )
122
+ throw notSupportedError({ method })("empty object type");
123
+ // MULTIPLE DYNAMIC KEY TYPED PROPERTIES
124
+ else if (
125
+ meta.objects.length &&
126
+ meta.objects.some(
127
+ (obj) =>
128
+ obj.properties.filter((p) => !p.key.isSoleLiteral())
129
+ .length > 1,
130
+ )
131
+ )
132
+ throw notSupportedError({ method })(
133
+ "object type with multiple dynamic key typed properties. Keep only one.",
134
+ );
135
+ // STATIC AND DYNAMIC PROPERTIES ARE COMPATIBLE
136
+ else if (
137
+ meta.objects.length &&
138
+ meta.objects.some(
139
+ (obj) =>
140
+ obj.properties.some((p) => p.key.isSoleLiteral()) &&
141
+ obj.properties.some((p) => !p.key.isSoleLiteral()),
142
+ )
143
+ )
144
+ throw notSupportedError({ method })(
145
+ "object type with mixed static and dynamic key typed properties. Keep statics or dynamic only.",
146
+ );
147
+ // STATIC PROPERTY, BUT INVALID KEY NAME
148
+ else if (
149
+ meta.objects.length &&
150
+ meta.objects.some((obj) =>
151
+ obj.properties.some(
152
+ (p) =>
153
+ p.key.isSoleLiteral() &&
154
+ !Escaper.variable(p.key.getSoleLiteral()!),
155
+ ),
156
+ )
157
+ )
158
+ throw notSupportedError({ method })(
159
+ `object type with invalid static key name.`,
160
+ );
161
+ // DYNAMIC OBJECT, BUT PROPERTY VALUE TYPE IS ARRAY
162
+ else if (
163
+ meta.objects.length &&
164
+ isDynamicObject(meta.objects[0]!) &&
165
+ meta.objects[0]!.properties.some((p) => !!p.value.arrays.length)
166
+ )
167
+ throw notSupportedError({ method })(
168
+ "dynamic object with array value type",
169
+ );
170
+ // UNION WITH DYNAMIC OBJECT
171
+ else if (
172
+ meta.size() > 1 &&
173
+ meta.objects.length &&
174
+ isDynamicObject(meta.objects[0]!)
175
+ )
176
+ throw notSupportedError({ method })(
177
+ "union type with dynamic object type",
178
+ );
179
+ // UNION IN DYNAMIC PROPERTY VALUE
180
+ else if (
181
+ meta.objects.length &&
182
+ meta.objects.some(
183
+ (obj) =>
184
+ isDynamicObject(obj) &&
185
+ obj.properties.some((p) => p.value.isBinaryUnion()),
186
+ )
187
+ )
188
+ throw notSupportedError({ method })(
189
+ "union type in dynamic property",
190
+ );
191
+ //----
192
+ // MAP CASES
193
+ //----
194
+ // MAP TYPE, BUT PROPERTY KEY TYPE IS NOT STRING
195
+ else if (
196
+ meta.maps.length &&
197
+ meta.maps.some(
198
+ (m) =>
199
+ m.key.isBinaryUnion() ||
200
+ (m.key.atomics.find((v) => v === "string") === undefined &&
201
+ m.key.constants.find((c) => c.type === "string") ===
202
+ undefined),
203
+ )
204
+ )
205
+ throw notSupportedError({ method })("non-string key typed map");
206
+ // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
207
+ else if (
208
+ meta.maps.length &&
209
+ meta.maps.some(
210
+ (m) => m.key.isRequired() === false || m.key.nullable,
211
+ )
212
+ )
213
+ throw notSupportedError({ method })("optional key typed map");
214
+ // MAP TYPE, BUT VALUE TYPE IS ARRAY
215
+ else if (
216
+ meta.maps.length &&
217
+ meta.maps.some((m) => !!m.value.arrays.length)
218
+ )
219
+ throw notSupportedError({ method })(
220
+ "map type with array value type",
221
+ );
222
+ // UNION WITH MAP
223
+ else if (meta.size() > 1 && meta.maps.length)
224
+ throw notSupportedError({ method })("union type with map type");
225
+ // UNION IN MAP
226
+ else if (
227
+ meta.maps.length &&
228
+ meta.maps.some((m) => m.value.isBinaryUnion())
229
+ )
230
+ throw notSupportedError({ method })("union type in map");
231
+ };
232
+ }
233
+
234
+ const prefix = (method: string) => `Error on typia.protobuf.${method}():`;
235
+
236
+ const notSupportedError = (p: { method: string }) => (title: string) =>
237
+ new Error(
238
+ `${prefix(p.method)}: protocol buffer does not support ${title}.`,
239
+ );
240
+
241
+ const isDynamicObject = (obj: MetadataObject): boolean =>
242
+ obj.properties[0]!.key.isSoleLiteral() === false;
243
+
244
+ const BANNED_NATIVE_TYPES: Map<string, string | null> = new Map([
245
+ ["Date", "string"],
246
+ ["Boolean", "boolean"],
247
+ ["BigInt", "bigint"],
248
+ ["Number", "number"],
249
+ ["String", "string"],
250
+ ...[
251
+ "Buffer",
252
+ "Uint8ClampedArray",
253
+ "Uint16Array",
254
+ "Uint32Array",
255
+ "BigUint64Array",
256
+ "Int8Array",
257
+ "Int16Array",
258
+ "Int32Array",
259
+ "BigInt64Array",
260
+ "Float32Array",
261
+ "Float64Array",
262
+ "DataView",
263
+ "ArrayBuffer",
264
+ "SharedArrayBuffer",
265
+ ].map((name) => [name, "Uint8Array"] as const),
266
+ ]);