typia 3.7.0-dev.20230310 → 3.7.0-dev.20230401

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 (267) hide show
  1. package/README.md +16 -45
  2. package/lib/IRandomGenerator.d.ts +2 -1
  3. package/lib/executable/TypiaSetupWizard.js +12 -2
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/factories/MetadataCollection.d.ts +9 -1
  6. package/lib/factories/MetadataCollection.js +75 -2
  7. package/lib/factories/MetadataCollection.js.map +1 -1
  8. package/lib/factories/MetadataTagFactory.js +151 -132
  9. package/lib/factories/MetadataTagFactory.js.map +1 -1
  10. package/lib/factories/TypeFactory.js +1 -1
  11. package/lib/factories/TypeFactory.js.map +1 -1
  12. package/lib/factories/TypiaFileFactory.js +61 -54
  13. package/lib/factories/TypiaFileFactory.js.map +1 -1
  14. package/lib/functional/$dictionary.d.ts +1 -0
  15. package/lib/functional/$dictionary.js +14 -0
  16. package/lib/functional/$dictionary.js.map +1 -0
  17. package/lib/functional/$is_custom.d.ts +2 -0
  18. package/lib/functional/$is_custom.js +12 -0
  19. package/lib/functional/$is_custom.js.map +1 -0
  20. package/lib/functional/$is_date.d.ts +1 -0
  21. package/lib/functional/$is_date.js +9 -0
  22. package/lib/functional/$is_date.js.map +1 -0
  23. package/lib/functional/$is_datetime.d.ts +1 -0
  24. package/lib/functional/$is_datetime.js +8 -0
  25. package/lib/functional/$is_datetime.js.map +1 -0
  26. package/lib/functional/Namespace.js +6 -0
  27. package/lib/functional/Namespace.js.map +1 -1
  28. package/lib/metadata/IMetadataTag.d.ts +30 -38
  29. package/lib/metadata/Metadata.js +2 -2
  30. package/lib/metadata/Metadata.js.map +1 -1
  31. package/lib/module.d.ts +25 -2
  32. package/lib/module.js +12 -5
  33. package/lib/module.js.map +1 -1
  34. package/lib/programmers/AssertProgrammer.js +11 -0
  35. package/lib/programmers/AssertProgrammer.js.map +1 -1
  36. package/lib/programmers/CheckerProgrammer.d.ts +4 -2
  37. package/lib/programmers/CheckerProgrammer.js +26 -27
  38. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  39. package/lib/programmers/CloneProgrammer.js +2 -2
  40. package/lib/programmers/CloneProgrammer.js.map +1 -1
  41. package/lib/programmers/FeatureProgrammer.d.ts +3 -2
  42. package/lib/programmers/FeatureProgrammer.js +5 -5
  43. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  44. package/lib/programmers/IsProgrammer.d.ts +1 -1
  45. package/lib/programmers/IsProgrammer.js +32 -2
  46. package/lib/programmers/IsProgrammer.js.map +1 -1
  47. package/lib/programmers/PruneProgrammer.js +2 -2
  48. package/lib/programmers/PruneProgrammer.js.map +1 -1
  49. package/lib/programmers/RandomProgrammer.js +1 -2
  50. package/lib/programmers/RandomProgrammer.js.map +1 -1
  51. package/lib/programmers/StringifyProgrammer.js +6 -6
  52. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  53. package/lib/programmers/ValidateProgrammer.js +11 -0
  54. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  55. package/lib/programmers/helpers/ICheckEntry.d.ts +11 -0
  56. package/lib/{messages/IProtocolMap.js → programmers/helpers/ICheckEntry.js} +1 -1
  57. package/lib/programmers/helpers/ICheckEntry.js.map +1 -0
  58. package/lib/programmers/helpers/UnionExplorer.d.ts +7 -7
  59. package/lib/programmers/helpers/UnionExplorer.js +6 -6
  60. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  61. package/lib/programmers/internal/application_object.js +11 -11
  62. package/lib/programmers/internal/application_object.js.map +1 -1
  63. package/lib/programmers/internal/application_schema.js +3 -5
  64. package/lib/programmers/internal/application_schema.js.map +1 -1
  65. package/lib/programmers/internal/application_string.js +8 -5
  66. package/lib/programmers/internal/application_string.js.map +1 -1
  67. package/lib/programmers/internal/check_array.js +35 -10
  68. package/lib/programmers/internal/check_array.js.map +1 -1
  69. package/lib/programmers/internal/check_array_length.js +23 -36
  70. package/lib/programmers/internal/check_array_length.js.map +1 -1
  71. package/lib/programmers/internal/check_bigint.d.ts +1 -3
  72. package/lib/programmers/internal/check_bigint.js +92 -57
  73. package/lib/programmers/internal/check_bigint.js.map +1 -1
  74. package/lib/programmers/internal/check_custom.d.ts +5 -0
  75. package/lib/programmers/internal/check_custom.js +40 -0
  76. package/lib/programmers/internal/check_custom.js.map +1 -0
  77. package/lib/programmers/internal/check_number.js +126 -73
  78. package/lib/programmers/internal/check_number.js.map +1 -1
  79. package/lib/programmers/internal/check_string.js +10 -9
  80. package/lib/programmers/internal/check_string.js.map +1 -1
  81. package/lib/programmers/internal/check_string_tags.js +63 -24
  82. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  83. package/lib/programmers/internal/check_template.js +23 -11
  84. package/lib/programmers/internal/check_template.js.map +1 -1
  85. package/lib/programmers/internal/check_union_array_like.d.ts +2 -2
  86. package/lib/programmers/internal/check_union_array_like.js +4 -4
  87. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  88. package/lib/programmers/internal/check_union_tuple.js +2 -2
  89. package/lib/programmers/internal/check_union_tuple.js.map +1 -1
  90. package/lib/programmers/internal/feature_object_entries.js +1 -1
  91. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  92. package/lib/transformers/CallExpressionTransformer.js +1 -3
  93. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  94. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +3 -1
  95. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  96. package/lib/transformers/features/miscellaneous/CreateRandomGenerator.js +1 -1
  97. package/lib/transformers/features/miscellaneous/CreateRandomGenerator.js.map +1 -1
  98. package/lib/transformers/features/miscellaneous/RandomTransformer.js +1 -1
  99. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  100. package/lib/transformers/internal/GenericTransformer.js +2 -2
  101. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  102. package/lib/typings/Customizable.d.ts +6 -0
  103. package/lib/{messages/IProtocolMessage.js → typings/Customizable.js} +1 -1
  104. package/lib/typings/Customizable.js.map +1 -0
  105. package/lib/utils/RandomGenerator.js +8 -2
  106. package/lib/utils/RandomGenerator.js.map +1 -1
  107. package/package.json +10 -9
  108. package/src/IRandomGenerator.ts +2 -1
  109. package/src/executable/TypiaSetupWizard.ts +16 -6
  110. package/src/factories/MetadataCollection.ts +41 -2
  111. package/src/factories/MetadataTagFactory.ts +186 -149
  112. package/src/factories/TypeFactory.ts +1 -1
  113. package/src/factories/TypiaFileFactory.ts +10 -7
  114. package/src/functional/$dictionary.ts +17 -0
  115. package/src/functional/$is_custom.ts +14 -0
  116. package/src/functional/$is_date.ts +4 -0
  117. package/src/functional/$is_datetime.ts +3 -0
  118. package/src/functional/Namespace.ts +6 -0
  119. package/src/metadata/IMetadataTag.ts +46 -70
  120. package/src/metadata/Metadata.ts +3 -6
  121. package/src/module.ts +39 -10
  122. package/src/programmers/AssertProgrammer.ts +24 -0
  123. package/src/programmers/CheckerProgrammer.ts +66 -37
  124. package/src/programmers/CloneProgrammer.ts +2 -0
  125. package/src/programmers/FeatureProgrammer.ts +12 -5
  126. package/src/programmers/IsProgrammer.ts +7 -1
  127. package/src/programmers/PruneProgrammer.ts +2 -0
  128. package/src/programmers/RandomProgrammer.ts +1 -4
  129. package/src/programmers/StringifyProgrammer.ts +6 -0
  130. package/src/programmers/ValidateProgrammer.ts +24 -0
  131. package/src/programmers/helpers/ICheckEntry.ts +12 -0
  132. package/src/programmers/helpers/UnionExplorer.ts +7 -0
  133. package/src/programmers/internal/application_object.ts +5 -5
  134. package/src/programmers/internal/application_schema.ts +3 -7
  135. package/src/programmers/internal/application_string.ts +6 -2
  136. package/src/programmers/internal/check_array.ts +15 -11
  137. package/src/programmers/internal/check_array_length.ts +31 -35
  138. package/src/programmers/internal/check_bigint.ts +76 -58
  139. package/src/programmers/internal/check_custom.ts +41 -0
  140. package/src/programmers/internal/check_number.ts +106 -77
  141. package/src/programmers/internal/check_string.ts +15 -14
  142. package/src/programmers/internal/check_string_tags.ts +23 -13
  143. package/src/programmers/internal/check_template.ts +16 -7
  144. package/src/programmers/internal/check_union_array_like.ts +5 -0
  145. package/src/programmers/internal/check_union_tuple.ts +2 -0
  146. package/src/programmers/internal/feature_object_entries.ts +1 -0
  147. package/src/transformers/CallExpressionTransformer.ts +9 -16
  148. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +3 -1
  149. package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +1 -1
  150. package/src/transformers/features/miscellaneous/RandomTransformer.ts +1 -1
  151. package/src/transformers/internal/GenericTransformer.ts +2 -2
  152. package/src/typings/Customizable.ts +6 -0
  153. package/src/utils/RandomGenerator.ts +8 -2
  154. package/lib/factories/ProtocolFactory.d.ts +0 -8
  155. package/lib/factories/ProtocolFactory.js +0 -112
  156. package/lib/factories/ProtocolFactory.js.map +0 -1
  157. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +0 -16
  158. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +0 -156
  159. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +0 -1
  160. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +0 -3
  161. package/lib/factories/internal/protocols/emplace_protocol_object.js +0 -47
  162. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +0 -1
  163. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +0 -4
  164. package/lib/factories/internal/protocols/emplace_protocol_property.js +0 -20
  165. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +0 -1
  166. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +0 -3
  167. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +0 -69
  168. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +0 -1
  169. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +0 -2
  170. package/lib/factories/internal/protocols/iterate_protocol_constant.js +0 -30
  171. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +0 -1
  172. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +0 -3
  173. package/lib/factories/internal/protocols/iterate_protocol_main.js +0 -17
  174. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +0 -1
  175. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +0 -4
  176. package/lib/factories/internal/protocols/iterate_protocol_map.js +0 -75
  177. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +0 -1
  178. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +0 -5
  179. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +0 -190
  180. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +0 -1
  181. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +0 -2
  182. package/lib/factories/internal/protocols/iterate_protocol_native.js +0 -33
  183. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +0 -1
  184. package/lib/factories/internal/protocols/iterate_protocol_never.d.ts +0 -1
  185. package/lib/factories/internal/protocols/iterate_protocol_never.js +0 -6
  186. package/lib/factories/internal/protocols/iterate_protocol_never.js.map +0 -1
  187. package/lib/factories/internal/protocols/iterate_protocol_object.d.ts +0 -4
  188. package/lib/factories/internal/protocols/iterate_protocol_object.js +0 -157
  189. package/lib/factories/internal/protocols/iterate_protocol_object.js.map +0 -1
  190. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +0 -5
  191. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +0 -25
  192. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +0 -1
  193. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +0 -3
  194. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +0 -46
  195. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +0 -1
  196. package/lib/functional/$proto_bytes.d.ts +0 -2
  197. package/lib/functional/$proto_bytes.js +0 -37
  198. package/lib/functional/$proto_bytes.js.map +0 -1
  199. package/lib/functional/$proto_field.d.ts +0 -10
  200. package/lib/functional/$proto_field.js +0 -42
  201. package/lib/functional/$proto_field.js.map +0 -1
  202. package/lib/functional/$proto_float.d.ts +0 -4
  203. package/lib/functional/$proto_float.js +0 -28
  204. package/lib/functional/$proto_float.js.map +0 -1
  205. package/lib/functional/$proto_i32.d.ts +0 -2
  206. package/lib/functional/$proto_i32.js +0 -23
  207. package/lib/functional/$proto_i32.js.map +0 -1
  208. package/lib/functional/$proto_i64.d.ts +0 -2
  209. package/lib/functional/$proto_i64.js +0 -31
  210. package/lib/functional/$proto_i64.js.map +0 -1
  211. package/lib/functional/$proto_size.d.ts +0 -6
  212. package/lib/functional/$proto_size.js +0 -76
  213. package/lib/functional/$proto_size.js.map +0 -1
  214. package/lib/functional/$proto_string.d.ts +0 -2
  215. package/lib/functional/$proto_string.js +0 -34
  216. package/lib/functional/$proto_string.js.map +0 -1
  217. package/lib/functional/$varint.d.ts +0 -6
  218. package/lib/functional/$varint.js +0 -99
  219. package/lib/functional/$varint.js.map +0 -1
  220. package/lib/functional/$zigzag.d.ts +0 -4
  221. package/lib/functional/$zigzag.js +0 -34
  222. package/lib/functional/$zigzag.js.map +0 -1
  223. package/lib/messages/IProtocolMap.d.ts +0 -5
  224. package/lib/messages/IProtocolMap.js.map +0 -1
  225. package/lib/messages/IProtocolMessage.d.ts +0 -5
  226. package/lib/messages/IProtocolMessage.js.map +0 -1
  227. package/lib/messages/IProtocolProperty.d.ts +0 -12
  228. package/lib/messages/IProtocolProperty.js +0 -3
  229. package/lib/messages/IProtocolProperty.js.map +0 -1
  230. package/lib/programmers/MessageProgrammer.d.ts +0 -5
  231. package/lib/programmers/MessageProgrammer.js +0 -141
  232. package/lib/programmers/MessageProgrammer.js.map +0 -1
  233. package/lib/transformers/features/protocols/MessageTransformer.d.ts +0 -5
  234. package/lib/transformers/features/protocols/MessageTransformer.js +0 -17
  235. package/lib/transformers/features/protocols/MessageTransformer.js.map +0 -1
  236. package/lib/utils/NameEncoder.d.ts +0 -4
  237. package/lib/utils/NameEncoder.js +0 -89
  238. package/lib/utils/NameEncoder.js.map +0 -1
  239. package/src/factories/ProtocolFactory.ts +0 -79
  240. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +0 -163
  241. package/src/factories/internal/protocols/emplace_protocol_object.ts +0 -25
  242. package/src/factories/internal/protocols/emplace_protocol_property.ts +0 -12
  243. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +0 -34
  244. package/src/factories/internal/protocols/iterate_protocol_constant.ts +0 -27
  245. package/src/factories/internal/protocols/iterate_protocol_main.ts +0 -19
  246. package/src/factories/internal/protocols/iterate_protocol_map.ts +0 -58
  247. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +0 -96
  248. package/src/factories/internal/protocols/iterate_protocol_native.ts +0 -34
  249. package/src/factories/internal/protocols/iterate_protocol_never.ts +0 -1
  250. package/src/factories/internal/protocols/iterate_protocol_object.ts +0 -110
  251. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +0 -34
  252. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +0 -29
  253. package/src/functional/$proto_bytes.ts +0 -25
  254. package/src/functional/$proto_field.ts +0 -30
  255. package/src/functional/$proto_float.ts +0 -37
  256. package/src/functional/$proto_i32.ts +0 -29
  257. package/src/functional/$proto_i64.ts +0 -37
  258. package/src/functional/$proto_size.ts +0 -82
  259. package/src/functional/$proto_string.ts +0 -24
  260. package/src/functional/$varint.ts +0 -130
  261. package/src/functional/$zigzag.ts +0 -39
  262. package/src/messages/IProtocolMap.ts +0 -5
  263. package/src/messages/IProtocolMessage.ts +0 -6
  264. package/src/messages/IProtocolProperty.ts +0 -13
  265. package/src/programmers/MessageProgrammer.ts +0 -126
  266. package/src/transformers/features/protocols/MessageTransformer.ts +0 -32
  267. package/src/utils/NameEncoder.ts +0 -32
