typia 3.8.9 → 3.9.0-dev.20230604

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 (239) hide show
  1. package/lib/IRandomGenerator.d.ts +1 -0
  2. package/lib/factories/IdentifierFactory.js +2 -1
  3. package/lib/factories/IdentifierFactory.js.map +1 -1
  4. package/lib/factories/MetadataCollection.d.ts +22 -4
  5. package/lib/factories/MetadataCollection.js +121 -28
  6. package/lib/factories/MetadataCollection.js.map +1 -1
  7. package/lib/factories/MetadataFactory.d.ts +1 -0
  8. package/lib/factories/MetadataFactory.js +6 -48
  9. package/lib/factories/MetadataFactory.js.map +1 -1
  10. package/lib/factories/MetadataTagFactory.js +5 -3
  11. package/lib/factories/MetadataTagFactory.js.map +1 -1
  12. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +5 -0
  13. package/lib/factories/internal/metadata/emplace_metadata_array.js +38 -0
  14. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +1 -0
  15. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +5 -0
  16. package/lib/factories/internal/metadata/emplace_metadata_definition.js +38 -0
  17. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -0
  18. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -4
  19. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  20. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +5 -0
  21. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +58 -0
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -0
  23. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  24. package/lib/factories/internal/metadata/explore_metadata.js +11 -34
  25. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  27. package/lib/factories/internal/metadata/iterate_metadata.js +5 -2
  28. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata_array.js +4 -5
  30. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -0
  32. package/lib/factories/internal/metadata/iterate_metadata_collection.js +151 -0
  33. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -0
  34. package/lib/factories/internal/metadata/iterate_metadata_definition.d.ts +5 -0
  35. package/lib/factories/internal/metadata/iterate_metadata_definition.js +24 -0
  36. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -0
  37. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -1
  38. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  39. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +3 -0
  40. package/lib/factories/internal/metadata/iterate_metadata_sort.js +156 -0
  41. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -0
  42. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -26
  43. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  44. package/lib/factories/internal/metadata/iterate_metadata_union.js +3 -3
  45. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  46. package/lib/metadata/IMetadata.d.ts +3 -2
  47. package/lib/metadata/IMetadataAlias.d.ts +10 -0
  48. package/lib/metadata/IMetadataAlias.js +3 -0
  49. package/lib/metadata/IMetadataAlias.js.map +1 -0
  50. package/lib/metadata/IMetadataApplication.d.ts +2 -2
  51. package/lib/metadata/IMetadataArray.d.ts +8 -0
  52. package/lib/metadata/IMetadataArray.js +3 -0
  53. package/lib/metadata/IMetadataArray.js.map +1 -0
  54. package/lib/metadata/IMetadataCollection.d.ts +10 -0
  55. package/lib/metadata/IMetadataCollection.js +3 -0
  56. package/lib/metadata/IMetadataCollection.js.map +1 -0
  57. package/lib/metadata/IMetadataDictionary.js +3 -0
  58. package/lib/metadata/IMetadataDictionary.js.map +1 -0
  59. package/lib/metadata/IMetadataObject.d.ts +3 -0
  60. package/lib/metadata/IMetadataProperty.d.ts +1 -1
  61. package/lib/metadata/IMetadataTuple.d.ts +8 -0
  62. package/lib/metadata/IMetadataTuple.js +3 -0
  63. package/lib/metadata/IMetadataTuple.js.map +1 -0
  64. package/lib/metadata/Metadata.d.ts +24 -21
  65. package/lib/metadata/Metadata.js +323 -262
  66. package/lib/metadata/Metadata.js.map +1 -1
  67. package/lib/metadata/MetadataAlias.d.ts +16 -0
  68. package/lib/metadata/MetadataAlias.js +39 -0
  69. package/lib/metadata/MetadataAlias.js.map +1 -0
  70. package/lib/metadata/MetadataArray.d.ts +12 -0
  71. package/lib/metadata/MetadataArray.js +36 -0
  72. package/lib/metadata/MetadataArray.js.map +1 -0
  73. package/lib/metadata/MetadataObject.d.ts +4 -0
  74. package/lib/metadata/MetadataObject.js +3 -5
  75. package/lib/metadata/MetadataObject.js.map +1 -1
  76. package/lib/metadata/MetadataProperty.d.ts +1 -1
  77. package/lib/metadata/MetadataProperty.js +3 -3
  78. package/lib/metadata/MetadataProperty.js.map +1 -1
  79. package/lib/metadata/MetadataTuple.d.ts +12 -0
  80. package/lib/metadata/MetadataTuple.js +36 -0
  81. package/lib/metadata/MetadataTuple.js.map +1 -0
  82. package/lib/programmers/ApplicationProgrammer.js +3 -3
  83. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  84. package/lib/programmers/AssertProgrammer.js +13 -21
  85. package/lib/programmers/AssertProgrammer.js.map +1 -1
  86. package/lib/programmers/CheckerProgrammer.d.ts +6 -7
  87. package/lib/programmers/CheckerProgrammer.js +276 -185
  88. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  89. package/lib/programmers/CloneProgrammer.js +312 -204
  90. package/lib/programmers/CloneProgrammer.js.map +1 -1
  91. package/lib/programmers/FeatureProgrammer.d.ts +21 -27
  92. package/lib/programmers/FeatureProgrammer.js +60 -63
  93. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  94. package/lib/programmers/IsProgrammer.d.ts +3 -3
  95. package/lib/programmers/IsProgrammer.js +43 -28
  96. package/lib/programmers/IsProgrammer.js.map +1 -1
  97. package/lib/programmers/LiteralsProgrammer.js +1 -0
  98. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  99. package/lib/programmers/PruneProgrammer.js +270 -176
  100. package/lib/programmers/PruneProgrammer.js.map +1 -1
  101. package/lib/programmers/RandomProgrammer.js +124 -32
  102. package/lib/programmers/RandomProgrammer.js.map +1 -1
  103. package/lib/programmers/StringifyProgrammer.js +462 -356
  104. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  105. package/lib/programmers/ValidateProgrammer.js +9 -9
  106. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  107. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  108. package/lib/programmers/helpers/FunctionImporeter.js +17 -2
  109. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  110. package/lib/programmers/helpers/RandomJoiner.d.ts +6 -1
  111. package/lib/programmers/helpers/RandomJoiner.js +11 -14
  112. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  113. package/lib/programmers/helpers/UnionExplorer.d.ts +12 -10
  114. package/lib/programmers/helpers/UnionExplorer.js +47 -12
  115. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  116. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  117. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  118. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  119. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  120. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.d.ts +1 -1
  121. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js +2 -2
  122. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js.map +1 -1
  123. package/lib/programmers/internal/application_array.js +41 -21
  124. package/lib/programmers/internal/application_array.js.map +1 -1
  125. package/lib/programmers/internal/application_boolean.js +1 -1
  126. package/lib/programmers/internal/application_boolean.js.map +1 -1
  127. package/lib/programmers/internal/application_constant.js +2 -2
  128. package/lib/programmers/internal/application_constant.js.map +1 -1
  129. package/lib/programmers/internal/application_default.js +3 -3
  130. package/lib/programmers/internal/application_default.js.map +1 -1
  131. package/lib/programmers/internal/application_definition.d.ts +5 -0
  132. package/lib/programmers/internal/application_definition.js +45 -0
  133. package/lib/programmers/internal/application_definition.js.map +1 -0
  134. package/lib/programmers/internal/application_native.js +14 -11
  135. package/lib/programmers/internal/application_native.js.map +1 -1
  136. package/lib/programmers/internal/application_object.js +19 -14
  137. package/lib/programmers/internal/application_object.js.map +1 -1
  138. package/lib/programmers/internal/application_schema.js +28 -31
  139. package/lib/programmers/internal/application_schema.js.map +1 -1
  140. package/lib/programmers/internal/application_tuple.js +34 -5
  141. package/lib/programmers/internal/application_tuple.js.map +1 -1
  142. package/lib/programmers/internal/check_union_array_like.js +54 -63
  143. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  144. package/lib/programmers/internal/feature_object_entries.js +2 -2
  145. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  146. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +2 -0
  147. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +18 -0
  148. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -0
  149. package/lib/schemas/IJsonApplication.d.ts +0 -4
  150. package/lib/schemas/IJsonComponents.d.ts +16 -4
  151. package/lib/schemas/IJsonSchema.d.ts +1 -1
  152. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  153. package/lib/transformers/FileTransformer.js +3 -3
  154. package/lib/transformers/FileTransformer.js.map +1 -1
  155. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -0
  156. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  157. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +2 -1
  158. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  159. package/lib/utils/ArrayUtil.d.ts +1 -1
  160. package/lib/utils/ArrayUtil.js +2 -1
  161. package/lib/utils/ArrayUtil.js.map +1 -1
  162. package/lib/utils/RandomGenerator.js +2 -3
  163. package/lib/utils/RandomGenerator.js.map +1 -1
  164. package/package.json +6 -1
  165. package/src/IRandomGenerator.ts +1 -0
  166. package/src/factories/IdentifierFactory.ts +3 -1
  167. package/src/factories/MetadataCollection.ts +170 -34
  168. package/src/factories/MetadataFactory.ts +7 -29
  169. package/src/factories/MetadataTagFactory.ts +6 -3
  170. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -0
  171. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -0
  172. package/src/factories/internal/metadata/emplace_metadata_object.ts +4 -4
  173. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -0
  174. package/src/factories/internal/metadata/explore_metadata.ts +18 -44
  175. package/src/factories/internal/metadata/iterate_metadata.ts +13 -3
  176. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -11
  177. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -0
  178. package/src/factories/internal/metadata/iterate_metadata_definition.ts +30 -0
  179. package/src/factories/internal/metadata/iterate_metadata_object.ts +1 -0
  180. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -0
  181. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -31
  182. package/src/factories/internal/metadata/iterate_metadata_union.ts +13 -2
  183. package/src/metadata/IMetadata.ts +3 -2
  184. package/src/metadata/IMetadataAlias.ts +12 -0
  185. package/src/metadata/IMetadataApplication.ts +2 -2
  186. package/src/metadata/IMetadataArray.ts +10 -0
  187. package/src/metadata/IMetadataCollection.ts +11 -0
  188. package/src/metadata/IMetadataDictionary.ts +14 -0
  189. package/src/metadata/IMetadataObject.ts +2 -13
  190. package/src/metadata/IMetadataProperty.ts +1 -1
  191. package/src/metadata/IMetadataTuple.ts +10 -0
  192. package/src/metadata/Metadata.ts +180 -134
  193. package/src/metadata/MetadataAlias.ts +61 -0
  194. package/src/metadata/MetadataArray.ts +52 -0
  195. package/src/metadata/MetadataObject.ts +7 -20
  196. package/src/metadata/MetadataProperty.ts +5 -5
  197. package/src/metadata/MetadataTuple.ts +53 -0
  198. package/src/programmers/ApplicationProgrammer.ts +1 -2
  199. package/src/programmers/AssertProgrammer.ts +45 -39
  200. package/src/programmers/CheckerProgrammer.ts +612 -331
  201. package/src/programmers/CloneProgrammer.ts +344 -138
  202. package/src/programmers/FeatureProgrammer.ts +110 -115
  203. package/src/programmers/IsProgrammer.ts +86 -52
  204. package/src/programmers/LiteralsProgrammer.ts +1 -0
  205. package/src/programmers/PruneProgrammer.ts +304 -101
  206. package/src/programmers/RandomProgrammer.ts +227 -61
  207. package/src/programmers/StringifyProgrammer.ts +374 -182
  208. package/src/programmers/ValidateProgrammer.ts +41 -44
  209. package/src/programmers/helpers/FunctionImporeter.ts +35 -11
  210. package/src/programmers/helpers/RandomJoiner.ts +25 -13
  211. package/src/programmers/helpers/UnionExplorer.ts +76 -50
  212. package/src/programmers/helpers/UnionPredicator.ts +1 -1
  213. package/src/programmers/helpers/disable_function_importer_declare.ts +5 -0
  214. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  215. package/src/programmers/internal/application_array.ts +48 -16
  216. package/src/programmers/internal/application_boolean.ts +1 -1
  217. package/src/programmers/internal/application_constant.ts +2 -2
  218. package/src/programmers/internal/application_default.ts +3 -3
  219. package/src/programmers/internal/application_definition.ts +45 -0
  220. package/src/programmers/internal/application_native.ts +15 -12
  221. package/src/programmers/internal/application_object.ts +17 -12
  222. package/src/programmers/internal/application_schema.ts +31 -65
  223. package/src/programmers/internal/application_tuple.ts +63 -13
  224. package/src/programmers/internal/check_union_array_like.ts +249 -191
  225. package/src/programmers/internal/feature_object_entries.ts +2 -2
  226. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -0
  227. package/src/schemas/IJsonApplication.ts +0 -5
  228. package/src/schemas/IJsonComponents.ts +17 -5
  229. package/src/schemas/IJsonSchema.ts +1 -1
  230. package/src/transformers/CallExpressionTransformer.ts +2 -0
  231. package/src/transformers/FileTransformer.ts +8 -8
  232. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -0
  233. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +2 -1
  234. package/src/utils/ArrayUtil.ts +3 -2
  235. package/src/utils/RandomGenerator.ts +3 -3
  236. package/lib/programmers/internal/check_union_tuple.js +0 -15
  237. package/lib/programmers/internal/check_union_tuple.js.map +0 -1
  238. package/src/programmers/internal/check_union_tuple.ts +0 -33
  239. /package/lib/{programmers/internal/check_union_tuple.d.ts → metadata/IMetadataDictionary.d.ts} +0 -0
