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
@@ -1,64 +1,29 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
3
4
  import { IMetadataTag } from "../../metadata/IMetadataTag";
4
5
 
5
6
  import { IProject } from "../../transformers/IProject";
6
7
 
8
+ import { FunctionImporter } from "../helpers/FunctionImporeter";
9
+ import { ICheckEntry } from "../helpers/ICheckEntry";
7
10
  import { OptionPredicator } from "../helpers/OptionPredicator";
11
+ import { check_custom } from "./check_custom";
8
12
 
9
13
  /**
10
14
  * @internal
11
15
  */
12
16
  export const check_number =
13
- ({ options }: IProject, numeric: boolean) =>
14
- (input: ts.Expression, tagList: IMetadataTag[]) => {
15
- // TYPEOF STATEMENT
16
- const conditions: ts.Expression[] = [
17
- ts.factory.createStrictEquality(
18
- ts.factory.createStringLiteral("number"),
19
- ts.factory.createTypeOfExpression(input),
20
- ),
21
- ];
22
-
23
- // CHECK FINITE AND NAN
24
- const finite: boolean =
25
- (!!tagList.find(
26
- (tag) =>
27
- tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
28
- ) &&
29
- !!tagList.find(
30
- (tag) =>
31
- tag.kind === "maximum" ||
32
- tag.kind === "exclusiveMaximum",
33
- )) ||
34
- !!tagList.find(
35
- (tag) => tag.kind === "step" || tag.kind === "multipleOf",
36
- );
37
-
38
- if (numeric === true && finite === false)
39
- if (OptionPredicator.finite(options))
40
- conditions.push(
41
- ts.factory.createCallExpression(
42
- ts.factory.createIdentifier("Number.isFinite"),
43
- undefined,
44
- [input],
45
- ),
46
- );
47
- else if (OptionPredicator.numeric(options))
48
- conditions.push(
49
- ts.factory.createLogicalNot(
50
- ts.factory.createCallExpression(
51
- ts.factory.createIdentifier("Number.isNaN"),
52
- undefined,
53
- [input],
54
- ),
55
- ),
56
- );
57
-
58
- // TAG (RANGE)
59
- for (const tag of tagList)
17
+ (project: IProject, numeric: boolean) =>
18
+ (importer: FunctionImporter) =>
19
+ (metaTags: IMetadataTag[]) =>
20
+ (jsDocTag: IJsDocTagInfo[]) =>
21
+ (input: ts.Expression): ICheckEntry => {
22
+ const entries: [IMetadataTag, ts.Expression][] = [];
23
+ for (const tag of metaTags)
60
24
  if (tag.kind === "type") {
61
- conditions.push(
25
+ entries.push([
26
+ tag,
62
27
  ts.factory.createStrictEquality(
63
28
  ts.factory.createCallExpression(
64
29
  ts.factory.createIdentifier("parseInt"),
@@ -67,16 +32,18 @@ export const check_number =
67
32
  ),
68
33
  input,
69
34
  ),
70
- );
35
+ ]);
71
36
  if (tag.value === "uint")
72
- conditions.push(
37
+ entries.push([
38
+ tag,
73
39
  ts.factory.createLessThanEquals(
74
40
  ts.factory.createNumericLiteral(0),
75
41
  input,
76
42
  ),
77
- );
43
+ ]);
78
44
  } else if (tag.kind === "multipleOf")
79
- conditions.push(
45
+ entries.push([
46
+ tag,
80
47
  ts.factory.createStrictEquality(
81
48
  ts.factory.createNumericLiteral(0),
82
49
  ts.factory.createModulo(
@@ -84,61 +51,123 @@ export const check_number =
84
51
  ts.factory.createNumericLiteral(tag.value),
85
52
  ),
86
53
  ),
87
- );
54
+ ]);
88
55
  else if (tag.kind === "step") {
89
- const modulo = () =>
90
- ts.factory.createModulo(
91
- input,
92
- ts.factory.createNumericLiteral(tag.value),
93
- );
94
- const minimum = (() => {
95
- for (const tag of tagList)
96
- if (tag.kind === "minimum") return tag.value;
97
- else if (tag.kind === "exclusiveMinimum")
98
- return tag.value;
99
- return undefined;
100
- })();
101
- conditions.push(
56
+ const modulo = ts.factory.createModulo(
57
+ input,
58
+ ts.factory.createNumericLiteral(tag.value),
59
+ );
60
+ const minimum =
61
+ (metaTags.find(
62
+ (tag) =>
63
+ tag.kind === "minimum" ||
64
+ tag.kind === "exclusiveMinimum",
65
+ )?.value as number | undefined) ?? undefined;
66
+ entries.push([
67
+ tag,
102
68
  ts.factory.createStrictEquality(
103
69
  ts.factory.createNumericLiteral(0),
104
70
  minimum !== undefined
105
71
  ? ts.factory.createSubtract(
106
- modulo(),
72
+ modulo,
107
73
  ts.factory.createNumericLiteral(minimum),
108
74
  )
109
- : modulo(),
75
+ : modulo,
110
76
  ),
111
- );
77
+ ]);
112
78
  } else if (tag.kind === "minimum")
113
- conditions.push(
79
+ entries.push([
80
+ tag,
114
81
  ts.factory.createLessThanEquals(
115
82
  ts.factory.createNumericLiteral(tag.value),
116
83
  input,
117
84
  ),
118
- );
85
+ ]);
119
86
  else if (tag.kind === "maximum")
120
- conditions.push(
87
+ entries.push([
88
+ tag,
121
89
  ts.factory.createGreaterThanEquals(
122
90
  ts.factory.createNumericLiteral(tag.value),
123
91
  input,
124
92
  ),
125
- );
93
+ ]);
126
94
  else if (tag.kind === "exclusiveMinimum")
127
- conditions.push(
95
+ entries.push([
96
+ tag,
128
97
  ts.factory.createLessThan(
129
98
  ts.factory.createNumericLiteral(tag.value),
130
99
  input,
131
100
  ),
132
- );
101
+ ]);
133
102
  else if (tag.kind === "exclusiveMaximum")
134
- conditions.push(
103
+ entries.push([
104
+ tag,
135
105
  ts.factory.createGreaterThan(
136
106
  ts.factory.createNumericLiteral(tag.value),
137
107
  input,
138
108
  ),
109
+ ]);
110
+
111
+ return {
112
+ expression: is_number(project, numeric)(metaTags)(input),
113
+ tags: [
114
+ ...entries.map(([tag, expression]) => ({
115
+ expected: `number (@${tag.kind} ${tag.value})`,
116
+ expression,
117
+ })),
118
+ ...check_custom("number")(importer)(jsDocTag)(input),
119
+ ],
120
+ };
121
+ };
122
+
123
+ const is_number =
124
+ ({ options }: IProject, numeric: boolean) =>
125
+ (metaTags: IMetadataTag[]) =>
126
+ (input: ts.Expression) => {
127
+ // TYPEOF STATEMENT
128
+ const conditions: ts.Expression[] = [
129
+ ts.factory.createStrictEquality(
130
+ ts.factory.createStringLiteral("number"),
131
+ ts.factory.createTypeOfExpression(input),
132
+ ),
133
+ ];
134
+
135
+ // CHECK FINITE AND NAN
136
+ const finite: boolean =
137
+ (!!metaTags.find(
138
+ (tag) =>
139
+ tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
140
+ ) &&
141
+ !!metaTags.find(
142
+ (tag) =>
143
+ tag.kind === "maximum" ||
144
+ tag.kind === "exclusiveMaximum",
145
+ )) ||
146
+ !!metaTags.find(
147
+ (tag) => tag.kind === "step" || tag.kind === "multipleOf",
148
+ );
149
+
150
+ if (numeric === true && finite === false)
151
+ if (OptionPredicator.finite(options))
152
+ conditions.push(
153
+ ts.factory.createCallExpression(
154
+ ts.factory.createIdentifier("Number.isFinite"),
155
+ undefined,
156
+ [input],
157
+ ),
158
+ );
159
+ else if (OptionPredicator.numeric(options))
160
+ conditions.push(
161
+ ts.factory.createLogicalNot(
162
+ ts.factory.createCallExpression(
163
+ ts.factory.createIdentifier("Number.isNaN"),
164
+ undefined,
165
+ [input],
166
+ ),
167
+ ),
139
168
  );
140
169
 
141
- // COMBINATION
170
+ // COMBINATE
142
171
  return conditions.length === 1
143
172
  ? conditions[0]!
144
173
  : conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
@@ -3,22 +3,23 @@ import ts from "typescript";
3
3
  import { IMetadataTag } from "../../metadata/IMetadataTag";
4
4
 
5
5
  import { FunctionImporter } from "../helpers/FunctionImporeter";
6
+ import { check_custom } from "./check_custom";
6
7
  import { check_string_tags } from "./check_string_tags";
7
8
 
8
9
  /**
9
10
  * @internal
10
11
  */
11
- export function check_string(importer: FunctionImporter) {
12
- return function (input: ts.Expression, tagList: IMetadataTag[]) {
13
- const conditions: ts.Expression[] = [
14
- ts.factory.createStrictEquality(
15
- ts.factory.createStringLiteral("string"),
16
- ts.factory.createTypeOfExpression(input),
17
- ),
18
- ...check_string_tags(importer)(input, tagList),
19
- ];
20
- return conditions.length === 1
21
- ? conditions[0]!
22
- : conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
23
- };
24
- }
12
+ export const check_string =
13
+ (importer: FunctionImporter) =>
14
+ (metaTags: IMetadataTag[]) =>
15
+ (jsDocTags: ts.JSDocTagInfo[]) =>
16
+ (input: ts.Expression) => ({
17
+ expression: ts.factory.createStrictEquality(
18
+ ts.factory.createStringLiteral("string"),
19
+ ts.factory.createTypeOfExpression(input),
20
+ ),
21
+ tags: [
22
+ ...check_string_tags(importer)(metaTags)(input),
23
+ ...check_custom("string")(importer)(jsDocTags)(input),
24
+ ],
25
+ });
@@ -5,17 +5,20 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
5
  import { IMetadataTag } from "../../metadata/IMetadataTag";
6
6
 
7
7
  import { FunctionImporter } from "../helpers/FunctionImporeter";
8
+ import { ICheckEntry } from "../helpers/ICheckEntry";
8
9
 
9
10
  /**
10
11
  * @internal
11
12
  */
12
13
  export const check_string_tags =
13
14
  (importer: FunctionImporter) =>
14
- (input: ts.Expression, tagList: IMetadataTag[]) => {
15
- const conditions: ts.Expression[] = [];
15
+ (tagList: IMetadataTag[]) =>
16
+ (input: ts.Expression): ICheckEntry.ITag[] => {
17
+ const conditions: [IMetadataTag, ts.Expression][] = [];
16
18
  for (const tag of tagList)
17
19
  if (tag.kind === "format")
18
- conditions.push(
20
+ conditions.push([
21
+ tag,
19
22
  ts.factory.createStrictEquality(
20
23
  ts.factory.createTrue(),
21
24
  ts.factory.createCallExpression(
@@ -24,9 +27,10 @@ export const check_string_tags =
24
27
  [input],
25
28
  ),
26
29
  ),
27
- );
30
+ ]);
28
31
  else if (tag.kind === "pattern")
29
- conditions.push(
32
+ conditions.push([
33
+ tag,
30
34
  ts.factory.createStrictEquality(
31
35
  ts.factory.createTrue(),
32
36
  ts.factory.createCallExpression(
@@ -37,27 +41,33 @@ export const check_string_tags =
37
41
  [input],
38
42
  ),
39
43
  ),
40
- );
44
+ ]);
41
45
  else if (tag.kind === "length")
42
- conditions.push(
46
+ conditions.push([
47
+ tag,
43
48
  ts.factory.createStrictEquality(
44
49
  ts.factory.createNumericLiteral(tag.value),
45
50
  IdentifierFactory.join(input, "length"),
46
51
  ),
47
- );
52
+ ]);
48
53
  else if (tag.kind === "minLength")
49
- conditions.push(
54
+ conditions.push([
55
+ tag,
50
56
  ts.factory.createLessThanEquals(
51
57
  ts.factory.createNumericLiteral(tag.value),
52
58
  IdentifierFactory.join(input, "length"),
53
59
  ),
54
- );
60
+ ]);
55
61
  else if (tag.kind === "maxLength")
56
- conditions.push(
62
+ conditions.push([
63
+ tag,
57
64
  ts.factory.createGreaterThanEquals(
58
65
  ts.factory.createNumericLiteral(tag.value),
59
66
  IdentifierFactory.join(input, "length"),
60
67
  ),
61
- );
62
- return conditions;
68
+ ]);
69
+ return conditions.map(([tag, expression]) => ({
70
+ expected: `string (@${tag.kind} ${tag.value})`,
71
+ expression,
72
+ }));
63
73
  };
@@ -1,9 +1,12 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
3
4
  import { IMetadataTag } from "../../metadata/IMetadataTag";
4
5
  import { Metadata } from "../../metadata/Metadata";
5
6
 
6
7
  import { FunctionImporter } from "../helpers/FunctionImporeter";
8
+ import { ICheckEntry } from "../helpers/ICheckEntry";
9
+ import { check_custom } from "./check_custom";
7
10
  import { check_string_tags } from "./check_string_tags";
8
11
  import { template_to_pattern } from "./template_to_pattern";
9
12
 
@@ -12,18 +15,16 @@ import { template_to_pattern } from "./template_to_pattern";
12
15
  */
13
16
  export const check_template =
14
17
  (importer: FunctionImporter) =>
15
- (
16
- input: ts.Expression,
17
- templates: Metadata[][],
18
- tagList: IMetadataTag[],
19
- ) => {
18
+ (metaTags: IMetadataTag[]) =>
19
+ (jsDocTags: IJsDocTagInfo[]) =>
20
+ (templates: Metadata[][]) =>
21
+ (input: ts.Expression): ICheckEntry => {
20
22
  // TYPEOF STRING & TAGS
21
23
  const conditions: ts.Expression[] = [
22
24
  ts.factory.createStrictEquality(
23
25
  ts.factory.createStringLiteral("string"),
24
26
  ts.factory.createTypeOfExpression(input),
25
27
  ),
26
- ...check_string_tags(importer)(input, tagList),
27
28
  ];
28
29
 
29
30
  // TEMPLATES
@@ -46,5 +47,13 @@ export const check_template =
46
47
  );
47
48
 
48
49
  // COMBINATION
49
- return conditions.reduce((x, y) => ts.factory.createLogicalAnd(x, y));
50
+ return {
51
+ expression: conditions.reduce((x, y) =>
52
+ ts.factory.createLogicalAnd(x, y),
53
+ ),
54
+ tags: [
55
+ ...check_string_tags(importer)(metaTags)(input),
56
+ ...check_custom("string")(importer)(jsDocTags)(input),
57
+ ],
58
+ };
50
59
  };
@@ -18,6 +18,7 @@ export const check_union_array_like =
18
18
  targets: T[],
19
19
  explore: FeatureProgrammer.IExplore,
20
20
  tags: IMetadataTag[],
21
+ jsDocTags: ts.JSDocTagInfo[],
21
22
  ) => {
22
23
  // ONLY ONE TYPE
23
24
  if (targets.length === 1)
@@ -26,6 +27,7 @@ export const check_union_array_like =
26
27
  targets[0]!,
27
28
  explore,
28
29
  tags,
30
+ jsDocTags,
29
31
  );
30
32
 
31
33
  //----
@@ -58,6 +60,7 @@ export const check_union_array_like =
58
60
  postfix: `"[0]"`,
59
61
  },
60
62
  tags,
63
+ jsDocTags,
61
64
  input,
62
65
  ),
63
66
  ),
