typia 5.0.0-dev.20230823 → 5.0.0-dev.2023084

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 (217) hide show
  1. package/lib/Primitive.d.ts +14 -12
  2. package/lib/Resolved.d.ts +46 -0
  3. package/lib/{schemas/metadata/IMetadataResolved.js → Resolved.js} +1 -1
  4. package/lib/Resolved.js.map +1 -0
  5. package/lib/factories/MetadataFactory.d.ts +1 -1
  6. package/lib/factories/MetadataTagFactory.js +10 -8
  7. package/lib/factories/MetadataTagFactory.js.map +1 -1
  8. package/lib/factories/ProtobufFactory.js +4 -3
  9. package/lib/factories/ProtobufFactory.js.map +1 -1
  10. package/lib/factories/internal/metadata/emend_metadata_atomics.js +6 -6
  11. package/lib/factories/internal/metadata/emend_metadata_atomics.js.map +1 -1
  12. package/lib/factories/internal/metadata/explore_metadata.js +3 -3
  13. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  14. package/lib/factories/internal/metadata/iterate_metadata_atomic.js +1 -1
  15. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -1
  16. package/lib/factories/internal/metadata/iterate_metadata_collection.js +6 -6
  17. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  18. package/lib/factories/internal/metadata/iterate_metadata_native.js +2 -10
  19. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata_resolve.js +6 -6
  21. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -1
  22. package/lib/factories/internal/metadata/iterate_metadata_sort.js +2 -2
  23. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -1
  24. package/lib/functional/$ProtobufWriter.js.map +1 -1
  25. package/lib/json.d.ts +15 -15
  26. package/lib/misc.d.ts +42 -42
  27. package/lib/module.d.ts +18 -17
  28. package/lib/module.js +1 -0
  29. package/lib/module.js.map +1 -1
  30. package/lib/programmers/AssertProgrammer.js +1 -1
  31. package/lib/programmers/AssertProgrammer.js.map +1 -1
  32. package/lib/programmers/CheckerProgrammer.js +7 -7
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/IsProgrammer.js +2 -2
  35. package/lib/programmers/IsProgrammer.js.map +1 -1
  36. package/lib/programmers/RandomProgrammer.js +311 -136
  37. package/lib/programmers/RandomProgrammer.js.map +1 -1
  38. package/lib/programmers/ValidateProgrammer.js +1 -1
  39. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  40. package/lib/programmers/helpers/AtomicPredicator.js +2 -2
  41. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  42. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  43. package/lib/programmers/helpers/FunctionImporeter.js +2 -1
  44. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  45. package/lib/programmers/helpers/ProtobufUtil.js +2 -2
  46. package/lib/programmers/helpers/ProtobufUtil.js.map +1 -1
  47. package/lib/programmers/helpers/StringifyPredicator.js +1 -2
  48. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  49. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  50. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  51. package/lib/programmers/internal/application_default_string.js +2 -2
  52. package/lib/programmers/internal/application_default_string.js.map +1 -1
  53. package/lib/programmers/internal/application_resolved.d.ts +2 -2
  54. package/lib/programmers/internal/application_resolved.js.map +1 -1
  55. package/lib/programmers/internal/application_schema.js +7 -7
  56. package/lib/programmers/internal/application_schema.js.map +1 -1
  57. package/lib/programmers/internal/metadata_to_pattern.js +4 -4
  58. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  59. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -1
  60. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  61. package/lib/programmers/json/JsonStringifyProgrammer.js +20 -14
  62. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  63. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +1 -1
  64. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  65. package/lib/programmers/misc/MiscCloneProgrammer.js +114 -33
  66. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  67. package/lib/programmers/misc/MiscIsCloneProgrammer.js +1 -1
  68. package/lib/programmers/misc/MiscIsCloneProgrammer.js.map +1 -1
  69. package/lib/programmers/misc/MiscLiteralsProgrammer.js +3 -3
  70. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  71. package/lib/programmers/misc/MiscPruneProgrammer.js +2 -2
  72. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  73. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +1 -1
  74. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +3 -3
  76. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  77. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +3 -3
  78. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  79. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +1 -1
  80. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  81. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js +2 -2
  82. package/lib/programmers/protobuf/ProtobufIsDecodeProgrammer.js.map +1 -1
  83. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +1 -1
  84. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  85. package/lib/protobuf.d.ts +631 -10
  86. package/lib/protobuf.js +13 -13
  87. package/lib/protobuf.js.map +1 -1
  88. package/lib/schemas/metadata/IMetadata.d.ts +4 -4
  89. package/lib/schemas/metadata/IMetadataAtomic.d.ts +12 -0
  90. package/lib/schemas/metadata/IMetadataAtomic.js +3 -0
  91. package/lib/schemas/metadata/IMetadataAtomic.js.map +1 -0
  92. package/lib/schemas/metadata/{IMetadataResolved.d.ts → IMetadataEscaped.d.ts} +1 -1
  93. package/lib/schemas/metadata/IMetadataEscaped.js +3 -0
  94. package/lib/schemas/metadata/IMetadataEscaped.js.map +1 -0
  95. package/lib/schemas/metadata/Metadata.d.ts +4 -4
  96. package/lib/schemas/metadata/Metadata.js +64 -59
  97. package/lib/schemas/metadata/Metadata.js.map +1 -1
  98. package/lib/schemas/metadata/{MetadataResolved.d.ts → MetadataEscaped.d.ts} +3 -3
  99. package/lib/schemas/metadata/{MetadataResolved.js → MetadataEscaped.js} +11 -11
  100. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -0
  101. package/lib/tags/ExclusiveMaximum.d.ts +8 -0
  102. package/lib/tags/ExclusiveMaximum.js +3 -0
  103. package/lib/tags/ExclusiveMaximum.js.map +1 -0
  104. package/lib/tags/ExclusiveMinimum.d.ts +8 -0
  105. package/lib/tags/ExclusiveMinimum.js +3 -0
  106. package/lib/tags/ExclusiveMinimum.js.map +1 -0
  107. package/lib/tags/Format.d.ts +8 -0
  108. package/lib/tags/Format.js +3 -0
  109. package/lib/tags/Format.js.map +1 -0
  110. package/lib/tags/MaxItems.d.ts +8 -0
  111. package/lib/tags/MaxItems.js +3 -0
  112. package/lib/tags/MaxItems.js.map +1 -0
  113. package/lib/tags/MaxLength.d.ts +8 -0
  114. package/lib/tags/MaxLength.js +3 -0
  115. package/lib/tags/MaxLength.js.map +1 -0
  116. package/lib/tags/Maximum.d.ts +8 -0
  117. package/lib/tags/Maximum.js +3 -0
  118. package/lib/tags/Maximum.js.map +1 -0
  119. package/lib/tags/MinItems.d.ts +8 -0
  120. package/lib/tags/MinItems.js +3 -0
  121. package/lib/tags/MinItems.js.map +1 -0
  122. package/lib/tags/MinLength.d.ts +8 -0
  123. package/lib/tags/MinLength.js +3 -0
  124. package/lib/tags/MinLength.js.map +1 -0
  125. package/lib/tags/Minimum.d.ts +8 -0
  126. package/lib/tags/Minimum.js +3 -0
  127. package/lib/tags/Minimum.js.map +1 -0
  128. package/lib/tags/MultipleOf.d.ts +8 -0
  129. package/lib/tags/MultipleOf.js +3 -0
  130. package/lib/tags/MultipleOf.js.map +1 -0
  131. package/lib/tags/Pattern.d.ts +8 -0
  132. package/lib/tags/Pattern.js +3 -0
  133. package/lib/tags/Pattern.js.map +1 -0
  134. package/lib/tags/TagBase.d.ts +10 -0
  135. package/lib/tags/TagBase.js +3 -0
  136. package/lib/tags/TagBase.js.map +1 -0
  137. package/lib/tags/Type.d.ts +13 -0
  138. package/lib/tags/Type.js +3 -0
  139. package/lib/tags/Type.js.map +1 -0
  140. package/lib/tags/index.d.ts +12 -0
  141. package/lib/tags/index.js +29 -0
  142. package/lib/tags/index.js.map +1 -0
  143. package/lib/transformers/features/json/JsonApplicationTransformer.js +2 -2
  144. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  145. package/lib/transformers/features/misc/MetadataTransformer.js +1 -1
  146. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  147. package/lib/utils/RandomGenerator.js +3 -2
  148. package/lib/utils/RandomGenerator.js.map +1 -1
  149. package/package.json +2 -1
  150. package/src/Primitive.ts +135 -131
  151. package/src/Resolved.ts +116 -0
  152. package/src/factories/MetadataFactory.ts +46 -46
  153. package/src/factories/MetadataTagFactory.ts +366 -364
  154. package/src/factories/ProtobufFactory.ts +268 -266
  155. package/src/factories/internal/metadata/emend_metadata_atomics.ts +35 -33
  156. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  157. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +63 -59
  158. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  159. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -219
  160. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  161. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  162. package/src/functional/$ProtobufWriter.ts +151 -151
  163. package/src/json.ts +648 -648
  164. package/src/misc.ts +651 -651
  165. package/src/module.ts +709 -708
  166. package/src/programmers/AssertProgrammer.ts +281 -279
  167. package/src/programmers/CheckerProgrammer.ts +1174 -1173
  168. package/src/programmers/IsProgrammer.ts +241 -239
  169. package/src/programmers/RandomProgrammer.ts +874 -578
  170. package/src/programmers/ValidateProgrammer.ts +307 -305
  171. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  172. package/src/programmers/helpers/FunctionImporeter.ts +91 -89
  173. package/src/programmers/helpers/ProtobufUtil.ts +29 -29
  174. package/src/programmers/helpers/StringifyPredicator.ts +12 -13
  175. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -27
  176. package/src/programmers/internal/application_default_string.ts +37 -33
  177. package/src/programmers/internal/application_resolved.ts +55 -55
  178. package/src/programmers/internal/application_schema.ts +157 -157
  179. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  180. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  181. package/src/programmers/json/JsonStringifyProgrammer.ts +995 -987
  182. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  183. package/src/programmers/misc/MiscCloneProgrammer.ts +775 -587
  184. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  185. package/src/programmers/misc/MiscLiteralsProgrammer.ts +64 -64
  186. package/src/programmers/misc/MiscPruneProgrammer.ts +544 -542
  187. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  188. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -66
  189. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +673 -669
  190. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +814 -814
  191. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -75
  192. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  193. package/src/protobuf.ts +881 -249
  194. package/src/schemas/metadata/IMetadata.ts +27 -28
  195. package/src/schemas/metadata/IMetadataAtomic.ts +13 -0
  196. package/src/schemas/metadata/{IMetadataResolved.ts → IMetadataEscaped.ts} +6 -6
  197. package/src/schemas/metadata/Metadata.ts +643 -637
  198. package/src/schemas/metadata/{MetadataResolved.ts → MetadataEscaped.ts} +51 -51
  199. package/src/tags/ExclusiveMaximum.ts +8 -0
  200. package/src/tags/ExclusiveMinimum.ts +8 -0
  201. package/src/tags/Format.ts +29 -0
  202. package/src/tags/MaxItems.ts +8 -0
  203. package/src/tags/MaxLength.ts +8 -0
  204. package/src/tags/Maximum.ts +8 -0
  205. package/src/tags/MinItems.ts +8 -0
  206. package/src/tags/MinLength.ts +8 -0
  207. package/src/tags/Minimum.ts +8 -0
  208. package/src/tags/MultipleOf.ts +10 -0
  209. package/src/tags/Pattern.ts +8 -0
  210. package/src/tags/TagBase.ts +17 -0
  211. package/src/tags/Type.ts +30 -0
  212. package/src/tags/index.ts +12 -0
  213. package/src/transformers/features/json/JsonApplicationTransformer.ts +111 -111
  214. package/src/transformers/features/misc/MetadataTransformer.ts +53 -53
  215. package/src/utils/RandomGenerator.ts +83 -81
  216. package/lib/schemas/metadata/IMetadataResolved.js.map +0 -1
  217. package/lib/schemas/metadata/MetadataResolved.js.map +0 -1