@@ -2,7 +2,7 @@ import { IJsonComponents } from "../../schemas/IJsonComponents";
2
2
 
3
3
  import { IJsonSchema } from "../../module";
4
4
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
5
- import { JSON_SCHEMA_PREFIX } from "./JSON_SCHEMA_PREFIX";
5
+ import { JSON_COMPONENTS_PREFIX } from "./JSON_SCHEMA_PREFIX";
6
6
 
7
7
  /**
8
8
  * @internal
@@ -19,18 +19,21 @@ export const application_native =
19
19
  options.purpose === "ajv"
20
20
  ? name
21
21
  : `${name}${props.nullable ? ".Nullable" : ""}`;
22
- components.schemas[key] ??= {
23
- type: "object",
24
- $id:
25
- options.purpose === "ajv"
26
- ? `${JSON_SCHEMA_PREFIX}/${key}`
27
- : undefined,
28
- properties: {},
29
- nullable:
30
- options.purpose === "swagger" ? props.nullable : undefined,
31
- };
22
+ if (components.objects?.[key] === undefined) {
23
+ components.objects ??= {};
24
+ components.objects[key] ??= {
25
+ type: "object",
26
+ $id:
27
+ options.purpose === "ajv"
28
+ ? `${JSON_COMPONENTS_PREFIX}/objects/${key}`
29
+ : undefined,
30
+ properties: {},
31
+ nullable:
32
+ options.purpose === "swagger" ? props.nullable : undefined,
33
+ };
34
+ }
32
35
  return {
33
36
  ...props.attribute,
34
- $ref: `${JSON_SCHEMA_PREFIX}/${key}`,
37
+ $ref: `${JSON_COMPONENTS_PREFIX}/objects/${key}`,
35
38
  };
36
39
  };
@@ -9,7 +9,7 @@ import { PatternUtil } from "../../utils/PatternUtil";
9
9
 
10
10
  import { IJsonSchema } from "../../module";
11
11
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
12
- import { JSON_SCHEMA_PREFIX } from "./JSON_SCHEMA_PREFIX";
12
+ import { JSON_COMPONENTS_PREFIX } from "./JSON_SCHEMA_PREFIX";
13
13
  import { application_schema } from "./application_schema";
14
14
  import { metadata_to_pattern } from "./metadata_to_pattern";
15
15
 
@@ -20,15 +20,23 @@ export const application_object =
20
20
  (options: ApplicationProgrammer.IOptions) =>
21
21
  (components: IJsonComponents) =>
22
22
  (obj: MetadataObject) =>
23
- (nullable: boolean): string => {
24
- const key =
23
+ (
24
+ nullable: boolean,
25
+ ): IJsonSchema.IReference | IJsonSchema.IRecursiveReference => {
26
+ const key: string =
25
27
  options.purpose === "ajv"
26
28
  ? obj.name
27
29
  : `${obj.name}${nullable ? ".Nullable" : ""}`;
30
+ const $id: string = `${JSON_COMPONENTS_PREFIX}/objects/${key}`;
31
+ const out = () =>
32
+ options.purpose === "ajv" && obj.recursive
33
+ ? { $recursiveRef: $id }
34
+ : { $ref: $id };
28
35
 
29
36
  // TEMPORARY ASSIGNMENT
30
- if (components.schemas[key] !== undefined) return key;
31
- components.schemas[key] = {} as any;
37
+ if (components.objects?.[key] !== undefined) return out();
38
+ components.objects ??= {};
39
+ components.objects[key] = {} as any;
32
40
 
33
41
  // ITERATE PROPERTIES
34
42
  const properties: Record<string, any> = {};
@@ -62,7 +70,7 @@ export const application_object =
62
70
  ? CommentFactory.merge(info.text)
63
71
  : undefined;
64
72
  })(),
65
- description: property.description,
73
+ description: property.description ?? undefined,
66
74
  "x-typia-metaTags": property.tags.length
67
75
  ? property.tags
68
76
  : undefined,
@@ -103,10 +111,7 @@ export const application_object =
103
111
  })(),
104
112
  };
105
113
  const schema: IJsonComponents.IObject = {
106
- $id:
107
- options.purpose === "ajv"
108
- ? `${JSON_SCHEMA_PREFIX}/${key}`
109
- : undefined,
114
+ $id: options.purpose === "ajv" ? $id : undefined,
110
115
  $recursiveAnchor:
111
116
  (options.purpose === "ajv" && obj.recursive) || undefined,
112
117
  type: "object",
@@ -126,8 +131,8 @@ export const application_object =
126
131
  join(options)(components)(extraMeta),
127
132
  }),
128
133
  };
129
- components.schemas[key] = schema;
130
- return key;
134
+ components.objects[key] = schema;
135
+ return out();
131
136
  };
132
137
 
133
138
  const join =
@@ -4,10 +4,10 @@ import { IJsonSchema } from "../../schemas/IJsonSchema";
4
4
 
5
5
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
6
  import { AtomicPredicator } from "../helpers/AtomicPredicator";
7
- import { JSON_SCHEMA_PREFIX } from "./JSON_SCHEMA_PREFIX";
8
7
  import { application_array } from "./application_array";
9
8
  import { application_boolean } from "./application_boolean";
10
9
  import { application_constant } from "./application_constant";
10
+ import { application_definition } from "./application_definition";
11
11
  import { application_native } from "./application_native";
12
12
  import { application_number } from "./application_number";
13
13
  import { application_object } from "./application_object";
@@ -47,11 +47,13 @@ export const application_schema =
47
47
 
48
48
  const insert =
49
49
  meta.nullable && options.purpose === "swagger"
50
- ? (significant: IJsonSchema.ISignificant<any>) =>
50
+ ? (s: IJsonSchema) =>
51
51
  union.push({
52
- ...significant,
53
- nullable: true,
54
- })
52
+ ...s,
53
+ nullable: (s as IJsonSchema.ISignificant<any>).type
54
+ ? true
55
+ : undefined,
56
+ } as IJsonSchema)
55
57
  : (schema: IJsonSchema) => union.push(schema);
56
58
 
57
59
  // toJSON() METHOD
@@ -86,34 +88,20 @@ export const application_schema =
86
88
  );
87
89
 
88
90
  // ARRAY
89
- for (const schema of meta.arrays.values())
90
- insert(application_array(options)(components)()(schema)(attribute));
91
+ for (const array of meta.arrays)
92
+ insert(
93
+ application_array(options)(components)(array)(attribute)(
94
+ meta.nullable,
95
+ ),
96
+ );
91
97
 
92
98
  // TUPLE
93
- for (const items of meta.tuples) {
94
- const tuple: IJsonSchema.ITuple =
95
- application_tuple(options)(components)(items)(attribute);
96
- if (options.purpose === "swagger" && items.length === 0)
97
- throw new Error(
98
- "Error on typia.application(): swagger does not support zero length tuple type.",
99
- );
100
- else if (
101
- options.purpose === "ajv" &&
102
- !items[items.length - 1]?.rest
103
- )
104
- insert(tuple);
105
- else {
106
- // SWAGGER DOES NOT SUPPORT TUPLE TYPE YET
107
- const merged: Metadata = items.reduce((x, y) =>
108
- Metadata.merge(x, y),
109
- );
110
- insert(
111
- application_array(options)(components)(tuple)(merged)(
112
- attribute,
113
- ),
114
- );
115
- }
116
- }
99
+ for (const tuple of meta.tuples)
100
+ insert(
101
+ application_tuple(options)(components)(tuple)(attribute)(
102
+ meta.nullable,
103
+ ),
104
+ );
117
105
 
118
106
  // NATIVES
119
107
  for (const native of meta.natives)
@@ -126,21 +114,21 @@ export const application_schema =
126
114
  : application_number(attribute),
127
115
  );
128
116
  else
129
- union.push(
117
+ insert(
130
118
  application_native(options)(components)(native)({
131
119
  nullable: meta.nullable,
132
120
  attribute,
133
121
  }),
134
122
  );
135
123
  if (meta.sets.length)
136
- union.push(
124
+ insert(
137
125
  application_native(options)(components)(`Set`)({
138
126
  nullable: meta.nullable,
139
127
  attribute,
140
128
  }),
141
129
  );
142
130
  if (meta.maps.length)
143
- union.push(
131
+ insert(
144
132
  application_native(options)(components)(`Map`)({
145
133
  nullable: meta.nullable,
146
134
  attribute,
@@ -148,16 +136,16 @@ export const application_schema =
148
136
  );
149
137
 
150
138
  // OBJECT
151
- for (const obj of meta.objects) {
152
- const key: string = application_object(options)(components)(obj)(
153
- meta.nullable,
154
- );
155
- union.push(
156
- (options.purpose === "ajv" && obj.recursive
157
- ? recursive
158
- : reference)(`${JSON_SCHEMA_PREFIX}/${key}`, attribute),
139
+ for (const obj of meta.objects)
140
+ insert(application_object(options)(components)(obj)(meta.nullable));
141
+
142
+ // ALIASES
143
+ for (const alias of meta.aliases)
144
+ insert(
145
+ application_definition(options)(blockNever)(components)(alias)(
146
+ meta.nullable,
147
+ ),
159
148
  );
160
- }
161
149
 
162
150
  //----
163
151
  // RETURNS
@@ -173,26 +161,4 @@ export const application_schema =
173
161
  return { oneOf: union, ...attribute };
174
162
  };
175
163
 
176
- /**
177
- * @internal
178
- */
179
- const reference = (
180
- $ref: string,
181
- attribute: IJsonSchema.IAttribute,
182
- ): IJsonSchema.IReference => ({
183
- $ref,
184
- ...attribute,
185
- });
186
-
187
- /**
188
- * @internal
189
- */
190
- const recursive = (
191
- $recursiveRef: string,
192
- attribute: IJsonSchema.IAttribute,
193
- ): IJsonSchema.IRecursiveReference => ({
194
- $recursiveRef,
195
- ...attribute,
196
- });
197
-
198
164
  const NO_BIGINT = "Error on typia.application(): does not allow bigint type.";