@@ -80,6 +83,7 @@ export const check_union_array_like =
80
83
  tracable: true,
81
84
  },
82
85
  tags,
86
+ jsDocTags,
83
87
  ),
84
88
  ),
85
89
  ]),
@@ -239,6 +243,7 @@ export namespace check_union_array_like {
239
243
  target: T,
240
244
  explore: FeatureProgrammer.IExplore,
241
245
  tags: IMetadataTag[],
246
+ jsDocTags: ts.JSDocTagInfo[],
242
247
  array: ts.Expression,
243
248
  ): ts.Expression;
244
249
  decoder: UnionExplorer.Decoder<T>;
@@ -23,6 +23,7 @@ export const check_union_tuple =
23
23
  elements: Metadata[],
24
24
  explore: CheckerProgrammer.IExplore,
25
25
  tags: IMetadataTag[],
26
+ jsDocTags: ts.JSDocTagInfo[],
26
27
  array: ts.Expression,
27
28
  ) =>
28
29
  CheckerProgrammer.decode_tuple(project, config, importer, true)(
@@ -30,4 +31,5 @@ export const check_union_tuple =
30
31
  elements,
31
32
  explore,
32
33
  tags,
34
+ jsDocTags,
33
35
  );
@@ -54,6 +54,7 @@ export const feature_object_entries =
54
54
  })(),
