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,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 { MetadataArray } from "./MetadataArray";
8
11
  import { MetadataConstant } from "./MetadataConstant";
12
+ import { MetadataDefinition } from "./MetadataDefinition";
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 arrays: MetadataArray[];
31
+ public tuples: MetadataTuple[];
32
+ public objects: MetadataObject[];
33
+ public definitions: MetadataDefinition[];
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.definitions = props.definitions;
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
+ definitions: [],
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
+ definitions: this.definitions.map((def) => def.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
+ definitions: new Map(
150
+ collection.definitions.map((def) => [
151
+ def.name,
152
+ MetadataDefinition._From_without_value(def),
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 def of collection.definitions)
178
+ Writable(dict.definitions.get(def.name)!).value = this._From(
179
+ def.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
+ definitions: meta.definitions.map((def) => {
238
+ const found = dict.definitions.get(def);
239
+ if (found === undefined)
240
+ throw new Error(
241
+ `Error on Metadata.from(): failed to find definition "${def}".`,
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.definitions.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.definitions.length ? 1 : 0)
245
300
  );
246
301
  }
247
302
  public isConstant(): boolean {
@@ -284,49 +339,316 @@ export class Metadata {
284
339
  public isParentResolved(): boolean {
285
340
  return this.parent_resolved_;
286
341
  }
342
+
343
+ // /* -----------------------------------------------------------
344
+ // COMBINERS
345
+ // ----------------------------------------------------------- */
346
+ // public computeEmpty(): boolean {
347
+ // return this.computeSize() === 0;
348
+ // }
349
+
350
+ // public computeSize(): number {
351
+ // return (this.computed_size_ ??=
352
+ // (this.computeResolved() ? 1 : 0) +
353
+ // (this.computeFunctional() ? 1 : 0) +
354
+ // (this.computeRest() ? 1 : 0) +
355
+ // this.computeTemplates().length +
356
+ // this.computeAtomics().size +
357
+ // [...this.computeConstants().values()]
358
+ // .map((v) => v.size)
359
+ // .reduce((a, b) => a + b, 0) +
360
+ // this.computeArrays().length +
361
+ // this.computeTuples().length +
362
+ // this.computeObjects().length +
363
+ // this.computeDefinitions().length +
364
+ // this.computeNatives().size +
365
+ // this.computeSets().length +
366
+ // this.computeMaps().length);
367
+ // }
368
+
369
+ // public computeBucket(): number {
370
+ // return (this.computed_bucket_ ??=
371
+ // (this.computeResolved() ? 1 : 0) +
372
+ // (this.computeFunctional() ? 1 : 0) +
373
+ // (this.computeTemplates().length ? 1 : 0) +
374
+ // (this.computeAtomics().size ? 1 : 0) +
375
+ // (this.computeConstants().size ? 1 : 0) +
376
+ // (this.computeRest() ? 1 : 0) +
377
+ // (this.computeArrays().length ? 1 : 0) +
378
+ // (this.computeTuples().length ? 1 : 0) +
379
+ // (this.computeObjects().length ? 1 : 0) +
380
+ // (this.computeNatives().size ? 1 : 0) +
381
+ // (this.computeSets().length ? 1 : 0) +
382
+ // (this.computeMaps().length ? 1 : 0));
383
+ // }
384
+
385
+ // public computeAny(): boolean {
386
+ // return (this.computed_any_ ??= Metadata._Iterate([] as boolean[])(
387
+ // (flags) => (meta) => flags.push(meta.any),
388
+ // )(this).reduce((x, y) => x || y));
389
+ // }
390
+
391
+ // public computeRequired(): boolean {
392
+ // return (this.computed_required_ ??= Metadata._Iterate([] as boolean[])(
393
+ // (flags) => (meta) => flags.push(meta.required),
394
+ // )(this).reduce((x, y) => x && y));
395
+ // }
396
+
397
+ // public computeOptional(): boolean {
398
+ // return (this.computed_optional_ ??= Metadata._Iterate([] as boolean[])(
399
+ // (flags) => (meta) => flags.push(meta.optional),
400
+ // )(this).reduce((x, y) => x || y));
401
+ // }
402
+
403
+ // public computeNullable(): boolean {
404
+ // return (this.computed_nullable_ ??= Metadata._Iterate([] as boolean[])(
405
+ // (flags) => (meta) => flags.push(meta.nullable),
406
+ // )(this).reduce((x, y) => x || y));
407
+ // }
408
+
409
+ // public computeFunctional(): boolean {
410
+ // return (this.computed_functional_ ??= Metadata._Iterate(
411
+ // [] as boolean[],
412
+ // )((flags) => (meta) => flags.push(meta.any))(this).reduce(
413
+ // (x, y) => x || y,
414
+ // ));
415
+ // }
416
+
417
+ // public computeAtomics(): Set<Atomic.Literal> {
418
+ // return (this.computed_atomics_ ??= Metadata._Iterate(
419
+ // new Set<Atomic.Literal>(),
420
+ // )((values) => (meta) => {
421
+ // for (const atomic of meta.atomics) values.add(atomic);
422
+ // })(this));
423
+ // }
424
+
425
+ // public computeConstants(): Map<Atomic.Literal, Set<Atomic.Type>> {
426
+ // return (this.computed_constants_ ??= Metadata._Iterate(
427
+ // new Map<Atomic.Literal, Set<Atomic.Type>>(),
428
+ // )((container) => (meta) => {
429
+ // for (const constant of meta.constants) {
430
+ // const line = MapUtil.take(container)(
431
+ // constant.type,
432
+ // () => new Set(),
433
+ // );
434
+ // for (const v of constant.values) line.add(v);
435
+ // }
436
+ // })(this));
437
+ // }
438
+
439
+ // public computeTemplates(): Metadata[][] {
440
+ // return (this.computed_templates_ ??= (() => {
441
+ // const dict = Metadata._Iterate(new Map<string, Metadata[]>())(
442
+ // (dict) => (meta) =>
443
+ // meta.templates.forEach((tpl) =>
444
+ // dict.set(tpl.map((t) => t.getName).join(","), tpl),
445
+ // ),
446
+ // )(this);
447
+ // return [...dict.values()];
448
+ // })());
449
+ // }
450
+
451
+ // public computeResolved(): Metadata | null {
452
+ // return (this.computed_resolved_ ??= this.resolved);
453
+ // }
454
+
455
+ // public computeRest(): Metadata | null {
456
+ // return (this.computed_rest_ ??= this.rest);
457
+ // }
458
+
459
+ // public computeArrays(): Metadata[] {
460
+ // return (this.computed_arrays_ ??= (() => {
461
+ // const dict = Metadata._Iterate(new Map<string, Metadata>())(
462
+ // (dict) => (meta) =>
463
+ // meta.arrays.forEach((array) =>
464
+ // dict.set(array.getName(), array),
465
+ // ),
466
+ // )(this);
467
+ // return [...dict.values()];
468
+ // })());
469
+ // }
470
+
471
+ // public computeTuples(): Metadata[][] {
472
+ // return (this.computed_tuples_ ??= (() => {
473
+ // const dict = Metadata._Iterate(new Map<string, Metadata[]>())(
474
+ // (dict) => (meta) =>
475
+ // meta.tuples.forEach((tpl) =>
476
+ // dict.set(tpl.map((t) => t.getName).join(","), tpl),
477
+ // ),
478
+ // )(this);
479
+ // return [...dict.values()];
480
+ // })());
481
+ // }
482
+
483
+ // public computeNatives(): Set<string> {
484
+ // return (this.computed_natives_ ??= Metadata._Iterate(new Set<string>())(
485
+ // (values) => (meta) => {
486
+ // for (const native of meta.natives) values.add(native);
487
+ // },
488
+ // )(this));
489
+ // }
490
+
491
+ // public computeSets(): Metadata[] {
492
+ // return (this.computed_sets_ ??= (() => {
493
+ // const dict = Metadata._Iterate(new Map<string, Metadata>())(
494
+ // (dict) => (meta) =>
495
+ // meta.sets.forEach((set) => dict.set(set.getName(), set)),
496
+ // )(this);
497
+ // return [...dict.values()];
498
+ // })());
499
+ // }
500
+
501
+ // public computeMaps(): Metadata.Entry[] {
502
+ // return (this.computed_maps_ ??= (() => {
503
+ // const dict = Metadata._Iterate(new Map<string, Metadata.Entry>())(
504
+ // (dict) => (meta) =>
505
+ // meta.maps.forEach((m) =>
506
+ // dict.set(
507
+ // [m.key.getName(), m.value.getName()].join(","),
508
+ // m,
509
+ // ),
510
+ // ),
511
+ // )(this);
512
+ // return [...dict.values()];
513
+ // })());
514
+ // }
515
+
516
+ // public computeObjects(): MetadataObject[] {
517
+ // return (this.computed_objects_ ??= (() => {
518
+ // const dict = Metadata._Iterate(new Map<string, MetadataObject>())(
519
+ // (dict) => (meta) =>
520
+ // meta.objects.forEach((obj) => dict.set(obj.name, obj)),
521
+ // )(this);
522
+ // return [...dict.values()];
523
+ // })());
524
+ // }
525
+
526
+ // public computeDefinitions(): MetadataDefinition[] {
527
+ // return (this.computed_definitions_ ??= (() => {
528
+ // const dict = Metadata._Iterate(
529
+ // new Map<string, MetadataDefinition>(),
530
+ // )(
531
+ // (dict) => (meta) =>
532
+ // meta.definitions.forEach((def) => dict.set(def.name, def)),
533
+ // )(this);
534
+ // return [...dict.values()];
535
+ // })());
536
+ // }
537
+
538
+ // public absorb(): void {
539
+ // this._Absorb(new Set());
540
+ // }
541
+
542
+ // private _Absorb(visited: Set<Metadata>): void {
543
+ // if (visited.has(this)) return;
544
+ // visited.add(this);
545
+
546
+ // if (this.size() === 1 && this.definitions.length === 1) return;
547
+
548
+ // //----
549
+ // // ITERATIONS
550
+ // //----
551
+ // if (this.resolved) this.resolved._Absorb(visited);
552
+ // if (this.rest) this.rest._Absorb(visited);
553
+
554
+ // for (const array of this.arrays) array._Absorb(visited);
555
+ // for (const tuple of this.tuples)
556
+ // for (const elem of tuple) elem._Absorb(visited);
557
+
558
+ // for (const set of this.sets) set._Absorb(visited);
559
+ // for (const map of this.maps) map.value._Absorb(visited);
560
+ // for (const object of this.objects)
561
+ // for (const property of object.properties)
562
+ // property.value._Absorb(visited);
563
+ // for (const definition of this.definitions)
564
+ // definition.value._Absorb(visited);
565
+
566
+ // //----
567
+ // // MEMBERS
568
+ // //----
569
+ // // FLAGS
570
+ // this.any = this.computeAny();
571
+ // this.required = this.computeRequired();
572
+ // this.optional = this.computeOptional();
573
+ // this.nullable = this.computeNullable();
574
+ // this.functional = this.computeFunctional();
575
+
576
+ // // ATOMICS
577
+ // this.atomics = [...this.computeAtomics()];
578
+ // this.constants = [...this.computeConstants()].map(([type, values]) => ({
579
+ // type,
580
+ // values: [...values],
581
+ // })) as MetadataConstant[];
582
+ // this.templates = this.computeTemplates();
583
+
584
+ // // INSTANCES
585
+ // this.resolved = this.computeResolved();
586
+ // this.rest = this.computeRest();
587
+ // this.arrays = this.computeArrays();
588
+ // this.tuples = this.computeTuples();
589
+ // this.natives = [...this.computeNatives()];
590
+ // this.maps = this.computeMaps();
591
+ // this.sets = this.computeSets();
592
+ // this.objects = this.computeObjects();
593
+ // this.definitions = this.computeDefinitions();
594
+ // }
595
+
596
+ // private static _Iterate =
597
+ // <T>(container: T) =>
598
+ // (closure: (container: T) => (meta: Metadata) => any) => {
599
+ // const visited: Set<string> = new Set();
600
+ // const iterate = (meta: Metadata): T => {
601
+ // closure(container)(meta);
602
+ // for (const def of meta.definitions) {
603
+ // const name: string = def.value.getName();
604
+ // if (visited.has(name)) continue;
605
+ // visited.add(name);
606
+ // iterate(def.value);
607
+ // }
608
+ // return container;
609
+ // };
610
+ // return iterate;
611
+ // };
612
+
613
+ // /** @internal */ private computed_size_?: number;
614
+ // /** @internal */ private computed_bucket_?: number;
615
+ // /** @internal */ private computed_any_?: boolean;
616
+ // /** @internal */ private computed_required_?: boolean;
617
+ // /** @internal */ private computed_optional_?: boolean;
618
+ // /** @internal */ private computed_nullable_?: boolean;
619
+ // /** @internal */ private computed_functional_?: boolean;
620
+ // /** @internal */ private computed_atomics_?: Set<Atomic.Literal>;
621
+ // /** @internal */ private computed_constants_?: Map<
622
+ // Atomic.Literal,
623
+ // Set<Atomic.Type>
624
+ // >;
625
+ // /** @internal */ private computed_templates_?: Metadata[][];
626
+ // /** @internal */ private computed_rest_?: Metadata | null;
627
+ // /** @internal */ private computed_resolved_?: Metadata | null;
628
+ // /** @internal */ private computed_arrays_?: Metadata[];
629
+ // /** @internal */ private computed_tuples_?: Metadata[][];
630
+ // /** @internal */ private computed_natives_?: Set<string>;
631
+ // /** @internal */ private computed_sets_?: Metadata[];
632
+ // /** @internal */ private computed_maps_?: Metadata.Entry[];
633
+ // /** @internal */ private computed_objects_?: MetadataObject[];
634
+ // /** @internal */ private computed_definitions_?: MetadataDefinition[];
287
635
  }
288
636
  export namespace Metadata {
289
- export const intersects = (
290
- x: Metadata,
291
- y: Metadata,
292
- deep: boolean,
293
- ): boolean => {
637
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
294
638
  // CHECK ANY & OPTIONAL
295
639
  if (x.any || y.any) return true;
296
640
  if (x.required === false && false === y.required) return true;
297
641
  if (x.nullable === true && true === y.nullable) return true;
642
+ if (x.functional === true && y.functional === true) return true;
298
643
 
299
644
  //----
300
645
  // INSTANCES
301
646
  //----
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;
647
+ // ARRAYS
648
+ if (x.arrays.length && y.arrays.length) return true;
649
+ if (x.tuples.length && y.tuples.length) return true;
650
+ if (x.objects.length && y.objects.length) return true;
651
+ if (x.definitions.length && y.definitions.length) return true;
330
652
 
331
653
  //----
332
654
  // VALUES
@@ -349,46 +671,63 @@ export namespace Metadata {
349
671
  if (values.size !== constant.values.length + opposite.values.length)
350
672
  return true;
351
673
  }
352
-
353
- // FUNCTIONAL
354
- if (x.functional === true && y.functional === true) return true;
355
-
356
674
  return false;
357
675
  };
358
676
 
359
- export const covers = (x: Metadata, y: Metadata): boolean => {
677
+ export const covers = (
678
+ x: Metadata,
679
+ y: Metadata,
680
+ level: number = 0,
681
+ ): boolean => {
360
682
  // CHECK ANY
361
- if (x.any) return true;
683
+ if (x === y) return false;
684
+ else if (x.any) return true;
362
685
  else if (y.any) return false;
363
686
 
364
687
  //----
365
688
  // INSTANCES
366
689
  //----
367
- // ARRAYS
368
- for (const ya of y.arrays)
369
- if (x.arrays.some((xa) => covers(xa, ya) === true) === false)
370
- return false;
690
+ if (level === 0) {
691
+ // ARRAYS
692
+ for (const ya of y.arrays)
693
+ if (
694
+ !x.arrays.some((xa) =>
695
+ covers(xa.value, ya.value, level + 1),
696
+ )
697
+ ) {
698
+ return false;
699
+ }
700
+
701
+ // TUPLES
702
+ for (const yt of y.tuples)
703
+ if (
704
+ yt.elements.length !== 0 &&
705
+ x.tuples.some(
706
+ (xt) =>
707
+ xt.elements.length >= yt.elements.length &&
708
+ xt.elements
709
+ .slice(yt.elements.length)
710
+ .every((xv, i) =>
711
+ covers(xv, yt.elements[i]!, level + 1),
712
+ ),
713
+ ) === false
714
+ )
715
+ return false;
716
+ }
371
717
 
372
718
  // OBJECTS
373
719
  for (const yo of y.objects)
374
720
  if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
375
721
  return false;
376
722
 
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
- )
723
+ // DEFINITIONS
724
+ for (const yd of y.definitions)
725
+ if (x.definitions.some((xd) => xd.name === yd.name) === false)
389
726
  return false;
390
727
 
391
728
  // NATIVES
729
+ for (const yn of y.natives)
730
+ if (x.natives.some((xn) => xn === yn) === false) return false;
392
731
 
393
732
  // SETS
394
733
  for (const ys of y.sets)
@@ -422,6 +761,9 @@ export namespace Metadata {
422
761
  return true;
423
762
  };
424
763
 
764
+ /**
765
+ * @internal
766
+ */
425
767
  export const merge = (x: Metadata, y: Metadata): Metadata => {
426
768
  const output: Metadata = Metadata.create({
427
769
  any: x.any || y.any,
@@ -445,6 +787,7 @@ export namespace Metadata {
445
787
  arrays: x.arrays.slice(),
446
788
  tuples: x.tuples.slice(),
447
789
  objects: x.objects.slice(),
790
+ definitions: x.definitions.slice(),
448
791
 
449
792
  natives: [...new Set([...x.natives, ...y.natives])],
450
793
  sets: x.sets.slice(),
@@ -463,14 +806,13 @@ export namespace Metadata {
463
806
  ArrayUtil.add(target.values, value);
464
807
  }
465
808
  for (const array of y.arrays)
466
- ArrayUtil.set(output.arrays, array, (elem) => elem.getName());
809
+ ArrayUtil.set(output.arrays, array, (elem) => elem.name);
810
+ for (const tuple of y.tuples)
811
+ ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
467
812
  for (const obj of y.objects)
468
813
  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());
814
+ for (const def of y.definitions)
815
+ ArrayUtil.set(output.definitions, def, (elem) => elem.name);
474
816
 
475
817
  return output;
476
818
  };
@@ -513,15 +855,12 @@ const getName = (metadata: Metadata): string => {
513
855
  for (const map of metadata.maps)
514
856
  elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
515
857
 
516
- // ARRAY
858
+ // INSTANCES
517
859
  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
860
+ for (const tuple of metadata.tuples) elements.push(tuple.name);
861
+ for (const array of metadata.arrays) elements.push(array.name);
524
862
  for (const object of metadata.objects) elements.push(object.name);
863
+ for (const def of metadata.definitions) elements.push(def.name);
525
864
  if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
526
865
 
527
866
  // RETURNS