@@ -1,8 +1,10 @@
1
1
  import { Metadata } from "../../metadata/Metadata";
2
+ import { MetadataTuple } from "../../metadata/MetadataTuple";
2
3
  import { IJsonComponents } from "../../schemas/IJsonComponents";
3
4
  import { IJsonSchema } from "../../schemas/IJsonSchema";
4
5
 
5
6
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
7
+ import { JSON_COMPONENTS_PREFIX } from "./JSON_SCHEMA_PREFIX";
6
8
  import { application_schema } from "./application_schema";
7
9
 
8
10
  /**
@@ -11,17 +13,65 @@ import { application_schema } from "./application_schema";
11
13
  export const application_tuple =
12
14
  (options: ApplicationProgrammer.IOptions) =>
13
15
  (components: IJsonComponents) =>
14
- (items: Array<Metadata>) =>
15
- (attribute: IJsonSchema.IAttribute): IJsonSchema.ITuple => ({
16
- type: "array",
17
- items: items.map((meta, i) =>
18
- application_schema(options)(false)(components)(meta.rest ?? meta)({
16
+ (tuple: MetadataTuple) =>
17
+ (attribute: IJsonSchema.IAttribute) =>
18
+ (
19
+ nullable: boolean,
20
+ ):
21
+ | IJsonSchema.ITuple
22
+ | IJsonSchema.IArray
23
+ | IJsonSchema.IReference
24
+ | IJsonSchema.IRecursiveReference => {
25
+ const generator = () => {
26
+ const schema: IJsonSchema.ITuple = {
19
27
  ...attribute,
20
- "x-typia-rest":
21
- i === items.length - 1 ? meta.rest !== null : undefined,
22
- "x-typia-required": meta.required,
23
- "x-typia-optional": meta.optional,
24
- }),
25
- ),
26
- ...attribute,
27
- });
28
+ type: "array",
29
+ items: tuple.elements.map((elem) =>
30
+ application_schema(options)(false)(components)(
31
+ elem.rest ?? elem,
32
+ )(tuple.recursive ? {} : attribute),
33
+ ),
34
+ "x-typia-rest": !!tuple.elements.at(-1)?.rest,
35
+ };
36
+ const wrapper: IJsonSchema.ITuple | IJsonSchema.IArray =
37
+ options.purpose === "ajv" && !tuple.elements.at(-1)?.rest
38
+ ? schema
39
+ : {
40
+ ...schema,
41
+ items: application_schema(options)(false)(components)(
42
+ tuple.elements.reduce(
43
+ (x, y) =>
44
+ Metadata.merge(x.rest ?? x, y.rest ?? y),
45
+ Metadata.initialize(),
46
+ ),
47
+ )(tuple.recursive ? {} : attribute),
48
+ "x-typia-tuple": schema,
49
+ };
50
+ return wrapper;
51
+ };
52
+ if (tuple.recursive === false) return generator();
53
+
54
+ // KEY
55
+ const key: string =
56
+ options.purpose === "ajv"
57
+ ? tuple.name
58
+ : `${tuple.name}${nullable ? ".Nullable" : ""}`;
59
+ const $id: string = `${JSON_COMPONENTS_PREFIX}/tuples/${key}`;
60
+
61
+ // REFERENCE
62
+ if (components.tuples?.[key] === undefined) {
63
+ components.tuples ??= {};
64
+ components.tuples[key] = {} as any;
65
+
66
+ const repeated: IJsonComponents.IArray | IJsonComponents.ITuple = {
67
+ ...generator(),
68
+ $id: options.purpose === "ajv" ? $id : undefined,
69
+ $recursiveAnchor: options.purpose === "ajv" || undefined,
70
+ };
71
+ components.tuples ??= {};
72
+ components.tuples[key] = repeated;
73
+ }
74
+ return options.purpose === "ajv" && tuple.recursive
75
+ ? { ...attribute, $recursiveRef: $id }
76
+ : { ...attribute, $ref: $id };
77
+ };