55
55
  },
56
56
  prop.tags,
57
+ prop.jsDocTags,
57
58
  ),
58
59
  };
59
60
  });
@@ -28,7 +28,6 @@ import { CreateIsParseTransformer } from "./features/parsers/CreateIsParseTransf
28
28
  import { CreateValidateParseTransformer } from "./features/parsers/CreateValidateParseTransformer";
29
29
  import { IsParseTransformer } from "./features/parsers/IsParseTransformer";
30
30
  import { ValidateParseTransformer } from "./features/parsers/ValidateParseTransformer";
31
- import { MessageTransformer } from "./features/protocols/MessageTransformer";
32
31
  import { AssertStringifyTransformer } from "./features/stringifiers/AssertStringifyTransformer";
33
32
  import { CreateAssertStringifyTransformer } from "./features/stringifiers/CreateAssertStringifyTransformer";
34
33
  import { CreateIsStringifyTransformer } from "./features/stringifiers/CreateIsStringifyTransformer";
@@ -95,7 +94,7 @@ const CLI_PATH = path.resolve(
95
94
 
96
95
  const FUNCTORS: Record<string, () => Task> = {
97
96
  //----
98
- // VALIDATORS
97
+ // SINGLE FUNCTIONS
99
98
  //----
100
99
  // BASIC VALIDATORS
101
100
  assert: () => AssertTransformer.transform(false),
@@ -108,23 +107,13 @@ const FUNCTORS: Record<string, () => Task> = {
108
107
  equals: () => IsTransformer.transform(true),
109
108
  validateEquals: () => ValidateTransformer.transform(true),
110
109
 
111
- //----
112
- // PROTOCOL BUFFER
113
- //----
114
- message: () => MessageTransformer.transform,
115
-
116
- //----
117
- // JSON FUNCTIONS
118
- //----
119
- // SCHEMA DEFINITION
120
- application: () => ApplicationTransformer.transform,
121
-
122
- // PARSER FUNCTIONS
110
+ // PARSE FUNCTIONS
123
111
  isParse: () => IsParseTransformer.transform,
124
112
  assertParse: () => AssertParseTransformer.transform,
125
113
  validateParse: () => ValidateParseTransformer.transform,
126
114
 
127
115
  // STRINGIFY FUNCTIONS
116
+ application: () => ApplicationTransformer.transform,
128
117
  stringify: () => StringifyTransformer.transform,
129
118
  assertStringify: () => AssertStringifyTransformer.transform,
130
119
  isStringify: () => IsStringifyTransformer.transform,
@@ -147,19 +136,23 @@ const FUNCTORS: Record<string, () => Task> = {
147
136
  //----
148
137
  // FACTORY FUNCTIONS
149
138
  //----
150
- // VALIDATORS
139
+ // BASIC VALIDATORS
151
140
  createAssert: () => CreateAssertTransformer.transform(false),
152
141
  createAssertType: () => CreateAssertTransformer.transform(false),
153
142
  createIs: () => CreateIsTransformer.transform(false),
154
143
  createValidate: () => CreateValidateTransformer.transform(false),
144
+
145
+ // STRICT VALIDATORS
155
146
  createAssertEquals: () => CreateAssertTransformer.transform(true),
156
147
  createEquals: () => CreateIsTransformer.transform(true),
157
148
  createValidateEquals: () => CreateValidateTransformer.transform(true),
158
149
 
159
- // JSON FUNCTIONS
150
+ // PARSE FUNCTIONS
160
151
  createIsParse: () => CreateIsParseTransformer.transform,
161
152
  createAssertParse: () => CreateAssertParseTransformer.transform,
162
153
  createValidateParse: () => CreateValidateParseTransformer.transform,
154
+
155
+ // STRINGIFY FUNCTIONS
163
156
  createStringify: () => CreateStringifyTransformer.transform,
164
157
  createAssertStringify: () => CreateAssertStringifyTransformer.transform,
165
158
  createIsStringify: () => CreateIsStringifyTransformer.transform,
@@ -59,7 +59,9 @@ export namespace ApplicationTransformer {
59
59
  // GENERATORS
60
60
  //----
61
61
  // METADATA
62
- const collection: MetadataCollection = new MetadataCollection();
62
+ const collection: MetadataCollection = new MetadataCollection({
63
+ replace: MetadataCollection.replace,
64
+ });
63
65
  const metadatas: Array<Metadata> = types.map((type) =>
64
66
  MetadataFactory.generate(checker, collection, type, {
65
67
  resolve: true,
@@ -32,7 +32,7 @@ export namespace CreateRandomTransformer {
32
32
  },
33
33
  },
34
34
  modulo,
35
- )(type, node.getText());
35
+ )(type, node.getFullText().trim());
36
36
  }
37
37
  }
38
38
 
@@ -33,7 +33,7 @@ export namespace RandomTransformer {
33
33
  },
34
34
  },
35
35
  modulo,
36
- )(type, node.getText()),
36
+ )(type, node.getFullText().trim()),
37
37
  undefined,
