typia 7.0.0-dev.20241007 → 7.0.0-dev.20241008

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 (240) hide show
  1. package/lib/factories/ExpressionFactory.d.ts +1 -1
  2. package/lib/factories/ValueFactory.d.ts +1 -1
  3. package/lib/programmers/AssertProgrammer.d.ts +5 -2
  4. package/lib/programmers/AssertProgrammer.js +12 -5
  5. package/lib/programmers/AssertProgrammer.js.map +1 -1
  6. package/lib/programmers/ImportProgrammer.d.ts +25 -4
  7. package/lib/programmers/ImportProgrammer.js +67 -31
  8. package/lib/programmers/ImportProgrammer.js.map +1 -1
  9. package/lib/programmers/RandomProgrammer.js +48 -32
  10. package/lib/programmers/RandomProgrammer.js.map +1 -1
  11. package/lib/programmers/ValidateProgrammer.js +10 -4
  12. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  13. package/lib/programmers/functional/FunctionalAssertFunctionProgrammer.js +1 -1
  14. package/lib/programmers/functional/FunctionalAssertFunctionProgrammer.js.map +1 -1
  15. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.d.ts +1 -0
  16. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.js +14 -5
  17. package/lib/programmers/functional/FunctionalValidateFunctionProgrammer.js.map +1 -1
  18. package/lib/programmers/functional/FunctionalValidateParametersProgrammer.js +5 -1
  19. package/lib/programmers/functional/FunctionalValidateParametersProgrammer.js.map +1 -1
  20. package/lib/programmers/functional/FunctionalValidateReturnProgrammer.js +1 -0
  21. package/lib/programmers/functional/FunctionalValidateReturnProgrammer.js.map +1 -1
  22. package/lib/programmers/http/HttpAssertFormDataProgrammer.js +4 -1
  23. package/lib/programmers/http/HttpAssertFormDataProgrammer.js.map +1 -1
  24. package/lib/programmers/http/HttpAssertHeadersProgrammer.js +4 -1
  25. package/lib/programmers/http/HttpAssertHeadersProgrammer.js.map +1 -1
  26. package/lib/programmers/http/HttpAssertQueryProgrammer.js +4 -1
  27. package/lib/programmers/http/HttpAssertQueryProgrammer.js.map +1 -1
  28. package/lib/programmers/http/HttpFormDataProgrammer.js +10 -6
  29. package/lib/programmers/http/HttpFormDataProgrammer.js.map +1 -1
  30. package/lib/programmers/http/HttpHeadersProgrammer.js +10 -6
  31. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  32. package/lib/programmers/http/HttpQueryProgrammer.js +10 -6
  33. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  34. package/lib/programmers/http/HttpValidateFormDataProgrammer.js +5 -3
  35. package/lib/programmers/http/HttpValidateFormDataProgrammer.js.map +1 -1
  36. package/lib/programmers/http/HttpValidateHeadersProgrammer.js +5 -3
  37. package/lib/programmers/http/HttpValidateHeadersProgrammer.js.map +1 -1
  38. package/lib/programmers/http/HttpValidateQueryProgrammer.js +5 -3
  39. package/lib/programmers/http/HttpValidateQueryProgrammer.js.map +1 -1
  40. package/lib/programmers/json/JsonAssertParseProgrammer.js +14 -7
  41. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  42. package/lib/programmers/json/JsonAssertStringifyProgrammer.js +4 -1
  43. package/lib/programmers/json/JsonAssertStringifyProgrammer.js.map +1 -1
  44. package/lib/programmers/json/JsonIsParseProgrammer.js +10 -6
  45. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  46. package/lib/programmers/json/JsonValidateParseProgrammer.js +16 -4
  47. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  48. package/lib/programmers/json/JsonValidateStringifyProgrammer.js +7 -3
  49. package/lib/programmers/json/JsonValidateStringifyProgrammer.js.map +1 -1
  50. package/lib/programmers/misc/MiscAssertCloneProgrammer.js +4 -1
  51. package/lib/programmers/misc/MiscAssertCloneProgrammer.js.map +1 -1
  52. package/lib/programmers/misc/MiscAssertPruneProgrammer.js +4 -1
  53. package/lib/programmers/misc/MiscAssertPruneProgrammer.js.map +1 -1
  54. package/lib/programmers/misc/MiscCloneProgrammer.js +10 -6
  55. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  56. package/lib/programmers/misc/MiscValidateCloneProgrammer.js +5 -3
  57. package/lib/programmers/misc/MiscValidateCloneProgrammer.js.map +1 -1
  58. package/lib/programmers/misc/MiscValidatePruneProgrammer.js +10 -4
  59. package/lib/programmers/misc/MiscValidatePruneProgrammer.js.map +1 -1
  60. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js +4 -1
  61. package/lib/programmers/notations/NotationAssertGeneralProgrammer.js.map +1 -1
  62. package/lib/programmers/notations/NotationGeneralProgrammer.d.ts +2 -1
  63. package/lib/programmers/notations/NotationGeneralProgrammer.js +13 -5
  64. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  65. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js +5 -3
  66. package/lib/programmers/notations/NotationValidateGeneralProgrammer.js.map +1 -1
  67. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js +4 -1
  68. package/lib/programmers/protobuf/ProtobufAssertDecodeProgrammer.js.map +1 -1
  69. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js +4 -1
  70. package/lib/programmers/protobuf/ProtobufAssertEncodeProgrammer.js.map +1 -1
  71. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +10 -6
  72. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  73. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js +5 -3
  74. package/lib/programmers/protobuf/ProtobufValidateDecodeProgrammer.js.map +1 -1
  75. package/lib/programmers/protobuf/ProtobufValidateEncodeProgrammer.js +7 -3
  76. package/lib/programmers/protobuf/ProtobufValidateEncodeProgrammer.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/factories/JsonMetadataFactory.ts +63 -63
  79. package/src/factories/ProtobufFactory.ts +275 -275
  80. package/src/programmers/AssertProgrammer.ts +454 -456
  81. package/src/programmers/CheckerProgrammer.ts +1610 -1610
  82. package/src/programmers/ImportProgrammer.ts +184 -109
  83. package/src/programmers/IsProgrammer.ts +273 -273
  84. package/src/programmers/RandomProgrammer.ts +168 -149
  85. package/src/programmers/TypiaProgrammer.ts +171 -171
  86. package/src/programmers/ValidateProgrammer.ts +434 -430
  87. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +1 -1
  88. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +12 -16
  89. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +5 -12
  90. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +1 -0
  91. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  92. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -96
  93. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -96
  94. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -102
  95. package/src/programmers/http/HttpFormDataProgrammer.ts +304 -308
  96. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -404
  97. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  98. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  99. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  100. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  101. package/src/programmers/http/HttpQueryProgrammer.ts +329 -333
  102. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -90
  103. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -90
  104. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -96
  105. package/src/programmers/json/JsonApplicationProgrammer.ts +92 -92
  106. package/src/programmers/json/JsonAssertParseProgrammer.ts +103 -104
  107. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -112
  108. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -118
  109. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  110. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  111. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -95
  112. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -119
  113. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -92
  114. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -113
  115. package/src/programmers/misc/MiscCloneProgrammer.ts +1025 -1029
  116. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  117. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  118. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  119. package/src/programmers/misc/MiscPruneProgrammer.ts +725 -725
  120. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -109
  121. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -109
  122. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -98
  123. package/src/programmers/notations/NotationGeneralProgrammer.ts +977 -973
  124. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  125. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -117
  126. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -95
  127. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -99
  128. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +708 -711
  129. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +1019 -1019
  130. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  131. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  132. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -90
  133. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -114
  134. package/src/transform.ts +35 -35
  135. package/src/transformers/CallExpressionTransformer.ts +540 -540
  136. package/src/transformers/FileTransformer.ts +120 -120
  137. package/src/transformers/IProgrammerProps.ts +11 -11
  138. package/src/transformers/ITransformOptions.ts +62 -62
  139. package/src/transformers/ITransformProps.ts +9 -9
  140. package/src/transformers/ITypiaContext.ts +18 -18
  141. package/src/transformers/ImportTransformer.ts +66 -66
  142. package/src/transformers/NodeTransformer.ts +17 -17
  143. package/src/transformers/TransformerError.ts +59 -59
  144. package/src/transformers/features/AssertTransformer.ts +24 -24
  145. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  146. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  147. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  148. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  149. package/src/transformers/features/IsTransformer.ts +18 -18
  150. package/src/transformers/features/RandomTransformer.ts +41 -41
  151. package/src/transformers/features/ValidateTransformer.ts +18 -18
  152. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  153. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  154. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  155. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  156. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  157. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  158. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  159. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  160. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  161. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  162. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  163. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  164. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  165. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  166. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  167. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  168. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  169. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  170. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  171. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  172. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  173. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  174. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  175. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  176. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  177. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  178. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  179. package/src/transformers/features/json/JsonApplicationTransformer.ts +130 -130
  180. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  181. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  182. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  183. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  184. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  185. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  186. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  187. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  188. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  189. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  190. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  191. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  192. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  193. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  194. package/src/transformers/features/llm/LlmApplicationTransformer.ts +86 -86
  195. package/src/transformers/features/llm/LlmSchemaTransformer.ts +59 -59
  196. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  197. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  198. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  199. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  200. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  201. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  202. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  203. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  204. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  205. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  206. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  207. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  208. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  209. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  210. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  211. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  212. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  213. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  214. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  215. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  216. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  217. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  218. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  219. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  220. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  221. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  222. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  223. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  224. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  225. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  226. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  227. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  228. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  229. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  230. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  231. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  232. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  233. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  234. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  235. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  236. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  237. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  238. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  239. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  240. package/src/transformers/internal/GenericTransformer.ts +101 -101
