typia 3.4.13 → 3.4.15

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 (270) hide show
  1. package/README.md +9 -8
  2. package/lib/executable/internal/TypiaSetupWizard.js +1 -1
  3. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -1
  4. package/lib/factories/MetadataFactory.d.ts +1 -0
  5. package/lib/factories/MetadataFactory.js +1 -1
  6. package/lib/factories/MetadataFactory.js.map +1 -1
  7. package/lib/factories/MetadataTagFactory.js +4 -1
  8. package/lib/factories/MetadataTagFactory.js.map +1 -1
  9. package/lib/factories/internal/{MetadataHelper.d.ts → metadata/MetadataHelper.d.ts} +1 -1
  10. package/lib/factories/internal/{MetadataHelper.js → metadata/MetadataHelper.js} +1 -1
  11. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -0
  12. package/lib/factories/internal/{emplace_metadata_object.d.ts → metadata/emplace_metadata_object.d.ts} +3 -3
  13. package/lib/factories/internal/{emplace_metadata_object.js → metadata/emplace_metadata_object.js} +5 -5
  14. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -0
  15. package/lib/factories/internal/{explore_metadata.d.ts → metadata/explore_metadata.d.ts} +3 -3
  16. package/lib/factories/internal/{explore_metadata.js → metadata/explore_metadata.js} +5 -3
  17. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -0
  18. package/lib/factories/internal/{iterate_metadata.d.ts → metadata/iterate_metadata.d.ts} +3 -3
  19. package/lib/factories/internal/{iterate_metadata.js → metadata/iterate_metadata.js} +1 -1
  20. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -0
  21. package/lib/factories/internal/{iterate_metadata_array.d.ts → metadata/iterate_metadata_array.d.ts} +3 -3
  22. package/lib/factories/internal/{iterate_metadata_array.js → metadata/iterate_metadata_array.js} +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -0
  24. package/lib/factories/internal/{iterate_metadata_atomic.d.ts → metadata/iterate_metadata_atomic.d.ts} +1 -1
  25. package/lib/factories/internal/{iterate_metadata_atomic.js → metadata/iterate_metadata_atomic.js} +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -0
  27. package/lib/factories/internal/{iterate_metadata_coalesce.d.ts → metadata/iterate_metadata_coalesce.d.ts} +1 -1
  28. package/lib/factories/internal/{iterate_metadata_coalesce.js → metadata/iterate_metadata_coalesce.js} +2 -2
  29. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -0
  30. package/lib/factories/internal/{iterate_metadata_constant.d.ts → metadata/iterate_metadata_constant.d.ts} +2 -2
  31. package/lib/factories/internal/{iterate_metadata_constant.js → metadata/iterate_metadata_constant.js} +1 -1
  32. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -0
  33. package/lib/factories/internal/{iterate_metadata_map.d.ts → metadata/iterate_metadata_map.d.ts} +3 -3
  34. package/lib/factories/internal/{iterate_metadata_map.js → metadata/iterate_metadata_map.js} +2 -2
  35. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -0
  36. package/lib/factories/internal/{iterate_metadata_native.d.ts → metadata/iterate_metadata_native.d.ts} +1 -1
  37. package/lib/factories/internal/{iterate_metadata_native.js → metadata/iterate_metadata_native.js} +2 -2
  38. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -0
  39. package/lib/factories/internal/{iterate_metadata_object.d.ts → metadata/iterate_metadata_object.d.ts} +3 -3
  40. package/lib/factories/internal/{iterate_metadata_object.js → metadata/iterate_metadata_object.js} +7 -5
  41. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -0
  42. package/lib/factories/internal/{iterate_metadata_resolve.d.ts → metadata/iterate_metadata_resolve.d.ts} +3 -3
  43. package/lib/factories/internal/{iterate_metadata_resolve.js → metadata/iterate_metadata_resolve.js} +2 -2
  44. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -0
  45. package/lib/factories/internal/{iterate_metadata_set.d.ts → metadata/iterate_metadata_set.d.ts} +3 -3
  46. package/lib/factories/internal/{iterate_metadata_set.js → metadata/iterate_metadata_set.js} +2 -2
  47. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -0
  48. package/lib/factories/internal/{iterate_metadata_template.d.ts → metadata/iterate_metadata_template.d.ts} +3 -3
  49. package/lib/factories/internal/{iterate_metadata_template.js → metadata/iterate_metadata_template.js} +0 -0
  50. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -0
  51. package/lib/factories/internal/{iterate_metadata_tuple.d.ts → metadata/iterate_metadata_tuple.d.ts} +3 -3
  52. package/lib/factories/internal/{iterate_metadata_tuple.js → metadata/iterate_metadata_tuple.js} +3 -3
  53. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -0
  54. package/lib/factories/internal/{iterate_metadata_union.d.ts → metadata/iterate_metadata_union.d.ts} +3 -3
  55. package/lib/factories/internal/{iterate_metadata_union.js → metadata/iterate_metadata_union.js} +3 -3
  56. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -0
  57. package/lib/functional/$number.js +2 -9
  58. package/lib/functional/$number.js.map +1 -1
  59. package/lib/programmers/AssertParseProgrammer.js +12 -1
  60. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  61. package/lib/programmers/AssertProgrammer.js +2 -1
  62. package/lib/programmers/AssertProgrammer.js.map +1 -1
  63. package/lib/programmers/AssertStringifyProgrammer.js +13 -2
  64. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  65. package/lib/programmers/CheckerProgrammer.js +6 -0
  66. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  67. package/lib/programmers/IsParseProgrammer.js +12 -1
  68. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  69. package/lib/programmers/IsProgrammer.js +5 -2
  70. package/lib/programmers/IsProgrammer.js.map +1 -1
  71. package/lib/programmers/IsStringifyProgrammer.js +13 -2
  72. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  73. package/lib/programmers/StringifyProgrammer.js +5 -0
  74. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  75. package/lib/programmers/ValidateParseProgrammer.js +12 -1
  76. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  77. package/lib/programmers/ValidateProgrammer.js +2 -1
  78. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  79. package/lib/programmers/ValidateStringifyProgrammer.js +13 -2
  80. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  81. package/lib/programmers/helpers/OptionPredicator.d.ts +2 -1
  82. package/lib/programmers/helpers/OptionPredicator.js +7 -3
  83. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  84. package/lib/programmers/internal/application_schema.js +7 -3
  85. package/lib/programmers/internal/application_schema.js.map +1 -1
  86. package/lib/programmers/internal/check_bigint.d.ts +3 -0
  87. package/lib/programmers/internal/check_bigint.js +97 -0
  88. package/lib/programmers/internal/check_bigint.js.map +1 -0
  89. package/lib/programmers/internal/check_number.js +21 -22
  90. package/lib/programmers/internal/check_number.js.map +1 -1
  91. package/lib/schemas/IJsonSchema.d.ts +3 -5
  92. package/lib/transformers/ITransformOptions.d.ts +42 -1
  93. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +4 -0
  94. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  95. package/lib/transformers/features/stringifiers/StringifyTransformer.js +12 -1
  96. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  97. package/package.json +3 -2
  98. package/src/IValidation.ts +21 -21
  99. package/src/Primitive.ts +82 -82
  100. package/src/TypeGuardError.ts +36 -36
  101. package/src/executable/internal/CommandParser.ts +15 -15
  102. package/src/executable/internal/TypiaSetupWizard.ts +173 -175
  103. package/src/executable/typia.ts +46 -46
  104. package/src/factories/CommentFactory.ts +10 -10
  105. package/src/factories/ExpressionFactory.ts +66 -66
  106. package/src/factories/IdentifierFactory.ts +72 -72
  107. package/src/factories/LiteralFactory.ts +44 -44
  108. package/src/factories/MetadataCollection.ts +122 -122
  109. package/src/factories/MetadataFactory.ts +47 -46
  110. package/src/factories/MetadataTagFactory.ts +351 -347
  111. package/src/factories/StatementFactory.ts +60 -60
  112. package/src/factories/TemplateFactory.ts +56 -56
  113. package/src/factories/TypeFactory.ts +101 -101
  114. package/src/factories/ValueFactory.ts +12 -12
  115. package/src/factories/internal/{MetadataHelper.ts → metadata/MetadataHelper.ts} +12 -12
  116. package/src/factories/internal/{emplace_metadata_object.ts → metadata/emplace_metadata_object.ts} +140 -140
  117. package/src/factories/internal/{explore_metadata.ts → metadata/explore_metadata.ts} +92 -91
  118. package/src/factories/internal/{iterate_metadata.ts → metadata/iterate_metadata.ts} +80 -80
  119. package/src/factories/internal/{iterate_metadata_array.ts → metadata/iterate_metadata_array.ts} +29 -29
  120. package/src/factories/internal/{iterate_metadata_atomic.ts → metadata/iterate_metadata_atomic.ts} +59 -59
  121. package/src/factories/internal/{iterate_metadata_coalesce.ts → metadata/iterate_metadata_coalesce.ts} +33 -33
  122. package/src/factories/internal/{iterate_metadata_constant.ts → metadata/iterate_metadata_constant.ts} +58 -58
  123. package/src/factories/internal/{iterate_metadata_map.ts → metadata/iterate_metadata_map.ts} +41 -41
  124. package/src/factories/internal/{iterate_metadata_native.ts → metadata/iterate_metadata_native.ts} +227 -227
  125. package/src/factories/internal/{iterate_metadata_object.ts → metadata/iterate_metadata_object.ts} +48 -45
  126. package/src/factories/internal/{iterate_metadata_resolve.ts → metadata/iterate_metadata_resolve.ts} +27 -27
  127. package/src/factories/internal/{iterate_metadata_set.ts → metadata/iterate_metadata_set.ts} +33 -33
  128. package/src/factories/internal/{iterate_metadata_template.ts → metadata/iterate_metadata_template.ts} +38 -38
  129. package/src/factories/internal/{iterate_metadata_tuple.ts → metadata/iterate_metadata_tuple.ts} +45 -45
  130. package/src/factories/internal/{iterate_metadata_union.ts → metadata/iterate_metadata_union.ts} +59 -59
  131. package/src/functional/$every.ts +11 -11
  132. package/src/functional/$guard.ts +35 -35
  133. package/src/functional/$is_email.ts +5 -5
  134. package/src/functional/$is_ipv4.ts +5 -5
  135. package/src/functional/$is_ipv6.ts +5 -5
  136. package/src/functional/$is_url.ts +5 -5
  137. package/src/functional/$is_uuid.ts +5 -5
  138. package/src/functional/$join.ts +50 -50
  139. package/src/functional/$number.ts +12 -19
  140. package/src/functional/$report.ts +15 -15
  141. package/src/functional/$rest.ts +3 -3
  142. package/src/functional/$string.ts +37 -37
  143. package/src/functional/$tail.ts +6 -6
  144. package/src/index.ts +4 -4
  145. package/src/metadata/IJsDocTagInfo.ts +10 -10
  146. package/src/metadata/IMetadata.ts +25 -25
  147. package/src/metadata/IMetadataApplication.ts +7 -7
  148. package/src/metadata/IMetadataConstant.ts +16 -16
  149. package/src/metadata/IMetadataEntry.ts +6 -6
  150. package/src/metadata/IMetadataObject.ts +29 -29
  151. package/src/metadata/IMetadataProperty.ts +11 -11
  152. package/src/metadata/IMetadataTag.ts +122 -122
  153. package/src/metadata/Metadata.ts +477 -477
  154. package/src/metadata/MetadataConstant.ts +3 -3
  155. package/src/metadata/MetadataObject.ts +131 -131
  156. package/src/metadata/MetadataProperty.ts +64 -64
  157. package/src/module.ts +1535 -1535
  158. package/src/programmers/ApplicationProgrammer.ts +55 -55
  159. package/src/programmers/AssertParseProgrammer.ts +55 -45
  160. package/src/programmers/AssertProgrammer.ts +445 -444
  161. package/src/programmers/AssertStringifyProgrammer.ts +65 -45
  162. package/src/programmers/CheckerProgrammer.ts +810 -804
  163. package/src/programmers/FeatureProgrammer.ts +327 -327
  164. package/src/programmers/IsParseProgrammer.ts +61 -51
  165. package/src/programmers/IsProgrammer.ts +175 -172
  166. package/src/programmers/IsStringifyProgrammer.ts +69 -49
  167. package/src/programmers/StringifyProgrammer.ts +762 -756
  168. package/src/programmers/ValidateParseProgrammer.ts +59 -49
  169. package/src/programmers/ValidateProgrammer.ts +237 -236
  170. package/src/programmers/ValidateStringifyProgrammer.ts +80 -60
  171. package/src/programmers/helpers/AtomicPredicator.ts +15 -15
  172. package/src/programmers/helpers/FunctionImporeter.ts +31 -31
  173. package/src/programmers/helpers/IExpressionEntry.ts +10 -10
  174. package/src/programmers/helpers/OptionPredicator.ts +15 -11
  175. package/src/programmers/helpers/StringifyJoinder.ts +111 -111
  176. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  177. package/src/programmers/helpers/UnionExplorer.ts +437 -437
  178. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  179. package/src/programmers/internal/application_array.ts +45 -45
  180. package/src/programmers/internal/application_boolean.ts +17 -17
  181. package/src/programmers/internal/application_constant.ts +29 -29
  182. package/src/programmers/internal/application_default.ts +17 -17
  183. package/src/programmers/internal/application_default_string.ts +32 -32
  184. package/src/programmers/internal/application_native.ts +29 -29
  185. package/src/programmers/internal/application_number.ts +76 -76
  186. package/src/programmers/internal/application_object.ts +103 -103
  187. package/src/programmers/internal/application_schema.ts +228 -221
  188. package/src/programmers/internal/application_string.ts +49 -49
  189. package/src/programmers/internal/application_templates.ts +27 -27
  190. package/src/programmers/internal/application_tuple.ts +25 -25
  191. package/src/programmers/internal/check_array.ts +44 -44
  192. package/src/programmers/internal/check_bigint.ts +85 -0
  193. package/src/programmers/internal/check_dynamic_properties.ts +146 -146
  194. package/src/programmers/internal/check_everything.ts +25 -25
  195. package/src/programmers/internal/check_length.ts +46 -46
  196. package/src/programmers/internal/check_native.ts +9 -9
  197. package/src/programmers/internal/check_number.ts +175 -178
  198. package/src/programmers/internal/check_object.ts +42 -42
  199. package/src/programmers/internal/check_string.ts +24 -24
  200. package/src/programmers/internal/check_string_tags.ts +63 -63
  201. package/src/programmers/internal/check_template.ts +50 -50
  202. package/src/programmers/internal/decode_union_object.ts +73 -73
  203. package/src/programmers/internal/feature_object_entries.ts +49 -49
  204. package/src/programmers/internal/metadata_to_pattern.ts +31 -31
  205. package/src/programmers/internal/stringify_dynamic_properties.ts +164 -164
  206. package/src/programmers/internal/stringify_native.ts +8 -8
  207. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  208. package/src/programmers/internal/template_to_pattern.ts +15 -15
  209. package/src/schemas/IJsonApplication.ts +9 -9
  210. package/src/schemas/IJsonComponents.ts +24 -24
  211. package/src/schemas/IJsonSchema.ts +90 -92
  212. package/src/transform.ts +20 -20
  213. package/src/transformers/CallExpressionTransformer.ts +124 -124
  214. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  215. package/src/transformers/FileTransformer.ts +49 -49
  216. package/src/transformers/IProject.ts +11 -11
  217. package/src/transformers/ITransformOptions.ts +47 -4
  218. package/src/transformers/NodeTransformer.ts +19 -19
  219. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +119 -114
  220. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  221. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
  222. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
  223. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
  224. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
  225. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
  226. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
  227. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
  228. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
  229. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
  230. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
  231. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
  232. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
  233. package/src/transformers/features/stringifiers/StringifyTransformer.ts +46 -36
  234. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
  235. package/src/transformers/features/validators/AssertTransformer.ts +43 -43
  236. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
  237. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
  238. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
  239. package/src/transformers/features/validators/IsTransformer.ts +43 -43
  240. package/src/transformers/features/validators/ValidateTransformer.ts +43 -43
  241. package/src/typings/Atomic.ts +17 -17
  242. package/src/typings/ClassProperties.ts +5 -5
  243. package/src/typings/OmitNever.ts +3 -3
  244. package/src/typings/SpecialFields.ts +3 -3
  245. package/src/typings/Writable.ts +11 -11
  246. package/src/utils/ArrayUtil.ts +49 -49
  247. package/src/utils/Escaper.ts +50 -50
  248. package/src/utils/MapUtil.ts +14 -14
  249. package/src/utils/PatternUtil.ts +30 -30
  250. package/src/utils/Singleton.ts +17 -17
  251. package/lib/factories/internal/MetadataHelper.js.map +0 -1
  252. package/lib/factories/internal/emplace_metadata_object.js.map +0 -1
  253. package/lib/factories/internal/explore_metadata.js.map +0 -1
  254. package/lib/factories/internal/iterate_metadata.js.map +0 -1
  255. package/lib/factories/internal/iterate_metadata_array.js.map +0 -1
  256. package/lib/factories/internal/iterate_metadata_atomic.js.map +0 -1
  257. package/lib/factories/internal/iterate_metadata_coalesce.js.map +0 -1
  258. package/lib/factories/internal/iterate_metadata_constant.js.map +0 -1
  259. package/lib/factories/internal/iterate_metadata_map.js.map +0 -1
  260. package/lib/factories/internal/iterate_metadata_native.js.map +0 -1
  261. package/lib/factories/internal/iterate_metadata_object.js.map +0 -1
  262. package/lib/factories/internal/iterate_metadata_resolve.js.map +0 -1
  263. package/lib/factories/internal/iterate_metadata_set.js.map +0 -1
  264. package/lib/factories/internal/iterate_metadata_template.js.map +0 -1
  265. package/lib/factories/internal/iterate_metadata_tuple.js.map +0 -1
  266. package/lib/factories/internal/iterate_metadata_union.js.map +0 -1
  267. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.d.ts +0 -5
  268. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js +0 -29
  269. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js.map +0 -1
  270. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +0 -41