@@ -1,266 +1,268 @@
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
- ]);
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
+ escape: 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
+ // @todo -> need to allow other typed keys
196
+ else if (
197
+ meta.maps.length &&
198
+ meta.maps.some(
199
+ (m) =>
200
+ m.key.isBinaryUnion() ||
201
+ (m.key.atomics.find((v) => v.type === "string") ===
202
+ undefined &&
203
+ m.key.constants.find((c) => c.type === "string") ===
204
+ undefined),
205
+ )
206
+ )
207
+ throw notSupportedError({ method })("non-string key typed map");
208
+ // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
209
+ else if (
210
+ meta.maps.length &&
211
+ meta.maps.some(
212
+ (m) => m.key.isRequired() === false || m.key.nullable,
213
+ )
214
+ )
215
+ throw notSupportedError({ method })("optional key typed map");
216
+ // MAP TYPE, BUT VALUE TYPE IS ARRAY
217
+ else if (
218
+ meta.maps.length &&
219
+ meta.maps.some((m) => !!m.value.arrays.length)
220
+ )
221
+ throw notSupportedError({ method })(
222
+ "map type with array value type",
223
+ );
224
+ // UNION WITH MAP
225
+ else if (meta.size() > 1 && meta.maps.length)
226
+ throw notSupportedError({ method })("union type with map type");
227
+ // UNION IN MAP
228
+ else if (
229
+ meta.maps.length &&
230
+ meta.maps.some((m) => m.value.isBinaryUnion())
231
+ )
232
+ throw notSupportedError({ method })("union type in map");
233
+ };
234
+ }
235
+
236
+ const prefix = (method: string) => `Error on ${method}():`;
237
+
238
+ const notSupportedError = (p: { method: string }) => (title: string) =>
239
+ new Error(
240
+ `${prefix(p.method)}: protocol buffer does not support ${title}.`,
241
+ );
242
+
243
+ const isDynamicObject = (obj: MetadataObject): boolean =>
244
+ obj.properties[0]!.key.isSoleLiteral() === false;
245
+
246
+ const BANNED_NATIVE_TYPES: Map<string, string | null> = new Map([
247
+ ["Date", "string"],
248
+ ["Boolean", "boolean"],
249
+ ["BigInt", "bigint"],
250
+ ["Number", "number"],
251
+ ["String", "string"],
252
+ ...[
253
+ "Buffer",
254
+ "Uint8ClampedArray",
255
+ "Uint16Array",
256
+ "Uint32Array",
257
+ "BigUint64Array",
258
+ "Int8Array",
259
+ "Int16Array",
260
+ "Int32Array",
261
+ "BigInt64Array",
262
+ "Float32Array",
263
+ "Float64Array",
264
+ "DataView",
265
+ "ArrayBuffer",
266
+ "SharedArrayBuffer",
267
+ ].map((name) => [name, "Uint8Array"] as const),
268
+ ]);
@@ -1,33 +1,35 @@
1
- import { Metadata } from "../../../schemas/metadata/Metadata";
2
-
3
- import { ArrayUtil } from "../../../utils/ArrayUtil";
4
-
5
- export const emend_metadata_atomics = (meta: Metadata) => {
6
- // ATOMICS
7
- for (const type of meta.atomics) {
8
- const index: number = meta.constants.findIndex((c) => c.type === type);
9
- if (index !== -1) meta.constants.splice(index, 1);
10
- }
11
-
12
- // BOOLEAN
13
- {
14
- const index: number = meta.constants.findIndex(
15
- (c) => c.type === "boolean",
16
- );
17
- if (index !== -1 && meta.constants[index]!.values.length === 2) {
18
- meta.constants.splice(index, 1);
19
- ArrayUtil.take(
20
- meta.atomics,
21
- (type) => type === "boolean",
22
- () => "boolean",
23
- );
24
- }
25
- }
26
-
27
- // TEMPLATE
28
- if (
29
- meta.templates.length &&
30
- meta.atomics.find((type) => type === "string") !== undefined
31
- )
32
- meta.templates.splice(0, meta.templates.length);
33
- };
1
+ import { Metadata } from "../../../schemas/metadata/Metadata";
2
+
3
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
4
+
5
+ export const emend_metadata_atomics = (meta: Metadata) => {
6
+ // ATOMICS
7
+ for (const a of meta.atomics) {
8
+ const index: number = meta.constants.findIndex(
9
+ (c) => c.type === a.type,
10
+ );
11
+ if (index !== -1) meta.constants.splice(index, 1);
12
+ }
13
+
14
+ // BOOLEAN
15
+ {
16
+ const index: number = meta.constants.findIndex(
17
+ (c) => c.type === "boolean",
18
+ );
19
+ if (index !== -1 && meta.constants[index]!.values.length === 2) {
20
+ meta.constants.splice(index, 1);
21
+ ArrayUtil.take(
22
+ meta.atomics,
23
+ (a) => a.type === "boolean",
24
+ () => ({ type: "boolean" as const, tags: [] }),
25
+ );
26
+ }
27
+ }
28
+
29
+ // TEMPLATE
30
+ if (
31
+ meta.templates.length &&
32
+ meta.atomics.find((a) => a.type === "string") !== undefined
33
+ )
34
+ meta.templates.splice(0, meta.templates.length);
35
+ };