typia 3.5.0-dev.20230213 → 3.5.0-dev.20230214

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 (192) hide show
  1. package/README.md +15 -1
  2. package/lib/IRandomGenerator.d.ts +15 -0
  3. package/lib/IRandomGenerator.js +3 -0
  4. package/lib/IRandomGenerator.js.map +1 -0
  5. package/lib/factories/ExpressionFactory.d.ts +1 -0
  6. package/lib/factories/ExpressionFactory.js +4 -0
  7. package/lib/factories/ExpressionFactory.js.map +1 -1
  8. package/lib/factories/MetadataFactory.js +15 -5
  9. package/lib/factories/MetadataFactory.js.map +1 -1
  10. package/lib/factories/MetadataTagFactory.js +11 -101
  11. package/lib/factories/MetadataTagFactory.js.map +1 -1
  12. package/lib/functional/$any.d.ts +1 -0
  13. package/lib/functional/$any.js +8 -0
  14. package/lib/functional/$any.js.map +1 -0
  15. package/lib/{programmers/internal/check_length.d.ts → functional/Namespace.d.ts} +0 -0
  16. package/lib/functional/Namespace.js +80 -0
  17. package/lib/functional/Namespace.js.map +1 -0
  18. package/lib/metadata/IMetadataTag.d.ts +3 -10
  19. package/lib/module.d.ts +254 -18
  20. package/lib/module.js +68 -246
  21. package/lib/module.js.map +1 -1
  22. package/lib/programmers/AssertCloneProgrammer.d.ts +5 -0
  23. package/lib/programmers/AssertCloneProgrammer.js +37 -0
  24. package/lib/programmers/AssertCloneProgrammer.js.map +1 -0
  25. package/lib/programmers/CloneProgrammer.js +2 -4
  26. package/lib/programmers/CloneProgrammer.js.map +1 -1
  27. package/lib/programmers/IsCloneProgrammer.d.ts +5 -0
  28. package/lib/programmers/IsCloneProgrammer.js +37 -0
  29. package/lib/programmers/IsCloneProgrammer.js.map +1 -0
  30. package/lib/programmers/IsProgrammer.d.ts +1 -1
  31. package/lib/programmers/IsProgrammer.js +5 -2
  32. package/lib/programmers/IsProgrammer.js.map +1 -1
  33. package/lib/programmers/RandomProgrammer.d.ts +5 -0
  34. package/lib/programmers/RandomProgrammer.js +338 -0
  35. package/lib/programmers/RandomProgrammer.js.map +1 -0
  36. package/lib/programmers/StringifyProgrammer.js +1 -1
  37. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  38. package/lib/programmers/ValidateCloneProgrammer.d.ts +5 -0
  39. package/lib/programmers/ValidateCloneProgrammer.js +37 -0
  40. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -0
  41. package/lib/programmers/ValidateStringifyProgrammer.js +1 -1
  42. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  43. package/lib/programmers/helpers/CloneJoiner.js +2 -2
  44. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  45. package/lib/programmers/helpers/RandomJoiner.d.ts +10 -0
  46. package/lib/programmers/helpers/RandomJoiner.js +93 -0
  47. package/lib/programmers/helpers/RandomJoiner.js.map +1 -0
  48. package/lib/programmers/helpers/RandomRanger.d.ts +25 -0
  49. package/lib/programmers/helpers/RandomRanger.js +138 -0
  50. package/lib/programmers/helpers/RandomRanger.js.map +1 -0
  51. package/lib/programmers/helpers/StringifyJoinder.js +2 -2
  52. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  53. package/lib/programmers/internal/application_array.js +0 -10
  54. package/lib/programmers/internal/application_array.js.map +1 -1
  55. package/lib/programmers/internal/application_number.js +4 -12
  56. package/lib/programmers/internal/application_number.js.map +1 -1
  57. package/lib/programmers/internal/application_string.js +0 -8
  58. package/lib/programmers/internal/application_string.js.map +1 -1
  59. package/lib/programmers/internal/check_array_length.js +3 -4
  60. package/lib/programmers/internal/check_array_length.js.map +1 -1
  61. package/lib/programmers/internal/check_bigint.js +0 -12
  62. package/lib/programmers/internal/check_bigint.js.map +1 -1
  63. package/lib/programmers/internal/check_number.js +7 -25
  64. package/lib/programmers/internal/check_number.js.map +1 -1
  65. package/lib/programmers/internal/check_string_tags.js +2 -3
  66. package/lib/programmers/internal/check_string_tags.js.map +1 -1
  67. package/lib/schemas/IJsonSchema.d.ts +36 -2
  68. package/lib/transformers/CallExpressionTransformer.js +16 -0
  69. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  70. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.d.ts +5 -0
  71. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js +23 -0
  72. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js.map +1 -0
  73. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.d.ts +5 -0
  74. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js +18 -0
  75. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js.map +1 -0
  76. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +2 -1
  77. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -1
  78. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +2 -1
  79. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -1
  80. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.d.ts +5 -0
  81. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js +18 -0
  82. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js.map +1 -0
  83. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +2 -1
  84. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -1
  85. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +2 -1
  86. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -1
  87. package/lib/transformers/features/miscellaneous/CreateRandomGenerator.d.ts +5 -0
  88. package/lib/transformers/features/miscellaneous/CreateRandomGenerator.js +29 -0
  89. package/lib/transformers/features/miscellaneous/CreateRandomGenerator.js.map +1 -0
  90. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.d.ts +5 -0
  91. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js +18 -0
  92. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js.map +1 -0
  93. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +2 -1
  94. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -1
  95. package/lib/transformers/features/miscellaneous/IsCloneTransformer.d.ts +5 -0
  96. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js +23 -0
  97. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js.map +1 -0
  98. package/lib/transformers/features/miscellaneous/RandomTransformer.d.ts +5 -0
  99. package/lib/transformers/features/miscellaneous/RandomTransformer.js +35 -0
  100. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -0
  101. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.d.ts +5 -0
  102. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js +23 -0
  103. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js.map +1 -0
  104. package/lib/transformers/features/parsers/AssertParseTransformer.js +2 -1
  105. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -1
  106. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +2 -1
  107. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -1
  108. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +2 -1
  109. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -1
  110. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +2 -1
  111. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -1
  112. package/lib/transformers/features/parsers/IsParseTransformer.js +2 -1
  113. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -1
  114. package/lib/transformers/features/parsers/ValidateParseTransformer.js +2 -1
  115. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -1
  116. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +2 -1
  117. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -1
  118. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +2 -1
  119. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -1
  120. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +2 -1
  121. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -1
  122. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +2 -1
  123. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -1
  124. package/lib/transformers/features/validators/CreateAssertTransformer.js +2 -1
  125. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -1
  126. package/lib/transformers/features/validators/CreateIsTransformer.js +2 -1
  127. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -1
  128. package/lib/transformers/features/validators/CreateValidateTransformer.js +2 -1
  129. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -1
  130. package/lib/utils/RandomGenerator.d.ts +1 -0
  131. package/lib/utils/RandomGenerator.js +85 -0
  132. package/lib/utils/RandomGenerator.js.map +1 -0
  133. package/package.json +8 -3
  134. package/src/IRandomGenerator.ts +16 -0
  135. package/src/factories/ExpressionFactory.ts +11 -0
  136. package/src/factories/MetadataFactory.ts +18 -14
  137. package/src/factories/MetadataTagFactory.ts +11 -97
  138. package/src/functional/$any.ts +3 -0
  139. package/src/functional/Namespace.ts +121 -0
  140. package/src/metadata/IMetadataTag.ts +2 -11
  141. package/src/module.ts +375 -368
  142. package/src/programmers/AssertCloneProgrammer.ts +60 -0
  143. package/src/programmers/CloneProgrammer.ts +3 -9
  144. package/src/programmers/IsCloneProgrammer.ts +66 -0
  145. package/src/programmers/IsProgrammer.ts +8 -5
  146. package/src/programmers/RandomProgrammer.ts +367 -0
  147. package/src/programmers/StringifyProgrammer.ts +2 -4
  148. package/src/programmers/ValidateCloneProgrammer.ts +77 -0
  149. package/src/programmers/ValidateStringifyProgrammer.ts +1 -4
  150. package/src/programmers/helpers/CloneJoiner.ts +2 -4
  151. package/src/programmers/helpers/RandomJoiner.ts +140 -0
  152. package/src/programmers/helpers/RandomRanger.ts +215 -0
  153. package/src/programmers/helpers/StringifyJoinder.ts +4 -4
  154. package/src/programmers/internal/application_array.ts +0 -10
  155. package/src/programmers/internal/application_number.ts +7 -13
  156. package/src/programmers/internal/application_string.ts +0 -8
  157. package/src/programmers/internal/check_array_length.ts +8 -9
  158. package/src/programmers/internal/check_bigint.ts +0 -21
  159. package/src/programmers/internal/check_number.ts +0 -30
  160. package/src/programmers/internal/check_string_tags.ts +7 -7
  161. package/src/schemas/IJsonSchema.ts +36 -1
  162. package/src/transformers/CallExpressionTransformer.ts +19 -0
  163. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +38 -0
  164. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +32 -0
  165. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +1 -1
  166. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +1 -1
  167. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +32 -0
  168. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +1 -1
  169. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +1 -1
  170. package/src/transformers/features/miscellaneous/CreateRandomGenerator.ts +39 -0
  171. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +32 -0
  172. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +1 -1
  173. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +38 -0
  174. package/src/transformers/features/miscellaneous/RandomTransformer.ts +45 -0
  175. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +38 -0
  176. package/src/transformers/features/parsers/AssertParseTransformer.ts +1 -1
  177. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +1 -1
  178. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +1 -1
  179. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +1 -1
  180. package/src/transformers/features/parsers/IsParseTransformer.ts +1 -1
  181. package/src/transformers/features/parsers/ValidateParseTransformer.ts +1 -1
  182. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +1 -1
  183. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +1 -1
  184. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +1 -1
  185. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +1 -1
  186. package/src/transformers/features/validators/CreateAssertTransformer.ts +1 -1
  187. package/src/transformers/features/validators/CreateIsTransformer.ts +1 -1
  188. package/src/transformers/features/validators/CreateValidateTransformer.ts +1 -1
  189. package/src/utils/RandomGenerator.ts +90 -0
  190. package/lib/programmers/internal/check_length.js +0 -28
  191. package/lib/programmers/internal/check_length.js.map +0 -1
  192. package/src/programmers/internal/check_length.ts +0 -46
