typia 3.8.8 → 3.9.0-dev.20230603

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 (233) hide show
  1. package/lib/IRandomGenerator.d.ts +1 -0
  2. package/lib/factories/CommentFactory.js +2 -1
  3. package/lib/factories/CommentFactory.js.map +1 -1
  4. package/lib/factories/IdentifierFactory.js +2 -1
  5. package/lib/factories/IdentifierFactory.js.map +1 -1
  6. package/lib/factories/MetadataCollection.d.ts +22 -4
  7. package/lib/factories/MetadataCollection.js +121 -28
  8. package/lib/factories/MetadataCollection.js.map +1 -1
  9. package/lib/factories/MetadataFactory.d.ts +1 -0
  10. package/lib/factories/MetadataFactory.js +6 -48
  11. package/lib/factories/MetadataFactory.js.map +1 -1
  12. package/lib/factories/MetadataTagFactory.js +5 -3
  13. package/lib/factories/MetadataTagFactory.js.map +1 -1
  14. package/lib/factories/internal/metadata/emplace_metadata_array.d.ts +5 -0
  15. package/lib/factories/internal/metadata/emplace_metadata_array.js +38 -0
  16. package/lib/factories/internal/metadata/emplace_metadata_array.js.map +1 -0
  17. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +5 -0
  18. package/lib/factories/internal/metadata/emplace_metadata_definition.js +38 -0
  19. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -0
  20. package/lib/factories/internal/metadata/emplace_metadata_object.js +4 -4
  21. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -1
  22. package/lib/factories/internal/metadata/emplace_metadata_tuple.d.ts +5 -0
  23. package/lib/factories/internal/metadata/emplace_metadata_tuple.js +58 -0
  24. package/lib/factories/internal/metadata/emplace_metadata_tuple.js.map +1 -0
  25. package/lib/factories/internal/metadata/explore_metadata.d.ts +1 -1
  26. package/lib/factories/internal/metadata/explore_metadata.js +11 -34
  27. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -1
  28. package/lib/factories/internal/metadata/iterate_metadata.d.ts +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata.js +5 -2
  30. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -1
  31. package/lib/factories/internal/metadata/iterate_metadata_array.js +4 -5
  32. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -1
  33. package/lib/factories/internal/metadata/iterate_metadata_collection.d.ts +2 -0
  34. package/lib/factories/internal/metadata/iterate_metadata_collection.js +151 -0
  35. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -0
  36. package/lib/factories/internal/metadata/iterate_metadata_definition.d.ts +5 -0
  37. package/lib/factories/internal/metadata/iterate_metadata_definition.js +24 -0
  38. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -0
  39. package/lib/factories/internal/metadata/iterate_metadata_object.js +1 -1
  40. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_sort.d.ts +3 -0
  42. package/lib/factories/internal/metadata/iterate_metadata_sort.js +156 -0
  43. package/lib/factories/internal/metadata/iterate_metadata_sort.js.map +1 -0
  44. package/lib/factories/internal/metadata/iterate_metadata_tuple.js +3 -26
  45. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -1
  46. package/lib/factories/internal/metadata/iterate_metadata_union.js +3 -3
  47. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -1
  48. package/lib/metadata/IMetadata.d.ts +3 -2
  49. package/lib/metadata/IMetadataApplication.d.ts +2 -2
  50. package/lib/metadata/IMetadataArray.d.ts +8 -0
  51. package/lib/metadata/IMetadataArray.js +3 -0
  52. package/lib/metadata/IMetadataArray.js.map +1 -0
  53. package/lib/metadata/IMetadataCollection.d.ts +10 -0
  54. package/lib/metadata/IMetadataCollection.js +3 -0
  55. package/lib/metadata/IMetadataCollection.js.map +1 -0
  56. package/lib/metadata/IMetadataDefinition.d.ts +10 -0
  57. package/lib/metadata/IMetadataDefinition.js +3 -0
  58. package/lib/metadata/IMetadataDefinition.js.map +1 -0
  59. package/lib/metadata/IMetadataDictionary.js +3 -0
  60. package/lib/metadata/IMetadataDictionary.js.map +1 -0
  61. package/lib/metadata/IMetadataObject.d.ts +3 -0
  62. package/lib/metadata/IMetadataProperty.d.ts +1 -1
  63. package/lib/metadata/IMetadataTuple.d.ts +8 -0
  64. package/lib/metadata/IMetadataTuple.js +3 -0
  65. package/lib/metadata/IMetadataTuple.js.map +1 -0
  66. package/lib/metadata/Metadata.d.ts +24 -21
  67. package/lib/metadata/Metadata.js +323 -262
  68. package/lib/metadata/Metadata.js.map +1 -1
  69. package/lib/metadata/MetadataArray.d.ts +12 -0
  70. package/lib/metadata/MetadataArray.js +36 -0
  71. package/lib/metadata/MetadataArray.js.map +1 -0
  72. package/lib/metadata/MetadataDefinition.d.ts +16 -0
  73. package/lib/metadata/MetadataDefinition.js +39 -0
  74. package/lib/metadata/MetadataDefinition.js.map +1 -0
  75. package/lib/metadata/MetadataObject.d.ts +4 -0
  76. package/lib/metadata/MetadataObject.js +3 -5
  77. package/lib/metadata/MetadataObject.js.map +1 -1
  78. package/lib/metadata/MetadataProperty.d.ts +1 -1
  79. package/lib/metadata/MetadataProperty.js +3 -3
  80. package/lib/metadata/MetadataProperty.js.map +1 -1
  81. package/lib/metadata/MetadataTuple.d.ts +12 -0
  82. package/lib/metadata/MetadataTuple.js +36 -0
  83. package/lib/metadata/MetadataTuple.js.map +1 -0
  84. package/lib/programmers/ApplicationProgrammer.js +3 -3
  85. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  86. package/lib/programmers/AssertProgrammer.js +13 -21
  87. package/lib/programmers/AssertProgrammer.js.map +1 -1
  88. package/lib/programmers/CheckerProgrammer.d.ts +6 -7
  89. package/lib/programmers/CheckerProgrammer.js +276 -185
  90. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  91. package/lib/programmers/CloneProgrammer.js +312 -204
  92. package/lib/programmers/CloneProgrammer.js.map +1 -1
  93. package/lib/programmers/FeatureProgrammer.d.ts +21 -27
  94. package/lib/programmers/FeatureProgrammer.js +60 -63
  95. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  96. package/lib/programmers/IsProgrammer.d.ts +3 -3
  97. package/lib/programmers/IsProgrammer.js +43 -28
  98. package/lib/programmers/IsProgrammer.js.map +1 -1
  99. package/lib/programmers/LiteralsProgrammer.js +1 -0
  100. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  101. package/lib/programmers/PruneProgrammer.js +270 -176
  102. package/lib/programmers/PruneProgrammer.js.map +1 -1
  103. package/lib/programmers/RandomProgrammer.js +124 -32
  104. package/lib/programmers/RandomProgrammer.js.map +1 -1
  105. package/lib/programmers/StringifyProgrammer.js +462 -356
  106. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  107. package/lib/programmers/ValidateProgrammer.js +9 -9
  108. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  109. package/lib/programmers/helpers/FunctionImporeter.d.ts +2 -0
  110. package/lib/programmers/helpers/FunctionImporeter.js +17 -2
  111. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  112. package/lib/programmers/helpers/RandomJoiner.d.ts +6 -1
  113. package/lib/programmers/helpers/RandomJoiner.js +11 -14
  114. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  115. package/lib/programmers/helpers/UnionExplorer.d.ts +12 -10
  116. package/lib/programmers/helpers/UnionExplorer.js +47 -12
  117. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  118. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  119. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  120. package/lib/programmers/helpers/disable_function_importer_declare.js +1 -0
  121. package/lib/programmers/helpers/disable_function_importer_declare.js.map +1 -1
  122. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.d.ts +1 -1
  123. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js +2 -2
  124. package/lib/programmers/internal/JSON_SCHEMA_PREFIX.js.map +1 -1
  125. package/lib/programmers/internal/application_array.js +41 -21
  126. package/lib/programmers/internal/application_array.js.map +1 -1
  127. package/lib/programmers/internal/application_definition.d.ts +5 -0
  128. package/lib/programmers/internal/application_definition.js +45 -0
  129. package/lib/programmers/internal/application_definition.js.map +1 -0
  130. package/lib/programmers/internal/application_native.js +14 -11
  131. package/lib/programmers/internal/application_native.js.map +1 -1
  132. package/lib/programmers/internal/application_object.js +19 -14
  133. package/lib/programmers/internal/application_object.js.map +1 -1
  134. package/lib/programmers/internal/application_schema.js +28 -31
  135. package/lib/programmers/internal/application_schema.js.map +1 -1
  136. package/lib/programmers/internal/application_tuple.js +34 -5
  137. package/lib/programmers/internal/application_tuple.js.map +1 -1
  138. package/lib/programmers/internal/check_union_array_like.js +54 -63
  139. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  140. package/lib/programmers/internal/feature_object_entries.js +2 -2
  141. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  142. package/lib/programmers/internal/wrap_metadata_rest_tuple.d.ts +2 -0
  143. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +18 -0
  144. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -0
  145. package/lib/schemas/IJsonApplication.d.ts +0 -4
  146. package/lib/schemas/IJsonComponents.d.ts +16 -4
  147. package/lib/schemas/IJsonSchema.d.ts +1 -1
  148. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  149. package/lib/transformers/FileTransformer.js +3 -3
  150. package/lib/transformers/FileTransformer.js.map +1 -1
  151. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -0
  152. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  153. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +2 -1
  154. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  155. package/lib/utils/ArrayUtil.d.ts +1 -1
  156. package/lib/utils/ArrayUtil.js +2 -1
  157. package/lib/utils/ArrayUtil.js.map +1 -1
  158. package/lib/utils/RandomGenerator.js +2 -3
  159. package/lib/utils/RandomGenerator.js.map +1 -1
  160. package/package.json +6 -1
  161. package/src/IRandomGenerator.ts +1 -0
  162. package/src/factories/CommentFactory.ts +2 -1
  163. package/src/factories/IdentifierFactory.ts +3 -1
  164. package/src/factories/MetadataCollection.ts +173 -34
  165. package/src/factories/MetadataFactory.ts +7 -29
  166. package/src/factories/MetadataTagFactory.ts +6 -3
  167. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -0
  168. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -0
  169. package/src/factories/internal/metadata/emplace_metadata_object.ts +4 -4
  170. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -0
  171. package/src/factories/internal/metadata/explore_metadata.ts +18 -44
  172. package/src/factories/internal/metadata/iterate_metadata.ts +13 -3
  173. package/src/factories/internal/metadata/iterate_metadata_array.ts +7 -11
  174. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -0
  175. package/src/factories/internal/metadata/iterate_metadata_definition.ts +34 -0
  176. package/src/factories/internal/metadata/iterate_metadata_object.ts +1 -0
  177. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -0
  178. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +7 -31
  179. package/src/factories/internal/metadata/iterate_metadata_union.ts +13 -2
  180. package/src/metadata/IMetadata.ts +3 -2
  181. package/src/metadata/IMetadataApplication.ts +2 -2
  182. package/src/metadata/IMetadataArray.ts +10 -0
  183. package/src/metadata/IMetadataCollection.ts +11 -0
  184. package/src/metadata/IMetadataDefinition.ts +12 -0
  185. package/src/metadata/IMetadataDictionary.ts +14 -0
  186. package/src/metadata/IMetadataObject.ts +2 -13
  187. package/src/metadata/IMetadataProperty.ts +1 -1
  188. package/src/metadata/IMetadataTuple.ts +10 -0
  189. package/src/metadata/Metadata.ts +473 -134
  190. package/src/metadata/MetadataArray.ts +52 -0
  191. package/src/metadata/MetadataDefinition.ts +65 -0
  192. package/src/metadata/MetadataObject.ts +7 -20
  193. package/src/metadata/MetadataProperty.ts +5 -5
  194. package/src/metadata/MetadataTuple.ts +53 -0
  195. package/src/programmers/ApplicationProgrammer.ts +1 -2
  196. package/src/programmers/AssertProgrammer.ts +45 -39
  197. package/src/programmers/CheckerProgrammer.ts +612 -331
  198. package/src/programmers/CloneProgrammer.ts +344 -138
  199. package/src/programmers/FeatureProgrammer.ts +110 -115
  200. package/src/programmers/IsProgrammer.ts +86 -52
  201. package/src/programmers/LiteralsProgrammer.ts +1 -0
  202. package/src/programmers/PruneProgrammer.ts +304 -101
  203. package/src/programmers/RandomProgrammer.ts +227 -61
  204. package/src/programmers/StringifyProgrammer.ts +374 -182
  205. package/src/programmers/ValidateProgrammer.ts +41 -44
  206. package/src/programmers/helpers/FunctionImporeter.ts +35 -11
  207. package/src/programmers/helpers/RandomJoiner.ts +25 -13
  208. package/src/programmers/helpers/UnionExplorer.ts +76 -50
  209. package/src/programmers/helpers/UnionPredicator.ts +1 -1
  210. package/src/programmers/helpers/disable_function_importer_declare.ts +5 -0
  211. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  212. package/src/programmers/internal/application_array.ts +48 -16
  213. package/src/programmers/internal/application_definition.ts +45 -0
  214. package/src/programmers/internal/application_native.ts +15 -12
  215. package/src/programmers/internal/application_object.ts +17 -12
  216. package/src/programmers/internal/application_schema.ts +31 -65
  217. package/src/programmers/internal/application_tuple.ts +63 -13
  218. package/src/programmers/internal/check_union_array_like.ts +249 -191
  219. package/src/programmers/internal/feature_object_entries.ts +2 -2
  220. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -0
  221. package/src/schemas/IJsonApplication.ts +0 -5
  222. package/src/schemas/IJsonComponents.ts +17 -5
  223. package/src/schemas/IJsonSchema.ts +1 -1
  224. package/src/transformers/CallExpressionTransformer.ts +2 -0
  225. package/src/transformers/FileTransformer.ts +8 -8
  226. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -0
  227. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +2 -1
  228. package/src/utils/ArrayUtil.ts +3 -2
  229. package/src/utils/RandomGenerator.ts +3 -3
  230. package/lib/programmers/internal/check_union_tuple.js +0 -15
  231. package/lib/programmers/internal/check_union_tuple.js.map +0 -1
  232. package/src/programmers/internal/check_union_tuple.ts +0 -33
  233. /package/lib/{programmers/internal/check_union_tuple.d.ts → metadata/IMetadataDictionary.d.ts} +0 -0
