typia 3.8.4-dev.20230502 → 3.8.5-dev.20230510

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 (170) hide show
  1. package/lib/factories/MetadataTagFactory.js +5 -5
  2. package/lib/factories/MetadataTagFactory.js.map +1 -1
  3. package/lib/factories/internal/metadata/emplace_metadata_object.js +17 -15
  4. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  5. package/lib/programmers/AssertProgrammer.js +1 -1
  6. package/lib/programmers/AssertProgrammer.js.map +1 -1
  7. package/lib/programmers/IsProgrammer.d.ts +1 -1
  8. package/lib/programmers/IsProgrammer.js +5 -2
  9. package/lib/programmers/IsProgrammer.js.map +1 -1
  10. package/lib/programmers/ValidateProgrammer.js +1 -1
  11. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  12. package/lib/programmers/helpers/disable_function_importer_declare.d.ts +2 -0
  13. package/lib/programmers/helpers/disable_function_importer_declare.js +15 -0
  14. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -0
  15. package/package.json +1 -1
  16. package/src/Primitive.ts +123 -123
  17. package/src/executable/TypiaGenerateWizard.ts +85 -85
  18. package/src/executable/TypiaSetupWizard.ts +133 -133
  19. package/src/executable/setup/CommandExecutor.ts +8 -8
  20. package/src/executable/setup/PackageManager.ts +71 -71
  21. package/src/executable/setup/PluginConfigurator.ts +70 -70
  22. package/src/executable/typia.ts +52 -52
  23. package/src/factories/CommentFactory.ts +14 -14
  24. package/src/factories/ExpressionFactory.ts +70 -70
  25. package/src/factories/IdentifierFactory.ts +63 -63
  26. package/src/factories/LiteralFactory.ts +39 -39
  27. package/src/factories/MetadataCollection.ts +121 -121
  28. package/src/factories/MetadataFactory.ts +62 -62
  29. package/src/factories/MetadataTagFactory.ts +295 -297
  30. package/src/factories/StatementFactory.ts +24 -24
  31. package/src/factories/TemplateFactory.ts +58 -58
  32. package/src/factories/TypeFactory.ts +124 -124
  33. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  34. package/src/factories/internal/metadata/emplace_metadata_object.ts +143 -143
  35. package/src/factories/internal/metadata/iterate_metadata.ts +67 -67
  36. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  37. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  38. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  39. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  40. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +48 -48
  41. package/src/factories/internal/metadata/iterate_metadata_union.ts +57 -57
  42. package/src/functional/$any.ts +2 -2
  43. package/src/functional/$dictionary.ts +25 -25
  44. package/src/functional/$is_between.ts +2 -2
  45. package/src/functional/$is_custom.ts +14 -14
  46. package/src/functional/$is_date.ts +3 -3
  47. package/src/functional/$is_datetime.ts +2 -2
  48. package/src/functional/$is_email.ts +4 -4
  49. package/src/functional/$is_ipv4.ts +4 -4
  50. package/src/functional/$is_ipv6.ts +4 -4
  51. package/src/functional/$is_url.ts +4 -4
  52. package/src/functional/$is_uuid.ts +4 -4
  53. package/src/functional/$join.ts +46 -46
  54. package/src/functional/$number.ts +12 -12
  55. package/src/functional/$rest.ts +3 -3
  56. package/src/functional/$string.ts +37 -37
  57. package/src/functional/$tail.ts +5 -5
  58. package/src/metadata/IMetadata.ts +26 -26
  59. package/src/metadata/Metadata.ts +539 -539
  60. package/src/metadata/MetadataConstant.ts +3 -3
  61. package/src/metadata/MetadataObject.ts +127 -127
  62. package/src/module.ts +2043 -2043
  63. package/src/programmers/ApplicationProgrammer.ts +62 -62
  64. package/src/programmers/AssertCloneProgrammer.ts +79 -79
  65. package/src/programmers/AssertParseProgrammer.ts +74 -74
  66. package/src/programmers/AssertProgrammer.ts +285 -285
  67. package/src/programmers/AssertPruneProgrammer.ts +76 -76
  68. package/src/programmers/AssertStringifyProgrammer.ts +74 -74
  69. package/src/programmers/CheckerProgrammer.ts +901 -901
  70. package/src/programmers/CloneProgrammer.ts +389 -389
  71. package/src/programmers/FeatureProgrammer.ts +500 -500
  72. package/src/programmers/IsCloneProgrammer.ts +86 -86
  73. package/src/programmers/IsParseProgrammer.ts +80 -80
  74. package/src/programmers/IsProgrammer.ts +216 -212
  75. package/src/programmers/IsPruneProgrammer.ts +81 -81
  76. package/src/programmers/IsStringifyProgrammer.ts +84 -84
  77. package/src/programmers/LiteralsProgrammer.ts +65 -65
  78. package/src/programmers/PruneProgrammer.ts +347 -347
  79. package/src/programmers/RandomProgrammer.ts +423 -423
  80. package/src/programmers/StringifyProgrammer.ts +798 -798
  81. package/src/programmers/TypiaProgrammer.ts +129 -129
  82. package/src/programmers/ValidateCloneProgrammer.ts +93 -93
  83. package/src/programmers/ValidateParseProgrammer.ts +78 -78
  84. package/src/programmers/ValidateProgrammer.ts +316 -316
  85. package/src/programmers/ValidatePruneProgrammer.ts +86 -86
  86. package/src/programmers/ValidateStringifyProgrammer.ts +92 -92
  87. package/src/programmers/helpers/CloneJoiner.ts +131 -131
  88. package/src/programmers/helpers/FunctionImporeter.ts +54 -54
  89. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  90. package/src/programmers/helpers/PruneJoiner.ts +144 -144
  91. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  92. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  93. package/src/programmers/helpers/UnionExplorer.ts +275 -275
  94. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  95. package/src/programmers/helpers/disable_function_importer_declare.ts +21 -0
  96. package/src/programmers/internal/application_array.ts +36 -36
  97. package/src/programmers/internal/application_boolean.ts +17 -17
  98. package/src/programmers/internal/application_constant.ts +30 -30
  99. package/src/programmers/internal/application_default_string.ts +33 -33
  100. package/src/programmers/internal/application_native.ts +32 -32
  101. package/src/programmers/internal/application_number.ts +73 -73
  102. package/src/programmers/internal/application_object.ts +155 -155
  103. package/src/programmers/internal/application_schema.ts +213 -213
  104. package/src/programmers/internal/application_string.ts +45 -45
  105. package/src/programmers/internal/application_templates.ts +26 -26
  106. package/src/programmers/internal/application_tuple.ts +31 -31
  107. package/src/programmers/internal/check_array.ts +30 -30
  108. package/src/programmers/internal/check_custom.ts +31 -31
  109. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  110. package/src/programmers/internal/check_everything.ts +28 -28
  111. package/src/programmers/internal/check_native.ts +21 -21
  112. package/src/programmers/internal/check_string_tags.ts +67 -67
  113. package/src/programmers/internal/check_union_array_like.ts +271 -271
  114. package/src/programmers/internal/check_union_tuple.ts +33 -33
  115. package/src/programmers/internal/random_custom.ts +29 -29
  116. package/src/programmers/internal/stringify_dynamic_properties.ts +167 -167
  117. package/src/programmers/internal/stringify_native.ts +7 -7
  118. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  119. package/src/schemas/IJsonSchema.ts +130 -130
  120. package/src/transform.ts +17 -17
  121. package/src/transformers/CallExpressionTransformer.ts +177 -177
  122. package/src/transformers/FileTransformer.ts +47 -47
  123. package/src/transformers/NodeTransformer.ts +13 -13
  124. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -114
  125. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  126. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  127. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  128. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  129. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  130. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  131. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  132. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  133. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  134. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +39 -39
  135. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  136. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  137. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  138. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  139. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +28 -28
  140. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +52 -52
  141. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  142. package/src/transformers/features/miscellaneous/RandomTransformer.ts +42 -42
  143. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  144. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  145. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  146. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  147. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  148. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  149. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  150. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  151. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  152. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  153. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  154. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  155. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  156. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  157. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  158. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  159. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  160. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  161. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  162. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  163. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  164. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  165. package/src/transformers/internal/GenericTransformer.ts +97 -97
  166. package/src/utils/ArrayUtil.ts +44 -44
  167. package/src/utils/Escaper.ts +45 -45
  168. package/src/utils/MapUtil.ts +12 -12
  169. package/src/utils/PatternUtil.ts +30 -30
  170. package/src/utils/RandomGenerator.ts +81 -81