@@ -18,6 +18,7 @@ export namespace UnionExplorer {
18
18
  target: T,
19
19
  explore: FeatureProgrammer.IExplore,
20
20
  tags: IMetadataTag[],
21
+ jsDocTags: ts.JSDocTagInfo[],
21
22
  ): ts.Expression;
22
23
  }
23
24
  export type ObjectCombiner = Decoder<MetadataObject[]>;
@@ -32,6 +33,7 @@ export namespace UnionExplorer {
32
33
  targets: MetadataObject[],
33
34
  explore: FeatureProgrammer.IExplore,
34
35
  tags: IMetadataTag[],
36
+ jsDocTags: ts.JSDocTagInfo[],
35
37
  ): ts.Expression => {
36
38
  // BREAKER
37
39
  if (targets.length === 1)
@@ -40,6 +42,7 @@ export namespace UnionExplorer {
40
42
  targets[0]!,
41
43
  explore,
42
44
  tags,
45
+ jsDocTags,
43
46
  );
44
47
 
45
48
  const expected: string = `(${targets
@@ -57,6 +60,7 @@ export namespace UnionExplorer {
57
60
  tracable: false,
58
61
  },
59
62
  tags,
63
+ jsDocTags,
60
64
  );
61
65
  return config.objector.full
62
66
  ? config.objector.full(condition)(input, expected, explore)
@@ -85,6 +89,7 @@ export namespace UnionExplorer {
85
89
  postfix: IdentifierFactory.postfix(key),
86
90
  },
87
91
  tags,
92
+ jsDocTags,
88
93
  )
89
94
  : (config.objector.required || ((exp) => exp))(
90
95
  ExpressionFactory.isRequired(accessor),
@@ -97,6 +102,7 @@ export namespace UnionExplorer {
97
102
  spec.object,
98
103
  explore,
99
104
  tags,
105
+ jsDocTags,
100
106
  ),
101
107
  ),
102
108
  );
@@ -120,6 +126,7 @@ export namespace UnionExplorer {
120
126
  remained,
121
127
  explore,
122
128
  tags,
129
+ jsDocTags,
123
130
  ),
124
131
  )
125
132
  : config.objector.failure(
@@ -18,10 +18,10 @@ import { metadata_to_pattern } from "./metadata_to_pattern";
18
18
  export const application_object =
19
19
  (options: ApplicationProgrammer.IOptions) =>
20
20
  (components: IJsonComponents) =>
21
- (id: string, obj: MetadataObject, nullable: boolean): void => {
21
+ (key: string, obj: MetadataObject, nullable: boolean): void => {
22
22
  // TEMPORARY ASSIGNMENT
23
- if (components.schemas[id] !== undefined) return;
24
- components.schemas[id] = {} as any;
23
+ if (components.schemas[key] !== undefined) return;
24
+ components.schemas[key] = {} as any;
25
25
 
26
26
  // ITERATE PROPERTIES
27
27
  const properties: Record<string, any> = {};
@@ -97,7 +97,7 @@ export const application_object =
97
97
  const schema: IJsonComponents.IObject = {
98
98
  $id:
99
99
  options.purpose === "ajv"
100
- ? options.prefix + "/" + id
100
+ ? options.prefix + "/" + key
101
101
  : undefined,
102
102
  $recursiveAnchor:
103
103
  (options.purpose === "ajv" && obj.recursive) || undefined,
@@ -118,7 +118,7 @@ export const application_object =
118
118
  join(options)(components)(extraMeta),
119
119
  }),
120
120
  };
121
- components.schemas[id] = schema;
121
+ components.schemas[key] = schema;
122
122
  };
123
123
 
124
124
  const join =
@@ -2,8 +2,6 @@ import { Metadata } from "../../metadata/Metadata";
2
2
  import { IJsonComponents } from "../../schemas/IJsonComponents";
3
3
  import { IJsonSchema } from "../../schemas/IJsonSchema";
4
4
 
5
- import { NameEncoder } from "../../utils/NameEncoder";
6
-
7
5
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
8
6
  import { AtomicPredicator } from "../helpers/AtomicPredicator";
9
7
  import { application_array } from "./application_array";
@@ -144,14 +142,12 @@ export const application_schema =
144
142
 
145
143
  // OBJECT
146
144
  for (const obj of meta.objects) {
147
- const id: string =
148
- NameEncoder.encode(obj.name) +
149
- (meta.nullable ? ".Nullable" : "");
150
- application_object(options)(components)(id, obj, meta.nullable);
145
+ const key: string = obj.name + (meta.nullable ? ".Nullable" : "");
146
+ application_object(options)(components)(key, obj, meta.nullable);
151
147
  union.push(
152
148
  (options.purpose === "ajv" && obj.recursive
153
149
  ? recursive
154
- : reference)(`${options.prefix}/${id}`, attribute),
150
+ : reference)(`${options.prefix}/${key}`, attribute),
155
151
  );
156
152
  }
157
153
 
@@ -1,3 +1,4 @@
1
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
1
2
  import { Metadata } from "../../metadata/Metadata";
2
3
  import { IJsonSchema } from "../../schemas/IJsonSchema";
3
4
 
@@ -24,12 +25,12 @@ export const application_string = (
24
25
  output.format = formatJsdocTag?.text.map((t) => t.text).join(" ");
25
26
 
26
27
  // REGULAR TAGS COMPATIBLE WITH JSON-SCHEMA
27
- for (const tag of attribute["x-typia-metaTags"] || []) {
28
+ for (const tag of attribute["x-typia-metaTags"] ?? []) {
28
29
  // RANGE
29
30
  if (tag.kind === "minLength") output.minLength = tag.value;
30
31
  else if (tag.kind === "maxLength") output.maxLength = tag.value;
31
32
  // FORMAT AND PATTERN
32
- else if (tag.kind === "format") output.format = tag.value;
33
+ else if (tag.kind === "format") output.format = emendFormat(tag.value);
33
34
  else if (tag.kind === "pattern") output.pattern = tag.value;
34
35
  }
35
36
 
@@ -39,3 +40,6 @@ export const application_string = (
39
40
  // RETURNS
40
41
  return output;
41
42
  };
43
+
44
+ const emendFormat = (tag: IMetadataTag.IFormat["value"]) =>
45
+ tag === "datetime" ? "date-time" : tag;
@@ -2,21 +2,25 @@ import ts from "typescript";
2
2
 
3
3
  import { ExpressionFactory } from "../../factories/ExpressionFactory";
4
4
 
5
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
5
6
  import { IMetadataTag } from "../../metadata/IMetadataTag";
6
7
 
8
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
9
+ import { ICheckEntry } from "../helpers/ICheckEntry";
7
10
  import { check_array_length } from "./check_array_length";
11
+ import { check_custom } from "./check_custom";
8
12
 
9
13
  /**
10
14
  * @internal
11
15
  */
12
- export function check_array(
13
- input: ts.Expression,
14
- tagList: IMetadataTag[],
15
- ): ts.Expression {
16
- const conditions: ts.Expression[] = [ExpressionFactory.isArray(input)];
17
-
18
- const length: ts.Expression | null = check_array_length(input, tagList);
19
- if (length !== null) conditions.push(length);
20
-
21
- return conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
22
- }
16
+ export const check_array =
17
+ (importer: FunctionImporter) =>
18
+ (metaTags: IMetadataTag[]) =>
19
+ (jsDocTags: IJsDocTagInfo[]) =>
20
+ (input: ts.Expression): ICheckEntry => ({
21
+ expression: ExpressionFactory.isArray(input),
22
+ tags: [
23
+ ...check_array_length(metaTags)(input),
24
+ ...check_custom("array", "Array")(importer)(jsDocTags)(input),
25
+ ],
26
+ });
@@ -4,41 +4,37 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
4
 
5
5
  import { IMetadataTag } from "../../metadata/IMetadataTag";
6
6
 
7
+ import { ICheckEntry } from "../helpers/ICheckEntry";
8
+
7
9
  /**
8
10
  * @internal
9
11
  */
10
- export function check_array_length(
11
- input: ts.Expression,
12
- tagList: IMetadataTag[],
13
- ): ts.Expression | null {
14
- const conditions: ts.Expression[] = [];
15
-
16
- // CHECK TAGS
17
- for (const tag of tagList)
18
- if (tag.kind === "items")
19
- conditions.push(
20
- ts.factory.createStrictEquality(
21
- ts.factory.createNumericLiteral(tag.value),
22
- IdentifierFactory.join(input, "length"),
23
- ),
24
- );
25
- else if (tag.kind === "minItems")
26
- conditions.push(
27
- ts.factory.createLessThanEquals(
28
- ts.factory.createNumericLiteral(tag.value),
29
- IdentifierFactory.join(input, "length"),
30
- ),
31
- );
32
- else if (tag.kind === "maxItems")
33
- conditions.push(
34
- ts.factory.createGreaterThanEquals(
35
- ts.factory.createNumericLiteral(tag.value),
36
- IdentifierFactory.join(input, "length"),
37
- ),
38
- );
39
-
40
- // COMBINATION
41
- return conditions.length
42
- ? conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y))
43
- : null;
44
- }
12
+ export const check_array_length =
13
+ (tagList: IMetadataTag[]) =>
14
+ (input: ts.Expression): ICheckEntry.ITag[] =>
15
+ tagList
16
+ .map((tag) => ({
17
+ tag,
18
+ expression:
19
+ tag.kind === "items"
20
+ ? ts.factory.createStrictEquality(
21
+ ts.factory.createNumericLiteral(tag.value),
22
+ IdentifierFactory.join(input, "length"),
23
+ )
24
+ : tag.kind === "minItems"
25
+ ? ts.factory.createLessThanEquals(
26
+ ts.factory.createNumericLiteral(tag.value),
27
+ IdentifierFactory.join(input, "length"),
28
+ )
29
+ : tag.kind === "maxItems"
30
+ ? ts.factory.createGreaterThanEquals(
31
+ ts.factory.createNumericLiteral(tag.value),
32
+ IdentifierFactory.join(input, "length"),
33
+ )
34
+ : null!,
35
+ }))
36
+ .filter((tuple) => tuple.expression !== null)
37
+ .map(({ tag, expression }) => ({
38
+ expected: `Array.length (@${tag.kind} ${tag.value})`,
39
+ expression,
40
+ }));
@@ -1,64 +1,82 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
3
4
  import { IMetadataTag } from "../../metadata/IMetadataTag";
4
5
 
5
- export function check_bigint(input: ts.Expression, tagList: IMetadataTag[]) {
6
- const caster = (value: number) =>
7
- ts.factory.createIdentifier(`${Math.floor(value)}n`);
6
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
7
+ import { ICheckEntry } from "../helpers/ICheckEntry";
8
+ import { check_custom } from "./check_custom";
8
9
 
9
- // TYPEOF STATEMENT
10
- const conditions: ts.Expression[] = [
11
- ts.factory.createStrictEquality(
12
- ts.factory.createStringLiteral("bigint"),
13
- ts.factory.createTypeOfExpression(input),
14
- ),
15
- ];
10
+ /**
11
+ * @internal
12
+ */
13
+ export const check_bigint =
14
+ (importer: FunctionImporter) =>
15
+ (metaTags: IMetadataTag[]) =>
16
+ (jsDocTag: IJsDocTagInfo[]) =>
17
+ (input: ts.Expression): ICheckEntry => {
18
+ const entries: [IMetadataTag, ts.Expression][] = [];
19
+ for (const tag of metaTags) {
20
+ if (tag.kind === "multipleOf")
21
+ entries.push([
22
+ tag,
23
+ ts.factory.createStrictEquality(
24
+ cast(0),
25
+ ts.factory.createModulo(input, cast(tag.value)),
26
+ ),
27
+ ]);
28
+ else if (tag.kind === "step") {
29
+ const modulo = ts.factory.createModulo(input, cast(tag.value));
30
+ const minimum =
31
+ (metaTags.find(
32
+ (tag) =>
33
+ tag.kind === "minimum" ||
34
+ tag.kind === "exclusiveMinimum",
35
+ )?.value as number | undefined) ?? undefined;
36
+ entries.push([
37
+ tag,
38
+ ts.factory.createStrictEquality(
39
+ cast(0),
40
+ minimum !== undefined
41
+ ? ts.factory.createSubtract(modulo, cast(minimum))
42
+ : modulo,
43
+ ),
44
+ ]);
45
+ } else if (tag.kind === "minimum")
46
+ entries.push([
47
+ tag,
48
+ ts.factory.createLessThanEquals(cast(tag.value), input),
49
+ ]);
50
+ else if (tag.kind === "maximum")
51
+ entries.push([
52
+ tag,
53
+ ts.factory.createGreaterThanEquals(cast(tag.value), input),
54
+ ]);
55
+ else if (tag.kind === "exclusiveMinimum")
56
+ entries.push([
57
+ tag,
58
+ ts.factory.createLessThan(cast(tag.value), input),
59
+ ]);
60
+ else if (tag.kind === "exclusiveMaximum")
61
+ entries.push([
62
+ tag,
63
+ ts.factory.createGreaterThan(cast(tag.value), input),
64
+ ]);
65
+ }
66
+ return {
67
+ expression: ts.factory.createStrictEquality(
68
+ ts.factory.createStringLiteral("bigint"),
69
+ ts.factory.createTypeOfExpression(input),
70
+ ),
71
+ tags: [
72
+ ...entries.map(([tag, expression]) => ({
73
+ expected: `bigint (@${tag.kind} ${tag.value})`,
74
+ expression,
75
+ })),
76
+ ...check_custom("bigint")(importer)(jsDocTag)(input),
77
+ ],
78
+ };
79
+ };
16
80
 
17
- // TAG (RANGE)
18
- for (const tag of tagList)
19
- if (tag.kind === "multipleOf")
20
- conditions.push(
21
- ts.factory.createStrictEquality(
22
- caster(0),
23
- ts.factory.createModulo(input, caster(tag.value)),
24
- ),
25
- );
26
- else if (tag.kind === "step") {
27
- const modulo = () =>
28
- ts.factory.createModulo(input, caster(tag.value));
29
- const minimum = (() => {
30
- for (const tag of tagList)
31
- if (tag.kind === "minimum") return tag.value;
32
- else if (tag.kind === "exclusiveMinimum") return tag.value;
33
- return undefined;
34
- })();
35
- conditions.push(
36
- ts.factory.createStrictEquality(
37
- caster(0),
38
- minimum !== undefined
39
- ? ts.factory.createSubtract(modulo(), caster(minimum))
40
- : modulo(),
41
- ),
42
- );
43
- } else if (tag.kind === "minimum")
44
- conditions.push(
45
- ts.factory.createLessThanEquals(caster(tag.value), input),
46
- );
47
- else if (tag.kind === "maximum")
48
- conditions.push(
49
- ts.factory.createGreaterThanEquals(caster(tag.value), input),
50
- );
51
- else if (tag.kind === "exclusiveMinimum")
52
- conditions.push(
53
- ts.factory.createLessThan(caster(tag.value), input),
54
- );
55
- else if (tag.kind === "exclusiveMaximum")
56
- conditions.push(
57
- ts.factory.createGreaterThan(caster(tag.value), input),
58
- );
59
-
60
- // COMBINATION
61
- return conditions.length === 1
62
- ? conditions[0]!
63
- : conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
64
- }
81
+ const cast = (value: number) =>
82
+ ts.factory.createIdentifier(`${Math.floor(value)}n`);
@@ -0,0 +1,41 @@
1
+ import ts from "typescript";
2
+
3
+ import { MetadataTagFactory } from "../../factories/MetadataTagFactory";
4
+
5
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
6
+
7
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
8
+ import { ICheckEntry } from "../helpers/ICheckEntry";
9
+
10
+ export const check_custom =
11
+ (type: string, alias?: string) =>
12
+ (importer: FunctionImporter) =>
13
+ (jsDocTags: IJsDocTagInfo[]) =>
14
+ (input: ts.Expression): ICheckEntry.ITag[] =>
15
+ jsDocTags
16
+ .filter(
17
+ (tag) =>
18
+ tag.name !== "random" &&
19
+ (!tag.text?.length ||
20
+ (tag.text?.length === 1 &&
21
+ tag.text?.[0]?.kind === "text")) &&
22
+ MetadataTagFactory._PARSER[tag.name] === undefined,
23
+ )
24
+ .map((tag) => {
25
+ const text: string | undefined = tag.text?.[0]?.text ?? "";
26
+ return {
27
+ expected: `${alias ?? type} (@${tag.name}${
28
+ text.length ? ` ${text}` : ""
29
+ })`,
30
+ expression: ts.factory.createCallExpression(
31
+ importer.use("is_custom"),
32
+ undefined,
33
+ [
34
+ ts.factory.createStringLiteral(tag.name),
35
+ ts.factory.createStringLiteral(type),
36
+ ts.factory.createStringLiteral(text),
37
+ input,
38
+ ],
39
+ ),
40
+ };
41
+ });