@@ -1,275 +1,275 @@
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 { TransformerError } from "../transformers/TransformerError";
9
-
10
- import { ValidationPipe } from "../typings/ValidationPipe";
11
-
12
- import { Escaper } from "../utils/Escaper";
13
-
14
- import { MetadataCollection } from "./MetadataCollection";
15
- import { MetadataFactory } from "./MetadataFactory";
16
-
17
- export namespace ProtobufFactory {
18
- export interface IProps {
19
- method: string;
20
- checker: ts.TypeChecker;
21
- transformer?: ts.TransformationContext;
22
- collection: MetadataCollection;
23
- type: ts.Type;
24
- }
25
-
26
- export const metadata = (props: IProps): Metadata => {
27
- // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
28
- const result: ValidationPipe<Metadata, MetadataFactory.IError> =
29
- MetadataFactory.analyze({
30
- ...props,
31
- transformer: props.transformer,
32
- options: {
33
- escape: false,
34
- constant: true,
35
- absorb: true,
36
- validate,
37
- },
38
- });
39
- if (result.success === false)
40
- throw TransformerError.from({
41
- code: `typia.protobuf.${props.method}`,
42
- errors: result.errors,
43
- });
44
- return result.data;
45
- };
46
-
47
- const validate = (
48
- meta: Metadata,
49
- explore: MetadataFactory.IExplore,
50
- ): string[] => {
51
- const errors: string[] = [];
52
- const insert = (msg: string) => errors.push(msg);
53
-
54
- if (explore.top === true) {
55
- const onlyObject: boolean =
56
- meta.size() === 1 &&
57
- meta.objects.length === 1 &&
58
- meta.objects[0]!.properties.every((p) => p.key.isSoleLiteral()) &&
59
- meta.isRequired() === true &&
60
- meta.nullable === false;
61
- if (onlyObject === false)
62
- insert("target type must be a sole and static object type");
63
- }
64
-
65
- //----
66
- // NOT SUPPORTED TYPES
67
- //----
68
- const noSupport = (msg: string) => insert(`does not support ${msg}`);
69
-
70
- // PROHIBIT ANY TYPE
71
- if (meta.any) noSupport("any type");
72
- // PROHIBIT FUNCTIONAL TYPE
73
- if (meta.functions.length) noSupport("functional type");
74
- // PROHIBIT TUPLE TYPE
75
- if (meta.tuples.length) noSupport("tuple type");
76
- // PROHIBIT SET TYPE
77
- if (meta.sets.length) noSupport("Set type");
78
- // NATIVE TYPE, BUT NOT Uint8Array
79
- if (meta.natives.length)
80
- for (const native of meta.natives) {
81
- if (native === "Uint8Array") continue;
82
-
83
- const instead = BANNED_NATIVE_TYPES.get(native);
84
- if (instead === undefined) noSupport(`${native} type`);
85
- else noSupport(`${native} type. Use ${instead} type instead.`);
86
- }
87
- //----
88
- // ATOMIC CASES
89
- //----
90
- if (meta.atomics.length) {
91
- const numbers = ProtobufUtil.getNumbers(meta);
92
- const bigints = ProtobufUtil.getBigints(meta);
93
-
94
- for (const type of ["int64", "uint64"])
95
- if (numbers.some((n) => n === type) && bigints.some((b) => b === type))
96
- insert(
97
- `tags.Type<"${type}"> cannot be used in both number and bigint types. Recommend to remove from number type`,
98
- );
99
- }
100
- //----
101
- // ARRRAY CASES
102
- //----
103
- // DO NOT ALLOW MULTI-DIMENTIONAL ARRAY
104
- if (
105
- meta.arrays.length &&
106
- meta.arrays.some((array) => !!array.type.value.arrays.length)
107
- )
108
- noSupport("over two dimenstional array type");
109
- // CHILD OF ARRAY TYPE MUST BE REQUIRED
110
- if (
111
- meta.arrays.length &&
112
- meta.arrays.some(
113
- (array) =>
114
- array.type.value.isRequired() === false ||
115
- array.type.value.nullable === true,
116
- )
117
- )
118
- noSupport("optional type in array");
119
- // UNION IN ARRAY
120
- if (
121
- meta.arrays.length &&
122
- meta.arrays.some(
123
- (a) =>
124
- a.type.value.size() > 1 &&
125
- a.type.value.constants.length !== 1 &&
126
- a.type.value.constants[0]?.values.length !== a.type.value.size(),
127
- )
128
- )
129
- noSupport("union type in array");
130
- // DO DYNAMIC OBJECT IN ARRAY
131
- if (
132
- meta.arrays.length &&
133
- meta.arrays.some(
134
- (a) =>
135
- a.type.value.maps.length ||
136
- (a.type.value.objects.length &&
137
- a.type.value.objects.some(
138
- (o) => ProtobufUtil.isStaticObject(o) === false,
139
- )),
140
- )
141
- )
142
- noSupport("dynamic object in array");
143
- // UNION WITH ARRAY
144
- if (meta.size() > 1 && meta.arrays.length)
145
- noSupport("union type with array type");
146
- //----
147
- // OBJECT CASES
148
- //----
149
- // EMPTY PROPERTY
150
- if (
151
- meta.objects.length &&
152
- meta.objects.some((obj) => obj.properties.length === 0)
153
- )
154
- noSupport("empty object type");
155
- // MULTIPLE DYNAMIC KEY TYPED PROPERTIES
156
- if (
157
- meta.objects.length &&
158
- meta.objects.some(
159
- (obj) =>
160
- obj.properties.filter((p) => !p.key.isSoleLiteral()).length > 1,
161
- )
162
- )
163
- noSupport(
164
- "object type with multiple dynamic key typed properties. Keep only one.",
165
- );
166
- // STATIC AND DYNAMIC PROPERTIES ARE COMPATIBLE
167
- if (
168
- meta.objects.length &&
169
- meta.objects.some(
170
- (obj) =>
171
- obj.properties.some((p) => p.key.isSoleLiteral()) &&
172
- obj.properties.some((p) => !p.key.isSoleLiteral()),
173
- )
174
- )
175
- noSupport(
176
- "object type with mixed static and dynamic key typed properties. Keep statics or dynamic only.",
177
- );
178
- // STATIC PROPERTY, BUT INVALID KEY NAME
179
- if (
180
- meta.objects.length &&
181
- meta.objects.some((obj) =>
182
- obj.properties.some(
183
- (p) =>
184
- p.key.isSoleLiteral() === true &&
185
- Escaper.variable(p.key.getSoleLiteral()!) === false,
186
- ),
187
- )
188
- )
189
- noSupport(`object type with invalid static key name.`);
190
- // DYNAMIC OBJECT, BUT PROPERTY VALUE TYPE IS ARRAY
191
- if (
192
- meta.objects.length &&
193
- isDynamicObject(meta.objects[0]!) &&
194
- meta.objects[0]!.properties.some((p) => !!p.value.arrays.length)
195
- )
196
- noSupport("dynamic object with array value type");
197
- // UNION WITH DYNAMIC OBJECT
198
- if (
199
- meta.size() > 1 &&
200
- meta.objects.length &&
201
- isDynamicObject(meta.objects[0]!)
202
- )
203
- noSupport("union type with dynamic object type");
204
- // UNION IN DYNAMIC PROPERTY VALUE
205
- if (
206
- meta.objects.length &&
207
- meta.objects.some(
208
- (obj) =>
209
- isDynamicObject(obj) &&
210
- obj.properties.some((p) => ProtobufUtil.isUnion(p.value)),
211
- )
212
- )
213
- noSupport("union type in dynamic property");
214
- //----
215
- // MAP CASES
216
- //----
217
- // KEY TYPE IS UNION
218
- if (meta.maps.length && meta.maps.some((m) => ProtobufUtil.isUnion(m.key)))
219
- noSupport("union key typed map");
220
- // KEY TYPE IS NOT ATOMIC
221
- if (
222
- meta.maps.length &&
223
- meta.maps.some((m) => ProtobufUtil.getAtomics(m.key).length !== 1)
224
- )
225
- noSupport("non-atomic key typed map");
226
- // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
227
- if (
228
- meta.maps.length &&
229
- meta.maps.some((m) => m.key.isRequired() === false || m.key.nullable)
230
- )
231
- noSupport("optional key typed map");
232
- // MAP TYPE, BUT VALUE TYPE IS ARRAY
233
- if (meta.maps.length && meta.maps.some((m) => !!m.value.arrays.length))
234
- noSupport("map type with array value type");
235
- // UNION WITH MAP
236
- if (meta.size() > 1 && meta.maps.length)
237
- noSupport("union type with map type");
238
- // UNION IN MAP
239
- if (
240
- meta.maps.length &&
241
- meta.maps.some((m) => ProtobufUtil.isUnion(m.value))
242
- )
243
- noSupport("union type in map value type");
244
- return errors;
245
- };
246
- }
247
-
248
- const isDynamicObject = (obj: MetadataObject): boolean =>
249
- obj.properties[0]!.key.isSoleLiteral() === false;
250
-
251
- const BANNED_NATIVE_TYPES: Map<string, string | null> = new Map([
252
- ["Date", "string"],
253
- ["Boolean", "boolean"],
254
- ["BigInt", "bigint"],
255
- ["Number", "number"],
256
- ["String", "string"],
257
- ...[
258
- "Buffer",
259
- "Uint8ClampedArray",
260
- "Uint16Array",
261
- "Uint32Array",
262
- "BigUint64Array",
263
- "Int8Array",
264
- "Int16Array",
265
- "Int32Array",
266
- "BigInt64Array",
267
- "Float32Array",
268
- "Float64Array",
269
- "DataView",
270
- "ArrayBuffer",
271
- "SharedArrayBuffer",
272
- ].map((name) => [name, "Uint8Array"] as const),
273
- ["WeakSet", "Array"],
274
- ["WeakMap", "Map"],
275
- ]);
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 { TransformerError } from "../transformers/TransformerError";
9
+
10
+ import { ValidationPipe } from "../typings/ValidationPipe";
11
+
12
+ import { Escaper } from "../utils/Escaper";
13
+
14
+ import { MetadataCollection } from "./MetadataCollection";
15
+ import { MetadataFactory } from "./MetadataFactory";
16
+
17
+ export namespace ProtobufFactory {
18
+ export interface IProps {
19
+ method: string;
20
+ checker: ts.TypeChecker;
21
+ transformer?: ts.TransformationContext;
22
+ collection: MetadataCollection;
23
+ type: ts.Type;
24
+ }
25
+
26
+ export const metadata = (props: IProps): Metadata => {
27
+ // COMPOSE METADATA WITH INDIVIDUAL VALIDATIONS
28
+ const result: ValidationPipe<Metadata, MetadataFactory.IError> =
29
+ MetadataFactory.analyze({
30
+ ...props,
31
+ transformer: props.transformer,
32
+ options: {
33
+ escape: false,
34
+ constant: true,
35
+ absorb: true,
36
+ validate,
37
+ },
38
+ });
39
+ if (result.success === false)
40
+ throw TransformerError.from({
41
+ code: `typia.protobuf.${props.method}`,
42
+ errors: result.errors,
43
+ });
44
+ return result.data;
45
+ };
46
+
47
+ const validate = (
48
+ meta: Metadata,
49
+ explore: MetadataFactory.IExplore,
50
+ ): string[] => {
51
+ const errors: string[] = [];
52
+ const insert = (msg: string) => errors.push(msg);
53
+
54
+ if (explore.top === true) {
55
+ const onlyObject: boolean =
56
+ meta.size() === 1 &&
57
+ meta.objects.length === 1 &&
58
+ meta.objects[0]!.properties.every((p) => p.key.isSoleLiteral()) &&
59
+ meta.isRequired() === true &&
60
+ meta.nullable === false;
61
+ if (onlyObject === false)
62
+ insert("target type must be a sole and static object type");
63
+ }
64
+
65
+ //----
66
+ // NOT SUPPORTED TYPES
67
+ //----
68
+ const noSupport = (msg: string) => insert(`does not support ${msg}`);
69
+
70
+ // PROHIBIT ANY TYPE
71
+ if (meta.any) noSupport("any type");
72
+ // PROHIBIT FUNCTIONAL TYPE
73
+ if (meta.functions.length) noSupport("functional type");
74
+ // PROHIBIT TUPLE TYPE
75
+ if (meta.tuples.length) noSupport("tuple type");
76
+ // PROHIBIT SET TYPE
77
+ if (meta.sets.length) noSupport("Set type");
78
+ // NATIVE TYPE, BUT NOT Uint8Array
79
+ if (meta.natives.length)
80
+ for (const native of meta.natives) {
81
+ if (native === "Uint8Array") continue;
82
+
83
+ const instead = BANNED_NATIVE_TYPES.get(native);
84
+ if (instead === undefined) noSupport(`${native} type`);
85
+ else noSupport(`${native} type. Use ${instead} type instead.`);
86
+ }
87
+ //----
88
+ // ATOMIC CASES
89
+ //----
90
+ if (meta.atomics.length) {
91
+ const numbers = ProtobufUtil.getNumbers(meta);
92
+ const bigints = ProtobufUtil.getBigints(meta);
93
+
94
+ for (const type of ["int64", "uint64"])
95
+ if (numbers.some((n) => n === type) && bigints.some((b) => b === type))
96
+ insert(
97
+ `tags.Type<"${type}"> cannot be used in both number and bigint types. Recommend to remove from number type`,
98
+ );
99
+ }
100
+ //----
101
+ // ARRRAY CASES
102
+ //----
103
+ // DO NOT ALLOW MULTI-DIMENTIONAL ARRAY
104
+ if (
105
+ meta.arrays.length &&
106
+ meta.arrays.some((array) => !!array.type.value.arrays.length)
107
+ )
108
+ noSupport("over two dimenstional array type");
109
+ // CHILD OF ARRAY TYPE MUST BE REQUIRED
110
+ if (
111
+ meta.arrays.length &&
112
+ meta.arrays.some(
113
+ (array) =>
114
+ array.type.value.isRequired() === false ||
115
+ array.type.value.nullable === true,
116
+ )
117
+ )
118
+ noSupport("optional type in array");
119
+ // UNION IN ARRAY
120
+ if (
121
+ meta.arrays.length &&
122
+ meta.arrays.some(
123
+ (a) =>
124
+ a.type.value.size() > 1 &&
125
+ a.type.value.constants.length !== 1 &&
126
+ a.type.value.constants[0]?.values.length !== a.type.value.size(),
127
+ )
128
+ )
129
+ noSupport("union type in array");
130
+ // DO DYNAMIC OBJECT IN ARRAY
131
+ if (
132
+ meta.arrays.length &&
133
+ meta.arrays.some(
134
+ (a) =>
135
+ a.type.value.maps.length ||
136
+ (a.type.value.objects.length &&
137
+ a.type.value.objects.some(
138
+ (o) => ProtobufUtil.isStaticObject(o) === false,
139
+ )),
140
+ )
141
+ )
142
+ noSupport("dynamic object in array");
143
+ // UNION WITH ARRAY
144
+ if (meta.size() > 1 && meta.arrays.length)
145
+ noSupport("union type with array type");
146
+ //----
147
+ // OBJECT CASES
148
+ //----
149
+ // EMPTY PROPERTY
150
+ if (
151
+ meta.objects.length &&
152
+ meta.objects.some((obj) => obj.properties.length === 0)
153
+ )
154
+ noSupport("empty object type");
155
+ // MULTIPLE DYNAMIC KEY TYPED PROPERTIES
156
+ if (
157
+ meta.objects.length &&
158
+ meta.objects.some(
159
+ (obj) =>
160
+ obj.properties.filter((p) => !p.key.isSoleLiteral()).length > 1,
161
+ )
162
+ )
163
+ noSupport(
164
+ "object type with multiple dynamic key typed properties. Keep only one.",
165
+ );
166
+ // STATIC AND DYNAMIC PROPERTIES ARE COMPATIBLE
167
+ if (
168
+ meta.objects.length &&
169
+ meta.objects.some(
170
+ (obj) =>
171
+ obj.properties.some((p) => p.key.isSoleLiteral()) &&
172
+ obj.properties.some((p) => !p.key.isSoleLiteral()),
173
+ )
174
+ )
175
+ noSupport(
176
+ "object type with mixed static and dynamic key typed properties. Keep statics or dynamic only.",
177
+ );
178
+ // STATIC PROPERTY, BUT INVALID KEY NAME
179
+ if (
180
+ meta.objects.length &&
181
+ meta.objects.some((obj) =>
182
+ obj.properties.some(
183
+ (p) =>
184
+ p.key.isSoleLiteral() === true &&
185
+ Escaper.variable(p.key.getSoleLiteral()!) === false,
186
+ ),
187
+ )
188
+ )
189
+ noSupport(`object type with invalid static key name.`);
190
+ // DYNAMIC OBJECT, BUT PROPERTY VALUE TYPE IS ARRAY
191
+ if (
192
+ meta.objects.length &&
193
+ isDynamicObject(meta.objects[0]!) &&
194
+ meta.objects[0]!.properties.some((p) => !!p.value.arrays.length)
195
+ )
196
+ noSupport("dynamic object with array value type");
197
+ // UNION WITH DYNAMIC OBJECT
198
+ if (
199
+ meta.size() > 1 &&
200
+ meta.objects.length &&
201
+ isDynamicObject(meta.objects[0]!)
202
+ )
203
+ noSupport("union type with dynamic object type");
204
+ // UNION IN DYNAMIC PROPERTY VALUE
205
+ if (
206
+ meta.objects.length &&
207
+ meta.objects.some(
208
+ (obj) =>
209
+ isDynamicObject(obj) &&
210
+ obj.properties.some((p) => ProtobufUtil.isUnion(p.value)),
211
+ )
212
+ )
213
+ noSupport("union type in dynamic property");
214
+ //----
215
+ // MAP CASES
216
+ //----
217
+ // KEY TYPE IS UNION
218
+ if (meta.maps.length && meta.maps.some((m) => ProtobufUtil.isUnion(m.key)))
219
+ noSupport("union key typed map");
220
+ // KEY TYPE IS NOT ATOMIC
221
+ if (
222
+ meta.maps.length &&
223
+ meta.maps.some((m) => ProtobufUtil.getAtomics(m.key).length !== 1)
224
+ )
225
+ noSupport("non-atomic key typed map");
226
+ // MAP TYPE, BUT PROPERTY KEY TYPE IS OPTIONAL
227
+ if (
228
+ meta.maps.length &&
229
+ meta.maps.some((m) => m.key.isRequired() === false || m.key.nullable)
230
+ )
231
+ noSupport("optional key typed map");
232
+ // MAP TYPE, BUT VALUE TYPE IS ARRAY
233
+ if (meta.maps.length && meta.maps.some((m) => !!m.value.arrays.length))
234
+ noSupport("map type with array value type");
235
+ // UNION WITH MAP
236
+ if (meta.size() > 1 && meta.maps.length)
237
+ noSupport("union type with map type");
238
+ // UNION IN MAP
239
+ if (
240
+ meta.maps.length &&
241
+ meta.maps.some((m) => ProtobufUtil.isUnion(m.value))
242
+ )
243
+ noSupport("union type in map value type");
244
+ return errors;
245
+ };
246
+ }
247
+
248
+ const isDynamicObject = (obj: MetadataObject): boolean =>
249
+ obj.properties[0]!.key.isSoleLiteral() === false;
250
+
251
+ const BANNED_NATIVE_TYPES: Map<string, string | null> = new Map([
252
+ ["Date", "string"],
253
+ ["Boolean", "boolean"],
254
+ ["BigInt", "bigint"],
255
+ ["Number", "number"],
256
+ ["String", "string"],
257
+ ...[
258
+ "Buffer",
259
+ "Uint8ClampedArray",
260
+ "Uint16Array",
261
+ "Uint32Array",
262
+ "BigUint64Array",
263
+ "Int8Array",
264
+ "Int16Array",
265
+ "Int32Array",
266
+ "BigInt64Array",
267
+ "Float32Array",
268
+ "Float64Array",
269
+ "DataView",
270
+ "ArrayBuffer",
271
+ "SharedArrayBuffer",
272
+ ].map((name) => [name, "Uint8Array"] as const),
273
+ ["WeakSet", "Array"],
274
+ ["WeakMap", "Map"],
275
+ ]);