@@ -1,103 +1,103 @@
1
- import { CommentFactory } from "../../factories/CommentFactory";
2
-
3
- import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
4
- import { MetadataObject } from "../../metadata/MetadataObject";
5
- import { IJsonComponents } from "../../schemas/IJsonComponents";
6
-
7
- import { PatternUtil } from "../../utils/PatternUtil";
8
-
9
- import { IJsonSchema } from "../../module";
10
- import { ApplicationProgrammer } from "../ApplicationProgrammer";
11
- import { application_schema } from "./application_schema";
12
- import { metadata_to_pattern } from "./metadata_to_pattern";
13
-
14
- /**
15
- * @internal
16
- */
17
- export const application_object =
18
- (options: ApplicationProgrammer.IOptions) =>
19
- (components: IJsonComponents) =>
20
- (key: string, obj: MetadataObject, nullable: boolean): void => {
21
- // TEMPORARY ASSIGNMENT
22
- if (components.schemas[key] !== undefined) return;
23
- components.schemas[key] = {} as any;
24
-
25
- // ITERATE PROPERTIES
26
- const properties: Record<string, any> = {};
27
- const patternProperties: Record<string, any> = {};
28
- const additionalProperties: IJsonSchema[] = [];
29
- const required: string[] = [];
30
-
31
- for (const property of obj.properties) {
32
- if (
33
- property.value.functional === true &&
34
- property.value.nullable === false &&
35
- property.value.required === true &&
36
- property.value.size() === 0
37
- )
38
- continue;
39
-
40
- const key: string | null = property.key.getSoleLiteral();
41
- const value: IJsonSchema | null = application_schema(options)(
42
- components,
43
- )(true)(property.value, {
44
- deprecated:
45
- !!property.jsDocTags.find(
46
- (tag) => tag.name === "deprecated",
47
- ) || undefined,
48
- title: (() => {
49
- const info: IJsDocTagInfo | undefined =
50
- property.jsDocTags.find((tag) => tag.name === "title");
51
- return info?.text?.length
52
- ? CommentFactory.generate(info.text)
53
- : undefined;
54
- })(),
55
- description: property.description,
56
- "x-typia-metaTags": property.tags.length
57
- ? property.tags
58
- : undefined,
59
- "x-typia-jsDocTags": property.jsDocTags.length
60
- ? property.jsDocTags
61
- : undefined,
62
- "x-typia-required": property.value.required,
63
- });
64
-
65
- if (value === null) continue;
66
- else if (key !== null) {
67
- properties[key] = value;
68
- if (property.value.required === true) required.push(key);
69
- } else {
70
- const pattern: string = metadata_to_pattern(true)(property.key);
71
- if (
72
- options.purpose === "swagger" ||
73
- pattern === PatternUtil.STRING
74
- )
75
- additionalProperties.push(value);
76
- else patternProperties[pattern] = value;
77
- }
78
- }
79
-
80
- const schema: IJsonComponents.IObject = {
81
- $id:
82
- options.purpose === "ajv"
83
- ? options.prefix + "/" + key
84
- : undefined,
85
- $recursiveAnchor:
86
- (options.purpose === "ajv" && obj.recursive) || undefined,
87
- type: "object",
88
- properties,
89
- patternProperties: Object.keys(patternProperties).length
90
- ? patternProperties
91
- : undefined,
92
- additionalProperties: additionalProperties.length
93
- ? additionalProperties.length === 1
94
- ? additionalProperties[0]
95
- : { oneOf: additionalProperties }
96
- : undefined,
97
- nullable,
98
- required: required.length ? required : undefined,
99
- description: obj.description,
100
- "x-typia_jsDocTags": obj.jsDocTags,
101
- };
102
- components.schemas[key] = schema;
103
- };
1
+ import { CommentFactory } from "../../factories/CommentFactory";
2
+
3
+ import { IJsDocTagInfo } from "../../metadata/IJsDocTagInfo";
4
+ import { MetadataObject } from "../../metadata/MetadataObject";
5
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
6
+
7
+ import { PatternUtil } from "../../utils/PatternUtil";
8
+
9
+ import { IJsonSchema } from "../../module";
10
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
11
+ import { application_schema } from "./application_schema";
12
+ import { metadata_to_pattern } from "./metadata_to_pattern";
13
+
14
+ /**
15
+ * @internal
16
+ */
17
+ export const application_object =
18
+ (options: ApplicationProgrammer.IOptions) =>
19
+ (components: IJsonComponents) =>
20
+ (key: string, obj: MetadataObject, nullable: boolean): void => {
21
+ // TEMPORARY ASSIGNMENT
22
+ if (components.schemas[key] !== undefined) return;
23
+ components.schemas[key] = {} as any;
24
+
25
+ // ITERATE PROPERTIES
26
+ const properties: Record<string, any> = {};
27
+ const patternProperties: Record<string, any> = {};
28
+ const additionalProperties: IJsonSchema[] = [];
29
+ const required: string[] = [];
30
+
31
+ for (const property of obj.properties) {
32
+ if (
33
+ property.value.functional === true &&
34
+ property.value.nullable === false &&
35
+ property.value.required === true &&
36
+ property.value.size() === 0
37
+ )
38
+ continue;
39
+
40
+ const key: string | null = property.key.getSoleLiteral();
41
+ const value: IJsonSchema | null = application_schema(options)(
42
+ components,
43
+ )(true)(property.value, {
44
+ deprecated:
45
+ !!property.jsDocTags.find(
46
+ (tag) => tag.name === "deprecated",
47
+ ) || undefined,
48
+ title: (() => {
49
+ const info: IJsDocTagInfo | undefined =
50
+ property.jsDocTags.find((tag) => tag.name === "title");
51
+ return info?.text?.length
52
+ ? CommentFactory.generate(info.text)
53
+ : undefined;
54
+ })(),
55
+ description: property.description,
56
+ "x-typia-metaTags": property.tags.length
57
+ ? property.tags
58
+ : undefined,
59
+ "x-typia-jsDocTags": property.jsDocTags.length
60
+ ? property.jsDocTags
61
+ : undefined,
62
+ "x-typia-required": property.value.required,
63
+ });
64
+
65
+ if (value === null) continue;
66
+ else if (key !== null) {
67
+ properties[key] = value;
68
+ if (property.value.required === true) required.push(key);
69
+ } else {
70
+ const pattern: string = metadata_to_pattern(true)(property.key);
71
+ if (
72
+ options.purpose === "swagger" ||
73
+ pattern === PatternUtil.STRING
74
+ )
75
+ additionalProperties.push(value);
76
+ else patternProperties[pattern] = value;
77
+ }
78
+ }
79
+
80
+ const schema: IJsonComponents.IObject = {
81
+ $id:
82
+ options.purpose === "ajv"
83
+ ? options.prefix + "/" + key
84
+ : undefined,
85
+ $recursiveAnchor:
86
+ (options.purpose === "ajv" && obj.recursive) || undefined,
87
+ type: "object",
88
+ properties,
89
+ patternProperties: Object.keys(patternProperties).length
90
+ ? patternProperties
91
+ : undefined,
92
+ additionalProperties: additionalProperties.length
93
+ ? additionalProperties.length === 1
94
+ ? additionalProperties[0]
95
+ : { oneOf: additionalProperties }
96
+ : undefined,
97
+ nullable,
98
+ required: required.length ? required : undefined,
99
+ description: obj.description,
100
+ "x-typia_jsDocTags": obj.jsDocTags,
101
+ };
102
+ components.schemas[key] = schema;
103
+ };
@@ -1,221 +1,228 @@
1
- import { Metadata } from "../../metadata/Metadata";
2
- import { MetadataConstant } from "../../metadata/MetadataConstant";
3
- import { IJsonComponents } from "../../schemas/IJsonComponents";
4
- import { IJsonSchema } from "../../schemas/IJsonSchema";
5
-
6
- import { ArrayUtil } from "../../utils/ArrayUtil";
7
-
8
- import { ApplicationProgrammer } from "../ApplicationProgrammer";
9
- import { AtomicPredicator } from "../helpers/AtomicPredicator";
10
- import { application_array } from "./application_array";
11
- import { application_boolean } from "./application_boolean";
12
- import { application_constant } from "./application_constant";
13
- import { application_native } from "./application_native";
14
- import { application_number } from "./application_number";
15
- import { application_object } from "./application_object";
16
- import { application_string } from "./application_string";
17
- import { application_templates } from "./application_templates";
18
- import { application_tuple } from "./application_tuple";
19
-
20
- /**
21
- * @internal
22
- */
23
- export const application_schema =
24
- (options: ApplicationProgrammer.IOptions) =>
25
- (components: IJsonComponents) =>
26
- <BlockNever extends boolean>(blockNever: BlockNever) =>
27
- (
28
- meta: Metadata,
29
- attribute: IJsonSchema.IAttribute,
30
- ): BlockNever extends true ? IJsonSchema | null : IJsonSchema => {
31
- // VULNERABLE CASE
32
- if (meta.any === true) return {};
33
- else if (meta.nullable && meta.empty())
34
- return { type: "null", ...attribute };
35
-
36
- //----
37
- // GATHER UNION SCHEMAS
38
- //----
39
- const union: IJsonSchema[] = [];
40
-
41
- // toJSON() METHOD
42
- if (meta.resolved !== null) {
43
- const resolved = application_schema(options)(components)(
44
- blockNever,
45
- )(meta.resolved, attribute);
46
- if (resolved !== null) union.push(resolved);
47
- }
48
-
49
- // ATOMIC TYPES
50
- if (meta.templates.length && AtomicPredicator.template(meta))
51
- union.push(application_templates(meta, attribute));
52
- for (const constant of meta.constants) {
53
- if (constant.type === "string" && meta.templates.length) continue;
54
- else if (!AtomicPredicator.constant(meta)(constant.type)) continue;
55
- union.push(
56
- application_constant(constant, meta.nullable, attribute),
57
- );
58
- }
59
- for (const type of meta.atomics) {
60
- union.push(
61
- type === "string"
62
- ? application_string(meta, attribute)
63
- : type === "boolean"
64
- ? application_boolean(meta.nullable, attribute)
65
- : application_number(meta.nullable, attribute),
66
- );
67
- }
68
-
69
- // ARRAY
70
- for (const schema of meta.arrays.values())
71
- union.push(
72
- application_array(options)(components)(
73
- schema,
74
- meta.nullable,
75
- attribute,
76
- ),
77
- );
78
-
79
- // TUPLE
80
- for (const items of meta.tuples)
81
- if (
82
- options.purpose === "ajv" &&
83
- items.every((i) => i.rest === null)
84
- )
85
- union.push(
86
- application_tuple(options)(components)(
87
- items,
88
- meta.nullable,
89
- attribute,
90
- ),
91
- );
92
- else {
93
- // SWAGGER DOES NOT SUPPORT TUPLE TYPE YET
94
- const merged: Metadata = items.reduce((x, y) =>
95
- merge_metadata(x, y),
96
- );
97
- union.push(
98
- application_array(options)(components)(
99
- merged,
100
- merged?.nullable || false,
101
- attribute,
102
- ),
103
- );
104
- }
105
-
106
- // NATIVES
107
- for (const native of meta.natives)
108
- union.push(
109
- application_native(options)(components)(native)(
110
- meta.nullable,
111
- attribute,
112
- ),
113
- );
114
- if (meta.sets.length)
115
- union.push(
116
- application_native(options)(components)(`Set`)(
117
- meta.nullable,
118
- attribute,
119
- ),
120
- );
121
- if (meta.maps.length)
122
- union.push(
123
- application_native(options)(components)(`Map`)(
124
- meta.nullable,
125
- attribute,
126
- ),
127
- );
128
-
129
- // OBJECT
130
- for (const obj of meta.objects) {
131
- const key: string = obj.name + (meta.nullable ? ".Nullable" : "");
132
- application_object(options)(components)(key, obj, meta.nullable);
133
- union.push(
134
- (options.purpose === "ajv" && obj.recursive
135
- ? recursive
136
- : reference)(`${options.prefix}/${key}`, attribute),
137
- );
138
- }
139
-
140
- //----
141
- // RETURNS
142
- //----
143
- if (union.length === 0) return blockNever === true ? null! : {};
144
- else if (union.length === 1) return union[0]!;
145
- return { oneOf: union, ...attribute };
146
- };
147
-
148
- /**
149
- * @internal
150
- */
151
- const reference = (
152
- $ref: string,
153
- attribute: IJsonSchema.IAttribute,
154
- ): IJsonSchema.IReference => ({
155
- $ref,
156
- ...attribute,
157
- });
158
-
159
- /**
160
- * @internal
161
- */
162
- const recursive = (
163
- $recursiveRef: string,
164
- attribute: IJsonSchema.IAttribute,
165
- ): IJsonSchema.IRecursiveReference => ({
166
- $recursiveRef,
167
- ...attribute,
168
- });
169
-
170
- /**
171
- * @internal
172
- * @todo: not perfect
173
- */
174
- function merge_metadata(x: Metadata, y: Metadata): Metadata {
175
- const output: Metadata = Metadata.create({
176
- any: x.any || y.any,
177
- nullable: x.nullable || y.nullable,
178
- required: x.required && y.required,
179
- functional: x.functional || y.functional,
180
-
181
- resolved:
182
- x.resolved !== null && y.resolved !== null
183
- ? merge_metadata(x.resolved, y.resolved)
184
- : x.resolved || y.resolved,
185
- atomics: [...new Set([...x.atomics, ...y.atomics])],
186
- constants: [...x.constants],
187
- templates: x.templates.slice(),
188
-
189
- rest: null,
190
- arrays: x.arrays.slice(),
191
- tuples: x.tuples.slice(),
192
- objects: x.objects.slice(),
193
-
194
- natives: [...new Set([...x.natives, ...y.natives])],
195
- sets: x.sets.slice(),
196
- maps: x.maps.slice(),
197
- });
198
- for (const constant of y.constants) {
199
- const target: MetadataConstant = ArrayUtil.take(
200
- output.constants,
201
- (elem) => elem.type === constant.type,
202
- () => ({
203
- type: constant.type,
204
- values: [],
205
- }),
206
- );
207
- for (const value of constant.values)
208
- ArrayUtil.add(target.values, value);
209
- }
210
- for (const array of y.arrays)
211
- ArrayUtil.set(output.arrays, array, (elem) => elem.getName());
212
- for (const obj of y.objects)
213
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
214
-
215
- if (x.rest !== null)
216
- ArrayUtil.set(output.arrays, x.rest, (elem) => elem.getName());
217
- if (y.rest !== null)
218
- ArrayUtil.set(output.arrays, y.rest, (elem) => elem.getName());
219
-
220
- return output;
221
- }
1
+ import { Metadata } from "../../metadata/Metadata";
2
+ import { MetadataConstant } from "../../metadata/MetadataConstant";
3
+ import { IJsonComponents } from "../../schemas/IJsonComponents";
4
+ import { IJsonSchema } from "../../schemas/IJsonSchema";
5
+
6
+ import { ArrayUtil } from "../../utils/ArrayUtil";
7
+
8
+ import { ApplicationProgrammer } from "../ApplicationProgrammer";
9
+ import { AtomicPredicator } from "../helpers/AtomicPredicator";
10
+ import { application_array } from "./application_array";
11
+ import { application_boolean } from "./application_boolean";
12
+ import { application_constant } from "./application_constant";
13
+ import { application_native } from "./application_native";
14
+ import { application_number } from "./application_number";
15
+ import { application_object } from "./application_object";
16
+ import { application_string } from "./application_string";
17
+ import { application_templates } from "./application_templates";
18
+ import { application_tuple } from "./application_tuple";
19
+
20
+ /**
21
+ * @internal
22
+ */
23
+ export const application_schema =
24
+ (options: ApplicationProgrammer.IOptions) =>
25
+ (components: IJsonComponents) =>
26
+ <BlockNever extends boolean>(blockNever: BlockNever) =>
27
+ (
28
+ meta: Metadata,
29
+ attribute: IJsonSchema.IAttribute,
30
+ ): BlockNever extends true ? IJsonSchema | null : IJsonSchema => {
31
+ // VULNERABLE CASE
32
+ if (meta.any === true) return {};
33
+ else if (meta.nullable && meta.empty())
34
+ return { type: "null", ...attribute };
35
+
36
+ //----
37
+ // GATHER UNION SCHEMAS
38
+ //----
39
+ const union: IJsonSchema[] = [];
40
+
41
+ // toJSON() METHOD
42
+ if (meta.resolved !== null) {
43
+ const resolved = application_schema(options)(components)(
44
+ blockNever,
45
+ )(meta.resolved, attribute);
46
+ if (resolved !== null) union.push(resolved);
47
+ }
48
+
49
+ // ATOMIC TYPES
50
+ if (meta.templates.length && AtomicPredicator.template(meta))
51
+ union.push(application_templates(meta, attribute));
52
+ for (const constant of meta.constants) {
53
+ if (constant.type === "bigint") throw new Error(NO_BIGINT);
54
+ else if (
55
+ (constant.type === "string" && meta.templates.length) ||
56
+ AtomicPredicator.constant(meta)(constant.type) === false
57
+ )
58
+ continue;
59
+ union.push(
60
+ application_constant(constant, meta.nullable, attribute),
61
+ );
62
+ }
63
+ for (const type of meta.atomics) {
64
+ if (type === "bigint") throw new Error(NO_BIGINT);
65
+ union.push(
66
+ type === "string"
67
+ ? application_string(meta, attribute)
68
+ : type === "boolean"
69
+ ? application_boolean(meta.nullable, attribute)
70
+ : application_number(meta.nullable, attribute),
71
+ );
72
+ }
73
+
74
+ // ARRAY
75
+ for (const schema of meta.arrays.values())
76
+ union.push(
77
+ application_array(options)(components)(
78
+ schema,
79
+ meta.nullable,
80
+ attribute,
81
+ ),
82
+ );
83
+
84
+ // TUPLE
85
+ for (const items of meta.tuples)
86
+ if (
87
+ options.purpose === "ajv" &&
88
+ items.every((i) => i.rest === null)
89
+ )
90
+ union.push(
91
+ application_tuple(options)(components)(
92
+ items,
93
+ meta.nullable,
94
+ attribute,
95
+ ),
96
+ );
97
+ else {
98
+ // SWAGGER DOES NOT SUPPORT TUPLE TYPE YET
99
+ const merged: Metadata = items.reduce((x, y) =>
100
+ merge_metadata(x, y),
101
+ );
102
+ union.push(
103
+ application_array(options)(components)(
104
+ merged,
105
+ merged?.nullable || false,
106
+ attribute,
107
+ ),
108
+ );
109
+ }
110
+
111
+ // NATIVES
112
+ for (const native of meta.natives)
113
+ union.push(
114
+ application_native(options)(components)(native)(
115
+ meta.nullable,
116
+ attribute,
117
+ ),
118
+ );
119
+ if (meta.sets.length)
120
+ union.push(
121
+ application_native(options)(components)(`Set`)(
122
+ meta.nullable,
123
+ attribute,
124
+ ),
125
+ );
126
+ if (meta.maps.length)
127
+ union.push(
128
+ application_native(options)(components)(`Map`)(
129
+ meta.nullable,
130
+ attribute,
131
+ ),
132
+ );
133
+
134
+ // OBJECT
135
+ for (const obj of meta.objects) {
136
+ const key: string = obj.name + (meta.nullable ? ".Nullable" : "");
137
+ application_object(options)(components)(key, obj, meta.nullable);
138
+ union.push(
139
+ (options.purpose === "ajv" && obj.recursive
140
+ ? recursive
141
+ : reference)(`${options.prefix}/${key}`, attribute),
142
+ );
143
+ }
144
+
145
+ //----
146
+ // RETURNS
147
+ //----
148
+ if (union.length === 0) return blockNever === true ? null! : {};
149
+ else if (union.length === 1) return union[0]!;
150
+ return { oneOf: union, ...attribute };
151
+ };
152
+
153
+ /**
154
+ * @internal
155
+ */
156
+ const reference = (
157
+ $ref: string,
158
+ attribute: IJsonSchema.IAttribute,
159
+ ): IJsonSchema.IReference => ({
160
+ $ref,
161
+ ...attribute,
162
+ });
163
+
164
+ /**
165
+ * @internal
166
+ */
167
+ const recursive = (
168
+ $recursiveRef: string,
169
+ attribute: IJsonSchema.IAttribute,
170
+ ): IJsonSchema.IRecursiveReference => ({
171
+ $recursiveRef,
172
+ ...attribute,
173
+ });
174
+
175
+ /**
176
+ * @internal
177
+ * @todo: not perfect
178
+ */
179
+ function merge_metadata(x: Metadata, y: Metadata): Metadata {
180
+ const output: Metadata = Metadata.create({
181
+ any: x.any || y.any,
182
+ nullable: x.nullable || y.nullable,
183
+ required: x.required && y.required,
184
+ functional: x.functional || y.functional,
185
+
186
+ resolved:
187
+ x.resolved !== null && y.resolved !== null
188
+ ? merge_metadata(x.resolved, y.resolved)
189
+ : x.resolved || y.resolved,
190
+ atomics: [...new Set([...x.atomics, ...y.atomics])],
191
+ constants: [...x.constants],
192
+ templates: x.templates.slice(),
193
+
194
+ rest: null,
195
+ arrays: x.arrays.slice(),
196
+ tuples: x.tuples.slice(),
197
+ objects: x.objects.slice(),
198
+
199
+ natives: [...new Set([...x.natives, ...y.natives])],
200
+ sets: x.sets.slice(),
201
+ maps: x.maps.slice(),
202
+ });
203
+ for (const constant of y.constants) {
204
+ const target: MetadataConstant = ArrayUtil.take(
205
+ output.constants,
206
+ (elem) => elem.type === constant.type,
207
+ () => ({
208
+ type: constant.type,
209
+ values: [],
210
+ }),
211
+ );
212
+ for (const value of constant.values)
213
+ ArrayUtil.add(target.values, value);
214
+ }
215
+ for (const array of y.arrays)
216
+ ArrayUtil.set(output.arrays, array, (elem) => elem.getName());
217
+ for (const obj of y.objects)
218
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
219
+
220
+ if (x.rest !== null)
221
+ ArrayUtil.set(output.arrays, x.rest, (elem) => elem.getName());
222
+ if (y.rest !== null)
223
+ ArrayUtil.set(output.arrays, y.rest, (elem) => elem.getName());
224
+
225
+ return output;
226
+ }
227
+
228
+ const NO_BIGINT = "Error on typia.application(): does not allow bigint type.";