@@ -1,297 +1,295 @@
1
- import ts from "typescript";
2
-
3
- import { IMetadataTag } from "../metadata/IMetadataTag";
4
- import { Metadata } from "../metadata/Metadata";
5
-
6
- export namespace MetadataTagFactory {
7
- export const generate =
8
- (metadata: Metadata) =>
9
- (tagList: ts.JSDocTagInfo[]) =>
10
- (identifier: () => string): IMetadataTag[] => {
11
- const output: IMetadataTag[] = [];
12
- for (const tag of tagList) {
13
- const elem: IMetadataTag | null = parse(
14
- identifier,
15
- metadata,
16
- tag,
17
- output,
18
- );
19
- if (elem !== null) output.push(elem);
20
- }
21
- return output;
22
- };
23
-
24
- const parse = (
25
- identifier: () => string,
26
- metadata: Metadata,
27
- tag: ts.JSDocTagInfo,
28
- output: IMetadataTag[],
29
- ): IMetadataTag | null => {
30
- const closure = _PARSER[tag.name];
31
- if (closure === undefined) return null;
32
-
33
- const text = (tag.text || [])[0]?.text;
34
- if (text === undefined)
35
- throw new Error(`${LABEL}: no tag value on ${identifier()}`);
36
-
37
- return closure(identifier, metadata, text, output);
38
- };
39
-
40
- /**
41
- * @internal
42
- */
43
- export const _PARSER: Record<
44
- string,
45
- (
46
- identifier: () => string,
47
- metadata: Metadata,
48
- text: string,
49
- output: IMetadataTag[],
50
- ) => IMetadataTag | null
51
- > = {
52
- /* -----------------------------------------------------------
53
- ARRAY
54
- ----------------------------------------------------------- */
55
- items: (identifier, metadata, text, output) => {
56
- validate(identifier, metadata, output, "items", "array", [
57
- "minItems",
58
- ]);
59
- return {
60
- kind: "items",
61
- value: parse_number(identifier, text),
62
- };
63
- },
64
- minItems: (identifier, metadata, text, output) => {
65
- validate(identifier, metadata, output, "minItems", "array", [
66
- "items",
67
- ]);
68
- return {
69
- kind: "minItems",
70
- value: parse_number(identifier, text),
71
- };
72
- },
73
- maxItems: (identifier, metadata, text, output) => {
74
- validate(identifier, metadata, output, "maxItems", "array", [
75
- "items",
76
- ]);
77
- return {
78
- kind: "maxItems",
79
- value: parse_number(identifier, text),
80
- };
81
- },
82
-
83
- /* -----------------------------------------------------------
84
- NUMBER
85
- ----------------------------------------------------------- */
86
- type: (identifier, metadata, text, output) => {
87
- validate(identifier, metadata, output, "type", "number", []);
88
- if (text !== "int" && text !== "uint")
89
- throw new Error(
90
- `${LABEL}: invalid type tag on "${identifier()}".`,
91
- );
92
- return { kind: "type", value: text };
93
- },
94
- minimum: (identifier, metadata, text, output) => {
95
- validate(identifier, metadata, output, "minimum", "number", [
96
- "exclusiveMinimum",
97
- ]);
98
- return {
99
- kind: "minimum",
100
- value: parse_number(identifier, text),
101
- };
102
- },
103
- maximum: (identifier, metadata, text, output) => {
104
- validate(identifier, metadata, output, "maximum", "number", [
105
- "exclusiveMaximum",
106
- ]);
107
- return {
108
- kind: "maximum",
109
- value: parse_number(identifier, text),
110
- };
111
- },
112
- exclusiveMinimum: (identifier, metadata, text, output) => {
113
- validate(
114
- identifier,
115
- metadata,
116
- output,
117
- "exclusiveMinimum",
118
- "number",
119
- ["minimum"],
120
- );
121
- return {
122
- kind: "exclusiveMinimum",
123
- value: parse_number(identifier, text),
124
- };
125
- },
126
- exclusiveMaximum: (identifier, metadata, text, output) => {
127
- validate(
128
- identifier,
129
- metadata,
130
- output,
131
- "exclusiveMaximum",
132
- "number",
133
- ["maximum"],
134
- );
135
- return {
136
- kind: "exclusiveMaximum",
137
- value: parse_number(identifier, text),
138
- };
139
- },
140
- multipleOf: (identifier, metadata, text, output) => {
141
- validate(identifier, metadata, output, "multipleOf", "number", [
142
- "step",
143
- ]);
144
- return {
145
- kind: "multipleOf",
146
- value: parse_number(identifier, text),
147
- };
148
- },
149
- step: (identifier, metadata, text, output) => {
150
- validate(identifier, metadata, output, "step", "number", [
151
- "multipleOf",
152
- ]);
153
-
154
- const minimum: boolean = output.some(
155
- (tag) =>
156
- tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
157
- );
158
- if (minimum === undefined)
159
- throw new Error(
160
- `${LABEL}: step requires minimum or exclusiveMinimum tag on "${identifier()}".`,
161
- );
162
-
163
- return {
164
- kind: "step",
165
- value: parse_number(identifier, text),
166
- };
167
- },
168
-
169
- /* -----------------------------------------------------------
170
- STRING
171
- ----------------------------------------------------------- */
172
- format: (identifier, metadata, str, output) => {
173
- validate(identifier, metadata, output, "format", "string", [
174
- "pattern",
175
- ]);
176
-
177
- // Ignore arbitrary @format values in the internal metadata,
178
- // these are currently only supported on the typia.application() API.
179
- const value: IMetadataTag.IFormat["value"] | undefined =
180
- FORMATS.get(str);
181
- if (value === undefined) return null;
182
- return {
183
- kind: "format",
184
- value,
185
- };
186
- },
187
- pattern: (identifier, metadata, value, output) => {
188
- validate(identifier, metadata, output, "pattern", "string", [
189
- "format",
190
- ]);
191
- return {
192
- kind: "pattern",
193
- value,
194
- };
195
- },
196
- length: (identifier, metadata, text, output) => {
197
- validate(identifier, metadata, output, "length", "string", [
198
- "minLength",
199
- "maxLength",
200
- ]);
201
- return {
202
- kind: "length",
203
- value: parse_number(identifier, text),
204
- };
205
- },
206
- minLength: (identifier, metadata, text, output) => {
207
- validate(identifier, metadata, output, "minLength", "string", [
208
- "length",
209
- ]);
210
- return {
211
- kind: "minLength",
212
- value: parse_number(identifier, text),
213
- };
214
- },
215
- maxLength: (identifier, metadata, text, output) => {
216
- validate(identifier, metadata, output, "maxLength", "string", [
217
- "length",
218
- ]);
219
- return {
220
- kind: "maxLength",
221
- value: parse_number(identifier, text),
222
- };
223
- },
224
- };
225
- }
226
-
227
- const parse_number = (identifier: () => string, str: string): number => {
228
- const value: number = Number(str);
229
- if (isNaN(value) === true)
230
- throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
231
- return value;
232
- };
233
-
234
- const LABEL = "Error on typia.MetadataTagFactory.generate()";
235
- const FORMATS: Map<string, IMetadataTag.IFormat["value"]> = new Map([
236
- ["uuid", "uuid"],
237
- ["email", "email"],
238
- ["url", "url"],
239
- ["ipv4", "ipv4"],
240
- ["ipv6", "ipv6"],
241
- ["date", "date"],
242
- ["datetime", "datetime"],
243
- ["date-time", "datetime"],
244
- ["dateTime", "datetime"],
245
- ]);
246
-
247
- const WRONG_TYPE = (
248
- tag: string,
249
- type: "string" | "number" | "array",
250
- identifier: () => string,
251
- ) => `${LABEL}: ${tag} requires ${type} type, but no "${identifier()}".`;
252
-
253
- const validate = (
254
- identifier: () => string,
255
- metadata: Metadata,
256
- output: IMetadataTag[],
257
- kind: IMetadataTag["kind"],
258
- type: "array" | "string" | "number",
259
- neighbors: IMetadataTag["kind"][],
260
- ): void => {
261
- // TYPE CHECKING
262
- if (type === "array") {
263
- if (has_array(metadata) === false)
264
- throw new Error(WRONG_TYPE(kind, "array", identifier));
265
- } else if (has_atomic(metadata)(type) === false)
266
- throw new Error(WRONG_TYPE(kind, type, identifier));
267
-
268
- // DUPLICATED TAG
269
- if (output.some((tag) => tag.kind === kind))
270
- throw new Error(
271
- `${LABEL}: duplicated ${kind} tags on "${identifier()}".`,
272
- );
273
-
274
- // NEIGHBOR TAG
275
- for (const name of neighbors)
276
- if (output.some((tag) => tag.kind === name))
277
- throw new Error(
278
- `${LABEL}: ${kind} and ${name} tags on "${identifier()}".`,
279
- );
280
- };
281
-
282
- const has_atomic =
283
- (metadata: Metadata) =>
284
- (type: "string" | "number"): boolean =>
285
- metadata.atomics.find(
286
- type === "number"
287
- ? (atom: string) => atom === type || atom === "bigint"
288
- : (atom: string) => atom === type,
289
- ) !== undefined ||
290
- metadata.arrays.some((child) => has_atomic(child)(type)) ||
291
- metadata.tuples.some((tuple) =>
292
- tuple.some((child) => has_atomic(child)(type)),
293
- );
294
-
295
- const has_array = (metadata: Metadata): boolean =>
296
- metadata.arrays.length !== 0 ||
297
- metadata.tuples.some((tuple) => tuple.some((child) => has_array(child)));
1
+ import ts from "typescript";
2
+
3
+ import { IMetadataTag } from "../metadata/IMetadataTag";
4
+ import { Metadata } from "../metadata/Metadata";
5
+
6
+ export namespace MetadataTagFactory {
7
+ export const generate =
8
+ (metadata: Metadata) =>
9
+ (tagList: ts.JSDocTagInfo[]) =>
10
+ (identifier: () => string): IMetadataTag[] => {
11
+ const output: IMetadataTag[] = [];
12
+ for (const tag of tagList) {
13
+ const elem: IMetadataTag | null = parse(
14
+ identifier,
15
+ metadata,
16
+ tag,
17
+ output,
18
+ );
19
+ if (elem !== null) output.push(elem);
20
+ }
21
+ return output;
22
+ };
23
+
24
+ const parse = (
25
+ identifier: () => string,
26
+ metadata: Metadata,
27
+ tag: ts.JSDocTagInfo,
28
+ output: IMetadataTag[],
29
+ ): IMetadataTag | null => {
30
+ const closure = _PARSER[tag.name];
31
+ if (closure === undefined) return null;
32
+
33
+ const text = (tag.text || [])[0]?.text;
34
+ if (text === undefined)
35
+ throw new Error(`${LABEL}: no tag value on ${identifier()}`);
36
+
37
+ return closure(identifier, metadata, text, output);
38
+ };
39
+
40
+ /**
41
+ * @internal
42
+ */
43
+ export const _PARSER: Record<
44
+ string,
45
+ (
46
+ identifier: () => string,
47
+ metadata: Metadata,
48
+ text: string,
49
+ output: IMetadataTag[],
50
+ ) => IMetadataTag | null
51
+ > = {
52
+ /* -----------------------------------------------------------
53
+ ARRAY
54
+ ----------------------------------------------------------- */
55
+ items: (identifier, metadata, text, output) => {
56
+ validate(identifier, metadata, output, "items", "array", [
57
+ "minItems",
58
+ ]);
59
+ return {
60
+ kind: "items",
61
+ value: parse_number(identifier, text),
62
+ };
63
+ },
64
+ minItems: (identifier, metadata, text, output) => {
65
+ validate(identifier, metadata, output, "minItems", "array", [
66
+ "items",
67
+ ]);
68
+ return {
69
+ kind: "minItems",
70
+ value: parse_number(identifier, text),
71
+ };
72
+ },
73
+ maxItems: (identifier, metadata, text, output) => {
74
+ validate(identifier, metadata, output, "maxItems", "array", [
75
+ "items",
76
+ ]);
77
+ return {
78
+ kind: "maxItems",
79
+ value: parse_number(identifier, text),
80
+ };
81
+ },
82
+
83
+ /* -----------------------------------------------------------
84
+ NUMBER
85
+ ----------------------------------------------------------- */
86
+ type: (_identifier, metadata, text, _output) => {
87
+ return has_atomic(metadata)("number") &&
88
+ (text === "int" || text === "uint")
89
+ ? { kind: "type", value: text }
90
+ : null;
91
+ },
92
+ minimum: (identifier, metadata, text, output) => {
93
+ validate(identifier, metadata, output, "minimum", "number", [
94
+ "exclusiveMinimum",
95
+ ]);
96
+ return {
97
+ kind: "minimum",
98
+ value: parse_number(identifier, text),
99
+ };
100
+ },
101
+ maximum: (identifier, metadata, text, output) => {
102
+ validate(identifier, metadata, output, "maximum", "number", [
103
+ "exclusiveMaximum",
104
+ ]);
105
+ return {
106
+ kind: "maximum",
107
+ value: parse_number(identifier, text),
108
+ };
109
+ },
110
+ exclusiveMinimum: (identifier, metadata, text, output) => {
111
+ validate(
112
+ identifier,
113
+ metadata,
114
+ output,
115
+ "exclusiveMinimum",
116
+ "number",
117
+ ["minimum"],
118
+ );
119
+ return {
120
+ kind: "exclusiveMinimum",
121
+ value: parse_number(identifier, text),
122
+ };
123
+ },
124
+ exclusiveMaximum: (identifier, metadata, text, output) => {
125
+ validate(
126
+ identifier,
127
+ metadata,
128
+ output,
129
+ "exclusiveMaximum",
130
+ "number",
131
+ ["maximum"],
132
+ );
133
+ return {
134
+ kind: "exclusiveMaximum",
135
+ value: parse_number(identifier, text),
136
+ };
137
+ },
138
+ multipleOf: (identifier, metadata, text, output) => {
139
+ validate(identifier, metadata, output, "multipleOf", "number", [
140
+ "step",
141
+ ]);
142
+ return {
143
+ kind: "multipleOf",
144
+ value: parse_number(identifier, text),
145
+ };
146
+ },
147
+ step: (identifier, metadata, text, output) => {
148
+ validate(identifier, metadata, output, "step", "number", [
149
+ "multipleOf",
150
+ ]);
151
+
152
+ const minimum: boolean = output.some(
153
+ (tag) =>
154
+ tag.kind === "minimum" || tag.kind === "exclusiveMinimum",
155
+ );
156
+ if (minimum === undefined)
157
+ throw new Error(
158
+ `${LABEL}: step requires minimum or exclusiveMinimum tag on "${identifier()}".`,
159
+ );
160
+
161
+ return {
162
+ kind: "step",
163
+ value: parse_number(identifier, text),
164
+ };
165
+ },
166
+
167
+ /* -----------------------------------------------------------
168
+ STRING
169
+ ----------------------------------------------------------- */
170
+ format: (identifier, metadata, str, output) => {
171
+ validate(identifier, metadata, output, "format", "string", [
172
+ "pattern",
173
+ ]);
174
+
175
+ // Ignore arbitrary @format values in the internal metadata,
176
+ // these are currently only supported on the typia.application() API.
177
+ const value: IMetadataTag.IFormat["value"] | undefined =
178
+ FORMATS.get(str);
179
+ if (value === undefined) return null;
180
+ return {
181
+ kind: "format",
182
+ value,
183
+ };
184
+ },
185
+ pattern: (identifier, metadata, value, output) => {
186
+ validate(identifier, metadata, output, "pattern", "string", [
187
+ "format",
188
+ ]);
189
+ return {
190
+ kind: "pattern",
191
+ value,
192
+ };
193
+ },
194
+ length: (identifier, metadata, text, output) => {
195
+ validate(identifier, metadata, output, "length", "string", [
196
+ "minLength",
197
+ "maxLength",
198
+ ]);
199
+ return {
200
+ kind: "length",
201
+ value: parse_number(identifier, text),
202
+ };
203
+ },
204
+ minLength: (identifier, metadata, text, output) => {
205
+ validate(identifier, metadata, output, "minLength", "string", [
206
+ "length",
207
+ ]);
208
+ return {
209
+ kind: "minLength",
210
+ value: parse_number(identifier, text),
211
+ };
212
+ },
213
+ maxLength: (identifier, metadata, text, output) => {
214
+ validate(identifier, metadata, output, "maxLength", "string", [
215
+ "length",
216
+ ]);
217
+ return {
218
+ kind: "maxLength",
219
+ value: parse_number(identifier, text),
220
+ };
221
+ },
222
+ };
223
+ }
224
+
225
+ const parse_number = (identifier: () => string, str: string): number => {
226
+ const value: number = Number(str);
227
+ if (isNaN(value) === true)
228
+ throw new Error(`${LABEL}: invalid number on "${identifier()}".`);
229
+ return value;
230
+ };
231
+
232
+ const LABEL = "Error on typia.MetadataTagFactory.generate()";
233
+ const FORMATS: Map<string, IMetadataTag.IFormat["value"]> = new Map([
234
+ ["uuid", "uuid"],
235
+ ["email", "email"],
236
+ ["url", "url"],
237
+ ["ipv4", "ipv4"],
238
+ ["ipv6", "ipv6"],
239
+ ["date", "date"],
240
+ ["datetime", "datetime"],
241
+ ["date-time", "datetime"],
242
+ ["dateTime", "datetime"],
243
+ ]);
244
+
245
+ const WRONG_TYPE = (
246
+ tag: string,
247
+ type: "string" | "number" | "array",
248
+ identifier: () => string,
249
+ ) => `${LABEL}: ${tag} requires ${type} type, but no "${identifier()}".`;
250
+
251
+ const validate = (
252
+ identifier: () => string,
253
+ metadata: Metadata,
254
+ output: IMetadataTag[],
255
+ kind: IMetadataTag["kind"],
256
+ type: "array" | "string" | "number",
257
+ neighbors: IMetadataTag["kind"][],
258
+ ): void => {
259
+ // TYPE CHECKING
260
+ if (type === "array") {
261
+ if (has_array(metadata) === false)
262
+ throw new Error(WRONG_TYPE(kind, "array", identifier));
263
+ } else if (has_atomic(metadata)(type) === false)
264
+ throw new Error(WRONG_TYPE(kind, type, identifier));
265
+
266
+ // DUPLICATED TAG
267
+ if (output.some((tag) => tag.kind === kind))
268
+ throw new Error(
269
+ `${LABEL}: duplicated ${kind} tags on "${identifier()}".`,
270
+ );
271
+
272
+ // NEIGHBOR TAG
273
+ for (const name of neighbors)
274
+ if (output.some((tag) => tag.kind === name))
275
+ throw new Error(
276
+ `${LABEL}: ${kind} and ${name} tags on "${identifier()}".`,
277
+ );
278
+ };
279
+
280
+ const has_atomic =
281
+ (metadata: Metadata) =>
282
+ (type: "string" | "number"): boolean =>
283
+ metadata.atomics.find(
284
+ type === "number"
285
+ ? (atom: string) => atom === type || atom === "bigint"
286
+ : (atom: string) => atom === type,
287
+ ) !== undefined ||
288
+ metadata.arrays.some((child) => has_atomic(child)(type)) ||
289
+ metadata.tuples.some((tuple) =>
290
+ tuple.some((child) => has_atomic(child)(type)),
291
+ );
292
+
293
+ const has_array = (metadata: Metadata): boolean =>
294
+ metadata.arrays.length !== 0 ||
295
+ metadata.tuples.some((tuple) => tuple.some((child) => has_array(child)));
@@ -1,24 +1,24 @@
1
- import ts from "typescript";
2
-
3
- export namespace StatementFactory {
4
- export const constant = (name: string, initializer?: ts.Expression) =>
5
- ts.factory.createVariableStatement(
6
- undefined,
7
- ts.factory.createVariableDeclarationList(
8
- [
9
- ts.factory.createVariableDeclaration(
10
- name,
11
- undefined,
12
- undefined,
13
- initializer,
14
- ),
15
- ],
16
- ts.NodeFlags.Const,
17
- ),
18
- );
19
-
20
- export const transpile = (script: string) =>
21
- ts.factory.createExpressionStatement(
22
- ts.factory.createIdentifier(ts.transpile(script)),
23
- );
24
- }
1
+ import ts from "typescript";
2
+
3
+ export namespace StatementFactory {
4
+ export const constant = (name: string, initializer?: ts.Expression) =>
5
+ ts.factory.createVariableStatement(
6
+ undefined,
7
+ ts.factory.createVariableDeclarationList(
8
+ [
9
+ ts.factory.createVariableDeclaration(
10
+ name,
11
+ undefined,
12
+ undefined,
13
+ initializer,
14
+ ),
15
+ ],
16
+ ts.NodeFlags.Const,
17
+ ),
18
+ );
19
+
20
+ export const transpile = (script: string) =>
21
+ ts.factory.createExpressionStatement(
22
+ ts.factory.createIdentifier(ts.transpile(script)),
23
+ );
24
+ }