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
@@ -1,49 +1,44 @@
1
1
  import { Atomic } from "../typings/Atomic";
2
2
  import { ClassProperties } from "../typings/ClassProperties";
3
+ import { Writable } from "../typings/Writable";
3
4
 
4
5
  import { ArrayUtil } from "../utils/ArrayUtil";
5
6
 
6
7
  import { IMetadata } from "./IMetadata";
7
- import { IMetadataObject } from "./IMetadataObject";
8
+ import { IMetadataCollection } from "./IMetadataCollection";
9
+ import { IMetadataDictionary } from "./IMetadataDictionary";
10
+ import { MetadataAlias } from "./MetadataAlias";
11
+ import { MetadataArray } from "./MetadataArray";
8
12
  import { MetadataConstant } from "./MetadataConstant";
9
13
  import { MetadataObject } from "./MetadataObject";
10
14
  import { MetadataProperty } from "./MetadataProperty";
15
+ import { MetadataTuple } from "./MetadataTuple";
11
16
 
12
17
  export class Metadata {
13
- public readonly any: boolean;
14
- public readonly required: boolean;
15
- public readonly optional: boolean;
16
- public readonly nullable: boolean;
17
- public readonly functional: boolean;
18
-
19
- public readonly resolved: Metadata | null;
20
- public readonly atomics: Atomic.Literal[];
21
- public readonly constants: MetadataConstant[];
22
- public readonly templates: Metadata[][];
23
-
24
- public readonly rest: Metadata | null;
25
- public readonly arrays: Metadata[];
26
- public readonly tuples: Metadata[][];
27
- public readonly objects: MetadataObject[];
28
-
29
- public readonly natives: string[];
30
- public readonly sets: Metadata[];
31
- public readonly maps: Metadata.Entry[];
32
-
33
- /**
34
- * @internal
35
- */
36
- private name_: string | undefined = undefined;
37
-
38
- /**
39
- * @internal
40
- */
41
- private parent_resolved_: boolean = false;
42
-
43
- /**
44
- * @internal
45
- */
46
- public union_index?: number;
18
+ public any: boolean;
19
+ public required: boolean;
20
+ public optional: boolean;
21
+ public nullable: boolean;
22
+ public functional: boolean;
23
+
24
+ public resolved: Metadata | null;
25
+ public atomics: Atomic.Literal[];
26
+ public constants: MetadataConstant[];
27
+ public templates: Metadata[][];
28
+
29
+ public rest: Metadata | null;
30
+ public aliases: MetadataAlias[];
31
+ public arrays: MetadataArray[];
32
+ public tuples: MetadataTuple[];
33
+ public objects: MetadataObject[];
34
+
35
+ public natives: string[];
36
+ public sets: Metadata[];
37
+ public maps: Metadata.Entry[];
38
+
39
+ /** @internal */ private name_?: string;
40
+ /** @internal */ private parent_resolved_: boolean = false;
41
+ /** @internal */ public union_index?: number;
47
42
 
48
43
  /* -----------------------------------------------------------
49
44
  CONSTRUCTORS
@@ -67,6 +62,7 @@ export class Metadata {
67
62
  this.arrays = props.arrays;
68
63
  this.tuples = props.tuples;
69
64
  this.objects = props.objects;
65
+ this.aliases = props.aliases;
70
66
 
71
67
  this.natives = props.natives;
72
68
  this.sets = props.sets;
@@ -98,6 +94,7 @@ export class Metadata {
98
94
  arrays: [],
99
95
  tuples: [],
100
96
  objects: [],
97
+ aliases: [],
101
98
 
102
99
  rest: null,
103
100
  natives: [],
@@ -124,11 +121,10 @@ export class Metadata {
124
121
  resolved: this.resolved ? this.resolved.toJSON() : null,
125
122
 
126
123
  rest: this.rest ? this.rest.toJSON() : null,
127
- arrays: this.arrays.map((meta) => meta.toJSON()),
128
- tuples: this.tuples.map((meta) =>
129
- meta.map((meta) => meta.toJSON()),
130
- ),
124
+ arrays: this.arrays.map((array) => array.name),
125
+ tuples: this.tuples.map((tuple) => tuple.name),
131
126
  objects: this.objects.map((obj) => obj.name),
127
+ aliases: this.aliases.map((alias) => alias.name),
132
128
 
133
129
  natives: this.natives.slice(),
134
130
  sets: this.sets.map((meta) => meta.toJSON()),
@@ -139,29 +135,66 @@ export class Metadata {
139
135
  };
140
136
  }
141
137
 
142
- public static from(meta: IMetadata, objects: IMetadataObject[]): Metadata {
143
- const dict: Map<string, MetadataObject> = new Map();
144
- for (const obj of objects)
145
- dict.set(obj.name, MetadataObject._From_without_properties(obj));
138
+ public static from(
139
+ meta: IMetadata,
140
+ collection: IMetadataCollection,
141
+ ): Metadata {
142
+ const dict: IMetadataDictionary = {
143
+ objects: new Map(
144
+ collection.objects.map((obj) => [
145
+ obj.name,
146
+ MetadataObject._From_without_properties(obj),
147
+ ]),
148
+ ),
149
+ aliases: new Map(
150
+ collection.aliases.map((alias) => [
151
+ alias.name,
152
+ MetadataAlias._From_without_value(alias),
153
+ ]),
154
+ ),
155
+ arrays: new Map(
156
+ collection.arrays.map((arr) => [
157
+ arr.name,
158
+ MetadataArray._From_without_value(arr),
159
+ ]),
160
+ ),
161
+ tuples: new Map(
162
+ collection.tuples.map((tpl) => [
163
+ tpl.name,
164
+ MetadataTuple._From_without_elements(tpl),
165
+ ]),
166
+ ),
167
+ };
146
168
 
147
- for (const obj of objects) {
148
- const initialized = dict.get(obj.name)!;
169
+ for (const obj of collection.objects) {
170
+ const initialized = dict.objects.get(obj.name)!;
149
171
  initialized.properties.push(
150
172
  ...obj.properties.map((prop) =>
151
173
  MetadataProperty._From(prop, dict),
152
174
  ),
153
175
  );
154
176
  }
177
+ for (const alias of collection.aliases)
178
+ Writable(dict.aliases.get(alias.name)!).value = this._From(
179
+ alias.value,
180
+ dict,
181
+ );
182
+ for (const array of collection.arrays)
183
+ Writable(dict.arrays.get(array.name)!).value = this._From(
184
+ array.value,
185
+ dict,
186
+ );
187
+ for (const tuple of collection.tuples)
188
+ Writable(dict.tuples.get(tuple.name)!).elements =
189
+ tuple.elements.map((elem) => this._From(elem, dict));
190
+
155
191
  return this._From(meta, dict);
156
192
  }
157
193
 
158
194
  /**
159
195
  * @internal
160
196
  */
161
- public static _From(
162
- meta: IMetadata,
163
- objects: Map<string, MetadataObject>,
164
- ): Metadata {
197
+ public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
165
198
  return this.create({
166
199
  any: meta.any,
167
200
  required: meta.required,
@@ -172,29 +205,49 @@ export class Metadata {
172
205
  constants: JSON.parse(JSON.stringify(meta.constants)),
173
206
  atomics: meta.atomics.slice(),
174
207
  templates: meta.templates.map((tpl) =>
175
- tpl.map((meta) => this._From(meta, objects)),
208
+ tpl.map((meta) => this._From(meta, dict)),
176
209
  ),
177
- resolved: meta.resolved ? this._From(meta.resolved, objects) : null,
210
+ resolved: meta.resolved ? this._From(meta.resolved, dict) : null,
178
211
 
179
- rest: meta.rest ? this._From(meta.rest, objects) : null,
180
- arrays: meta.arrays.map((meta) => this._From(meta, objects)),
181
- tuples: meta.tuples.map((tuple) =>
182
- tuple.map((meta) => this._From(meta, objects)),
183
- ),
212
+ rest: meta.rest ? this._From(meta.rest, dict) : null,
213
+ arrays: meta.arrays.map((id) => {
214
+ const array = dict.arrays.get(id);
215
+ if (array === undefined)
216
+ throw new Error(
217
+ `Error on Metadata.from(): failed to find array "${id}".`,
218
+ );
219
+ return array;
220
+ }),
221
+ tuples: meta.tuples.map((id) => {
222
+ const tuple = dict.tuples.get(id);
223
+ if (tuple === undefined)
224
+ throw new Error(
225
+ `Error on Metadata.from(): failed to find tuple "${id}".`,
226
+ );
227
+ return tuple;
228
+ }),
184
229
  objects: meta.objects.map((name) => {
185
- const found = objects.get(name);
230
+ const found = dict.objects.get(name);
186
231
  if (found === undefined)
187
232
  throw new Error(
188
233
  `Error on Metadata.from(): failed to find object "${name}".`,
189
234
  );
190
235
  return found;
191
236
  }),
237
+ aliases: meta.aliases.map((alias) => {
238
+ const found = dict.aliases.get(alias);
239
+ if (found === undefined)
240
+ throw new Error(
241
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
242
+ );
243
+ return found;
244
+ }),
192
245
 
193
246
  natives: meta.natives.slice(),
194
- sets: meta.sets.map((meta) => this._From(meta, objects)),
247
+ sets: meta.sets.map((meta) => this._From(meta, dict)),
195
248
  maps: meta.maps.map((entry) => ({
196
- key: this._From(entry.key, objects),
197
- value: this._From(entry.value, objects),
249
+ key: this._From(entry.key, dict),
250
+ value: this._From(entry.value, dict),
198
251
  })),
199
252
  });
200
253
  }
@@ -203,7 +256,7 @@ export class Metadata {
203
256
  ACCESSORS
204
257
  ----------------------------------------------------------- */
205
258
  public getName(): string {
206
- this.name_ ||= getName(this);
259
+ this.name_ ??= getName(this);
207
260
  return this.name_;
208
261
  }
209
262
 
@@ -214,18 +267,19 @@ export class Metadata {
214
267
  return (
215
268
  (this.resolved ? 1 : 0) +
216
269
  (this.functional ? 1 : 0) +
270
+ (this.rest ? this.rest.size() : 0) +
217
271
  this.templates.length +
218
272
  this.atomics.length +
219
273
  this.constants
220
274
  .map((c) => c.values.length)
221
275
  .reduce((x, y) => x + y, 0) +
222
- (this.rest ? this.rest.size() : 0) +
223
276
  this.arrays.length +
224
277
  this.tuples.length +
225
- this.objects.length +
226
278
  this.natives.length +
279
+ this.maps.length +
227
280
  this.sets.length +
228
- this.maps.length
281
+ this.objects.length +
282
+ this.aliases.length
229
283
  );
230
284
  }
231
285
  public bucket(): number {
@@ -238,10 +292,11 @@ export class Metadata {
238
292
  (this.rest ? this.rest.size() : 0) +
239
293
  (this.arrays.length ? 1 : 0) +
240
294
  (this.tuples.length ? 1 : 0) +
241
- (this.objects.length ? 1 : 0) +
242
295
  (this.natives.length ? 1 : 0) +
243
296
  (this.sets.length ? 1 : 0) +
244
- (this.maps.length ? 1 : 0)
297
+ (this.maps.length ? 1 : 0) +
298
+ (this.objects.length ? 1 : 0) +
299
+ (this.aliases.length ? 1 : 0)
245
300
  );
246
301
  }
247
302
  public isConstant(): boolean {
@@ -286,47 +341,21 @@ export class Metadata {
286
341
  }
287
342
  }
288
343
  export namespace Metadata {
289
- export const intersects = (
290
- x: Metadata,
291
- y: Metadata,
292
- deep: boolean,
293
- ): boolean => {
344
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
294
345
  // CHECK ANY & OPTIONAL
295
346
  if (x.any || y.any) return true;
296
347
  if (x.required === false && false === y.required) return true;
297
348
  if (x.nullable === true && true === y.nullable) return true;
349
+ if (x.functional === true && y.functional === true) return true;
298
350
 
299
351
  //----
300
352
  // INSTANCES
301
353
  //----
302
- // ARRAYS AND OBJECTS
303
- if (deep === true) {
304
- for (const xa of x.arrays)
305
- for (const ya of y.arrays)
306
- if (intersects(xa, ya, deep)) {
307
- return true;
308
- }
309
- for (const xo of x.objects)
310
- for (const yo of y.objects)
311
- if (MetadataObject.intersects(xo, yo)) {
312
- return true;
313
- }
314
- } else {
315
- if (x.arrays.length && y.arrays.length) return true;
316
- if (x.objects.length && y.objects.length) return true;
317
- }
318
-
319
- // TUPLES
320
- for (const xt of x.tuples)
321
- for (const yt of y.tuples)
322
- if (xt.length === 0 || yt.length === 0)
323
- return xt.length === 0 && yt.length === 0;
324
- else if (
325
- xt
326
- .slice(0, Math.min(xt.length, yt.length))
327
- .some((xv, i) => intersects(xv, yt[i]!, deep))
328
- )
329
- return true;
354
+ // ARRAYS
355
+ if (x.arrays.length && y.arrays.length) return true;
356
+ if (x.tuples.length && y.tuples.length) return true;
357
+ if (x.objects.length && y.objects.length) return true;
358
+ if (x.aliases.length && y.aliases.length) return true;
330
359
 
331
360
  //----
332
361
  // VALUES
@@ -349,46 +378,63 @@ export namespace Metadata {
349
378
  if (values.size !== constant.values.length + opposite.values.length)
350
379
  return true;
351
380
  }
352
-
353
- // FUNCTIONAL
354
- if (x.functional === true && y.functional === true) return true;
355
-
356
381
  return false;
357
382
  };
358
383
 
359
- export const covers = (x: Metadata, y: Metadata): boolean => {
384
+ export const covers = (
385
+ x: Metadata,
386
+ y: Metadata,
387
+ level: number = 0,
388
+ ): boolean => {
360
389
  // CHECK ANY
361
- if (x.any) return true;
390
+ if (x === y) return false;
391
+ else if (x.any) return true;
362
392
  else if (y.any) return false;
363
393
 
364
394
  //----
365
395
  // INSTANCES
366
396
  //----
367
- // ARRAYS
368
- for (const ya of y.arrays)
369
- if (x.arrays.some((xa) => covers(xa, ya) === true) === false)
370
- return false;
397
+ if (level === 0) {
398
+ // ARRAYS
399
+ for (const ya of y.arrays)
400
+ if (
401
+ !x.arrays.some((xa) =>
402
+ covers(xa.value, ya.value, level + 1),
403
+ )
404
+ ) {
405
+ return false;
406
+ }
407
+
408
+ // TUPLES
409
+ for (const yt of y.tuples)
410
+ if (
411
+ yt.elements.length !== 0 &&
412
+ x.tuples.some(
413
+ (xt) =>
414
+ xt.elements.length >= yt.elements.length &&
415
+ xt.elements
416
+ .slice(yt.elements.length)
417
+ .every((xv, i) =>
418
+ covers(xv, yt.elements[i]!, level + 1),
419
+ ),
420
+ ) === false
421
+ )
422
+ return false;
423
+ }
371
424
 
372
425
  // OBJECTS
373
426
  for (const yo of y.objects)
374
427
  if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
375
428
  return false;
376
429
 
377
- // TUPLES
378
- for (const yt of y.tuples)
379
- if (
380
- yt.length !== 0 &&
381
- x.tuples.some(
382
- (xt) =>
383
- xt.length >= yt.length &&
384
- xt
385
- .slice(yt.length)
386
- .every((xv, i) => covers(xv, yt[i]!)),
387
- ) === false
388
- )
430
+ // ALIASES
431
+ for (const yd of y.aliases)
432
+ if (x.aliases.some((xd) => xd.name === yd.name) === false)
389
433
  return false;
390
434
 
391
435
  // NATIVES
436
+ for (const yn of y.natives)
437
+ if (x.natives.some((xn) => xn === yn) === false) return false;
392
438
 
393
439
  // SETS
394
440
  for (const ys of y.sets)
@@ -422,6 +468,9 @@ export namespace Metadata {
422
468
  return true;
423
469
  };
424
470
 
471
+ /**
472
+ * @internal
473
+ */
425
474
  export const merge = (x: Metadata, y: Metadata): Metadata => {
426
475
  const output: Metadata = Metadata.create({
427
476
  any: x.any || y.any,
@@ -445,6 +494,7 @@ export namespace Metadata {
445
494
  arrays: x.arrays.slice(),
446
495
  tuples: x.tuples.slice(),
447
496
  objects: x.objects.slice(),
497
+ aliases: x.aliases.slice(),
448
498
 
449
499
  natives: [...new Set([...x.natives, ...y.natives])],
450
500
  sets: x.sets.slice(),
@@ -463,14 +513,13 @@ export namespace Metadata {
463
513
  ArrayUtil.add(target.values, value);
464
514
  }
465
515
  for (const array of y.arrays)
466
- ArrayUtil.set(output.arrays, array, (elem) => elem.getName());
516
+ ArrayUtil.set(output.arrays, array, (elem) => elem.name);
517
+ for (const tuple of y.tuples)
518
+ ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
467
519
  for (const obj of y.objects)
468
520
  ArrayUtil.set(output.objects, obj, (elem) => elem.name);
469
-
470
- if (x.rest !== null)
471
- ArrayUtil.set(output.arrays, x.rest, (elem) => elem.getName());
472
- if (y.rest !== null)
473
- ArrayUtil.set(output.arrays, y.rest, (elem) => elem.getName());
521
+ for (const alias of y.aliases)
522
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
474
523
 
475
524
  return output;
476
525
  };
@@ -513,15 +562,12 @@ const getName = (metadata: Metadata): string => {
513
562
  for (const map of metadata.maps)
514
563
  elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
515
564
 
516
- // ARRAY
565
+ // INSTANCES
517
566
  if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
518
- for (const tuple of metadata.tuples)
519
- elements.push(`[${tuple.map((elem) => elem.getName()).join(", ")}]`);
520
- for (const array of metadata.arrays)
521
- elements.push(`Array<${array.getName()}>`);
522
-
523
- // OBJECT
567
+ for (const tuple of metadata.tuples) elements.push(tuple.name);
568
+ for (const array of metadata.arrays) elements.push(array.name);
524
569
  for (const object of metadata.objects) elements.push(object.name);
570
+ for (const alias of metadata.aliases) elements.push(alias.name);
525
571
  if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
526
572
 
527
573
  // RETURNS
@@ -0,0 +1,61 @@
1
+ import { ClassProperties } from "../typings/ClassProperties";
2
+
3
+ import { IJsDocTagInfo } from "./IJsDocTagInfo";
4
+ import { IMetadataAlias } from "./IMetadataAlias";
5
+ import { Metadata } from "./Metadata";
6
+
7
+ export class MetadataAlias {
8
+ public readonly name: string;
9
+ public readonly value: Metadata;
10
+ public readonly description: string | null;
11
+ public readonly jsDocTags: IJsDocTagInfo[];
12
+ public readonly recursive: boolean;
13
+ public readonly nullables: boolean[];
14
+
15
+ /* -----------------------------------------------------------
16
+ CONSTRUCTORS
17
+ ----------------------------------------------------------- */
18
+ /**
19
+ * @hidden
20
+ */
21
+ private constructor(props: ClassProperties<MetadataAlias>) {
22
+ this.name = props.name;
23
+ this.value = props.value;
24
+ this.description = props.description;
25
+ this.jsDocTags = props.jsDocTags;
26
+ this.recursive = props.recursive;
27
+ this.nullables = props.nullables;
28
+ }
29
+
30
+ /**
31
+ * @internal
32
+ */
33
+ public static create(props: ClassProperties<MetadataAlias>): MetadataAlias {
34
+ return new MetadataAlias(props);
35
+ }
36
+
37
+ /**
38
+ * @internal
39
+ */
40
+ public static _From_without_value(props: Omit<IMetadataAlias, "value">) {
41
+ return this.create({
42
+ name: props.name,
43
+ value: null!,
44
+ description: props.description,
45
+ recursive: props.recursive,
46
+ jsDocTags: props.jsDocTags.slice(),
47
+ nullables: props.nullables.slice(),
48
+ });
49
+ }
50
+
51
+ public toJSON(): IMetadataAlias {
52
+ return {
53
+ name: this.name,
54
+ value: this.value.toJSON(),
55
+ description: this.description,
56
+ recursive: this.recursive,
57
+ jsDocTags: this.jsDocTags,
58
+ nullables: this.nullables.slice(),
59
+ };
60
+ }
61
+ }
@@ -0,0 +1,52 @@
1
+ import { ClassProperties } from "../typings/ClassProperties";
2
+
3
+ import { IMetadataArray } from "./IMetadataArray";
4
+ import { Metadata } from "./Metadata";
5
+
6
+ export class MetadataArray {
7
+ public readonly name: string;
8
+ public readonly value: Metadata;
9
+ public readonly nullables: boolean[];
10
+ public readonly recursive: boolean;
11
+ public readonly index: number | null;
12
+
13
+ /**
14
+ * @internal
15
+ */
16
+ private constructor(props: ClassProperties<MetadataArray>) {
17
+ this.name = props.name;
18
+ this.value = props.value;
19
+ this.index = props.index;
20
+ this.recursive = props.recursive;
21
+ this.nullables = props.nullables;
22
+ }
23
+
24
+ /**
25
+ * @internal
26
+ */
27
+ public static _From_without_value(
28
+ props: Omit<IMetadataArray, "value">,
29
+ ): MetadataArray {
30
+ return this.create({
31
+ name: props.name,
32
+ value: null!,
33
+ index: props.index,
34
+ recursive: props.recursive,
35
+ nullables: props.nullables,
36
+ });
37
+ }
38
+
39
+ public static create(props: ClassProperties<MetadataArray>): MetadataArray {
40
+ return new MetadataArray(props);
41
+ }
42
+
43
+ public toJSON(): IMetadataArray {
44
+ return {
45
+ name: this.name,
46
+ value: this.value.toJSON(),
47
+ nullables: this.nullables,
48
+ recursive: this.recursive,
49
+ index: this.index,
50
+ };
51
+ }
52
+ }
@@ -10,24 +10,9 @@ export class MetadataObject {
10
10
  public readonly description: string | undefined;
11
11
  public readonly jsDocTags: IJsDocTagInfo[];
12
12
 
13
- /**
14
- * @internal
15
- */
16
13
  public readonly index: number;
17
-
18
- /**
19
- * @internal
20
- */
21
14
  public validated: boolean;
22
-
23
- /**
24
- * @internal
25
- */
26
15
  public recursive: boolean;
27
-
28
- /**
29
- * @internal
30
- */
31
16
  public nullables: boolean[] = [];
32
17
 
33
18
  /* -----------------------------------------------------------
@@ -44,7 +29,7 @@ export class MetadataObject {
44
29
 
45
30
  this.index = props.index;
46
31
  this.validated = props.validated;
47
- this.recursive = false;
32
+ this.recursive = props.recursive;
48
33
  this.nullables = [];
49
34
  }
50
35
 
@@ -113,15 +98,17 @@ export namespace MetadataObject {
113
98
  export const intersects = (x: MetadataObject, y: MetadataObject): boolean =>
114
99
  x.properties.some(
115
100
  (prop) =>
116
- y.properties.find((oppo) => prop.key === oppo.key) !==
117
- undefined,
101
+ y.properties.find(
102
+ (oppo) => prop.key.getName() === oppo.key.getName(),
103
+ ) !== undefined,
118
104
  );
119
105
 
120
106
  export const covers = (x: MetadataObject, y: MetadataObject): boolean =>
121
107
  x.properties.length >= y.properties.length &&
122
108
  x.properties.every(
123
109
  (prop) =>
124
- y.properties.find((oppo) => prop.key === oppo.key) !==
125
- undefined,
110
+ y.properties.find(
111
+ (oppo) => prop.key.getName() === oppo.key.getName(),
112
+ ) !== undefined,
126
113
  );
127
114
  }