38
38
  expression.arguments.length
39
39
  ? [expression.arguments[0]!]
@@ -47,7 +47,7 @@ export namespace GenericTransformer {
47
47
  programmer(project, modulo)(
48
48
  type,
49
49
  generic
50
- ? node.getText()
50
+ ? node.getFullText().trim()
51
51
  : name(project.checker)(type)(node),
52
52
  ),
53
53
  undefined,
@@ -84,7 +84,7 @@ export namespace GenericTransformer {
84
84
  );
85
85
 
86
86
  // DO TRANSFORM
87
- return programmer(project, modulo)(type, node.getText());
87
+ return programmer(project, modulo)(type, node.getFullText().trim());
88
88
  };
89
89
 
90
90
  const name =
@@ -0,0 +1,6 @@
1
+ export type Customizable = {
2
+ number: number;
3
+ string: string;
4
+ bigint: bigint;
5
+ array: any[];
6
+ };
@@ -84,7 +84,13 @@ export namespace RandomGenerator {
84
84
 
85
85
  export function date(min?: number, max?: number): string {
86
86
  min ??= 0;
87
- max ??= Date.now();
88
- return new Date(number(min, max)).toString();
87
+ max ??= Date.now() * 2;
88
+ return new Date(number(min, max)).toISOString().substring(0, 10);
89
+ }
90
+
91
+ export function datetime(min?: number, max?: number): string {
92
+ min ??= 0;
93
+ max ??= Date.now() * 2;
94
+ return new Date(number(min, max)).toISOString();
89
95
  }
90
96
  }
@@ -1,8 +0,0 @@
1
- import ts from "typescript";
2
- import { Metadata } from "../metadata/Metadata";
3
- import { IProtocolMessage } from "../messages/IProtocolMessage";
4
- import { MetadataCollection } from "./MetadataCollection";
5
- export declare namespace ProtocolFactory {
6
- const metadata: (checker: ts.TypeChecker) => (collection: MetadataCollection) => (type: ts.Type) => Metadata;
7
- const generate: (collection: MetadataCollection) => (dict: Map<string, IProtocolMessage>) => (meta: Metadata) => void;
8
- }