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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/lib/factories/MetadataFactory.js +9 -0
  2. package/lib/factories/MetadataFactory.js.map +1 -1
  3. package/lib/factories/ProtobufFactory.js +8 -0
  4. package/lib/factories/ProtobufFactory.js.map +1 -1
  5. package/lib/functional/$ProtobufReader.d.ts +2 -0
  6. package/lib/functional/$ProtobufReader.js +14 -3
  7. package/lib/functional/$ProtobufReader.js.map +1 -1
  8. package/lib/functional/$ProtobufSizer.js +1 -1
  9. package/lib/functional/$ProtobufSizer.js.map +1 -1
  10. package/lib/functional/$ProtobufWriter.js +0 -1
  11. package/lib/functional/$ProtobufWriter.js.map +1 -1
  12. package/lib/programmers/helpers/ProtobufUtil.d.ts +3 -1
  13. package/lib/programmers/helpers/ProtobufUtil.js +5 -1
  14. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  15. package/lib/programmers/json/JsonValidateParseProgrammer.js +2 -3
  16. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  17. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +2 -3
  18. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  19. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +357 -6
  20. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  21. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +15 -60
  22. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  23. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +1 -1
  24. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  25. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +1 -1
  26. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  27. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +3 -4
  28. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  29. package/lib/protobuf.d.ts +8 -9
  30. package/lib/protobuf.js +7 -0
  31. package/lib/protobuf.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/factories/ExpressionFactory.ts +115 -115
  34. package/src/factories/MetadataCollection.ts +269 -269
  35. package/src/factories/MetadataFactory.ts +46 -34
  36. package/src/factories/MetadataTagFactory.ts +364 -364
  37. package/src/factories/ProtobufFactory.ts +266 -251
  38. package/src/factories/StatementFactory.ts +72 -72
  39. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  40. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  41. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  42. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  43. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  44. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  45. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  46. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  47. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  48. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  49. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  50. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  51. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  52. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  53. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -84
  54. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  55. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  56. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  57. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  58. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  59. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  60. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  61. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  62. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  63. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  64. package/src/functional/$ProtobufReader.ts +201 -188
  65. package/src/functional/$ProtobufSizer.ts +147 -144
  66. package/src/functional/$ProtobufWriter.ts +152 -152
  67. package/src/functional/$number.ts +13 -13
  68. package/src/functional/$strlen.ts +7 -7
  69. package/src/functional/$varint.ts +130 -130
  70. package/src/functional/$zigzag.ts +39 -39
  71. package/src/functional/IProtobufWriter.ts +18 -18
  72. package/src/functional/Namespace.ts +149 -149
  73. package/src/json.ts +648 -648
  74. package/src/misc.ts +651 -651
  75. package/src/module.ts +708 -708
  76. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  77. package/src/programmers/FeatureProgrammer.ts +497 -497
  78. package/src/programmers/IsProgrammer.ts +239 -239
  79. package/src/programmers/IsPruneProgrammer.ts +73 -73
  80. package/src/programmers/RandomProgrammer.ts +578 -578
  81. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  82. package/src/programmers/helpers/CloneJoiner.ts +107 -107
  83. package/src/programmers/helpers/FunctionImporeter.ts +89 -89
  84. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  85. package/src/programmers/helpers/ProtobufUtil.ts +29 -24
  86. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  87. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  88. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  89. package/src/programmers/helpers/RandomRanger.ts +208 -208
  90. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  91. package/src/programmers/helpers/UnionExplorer.ts +310 -310
  92. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  93. package/src/programmers/helpers/disable_function_importer_declare.ts +27 -27
  94. package/src/programmers/internal/application_alias.ts +66 -66
  95. package/src/programmers/internal/application_array.ts +30 -30
  96. package/src/programmers/internal/application_constant.ts +26 -26
  97. package/src/programmers/internal/application_default.ts +17 -17
  98. package/src/programmers/internal/application_default_string.ts +33 -33
  99. package/src/programmers/internal/application_native.ts +39 -39
  100. package/src/programmers/internal/application_number.ts +81 -81
  101. package/src/programmers/internal/application_object.ts +165 -165
  102. package/src/programmers/internal/application_resolved.ts +55 -55
  103. package/src/programmers/internal/application_schema.ts +157 -157
  104. package/src/programmers/internal/application_string.ts +44 -44
  105. package/src/programmers/internal/application_templates.ts +25 -25
  106. package/src/programmers/internal/application_tuple.ts +57 -57
  107. package/src/programmers/internal/check_array.ts +30 -30
  108. package/src/programmers/internal/check_array_length.ts +35 -35
  109. package/src/programmers/internal/check_bigint.ts +110 -110
  110. package/src/programmers/internal/check_custom.ts +31 -31
  111. package/src/programmers/internal/check_number.ts +258 -258
  112. package/src/programmers/internal/check_string.ts +25 -25
  113. package/src/programmers/internal/check_string_tags.ts +67 -67
  114. package/src/programmers/internal/check_template.ts +56 -56
  115. package/src/programmers/internal/check_union_array_like.ts +329 -329
  116. package/src/programmers/internal/decode_union_object.ts +84 -84
  117. package/src/programmers/internal/feature_object_entries.ts +63 -63
  118. package/src/programmers/internal/get_comment_tags.ts +23 -23
  119. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  120. package/src/programmers/internal/prune_object_properties.ts +60 -60
  121. package/src/programmers/internal/random_custom.ts +29 -29
  122. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  123. package/src/programmers/internal/template_to_pattern.ts +15 -15
  124. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  125. package/src/programmers/json/JsonApplicationProgrammer.ts +47 -47
  126. package/src/programmers/json/JsonAssertParseProgrammer.ts +66 -66
  127. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  128. package/src/programmers/json/JsonIsParseProgrammer.ts +72 -72
  129. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  130. package/src/programmers/json/JsonStringifyProgrammer.ts +987 -987
  131. package/src/programmers/json/JsonValidateParseProgrammer.ts +63 -70
  132. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  133. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  134. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  135. package/src/programmers/misc/MiscCloneProgrammer.ts +587 -587
  136. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  137. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  138. package/src/programmers/misc/MiscPruneProgrammer.ts +542 -542
  139. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  140. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  141. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +66 -69
  142. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  143. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +653 -38
  144. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +812 -920
  145. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +75 -75
  146. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  147. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +178 -178
  148. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -83
  149. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  150. package/src/protobuf.ts +249 -239
  151. package/src/schemas/json/IJsonApplication.ts +8 -8
  152. package/src/schemas/json/IJsonComponents.ts +33 -33
  153. package/src/schemas/json/IJsonSchema.ts +133 -133
  154. package/src/schemas/metadata/ICommentTag.ts +4 -4
  155. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  156. package/src/schemas/metadata/IMetadata.ts +28 -28
  157. package/src/schemas/metadata/IMetadataAlias.ts +14 -14
  158. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  159. package/src/schemas/metadata/IMetadataArray.ts +10 -10
  160. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  161. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  162. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  163. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  164. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  165. package/src/schemas/metadata/IMetadataProperty.ts +11 -11
  166. package/src/schemas/metadata/IMetadataResolved.ts +6 -6
  167. package/src/schemas/metadata/IMetadataTag.ts +112 -112
  168. package/src/schemas/metadata/IMetadataTuple.ts +10 -10
  169. package/src/schemas/metadata/Metadata.ts +637 -637
  170. package/src/schemas/metadata/MetadataAlias.ts +66 -66
  171. package/src/schemas/metadata/MetadataArray.ts +55 -55
  172. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  173. package/src/schemas/metadata/MetadataObject.ts +139 -139
  174. package/src/schemas/metadata/MetadataProperty.ts +64 -64
  175. package/src/schemas/metadata/MetadataResolved.ts +51 -51
  176. package/src/schemas/metadata/MetadataTuple.ts +58 -58
  177. package/src/transformers/CallExpressionTransformer.ts +240 -240
  178. package/src/transformers/features/AssertTransformer.ts +11 -11
  179. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  180. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  181. package/src/transformers/features/CreateRandomTransformer.ts +39 -39
  182. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  183. package/src/transformers/features/IsTransformer.ts +11 -11
  184. package/src/transformers/features/RandomTransformer.ts +42 -42
  185. package/src/transformers/features/ValidateTransformer.ts +11 -11
  186. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  187. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  188. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  189. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  190. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  191. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  192. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  193. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  194. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  195. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  196. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  197. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  198. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  199. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  200. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  201. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  202. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  203. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  204. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  205. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  206. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  207. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  208. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  209. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  210. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  211. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  212. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  213. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  214. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  215. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +28 -28
  216. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  217. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  218. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  219. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  220. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  221. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  222. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  223. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  224. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  225. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  226. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  227. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  228. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  229. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  230. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  231. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  232. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  233. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +31 -31
  234. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  235. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  236. package/src/utils/NameEncoder.ts +32 -32
@@ -1,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
+ ]);