@@ -0,0 +1,140 @@
1
+ import ts from "typescript";
2
+
3
+ import { StatementFactory } from "../../factories/StatementFactory";
4
+
5
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
6
+ import { Metadata } from "../../metadata/Metadata";
7
+ import { MetadataObject } from "../../metadata/MetadataObject";
8
+ import { MetadataProperty } from "../../metadata/MetadataProperty";
9
+
10
+ import { Escaper } from "../../utils/Escaper";
11
+
12
+ import { RandomRanger } from "./RandomRanger";
13
+
14
+ export namespace RandomJoiner {
15
+ export type Decoder = (
16
+ meta: Metadata,
17
+ tags: IMetadataTag[],
18
+ ) => ts.Expression;
19
+
20
+ export const array =
21
+ (decoder: Decoder) => (item: Metadata, tags: IMetadataTag[]) => {
22
+ const tail = RandomRanger.length({
23
+ minimum: 0,
24
+ maximum: 3,
25
+ gap: 3,
26
+ })({
27
+ fixed: "items",
28
+ minimum: "minItems",
29
+ maximum: "maxItems",
30
+ })(tags);
31
+ return ts.factory.createCallExpression(
32
+ ts.factory.createIdentifier("generator.array"),
33
+ undefined,
34
+ [
35
+ ts.factory.createArrowFunction(
36
+ undefined,
37
+ undefined,
38
+ [],
39
+ undefined,
40
+ undefined,
41
+ decoder(item, tags),
42
+ ),
43
+ ...(tail ? [tail] : []),
44
+ ],
45
+ );
46
+ };
47
+
48
+ export const tuple =
49
+ (decoder: Decoder) => (items: Metadata[], tags: IMetadataTag[]) =>
50
+ ts.factory.createArrayLiteralExpression(
51
+ items.map((i) => decoder(i.rest ?? i, tags)),
52
+ true,
53
+ );
54
+
55
+ export const object =
56
+ (decoder: Decoder) =>
57
+ (obj: MetadataObject): ts.ConciseBody => {
58
+ if (obj.properties.length === 0)
59
+ return ts.factory.createIdentifier("{}");
60
+
61
+ // LIST UP PROPERTIES
62
+ const regular = obj.properties.filter((p) => p.key.isSoleLiteral());
63
+ const dynamic = obj.properties.filter(
64
+ (p) => !p.key.isSoleLiteral(),
65
+ );
66
+
67
+ // REGULAR OBJECT
68
+ const literal: ts.ObjectLiteralExpression =
69
+ ts.factory.createObjectLiteralExpression(
70
+ regular.map((p) => {
71
+ const str: string = p.key.getSoleLiteral()!;
72
+ return ts.factory.createPropertyAssignment(
73
+ Escaper.variable(str)
74
+ ? str
75
+ : ts.factory.createStringLiteral(str),
76
+ decoder(p.value, p.tags),
77
+ );
78
+ }),
79
+ true,
80
+ );
81
+ if (dynamic.length === 0) return literal;
82
+
83
+ const properties: ts.Statement[] = dynamic.map((p) =>
84
+ ts.factory.createExpressionStatement(
85
+ dynamicProperty(decoder)(p),
86
+ ),
87
+ );
88
+ return ts.factory.createBlock(
89
+ [
90
+ StatementFactory.constant("output", literal),
91
+ ...(obj.recursive
92
+ ? [
93
+ ts.factory.createIfStatement(
94
+ ts.factory.createGreaterThanEquals(
95
+ ts.factory.createNumericLiteral(5),
96
+ ts.factory.createIdentifier("depth"),
97
+ ),
98
+ ts.factory.createBlock(properties, true),
99
+ ),
100
+ ]
101
+ : properties),
102
+ ts.factory.createReturnStatement(
103
+ ts.factory.createIdentifier("output"),
104
+ ),
105
+ ],
106
+ true,
107
+ );
108
+ };
109
+
110
+ const dynamicProperty = (decoder: Decoder) => (p: MetadataProperty) =>
111
+ ts.factory.createCallExpression(
112
+ ts.factory.createIdentifier("generator.array"),
113
+ undefined,
114
+ [
115
+ ts.factory.createArrowFunction(
116
+ undefined,
117
+ undefined,
118
+ [],
119
+ undefined,
120
+ undefined,
121
+ ts.factory.createBinaryExpression(
122
+ ts.factory.createElementAccessExpression(
123
+ ts.factory.createIdentifier("output"),
124
+ decoder(p.key, []),
125
+ ),
126
+ ts.factory.createToken(ts.SyntaxKind.EqualsToken),
127
+ decoder(p.value, p.tags),
128
+ ),
129
+ ),
130
+ ts.factory.createCallExpression(
131
+ ts.factory.createIdentifier("generator.integer"),
132
+ undefined,
133
+ [
134
+ ts.factory.createNumericLiteral(0),
135
+ ts.factory.createNumericLiteral(3),
136
+ ],
137
+ ),
138
+ ],
139
+ );
140
+ }
@@ -0,0 +1,215 @@
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTag } from "../../metadata/IMetadataTag";
4
+
5
+ export namespace RandomRanger {
6
+ export interface IDefaults {
7
+ minimum: number;
8
+ maximum: number;
9
+ gap: number;
10
+ }
11
+
12
+ export const length =
13
+ (defs: IDefaults) =>
14
+ (acc: length.IAccessors) =>
15
+ (tags: IMetadataTag[]) => {
16
+ const props = {
17
+ fixed: getter(tags)(acc.fixed),
18
+ minimum: getter(tags)(acc.minimum),
19
+ maximum: getter(tags)(acc.maximum),
20
+ };
21
+ if (props.fixed !== undefined)
22
+ return ts.factory.createNumericLiteral(props.fixed);
23
+ else if (props.minimum === undefined && props.maximum === undefined)
24
+ return undefined;
25
+
26
+ props.minimum ??= defs.minimum;
27
+ props.maximum ??= defs.maximum;
28
+ if (props.maximum <= props.minimum)
29
+ (props.maximum as number) += defs.gap;
30
+
31
+ return ts.factory.createCallExpression(
32
+ ts.factory.createIdentifier("generator.integer"),
33
+ undefined,
34
+ [
35
+ ts.factory.createNumericLiteral(props.minimum),
36
+ ts.factory.createNumericLiteral(props.maximum),
37
+ ],
38
+ );
39
+ };
40
+ export namespace length {
41
+ export interface IAccessors {
42
+ minimum: IMetadataTag["kind"];
43
+ maximum: IMetadataTag["kind"];
44
+ fixed: IMetadataTag["kind"];
45
+ }
46
+ }
47
+
48
+ export const number =
49
+ (config: number.IConfig) =>
50
+ (defs: IDefaults) =>
51
+ (tags: IMetadataTag[]): ts.Expression => {
52
+ const range = {
53
+ minimum: {
54
+ value:
55
+ getter(tags)("minimum") ??
56
+ getter(tags)("exclusiveMinimum"),
57
+ exclusive: getter(tags)("exclusiveMinimum") !== undefined,
58
+ },
59
+ maximum: {
60
+ value:
61
+ getter(tags)("maximum") ??
62
+ getter(tags)("exclusiveMaximum"),
63
+ exclusive: getter(tags)("exclusiveMaximum") !== undefined,
64
+ },
65
+ step: getter(tags)("step"),
66
+ multiply: getter(tags)("multipleOf"),
67
+ };
68
+ if (Object.values(range).every((v) => v !== undefined))
69
+ return config.setter([]);
70
+
71
+ //----
72
+ // MULTIPLIERS
73
+ //----
74
+ // STEP
75
+ if (range.step !== undefined) {
76
+ const { intercept, minimum, maximum } = stepper(defs.gap)(
77
+ range,
78
+ )(range.step);
79
+ return ts.factory.createAdd(
80
+ config.transform(intercept),
81
+ ts.factory.createMultiply(
82
+ config.transform(range.step),
83
+ config.setter([minimum, maximum]),
84
+ ),
85
+ );
86
+ }
87
+ // MULTIPLE-OF
88
+ else if (range.multiply !== undefined) {
89
+ const { minimum, maximum } = multiplier(defs.gap)(range)(
90
+ range.multiply,
91
+ );
92
+ return ts.factory.createMultiply(
93
+ config.transform(range.multiply),
94
+ config.setter([minimum, maximum]),
95
+ );
96
+ }
97
+
98
+ //----
99
+ // RANGE
100
+ //----
101
+ // INT
102
+ const integer = (value: number) => value === Math.floor(value);
103
+ if (
104
+ tags.find(
105
+ (t) => t.kind === "type" && t.value.indexOf("int") !== -1,
106
+ ) !== undefined
107
+ ) {
108
+ if (range.minimum.value !== undefined) {
109
+ if (range.minimum.exclusive) {
110
+ range.minimum.exclusive = false;
111
+ if (integer(range.minimum.value))
112
+ range.minimum.value += 1;
113
+ }
114
+ range.minimum.value = Math.ceil(range.minimum.value);
115
+ }
116
+ if (range.maximum.value !== undefined) {
117
+ if (range.maximum.exclusive) {
118
+ range.maximum.exclusive = false;
119
+ if (integer(range.maximum.value))
120
+ range.maximum.value -= 1;
121
+ }
122
+ range.maximum.value = Math.floor(range.maximum.value);
123
+ }
124
+ }
125
+
126
+ // UNSIGNED INT
127
+ if (
128
+ tags.find(
129
+ (t) => t.kind === "type" && t.value.indexOf("uint") === 0,
130
+ ) !== undefined
131
+ ) {
132
+ if (range.minimum.value === undefined) range.minimum.value = 0;
133
+ else if (range.minimum.value <= 0) {
134
+ range.minimum.value = 0;
135
+ range.minimum.exclusive = false;
136
+ }
137
+ }
138
+
139
+ const minimum =
140
+ range.minimum.value ??
141
+ (range.maximum.value !== undefined
142
+ ? range.maximum.value - defs.gap
143
+ : defs.minimum);
144
+ const maximum =
145
+ range.maximum.value ??
146
+ (range.minimum.value !== undefined
147
+ ? range.minimum.value + defs.gap
148
+ : defs.maximum);
149
+ return config.setter([minimum, maximum]);
150
+ };
151
+ export namespace number {
152
+ export interface IConfig {
153
+ setter: (args: number[]) => ts.Expression;
154
+ transform: (value: number) => ts.Expression;
155
+ type: "int" | "uint" | "double";
156
+ }
157
+ }
158
+ }
159
+
160
+ const getter =
161
+ (tags: IMetadataTag[]) =>
162
+ (kind: IMetadataTag["kind"]): number | undefined =>
163
+ tags.find((t) => t.kind === kind)?.value as number | undefined;
164
+
165
+ const stepper = (gap: number) => (range: IRange) => (s: number) => {
166
+ const intercept: number = range.minimum.value!;
167
+ const minimum: number = range.minimum.exclusive ? 1 : 0;
168
+ if (range.maximum.value === undefined)
169
+ return {
170
+ intercept,
171
+ minimum,
172
+ maximum: gap,
173
+ };
174
+
175
+ const y: number = Math.floor(range.maximum.value - intercept) / s;
176
+ return {
177
+ intercept,
178
+ minimum,
179
+ maximum:
180
+ range.maximum.exclusive && intercept + y * s === range.maximum.value
181
+ ? y - 1
182
+ : y,
183
+ };
184
+ };
185
+
186
+ const multiplier = (gap: number) => (range: IRange) => (m: number) => {
187
+ const minimum: number =
188
+ range.minimum.value === undefined
189
+ ? 0
190
+ : (() => {
191
+ const x: number = m * Math.ceil(range.minimum.value / m);
192
+ return range.minimum.exclusive && x === range.minimum.value
193
+ ? x + m
194
+ : x;
195
+ })() / m;
196
+ const maximum: number =
197
+ range.maximum.value === undefined
198
+ ? gap
199
+ : (() => {
200
+ const y: number = m * Math.floor(range.maximum.value / m);
201
+ return range.maximum.exclusive && y === range.maximum.value
202
+ ? y - m
203
+ : y;
204
+ })() / m;
205
+ return { minimum, maximum };
206
+ };
207
+
208
+ interface IRange {
209
+ minimum: IScalar;
210
+ maximum: IScalar;
211
+ }
212
+ interface IScalar {
213
+ value?: number;
214
+ exclusive: boolean;
215
+ }
@@ -16,16 +16,16 @@ export namespace StringifyJoiner {
16
16
  entries: IExpressionEntry<ts.Expression>[],
17
17
  ): ts.Expression => {
18
18
  // CHECK AND SORT ENTRIES
19
+ if (entries.length === 0)
20
+ return ts.factory.createStringLiteral("{}");
21
+
22
+ // PROPERTIES
19
23
  const regular: IExpressionEntry<ts.Expression>[] = entries.filter(
20
24
  (entry) => entry.key.isSoleLiteral(),
21
25
  );
22
26
  const dynamic: IExpressionEntry<ts.Expression>[] = entries.filter(
23
27
  (entry) => !entry.key.isSoleLiteral(),
24
28
  );
25
- if (regular.length === 0 && dynamic.length === 0)
26
- return ts.factory.createStringLiteral("{}");
27
-
28
- // PROPERTIES
29
29
  const expressions: ts.Expression[] = [
30
30
  ...stringify_regular_properties(regular, dynamic),
31
31
  ...(dynamic.length
@@ -33,15 +33,5 @@ export const application_array =
33
33
  for (const tag of attribute["x-typia-metaTags"] || [])
34
34
  if (tag.kind === "minItems") output.minItems = tag.value;
35
35
  else if (tag.kind === "maxItems") output.maxItems = tag.value;
36
- else if (tag.kind === "items") {
37
- if (tag.minimum !== undefined)
38
- output.minItems =
39
- tag.minimum.value +
40
- (tag.minimum.include === true ? 0 : 1);
41
- if (tag.maximum !== undefined)
42
- output.maxItems =
43
- tag.maximum.value -
44
- (tag.maximum.include === true ? 0 : 1);
45
- }
46
36
  return output;
47
37
  };
@@ -7,9 +7,9 @@ import { application_default } from "./application_default";
7
7
  export const application_number = (
8
8
  nullable: boolean,
9
9
  attribute: IJsonSchema.IAttribute,
10
- ): IJsonSchema.INumber => {
11
- const output: IJsonSchema.INumber = {
12
- type: "number",
10
+ ): IJsonSchema.INumber | IJsonSchema.IInteger => {
11
+ const output: IJsonSchema.INumber | IJsonSchema.IInteger = {
12
+ type: "number" as "number" | "integer",
13
13
  nullable,
14
14
  ...attribute,
15
15
  };
@@ -23,16 +23,10 @@ export const application_number = (
23
23
  // RANGE TAG
24
24
  else if (tag.kind === "minimum") output.minimum = tag.value;
25
25
  else if (tag.kind === "maximum") output.maximum = tag.value;
26
- else if (tag.kind === "range") {
27
- if (tag.minimum !== undefined)
28
- if (tag.minimum.include === true)
29
- output.minimum = tag.minimum.value;
30
- else output.exclusiveMinimum = tag.minimum.value;
31
- if (tag.maximum !== undefined)
32
- if (tag.maximum.include === true)
33
- output.maximum = tag.maximum.value;
34
- else output.exclusiveMaximum = tag.maximum.value;
35
- }
26
+ else if (tag.kind === "exclusiveMinimum")
27
+ output.exclusiveMinimum = tag.value;
28
+ else if (tag.kind === "exclusiveMaximum")
29
+ output.exclusiveMaximum = tag.value;
36
30
  // MULTIPLE-OF
37
31
  else if (tag.kind === "multipleOf") output.multipleOf = tag.value;
38
32
  }
@@ -28,14 +28,6 @@ export const application_string = (
28
28
  // RANGE
29
29
  if (tag.kind === "minLength") output.minLength = tag.value;
30
30
  else if (tag.kind === "maxLength") output.maxLength = tag.value;
31
- else if (tag.kind === "length") {
32
- if (tag.minimum !== undefined)
33
- output.minLength =
34
- tag.minimum.value + (tag.minimum.include ? 0 : 1);
35
- if (tag.maximum !== undefined)
36
- output.maxLength =
37
- tag.maximum.value - (tag.maximum.include ? 0 : 1);
38
- }
39
31
  // FORMAT AND PATTERN
40
32
  else if (tag.kind === "format") output.format = tag.value;
41
33
  else if (tag.kind === "pattern") output.pattern = tag.value;
@@ -4,8 +4,6 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory";
4
4
 
5
5
  import { IMetadataTag } from "../../metadata/IMetadataTag";
6
6
 
7
- import { check_length } from "./check_length";
8
-
9
7
  /**
10
8
  * @internal
11
9
  */
@@ -17,7 +15,14 @@ export function check_array_length(
17
15
 
18
16
  // CHECK TAGS
19
17
  for (const tag of tagList)
20
- if (tag.kind === "minItems")
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")
21
26
  conditions.push(
22
27
  ts.factory.createLessThanEquals(
23
28
  ts.factory.createNumericLiteral(tag.value),
@@ -31,12 +36,6 @@ export function check_array_length(
31
36
  IdentifierFactory.join(input, "length"),
32
37
  ),
33
38
  );
34
- else if (tag.kind === "items")
35
- check_length(
36
- conditions,
37
- IdentifierFactory.join(input, "length"),
38
- tag,
39
- );
40
39
 
41
40
  // COMBINATION
42
41
  return conditions.length
@@ -30,8 +30,6 @@ export function check_bigint(input: ts.Expression, tagList: IMetadataTag[]) {
30
30
  for (const tag of tagList)
31
31
  if (tag.kind === "minimum") return tag.value;
32
32
  else if (tag.kind === "exclusiveMinimum") return tag.value;
33
- else if (tag.kind === "range" && tag.minimum !== undefined)
34
- return tag.minimum.value;
35
33
  return undefined;
36
34
  })();
37
35
  conditions.push(
@@ -42,25 +40,6 @@ export function check_bigint(input: ts.Expression, tagList: IMetadataTag[]) {
42
40
  : modulo(),
43
41
  ),
44
42
  );
45
- } else if (tag.kind === "range") {
46
- if (tag.minimum !== undefined)
47
- conditions.push(
48
- (tag.minimum.include
49
- ? ts.factory.createLessThanEquals
50
- : ts.factory.createLessThan)(
51
- caster(tag.minimum.value),
52
- input,
53
- ),
54
- );
55
- if (tag.maximum !== undefined)
56
- conditions.push(
57
- (tag.maximum.include
58
- ? ts.factory.createLessThanEquals
59
- : ts.factory.createLessThan)(
60
- input,
61
- caster(tag.maximum.value),
62
- ),
63
- );
64
43
  } else if (tag.kind === "minimum")
65
44
  conditions.push(
66
45
  ts.factory.createLessThanEquals(caster(tag.value), input),
@@ -22,12 +22,6 @@ export const check_number =
22
22
 
23
23
  // CHECK FINITE AND NAN
24
24
  const finite: boolean =
25
- !!tagList.find(
26
- (tag) =>
27
- tag.kind === "range" &&
28
- tag.minimum !== undefined &&
29
- tag.maximum !== undefined,
30
- ) ||
31
25
  (!!tagList.find(
32
26
  (tag) =>
33
27
  tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
@@ -102,11 +96,6 @@ export const check_number =
102
96
  if (tag.kind === "minimum") return tag.value;
103
97
  else if (tag.kind === "exclusiveMinimum")
104
98
  return tag.value;
105
- else if (
106
- tag.kind === "range" &&
107
- tag.minimum !== undefined
108
- )
109
- return tag.minimum.value;
110
99
  return undefined;
111
100
  })();
112
101
  conditions.push(
@@ -120,25 +109,6 @@ export const check_number =
120
109
  : modulo(),
121
110
  ),
122
111
  );
123
- } else if (tag.kind === "range") {
124
- if (tag.minimum !== undefined)
125
- conditions.push(
126
- (tag.minimum.include
127
- ? ts.factory.createLessThanEquals
128
- : ts.factory.createLessThan)(
129
- ts.factory.createNumericLiteral(tag.minimum.value),
130
- input,
131
- ),
132
- );
133
- if (tag.maximum !== undefined)
134
- conditions.push(
135
- (tag.maximum.include
136
- ? ts.factory.createLessThanEquals
137
- : ts.factory.createLessThan)(
138
- input,
139
- ts.factory.createNumericLiteral(tag.maximum.value),
140
- ),
141
- );
142
112
  } else if (tag.kind === "minimum")
143
113
  conditions.push(
144
114
  ts.factory.createLessThanEquals(
@@ -5,7 +5,6 @@ import { IdentifierFactory } from "../../factories/IdentifierFactory";
5
5
  import { IMetadataTag } from "../../metadata/IMetadataTag";
6
6
 
7
7
  import { FunctionImporter } from "../helpers/FunctionImporeter";
8
- import { check_length } from "./check_length";
9
8
 
10
9
  /**
11
10
  * @internal
@@ -39,6 +38,13 @@ export const check_string_tags =
39
38
  ),
40
39
  ),
41
40
  );
41
+ else if (tag.kind === "length")
42
+ conditions.push(
43
+ ts.factory.createStrictEquality(
44
+ ts.factory.createNumericLiteral(tag.value),
45
+ IdentifierFactory.join(input, "length"),
46
+ ),
47
+ );
42
48
  else if (tag.kind === "minLength")
43
49
  conditions.push(
44
50
  ts.factory.createLessThanEquals(
@@ -53,11 +59,5 @@ export const check_string_tags =
53
59
  IdentifierFactory.join(input, "length"),
54
60
  ),
55
61
  );
56
- else if (tag.kind === "length")
57
- check_length(
58
- conditions,
59
- IdentifierFactory.join(input, "length"),
60
- tag,
61
- );
62
62
  return conditions;
63
63
  };
@@ -10,6 +10,7 @@ export namespace IJsonSchema {
10
10
  | IEnumeration<"number">
11
11
  | IEnumeration<"string">
12
12
  | IBoolean
13
+ | IInteger
13
14
  | INumber
14
15
  | IString
15
16
  | IArray
@@ -32,18 +33,46 @@ export namespace IJsonSchema {
32
33
  default?: Atomic.Mapper[Literal];
33
34
  }
34
35
  export interface IString extends IAtomic<"string"> {
36
+ /**
37
+ * @type uint
38
+ */
35
39
  minLength?: number;
40
+ /**
41
+ * @type uint
42
+ */
36
43
  maxLength?: number;
37
44
  pattern?: string;
38
45
  format?: string;
39
46
  }
40
- export interface INumber extends IAtomic<"number" | "integer"> {
47
+ export interface INumber extends IAtomic<"number"> {
41
48
  minimum?: number;
42
49
  maximum?: number;
43
50
  exclusiveMinimum?: number;
44
51
  exclusiveMaximum?: number;
45
52
  multipleOf?: number;
46
53
  }
54
+ export interface IInteger extends IAtomic<"integer"> {
55
+ /**
56
+ * @type int
57
+ */
58
+ minimum?: number;
59
+ /**
60
+ * @type int
61
+ */
62
+ maximum?: number;
63
+ /**
64
+ * @type int
65
+ */
66
+ exclusiveMinimum?: number;
67
+ /**
68
+ * @type int
69
+ */
70
+ exclusiveMaximum?: number;
71
+ /**
72
+ * @type int
73
+ */
74
+ multipleOf?: number;
75
+ }
47
76
  export interface IBoolean extends IAtomic<"boolean"> {}
48
77
 
49
78
  /* -----------------------------------------------------------
@@ -51,7 +80,13 @@ export namespace IJsonSchema {
51
80
  ----------------------------------------------------------- */
52
81
  export interface IArray extends ISignificant<"array"> {
53
82
  items: IJsonSchema;
83
+ /**
84
+ * @type uint
85
+ */
54
86
  minItems?: number;
87
+ /**
88
+ * @type uint
89
+ */
55
90
  maxItems?: number;
56
91
  "x-typia-tuple"?: ITuple;
57
92
  }