@@ -1,7 +1,13 @@
1
1
  import ts from "typescript";
2
2
 
3
+ import { IMetadataCollection } from "../metadata/IMetadataCollection";
3
4
  import { Metadata } from "../metadata/Metadata";
5
+ import { MetadataArray } from "../metadata/MetadataArray";
6
+ import { MetadataDefinition } from "../metadata/MetadataDefinition";
4
7
  import { MetadataObject } from "../metadata/MetadataObject";
8
+ import { MetadataTuple } from "../metadata/MetadataTuple";
9
+
10
+ import { Writable } from "../typings/Writable";
5
11
 
6
12
  import { MapUtil } from "../utils/MapUtil";
7
13
 
@@ -9,78 +15,211 @@ import { CommentFactory } from "./CommentFactory";
9
15
  import { TypeFactory } from "./TypeFactory";
10
16
 
11
17
  export class MetadataCollection {
12
- private readonly dict_: Map<ts.Type, MetadataObject>;
18
+ private readonly objects_: Map<ts.Type, MetadataObject>;
19
+ private readonly object_unions_: Map<string, MetadataObject[]>;
20
+ private readonly definitions_: Map<ts.Type, MetadataDefinition>;
21
+ private readonly arrays_: Map<ts.Type, MetadataArray>;
22
+ private readonly tuples_: Map<ts.Type, MetadataTuple>;
23
+
13
24
  private readonly names_: Map<string, Map<ts.Type, string>>;
14
- private readonly unions_: Map<string, MetadataObject[]>;
15
- private index_: number;
25
+ private object_index_: number;
26
+ private recursive_array_index_: number;
27
+ private recursive_tuple_index_: number;
16
28
 
17
29
  public constructor(
18
30
  private readonly options?: Partial<MetadataCollection.IOptions>,
19
31
  ) {
20
- this.dict_ = new Map();
32
+ this.objects_ = new Map();
33
+ this.object_unions_ = new Map();
34
+ this.definitions_ = new Map();
35
+ this.arrays_ = new Map();
36
+ this.tuples_ = new Map();
37
+
21
38
  this.names_ = new Map();
22
- this.unions_ = new Map();
23
- this.index_ = 0;
39
+ this.object_index_ = 0;
40
+ this.recursive_array_index_ = 0;
41
+ this.recursive_tuple_index_ = 0;
42
+ }
43
+
44
+ /* -----------------------------------------------------------
45
+ ACCESSORS
46
+ ----------------------------------------------------------- */
47
+ public definitions(): MetadataDefinition[] {
48
+ return [...this.definitions_.values()];
24
49
  }
25
50
 
26
51
  public objects(): MetadataObject[] {
27
- return [...this.dict_.values()];
52
+ return [...this.objects_.values()];
28
53
  }
54
+
29
55
  public unions(): MetadataObject[][] {
30
- return [...this.unions_.values()];
56
+ return [...this.object_unions_.values()];
31
57
  }
32
58
 
59
+ public arrays(): MetadataArray[] {
60
+ return [...this.arrays_.values()];
61
+ }
62
+
63
+ public tuples(): MetadataTuple[] {
64
+ return [...this.tuples_.values()];
65
+ }
66
+
67
+ private getName(checker: ts.TypeChecker, type: ts.Type): string {
68
+ const name: string = (() => {
69
+ const str: string = TypeFactory.getFullName(checker)(type);
70
+ return this.options?.replace ? this.options.replace(str) : str;
71
+ })();
72
+
73
+ const duplicates: Map<ts.Type, string> = MapUtil.take(this.names_)(
74
+ name,
75
+ () => new Map(),
76
+ );
77
+ const oldbie: string | undefined = duplicates.get(type);
78
+ if (oldbie !== undefined) return oldbie;
79
+
80
+ const addicted: string = duplicates.size
81
+ ? `${name}.o${duplicates.size}`
82
+ : name;
83
+ duplicates.set(type, addicted);
84
+ return addicted;
85
+ }
86
+
87
+ /**
88
+ * @internal
89
+ */
90
+ public getUnionIndex(meta: Metadata): number {
91
+ const key: string = meta.objects.map((obj) => obj.name).join(" | ");
92
+ MapUtil.take(this.object_unions_)(key, () => meta.objects);
93
+ return [...this.object_unions_.keys()].indexOf(key);
94
+ }
95
+
96
+ /* -----------------------------------------------------------
97
+ INSTANCES
98
+ ----------------------------------------------------------- */
33
99
  public emplace(
34
100
  checker: ts.TypeChecker,
35
101
  type: ts.Type,
36
102
  ): [MetadataObject, boolean] {
37
- const oldbie = this.dict_.get(type);
103
+ const oldbie = this.objects_.get(type);
38
104
  if (oldbie !== undefined) return [oldbie, false];
39
105
 
40
- const $id: string = this.get_name(checker, type);
106
+ const $id: string = this.getName(checker, type);
41
107
  const obj: MetadataObject = MetadataObject.create({
42
108
  name: $id,
43
109
  properties: [],
44
110
  description:
45
111
  (type.symbol && CommentFactory.description(type.symbol)) ??
46
112
  undefined,
47
- jsDocTags: type.symbol?.getJsDocTags() || [],
113
+ jsDocTags: type.symbol?.getJsDocTags() ?? [],
48
114
  validated: false,
49
- index: this.index_++,
50
- recursive: false,
115
+ index: this.object_index_++,
116
+ recursive: null!,
51
117
  nullables: [],
52
118
  });
53
- this.dict_.set(type, obj);
119
+ this.objects_.set(type, obj);
54
120
  return [obj, true];
55
121
  }
56
122
 
123
+ public emplaceDefinition(
124
+ checker: ts.TypeChecker,
125
+ type: ts.Type,
126
+ symbol: ts.Symbol,
127
+ ): [MetadataDefinition, boolean, (meta: Metadata) => void] {
128
+ const oldbie = this.definitions_.get(type);
129
+ if (oldbie !== undefined) return [oldbie, false, () => {}];
130
+
131
+ const $id: string = this.getName(checker, type);
132
+ const def: MetadataDefinition = MetadataDefinition.create({
133
+ name: $id,
134
+ value: null!,
135
+ description: CommentFactory.description(symbol) ?? null,
136
+ recursive: null!,
137
+ nullables: [],
138
+ jsDocTags: symbol.getJsDocTags() ?? [],
139
+ });
140
+ this.definitions_.set(type, def);
141
+ return [def, true, (meta) => (Writable(def).value = meta)];
142
+ }
143
+
144
+ public emplaceArray(
145
+ checker: ts.TypeChecker,
146
+ type: ts.Type,
147
+ ): [MetadataArray, boolean, (meta: Metadata) => void] {
148
+ const oldbie = this.arrays_.get(type);
149
+ if (oldbie !== undefined) return [oldbie, false, () => {}];
150
+
151
+ const $id = this.getName(checker, type);
152
+ const array: MetadataArray = MetadataArray.create({
153
+ name: $id,
154
+ value: null!,
155
+ index: null,
156
+ recursive: null!,
157
+ nullables: [],
158
+ });
159
+ this.arrays_.set(type, array);
160
+ return [array, true, (meta) => (Writable(array).value = meta)];
161
+ }
162
+
163
+ public emplaceTuple(
164
+ checker: ts.TypeChecker,
165
+ type: ts.TupleType,
166
+ ): [MetadataTuple, boolean, (elements: Metadata[]) => void] {
167
+ const oldbie = this.tuples_.get(type);
168
+ if (oldbie !== undefined) return [oldbie, false, () => {}];
169
+
170
+ const $id = this.getName(checker, type);
171
+ const tuple: MetadataTuple = MetadataTuple.create({
172
+ name: $id,
173
+ elements: null!,
174
+ index: null,
175
+ recursive: null!,
176
+ nullables: [],
177
+ });
178
+ this.tuples_.set(type, tuple);
179
+ return [
180
+ tuple,
181
+ true,
182
+ (elements) => (Writable(tuple).elements = elements),
183
+ ];
184
+ }
185
+
57
186
  /**
58
187
  * @internal
59
188
  */
60
- public getUnionIndex(meta: Metadata): number {
61
- const key: string = meta.objects.map((obj) => obj.name).join(" | ");
62
- MapUtil.take(this.unions_)(key, () => meta.objects);
63
- return [...this.unions_.keys()].indexOf(key);
189
+ public setObjectRecursive(obj: MetadataObject, recursive: boolean): void {
190
+ Writable(obj).recursive = recursive;
64
191
  }
65
192
 
66
- private get_name(checker: ts.TypeChecker, type: ts.Type): string {
67
- const name: string = (() => {
68
- const str: string = TypeFactory.getFullName(checker)(type);
69
- return this.options?.replace ? this.options.replace(str) : str;
70
- })();
193
+ /**
194
+ * @internal
195
+ */
196
+ public setDefinitionRecursive(
197
+ def: MetadataDefinition,
198
+ recursive: boolean,
199
+ ): void {
200
+ Writable(def).recursive = recursive;
201
+ }
71
202
 
72
- const duplicates: Map<ts.Type, string> = MapUtil.take(this.names_)(
73
- name,
74
- () => new Map(),
75
- );
76
- const oldbie: string | undefined = duplicates.get(type);
77
- if (oldbie !== undefined) return oldbie;
203
+ /**
204
+ * @internal
205
+ */
206
+ public setArrayRecursive(array: MetadataArray, recursive: boolean): void {
207
+ Writable(array).recursive = recursive;
208
+ if (recursive) Writable(array).index = this.recursive_array_index_++;
209
+ }
78
210
 
79
- const addicted: string = duplicates.size
80
- ? `${name}.o${duplicates.size}`
81
- : name;
82
- duplicates.set(type, addicted);
83
- return addicted;
211
+ public setTupleRecursive(tuple: MetadataTuple, recursive: boolean): void {
212
+ Writable(tuple).recursive = recursive;
213
+ if (recursive) Writable(tuple).index = this.recursive_tuple_index_++;
214
+ }
215
+
216
+ public toJSON(): IMetadataCollection {
217
+ return {
218
+ objects: this.objects().map((o) => o.toJSON()),
219
+ definitions: this.definitions().map((d) => d.toJSON()),
220
+ arrays: [...this.arrays_.values()].map((a) => a.toJSON()),
221
+ tuples: [...this.tuples_.values()].map((t) => t.toJSON()),
222
+ };
84
223
  }
85
224
  }
86
225
  export namespace MetadataCollection {
@@ -2,6 +2,8 @@ import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../metadata/Metadata";
4
4
  import { explore_metadata } from "./internal/metadata/explore_metadata";
5
+ import { iterate_metadata_collection } from "./internal/metadata/iterate_metadata_collection";
6
+ import { iterate_metadata_sort } from "./internal/metadata/iterate_metadata_sort";
5
7
 
6
8
  import { MetadataCollection } from "./MetadataCollection";
7
9
 
@@ -9,6 +11,7 @@ export namespace MetadataFactory {
9
11
  export interface IOptions {
10
12
  resolve: boolean;
11
13
  constant: boolean;
14
+ absorb: boolean;
12
15
  validate?: (meta: Metadata) => void;
13
16
  }
14
17
 
@@ -17,37 +20,12 @@ export namespace MetadataFactory {
17
20
  (options: IOptions) =>
18
21
  (collection: MetadataCollection) =>
19
22
  (type: ts.Type | null): Metadata => {
20
- // CONSTRUCT SCHEMA WITH OBJECTS
21
- const metadata: Metadata = explore_metadata(checker)(options)(
23
+ const meta: Metadata = explore_metadata(checker)(options)(
22
24
  collection,
23
25
  )(type, false);
24
-
25
- // FIND RECURSIVE OBJECTS
26
- for (const object of collection.objects())
27
- object.recursive = object.properties.some((prop) =>
28
- isRecursive(object.name)(prop.value),
29
- );
30
-
31
- // RETURNS
32
- return metadata;
33
- };
34
-
35
- const isRecursive =
36
- (name: string) =>
37
- (meta: Metadata): boolean => {
38
- const similar = (str: string) =>
39
- name === str ||
40
- name.indexOf(`<${str},`) !== -1 ||
41
- name.indexOf(`, ${str}>`) !== -1 ||
42
- name.indexOf(`, ${str},`) !== -1;
43
- return (
44
- meta.objects.some((obj) => similar(obj.name)) ||
45
- meta.arrays.some((arr) => isRecursive(name)(arr)) ||
46
- meta.tuples.some((tuple) =>
47
- tuple.some((m) => isRecursive(name)(m.rest ?? m)),
48
- ) ||
49
- meta.maps.some((map) => isRecursive(name)(map.value))
50
- );
26
+ iterate_metadata_collection(collection);
27
+ iterate_metadata_sort(collection)(meta);
28
+ return meta;
51
29
  };
52
30
 
53
31
  /**
@@ -277,6 +277,7 @@ const validate = (
277
277
  );
278
278
  };
279
279
 
280
+ // @todo: must block repeated array and tuple type
280
281
  const has_atomic =
281
282
  (metadata: Metadata) =>
282
283
  (type: "string" | "number"): boolean =>
@@ -285,11 +286,13 @@ const has_atomic =
285
286
  ? (atom: string) => atom === type || atom === "bigint"
286
287
  : (atom: string) => atom === type,
287
288
  ) !== undefined ||
288
- metadata.arrays.some((child) => has_atomic(child)(type)) ||
289
+ metadata.arrays.some((child) => has_atomic(child.value)(type)) ||
289
290
  metadata.tuples.some((tuple) =>
290
- tuple.some((child) => has_atomic(child)(type)),
291
+ tuple.elements.some((child) => has_atomic(child)(type)),
291
292
  );
292
293
 
293
294
  const has_array = (metadata: Metadata): boolean =>
294
295
  metadata.arrays.length !== 0 ||
295
- metadata.tuples.some((tuple) => tuple.some((child) => has_array(child)));
296
+ metadata.tuples.some((tuple) =>
297
+ tuple.elements.some((child) => has_array(child)),
298
+ );
@@ -0,0 +1,34 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataArray } from "../../../metadata/MetadataArray";
5
+
6
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
7
+
8
+ import { MetadataCollection } from "../../MetadataCollection";
9
+ import { MetadataFactory } from "../../MetadataFactory";
10
+ import { explore_metadata } from "./explore_metadata";
11
+
12
+ export const emplace_metadata_array =
13
+ (checker: ts.TypeChecker) =>
14
+ (options: MetadataFactory.IOptions) =>
15
+ (collection: MetadataCollection) =>
16
+ (type: ts.Type, nullable: boolean): MetadataArray => {
17
+ // CHECK EXISTENCE
18
+ const [array, newbie, setValue] = collection.emplaceArray(
19
+ checker,
20
+ type,
21
+ );
22
+ ArrayUtil.add(array.nullables, nullable);
23
+ if (newbie === false) return array;
24
+
25
+ // CONSTRUCT VALUE TYPE
26
+ const value: Metadata = explore_metadata(checker)(options)(collection)(
27
+ type.getNumberIndexType()!,
28
+ false,
29
+ false,
30
+ );
31
+ setValue(value);
32
+
33
+ return array;
34
+ };
@@ -0,0 +1,35 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataDefinition } from "../../../metadata/MetadataDefinition";
5
+
6
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
7
+
8
+ import { MetadataCollection } from "../../MetadataCollection";
9
+ import { MetadataFactory } from "../../MetadataFactory";
10
+ import { explore_metadata } from "./explore_metadata";
11
+
12
+ export const emplace_metadata_definition =
13
+ (checker: ts.TypeChecker) =>
14
+ (options: MetadataFactory.IOptions) =>
15
+ (collection: MetadataCollection) =>
16
+ (type: ts.Type, nullable: boolean): MetadataDefinition => {
17
+ // CHECK EXISTENCE
18
+ const [alias, newbie, closure] = collection.emplaceDefinition(
19
+ checker,
20
+ type,
21
+ type.aliasSymbol!,
22
+ );
23
+ ArrayUtil.add(alias.nullables, nullable);
24
+ if (newbie === false) return alias;
25
+
26
+ // CONSTRUCT VALUE TYPE
27
+ const value: Metadata = explore_metadata(checker)(options)(collection)(
28
+ type,
29
+ false,
30
+ true,
31
+ );
32
+ closure(value);
33
+
34
+ return alias;
35
+ };
@@ -23,6 +23,7 @@ export const emplace_metadata_object =
23
23
  // EMPLACE OBJECT
24
24
  const [obj, newbie] = collection.emplace(checker, parent);
25
25
  ArrayUtil.add(obj.nullables, nullable, (elem) => elem === nullable);
26
+
26
27
  if (newbie === false) return obj;
27
28
 
28
29
  // PREPARE ASSETS
@@ -49,9 +50,9 @@ export const emplace_metadata_object =
49
50
  filter?: (doc: ts.JSDocTagInfo) => boolean,
50
51
  ): MetadataProperty => {
51
52
  // COMMENTS AND TAGS
52
- const description: string | undefined = symbol
53
- ? CommentFactory.description(symbol)
54
- : undefined;
53
+ const description: string | null = symbol
54
+ ? CommentFactory.description(symbol) ?? null
55
+ : null;
55
56
  const jsDocTags: ts.JSDocTagInfo[] = (
56
57
  symbol?.getJsDocTags() ?? []
57
58
  ).filter(filter ?? (() => true));
@@ -131,7 +132,6 @@ export const emplace_metadata_object =
131
132
  (doc) => doc.name !== "default",
132
133
  );
133
134
  }
134
-
135
135
  return obj;
136
136
  };
137
137
 
@@ -0,0 +1,50 @@
1
+ import ts from "typescript";
2
+
3
+ import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataTuple } from "../../../metadata/MetadataTuple";
5
+
6
+ import { Writable } from "../../../typings/Writable";
7
+
8
+ import { ArrayUtil } from "../../../utils/ArrayUtil";
9
+
10
+ import { MetadataCollection } from "../../MetadataCollection";
11
+ import { MetadataFactory } from "../../MetadataFactory";
12
+ import { explore_metadata } from "./explore_metadata";
13
+
14
+ export const emplace_metadata_tuple =
15
+ (checker: ts.TypeChecker) =>
16
+ (options: MetadataFactory.IOptions) =>
17
+ (collection: MetadataCollection) =>
18
+ (type: ts.TupleType, nullable: boolean): MetadataTuple => {
19
+ // CHECK EXISTENCE
20
+ const [tuple, newbie, closure] = collection.emplaceTuple(checker, type);
21
+ ArrayUtil.add(tuple.nullables, nullable);
22
+ if (newbie === false) return tuple;
23
+
24
+ // CONSTRUCT ELEMENT TYPES
25
+ const flagList: readonly ts.ElementFlags[] =
26
+ type.elementFlags ??
27
+ (type.target as ts.TupleType)?.elementFlags ??
28
+ [];
29
+ const elements: Metadata[] = checker
30
+ .getTypeArguments(type as ts.TypeReference)
31
+ .map((elem, i) => {
32
+ const child: Metadata = explore_metadata(checker)(options)(
33
+ collection,
34
+ )(elem, false, false);
35
+
36
+ // CHECK OPTIONAL
37
+ const flag: ts.ElementFlags | undefined = flagList[i];
38
+ if (flag === ts.ElementFlags.Optional)
39
+ Writable(child).optional = true;
40
+
41
+ // REST TYPE
42
+ if (flag !== ts.ElementFlags.Rest) return child;
43
+ const wrapper: Metadata = Metadata.initialize();
44
+ Writable(wrapper).rest = child;
45
+ return wrapper;
46
+ });
47
+ closure(elements);
48
+
49
+ return tuple;
50
+ };
@@ -1,7 +1,6 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../metadata/Metadata";
4
- import { MetadataObject } from "../../../metadata/MetadataObject";
5
4
 
6
5
  import { ArrayUtil } from "../../../utils/ArrayUtil";
7
6
 
@@ -13,48 +12,26 @@ export const explore_metadata =
13
12
  (checker: ts.TypeChecker) =>
14
13
  (options: MetadataFactory.IOptions) =>
15
14
  (collection: MetadataCollection) =>
16
- (type: ts.Type | null, parentResolved: boolean): Metadata => {
15
+ (
16
+ type: ts.Type | null,
17
+ parentResolved: boolean,
18
+ aliased: boolean = false,
19
+ ): Metadata => {
17
20
  // CONSTRUCT METADATA
18
21
  const meta: Metadata = Metadata.initialize(parentResolved);
19
- if (type !== null)
20
- iterate_metadata(checker)(options)(collection)(
21
- meta,
22
- type,
23
- parentResolved,
24
- );
25
-
26
- // SORT OBJECTS
27
- if (meta.objects.length > 1) {
28
- meta.objects.sort((x, y) =>
29
- MetadataObject.covers(x, y)
30
- ? -1
31
- : MetadataObject.covers(y, x)
32
- ? 1
33
- : 0,
34
- );
35
- if (parentResolved === false)
36
- meta.union_index = collection.getUnionIndex(meta);
37
- }
22
+ const out = (meta: Metadata) => {
23
+ if (options.validate) options.validate(meta);
24
+ return meta;
25
+ };
26
+ if (type === null) return out(meta);
38
27
 
39
- // SORT ARRAYS AND TUPLES
40
- if (meta.arrays.length > 1)
41
- meta.arrays.sort((x, y) =>
42
- Metadata.covers(x, y) ? -1 : Metadata.covers(y, x) ? 1 : 0,
43
- );
44
- if (meta.tuples.length > 1)
45
- meta.tuples.sort((x, y) => {
46
- const xt = Metadata.initialize();
47
- const yt = Metadata.initialize();
48
-
49
- xt.tuples.push(x);
50
- yt.tuples.push(y);
51
-
52
- return Metadata.covers(xt, yt)
53
- ? -1
54
- : Metadata.covers(yt, xt)
55
- ? 1
56
- : 0;
57
- });
28
+ // ITERATE TYPESCRIPT TYPES
29
+ iterate_metadata(checker)(options)(collection)(
30
+ meta,
31
+ type,
32
+ parentResolved,
33
+ aliased,
34
+ );
58
35
 
59
36
  // EMEND ATOMICS
60
37
  for (const type of meta.atomics) {
@@ -85,8 +62,5 @@ export const explore_metadata =
85
62
  meta.atomics.find((type) => type === "string") !== undefined
86
63
  )
87
64
  meta.templates.splice(0, meta.templates.length);
88
-
89
- // RETURNS WITH VALIDATION
90
- if (options.validate) options.validate(meta);
91
- return meta;
65
+ return out(meta);
92
66
  };
@@ -9,6 +9,7 @@ import { iterate_metadata_array } from "./iterate_metadata_array";
9
9
  import { iterate_metadata_atomic } from "./iterate_metadata_atomic";
10
10
  import { iterate_metadata_coalesce } from "./iterate_metadata_coalesce";
11
11
  import { iterate_metadata_constant } from "./iterate_metadata_constant";
12
+ import { iterate_metadata_definition } from "./iterate_metadata_definition";
12
13
  import { iterate_metadata_map } from "./iterate_metadata_map";
13
14
  import { iterate_metadata_native } from "./iterate_metadata_native";
14
15
  import { iterate_metadata_object } from "./iterate_metadata_object";
@@ -22,14 +23,23 @@ export const iterate_metadata =
22
23
  (checker: ts.TypeChecker) =>
23
24
  (options: MetadataFactory.IOptions) =>
24
25
  (collection: MetadataCollection) =>
25
- (meta: Metadata, type: ts.Type, parentResolved: boolean): void => {
26
+ (
27
+ meta: Metadata,
28
+ type: ts.Type,
29
+ parentResolved: boolean,
30
+ aliased: boolean,
31
+ ): void => {
26
32
  if (type.isTypeParameter() === true)
27
33
  throw new Error(
28
34
  `Error on typia.MetadataFactory.generate(): non-specified generic argument on ${meta.getName()}.`,
29
35
  );
30
-
31
- // CHECK UNION & toJSON()
36
+ // CHECK SPECIAL CASES
32
37
  if (
38
+ (aliased !== true &&
39
+ iterate_metadata_definition(checker)(options)(collection)(
40
+ meta,
41
+ type,
42
+ )) ||
33
43
  iterate_metadata_union(checker)(options)(collection)(
34
44
  meta,
35
45
  type,
@@ -1,29 +1,25 @@
1
1
  import ts from "typescript";
2
2
 
3
3
  import { Metadata } from "../../../metadata/Metadata";
4
+ import { MetadataArray } from "../../../metadata/MetadataArray";
4
5
 
5
6
  import { ArrayUtil } from "../../../utils/ArrayUtil";
6
7
 
7
8
  import { MetadataCollection } from "../../MetadataCollection";
8
9
  import { MetadataFactory } from "../../MetadataFactory";
9
- import { explore_metadata } from "./explore_metadata";
10
+ import { emplace_metadata_array } from "./emplace_metadata_array";
10
11
 
11
12
  export const iterate_metadata_array =
12
13
  (checker: ts.TypeChecker) =>
13
14
  (options: MetadataFactory.IOptions) =>
14
15
  (collection: MetadataCollection) =>
15
16
  (meta: Metadata, type: ts.Type): boolean => {
16
- if (
17
- !(checker as any).isArrayType(type) &&
18
- !(checker as any).isArrayLikeType(type)
19
- )
17
+ if (!checker.isArrayType(type) && !checker.isArrayLikeType(type))
20
18
  return false;
21
19
 
22
- const value: ts.Type | null = type.getNumberIndexType() || null;
23
- ArrayUtil.set(
24
- meta.arrays,
25
- explore_metadata(checker)(options)(collection)(value, false),
26
- (elem) => elem.getName(),
27
- );
20
+ const array: MetadataArray = emplace_metadata_array(checker)(options)(
21
+ collection,
22
+ )(type, meta.nullable);
23
+ ArrayUtil.add(meta.arrays, array, (elem) => elem.name === array.name);
28
24
  return true;
29
25
  };