typia 4.2.3 → 4.3.0-dev.20230821

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 (260) hide show
  1. package/README.md +1 -1
  2. package/lib/factories/ExpressionFactory.d.ts +1 -0
  3. package/lib/factories/ExpressionFactory.js +3 -0
  4. package/lib/factories/ExpressionFactory.js.map +1 -1
  5. package/lib/factories/MetadataTagFactory.js +10 -4
  6. package/lib/factories/MetadataTagFactory.js.map +1 -1
  7. package/lib/metadata/IMetadataTag.d.ts +1 -1
  8. package/lib/metadata/MetadataTuple.js.map +1 -1
  9. package/lib/programmers/CheckerProgrammer.js +2 -2
  10. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  11. package/lib/programmers/LiteralsProgrammer.js +2 -1
  12. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  13. package/lib/programmers/RandomProgrammer.js +19 -10
  14. package/lib/programmers/RandomProgrammer.js.map +1 -1
  15. package/lib/programmers/helpers/RandomRanger.js +2 -2
  16. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  17. package/lib/programmers/helpers/UnionExplorer.js +11 -7
  18. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  19. package/lib/programmers/internal/application_number.js +10 -3
  20. package/lib/programmers/internal/application_number.js.map +1 -1
  21. package/lib/programmers/internal/check_bigint.js +16 -12
  22. package/lib/programmers/internal/check_bigint.js.map +1 -1
  23. package/lib/programmers/internal/check_number.js +38 -5
  24. package/lib/programmers/internal/check_number.js.map +1 -1
  25. package/package.json +2 -2
  26. package/src/CustomValidatorMap.ts +126 -126
  27. package/src/IRandomGenerator.ts +34 -34
  28. package/src/IValidation.ts +21 -21
  29. package/src/Primitive.ts +131 -131
  30. package/src/TypeGuardError.ts +36 -36
  31. package/src/executable/TypiaGenerateWizard.ts +85 -85
  32. package/src/executable/TypiaSetupWizard.ts +153 -153
  33. package/src/executable/setup/ArgumentParser.ts +45 -45
  34. package/src/executable/setup/CommandExecutor.ts +8 -8
  35. package/src/executable/setup/FileRetriever.ts +22 -22
  36. package/src/executable/setup/PackageManager.ts +71 -71
  37. package/src/executable/setup/PluginConfigurator.ts +70 -70
  38. package/src/executable/typia.ts +52 -52
  39. package/src/factories/CommentFactory.ts +84 -84
  40. package/src/factories/ExpressionFactory.ts +77 -70
  41. package/src/factories/IdentifierFactory.ts +59 -59
  42. package/src/factories/LiteralFactory.ts +39 -39
  43. package/src/factories/MetadataCollection.ts +269 -269
  44. package/src/factories/MetadataFactory.ts +34 -34
  45. package/src/factories/MetadataTagFactory.ts +361 -355
  46. package/src/factories/StatementFactory.ts +24 -24
  47. package/src/factories/TemplateFactory.ts +58 -58
  48. package/src/factories/TypeFactory.ts +124 -124
  49. package/src/factories/ValueFactory.ts +12 -12
  50. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  51. package/src/factories/internal/metadata/emend_metadata_atomics.ts +33 -33
  52. package/src/factories/internal/metadata/emplace_metadata_alias.ts +40 -40
  53. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  54. package/src/factories/internal/metadata/emplace_metadata_object.ts +136 -136
  55. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  56. package/src/factories/internal/metadata/explore_metadata.ts +38 -38
  57. package/src/factories/internal/metadata/iterate_metadata.ts +81 -81
  58. package/src/factories/internal/metadata/iterate_metadata_alias.ts +30 -30
  59. package/src/factories/internal/metadata/iterate_metadata_array.ts +24 -24
  60. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +59 -59
  61. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  62. package/src/factories/internal/metadata/iterate_metadata_collection.ts +133 -133
  63. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  64. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +84 -84
  65. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  66. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  67. package/src/factories/internal/metadata/iterate_metadata_object.ts +43 -43
  68. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +49 -49
  69. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  70. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  71. package/src/factories/internal/metadata/iterate_metadata_tag.ts +31 -31
  72. package/src/factories/internal/metadata/iterate_metadata_template.ts +38 -38
  73. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  74. package/src/factories/internal/metadata/iterate_metadata_union.ts +24 -24
  75. package/src/functional/$any.ts +2 -2
  76. package/src/functional/$dictionary.ts +25 -25
  77. package/src/functional/$every.ts +11 -11
  78. package/src/functional/$guard.ts +35 -35
  79. package/src/functional/$is_between.ts +2 -2
  80. package/src/functional/$is_custom.ts +14 -14
  81. package/src/functional/$is_date.ts +3 -3
  82. package/src/functional/$is_datetime.ts +2 -2
  83. package/src/functional/$is_email.ts +4 -4
  84. package/src/functional/$is_ipv4.ts +4 -4
  85. package/src/functional/$is_ipv6.ts +4 -4
  86. package/src/functional/$is_url.ts +4 -4
  87. package/src/functional/$is_uuid.ts +4 -4
  88. package/src/functional/$join.ts +46 -46
  89. package/src/functional/$number.ts +12 -12
  90. package/src/functional/$report.ts +15 -15
  91. package/src/functional/$rest.ts +3 -3
  92. package/src/functional/$string.ts +50 -50
  93. package/src/functional/$tail.ts +5 -5
  94. package/src/functional/Namespace.ts +127 -127
  95. package/src/index.ts +4 -4
  96. package/src/metadata/ICommentTag.ts +4 -4
  97. package/src/metadata/IJsDocTagInfo.ts +10 -10
  98. package/src/metadata/IMetadata.ts +28 -28
  99. package/src/metadata/IMetadataAlias.ts +14 -14
  100. package/src/metadata/IMetadataApplication.ts +7 -7
  101. package/src/metadata/IMetadataArray.ts +10 -10
  102. package/src/metadata/IMetadataCollection.ts +11 -11
  103. package/src/metadata/IMetadataConstant.ts +16 -16
  104. package/src/metadata/IMetadataDictionary.ts +14 -14
  105. package/src/metadata/IMetadataEntry.ts +6 -6
  106. package/src/metadata/IMetadataObject.ts +18 -18
  107. package/src/metadata/IMetadataProperty.ts +11 -11
  108. package/src/metadata/IMetadataResolved.ts +6 -6
  109. package/src/metadata/IMetadataTag.ts +112 -105
  110. package/src/metadata/IMetadataTuple.ts +10 -10
  111. package/src/metadata/Metadata.ts +607 -607
  112. package/src/metadata/MetadataAlias.ts +66 -66
  113. package/src/metadata/MetadataArray.ts +55 -55
  114. package/src/metadata/MetadataConstant.ts +3 -3
  115. package/src/metadata/MetadataObject.ts +129 -129
  116. package/src/metadata/MetadataProperty.ts +64 -64
  117. package/src/metadata/MetadataResolved.ts +51 -51
  118. package/src/metadata/MetadataTuple.ts +58 -53
  119. package/src/module.ts +2038 -2038
  120. package/src/programmers/ApplicationProgrammer.ts +47 -47
  121. package/src/programmers/AssertCloneProgrammer.ts +71 -71
  122. package/src/programmers/AssertParseProgrammer.ts +66 -66
  123. package/src/programmers/AssertProgrammer.ts +279 -279
  124. package/src/programmers/AssertPruneProgrammer.ts +68 -68
  125. package/src/programmers/AssertStringifyProgrammer.ts +66 -66
  126. package/src/programmers/CheckerProgrammer.ts +1173 -1173
  127. package/src/programmers/CloneProgrammer.ts +587 -587
  128. package/src/programmers/FeatureProgrammer.ts +495 -495
  129. package/src/programmers/IsCloneProgrammer.ts +78 -78
  130. package/src/programmers/IsParseProgrammer.ts +72 -72
  131. package/src/programmers/IsProgrammer.ts +239 -239
  132. package/src/programmers/IsPruneProgrammer.ts +73 -73
  133. package/src/programmers/IsStringifyProgrammer.ts +76 -76
  134. package/src/programmers/LiteralsProgrammer.ts +64 -63
  135. package/src/programmers/PruneProgrammer.ts +542 -542
  136. package/src/programmers/RandomProgrammer.ts +578 -579
  137. package/src/programmers/StringifyProgrammer.ts +986 -986
  138. package/src/programmers/TypiaProgrammer.ts +129 -129
  139. package/src/programmers/ValidateCloneProgrammer.ts +85 -85
  140. package/src/programmers/ValidateParseProgrammer.ts +70 -70
  141. package/src/programmers/ValidateProgrammer.ts +305 -305
  142. package/src/programmers/ValidatePruneProgrammer.ts +78 -78
  143. package/src/programmers/ValidateStringifyProgrammer.ts +84 -84
  144. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  145. package/src/programmers/helpers/CloneJoiner.ts +131 -131
  146. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  147. package/src/programmers/helpers/ICheckEntry.ts +12 -12
  148. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  149. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  150. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  151. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  152. package/src/programmers/helpers/RandomRanger.ts +208 -216
  153. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  154. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  155. package/src/programmers/helpers/UnionExplorer.ts +305 -301
  156. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  157. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  158. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  159. package/src/programmers/internal/application_alias.ts +66 -66
  160. package/src/programmers/internal/application_array.ts +30 -30
  161. package/src/programmers/internal/application_boolean.ts +15 -15
  162. package/src/programmers/internal/application_constant.ts +26 -26
  163. package/src/programmers/internal/application_default.ts +17 -17
  164. package/src/programmers/internal/application_default_string.ts +33 -33
  165. package/src/programmers/internal/application_native.ts +39 -39
  166. package/src/programmers/internal/application_number.ts +80 -74
  167. package/src/programmers/internal/application_object.ts +165 -165
  168. package/src/programmers/internal/application_resolved.ts +55 -55
  169. package/src/programmers/internal/application_schema.ts +157 -157
  170. package/src/programmers/internal/application_string.ts +44 -44
  171. package/src/programmers/internal/application_templates.ts +25 -25
  172. package/src/programmers/internal/application_tuple.ts +57 -57
  173. package/src/programmers/internal/check_array.ts +30 -30
  174. package/src/programmers/internal/check_array_length.ts +35 -35
  175. package/src/programmers/internal/check_bigint.ts +113 -82
  176. package/src/programmers/internal/check_custom.ts +31 -31
  177. package/src/programmers/internal/check_dynamic_properties.ts +195 -195
  178. package/src/programmers/internal/check_everything.ts +28 -28
  179. package/src/programmers/internal/check_native.ts +21 -21
  180. package/src/programmers/internal/check_number.ts +258 -177
  181. package/src/programmers/internal/check_object.ts +55 -55
  182. package/src/programmers/internal/check_string.ts +25 -25
  183. package/src/programmers/internal/check_string_tags.ts +67 -67
  184. package/src/programmers/internal/check_template.ts +56 -56
  185. package/src/programmers/internal/check_union_array_like.ts +329 -329
  186. package/src/programmers/internal/decode_union_object.ts +73 -73
  187. package/src/programmers/internal/feature_object_entries.ts +63 -63
  188. package/src/programmers/internal/get_comment_tags.ts +23 -23
  189. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  190. package/src/programmers/internal/prune_object_properties.ts +60 -60
  191. package/src/programmers/internal/random_custom.ts +29 -29
  192. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  193. package/src/programmers/internal/stringify_native.ts +7 -7
  194. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  195. package/src/programmers/internal/template_to_pattern.ts +15 -15
  196. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  197. package/src/schemas/IJsonApplication.ts +8 -8
  198. package/src/schemas/IJsonComponents.ts +33 -33
  199. package/src/schemas/IJsonSchema.ts +133 -133
  200. package/src/transform.ts +27 -27
  201. package/src/transformers/CallExpressionTransformer.ts +179 -179
  202. package/src/transformers/FileTransformer.ts +47 -47
  203. package/src/transformers/IProject.ts +11 -11
  204. package/src/transformers/ITransformOptions.ts +62 -62
  205. package/src/transformers/ImportTransformer.ts +66 -66
  206. package/src/transformers/NodeTransformer.ts +13 -13
  207. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +112 -112
  208. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  209. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  210. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  211. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  212. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  213. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  214. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  215. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  216. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  217. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +39 -39
  218. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  219. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  220. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  221. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  222. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +28 -28
  223. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  224. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  225. package/src/transformers/features/miscellaneous/RandomTransformer.ts +42 -42
  226. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  227. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  228. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  229. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  230. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  231. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  232. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  233. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  234. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  235. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  236. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  237. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  238. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  239. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  240. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  241. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  242. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  243. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  244. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  245. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  246. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  247. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  248. package/src/transformers/internal/GenericTransformer.ts +97 -97
  249. package/src/typings/Atomic.ts +17 -17
  250. package/src/typings/ClassProperties.ts +5 -5
  251. package/src/typings/Customizable.ts +5 -5
  252. package/src/typings/OmitNever.ts +3 -3
  253. package/src/typings/SpecialFields.ts +3 -3
  254. package/src/typings/Writable.ts +11 -11
  255. package/src/utils/ArrayUtil.ts +45 -45
  256. package/src/utils/Escaper.ts +46 -46
  257. package/src/utils/MapUtil.ts +12 -12
  258. package/src/utils/PatternUtil.ts +33 -33
  259. package/src/utils/RandomGenerator.ts +81 -81
  260. package/src/utils/Singleton.ts +17 -17
@@ -1,607 +1,607 @@
1
- import { Atomic } from "../typings/Atomic";
2
- import { ClassProperties } from "../typings/ClassProperties";
3
- import { Writable } from "../typings/Writable";
4
-
5
- import { ArrayUtil } from "../utils/ArrayUtil";
6
-
7
- import { IMetadata } from "./IMetadata";
8
- import { IMetadataCollection } from "./IMetadataCollection";
9
- import { IMetadataDictionary } from "./IMetadataDictionary";
10
- import { MetadataAlias } from "./MetadataAlias";
11
- import { MetadataArray } from "./MetadataArray";
12
- import { MetadataConstant } from "./MetadataConstant";
13
- import { MetadataObject } from "./MetadataObject";
14
- import { MetadataProperty } from "./MetadataProperty";
15
- import { MetadataResolved } from "./MetadataResolved";
16
- import { MetadataTuple } from "./MetadataTuple";
17
-
18
- export class Metadata {
19
- public any: boolean;
20
- public required: boolean;
21
- public optional: boolean;
22
- public nullable: boolean;
23
- public functional: boolean;
24
-
25
- public resolved: MetadataResolved | null;
26
- public atomics: Atomic.Literal[];
27
- public constants: MetadataConstant[];
28
- public templates: Metadata[][];
29
-
30
- public rest: Metadata | null;
31
- public aliases: MetadataAlias[];
32
- public arrays: MetadataArray[];
33
- public tuples: MetadataTuple[];
34
- public objects: MetadataObject[];
35
-
36
- public natives: string[];
37
- public sets: Metadata[];
38
- public maps: Metadata.Entry[];
39
-
40
- /** @internal */ private name_?: string;
41
- /** @internal */ private parent_resolved_: boolean = false;
42
- /** @internal */ public union_index?: number;
43
-
44
- /* -----------------------------------------------------------
45
- CONSTRUCTORS
46
- ----------------------------------------------------------- */
47
- /**
48
- * @hidden
49
- */
50
- private constructor(props: ClassProperties<Metadata>) {
51
- this.any = props.any;
52
- this.required = props.required;
53
- this.optional = props.optional;
54
- this.nullable = props.nullable;
55
- this.functional = props.functional;
56
-
57
- this.resolved = props.resolved;
58
- this.atomics = props.atomics;
59
- this.constants = props.constants;
60
- this.templates = props.templates;
61
-
62
- this.rest = props.rest;
63
- this.arrays = props.arrays;
64
- this.tuples = props.tuples;
65
- this.objects = props.objects;
66
- this.aliases = props.aliases;
67
-
68
- this.natives = props.natives;
69
- this.sets = props.sets;
70
- this.maps = props.maps;
71
- }
72
-
73
- /**
74
- * @internal
75
- */
76
- public static create(props: ClassProperties<Metadata>): Metadata {
77
- return new Metadata(props);
78
- }
79
-
80
- /**
81
- * @internal
82
- */
83
- public static initialize(parentResolved: boolean = false): Metadata {
84
- const meta: Metadata = this.create({
85
- any: false,
86
- nullable: false,
87
- required: true,
88
- optional: false,
89
- functional: false,
90
-
91
- resolved: null,
92
- constants: [],
93
- atomics: [],
94
- templates: [],
95
- arrays: [],
96
- tuples: [],
97
- objects: [],
98
- aliases: [],
99
-
100
- rest: null,
101
- natives: [],
102
- sets: [],
103
- maps: [],
104
- });
105
- meta.parent_resolved_ = parentResolved;
106
- return meta;
107
- }
108
-
109
- public toJSON(): IMetadata {
110
- return {
111
- any: this.any,
112
- required: this.required,
113
- optional: this.optional,
114
- nullable: this.nullable,
115
- functional: this.functional,
116
-
117
- atomics: this.atomics.slice(),
118
- constants: JSON.parse(JSON.stringify(this.constants)),
119
- templates: this.templates.map((tpl) =>
120
- tpl.map((meta) => meta.toJSON()),
121
- ),
122
- resolved: this.resolved ? this.resolved.toJSON() : null,
123
-
124
- rest: this.rest ? this.rest.toJSON() : null,
125
- arrays: this.arrays.map((array) => array.name),
126
- tuples: this.tuples.map((tuple) => tuple.name),
127
- objects: this.objects.map((obj) => obj.name),
128
- aliases: this.aliases.map((alias) => alias.name),
129
-
130
- natives: this.natives.slice(),
131
- sets: this.sets.map((meta) => meta.toJSON()),
132
- maps: this.maps.map((entry) => ({
133
- key: entry.key.toJSON(),
134
- value: entry.value.toJSON(),
135
- })),
136
- };
137
- }
138
-
139
- public static from(
140
- meta: IMetadata,
141
- collection: IMetadataCollection,
142
- ): Metadata {
143
- const dict: IMetadataDictionary = {
144
- objects: new Map(
145
- collection.objects.map((obj) => [
146
- obj.name,
147
- MetadataObject._From_without_properties(obj),
148
- ]),
149
- ),
150
- aliases: new Map(
151
- collection.aliases.map((alias) => [
152
- alias.name,
153
- MetadataAlias._From_without_value(alias),
154
- ]),
155
- ),
156
- arrays: new Map(
157
- collection.arrays.map((arr) => [
158
- arr.name,
159
- MetadataArray._From_without_value(arr),
160
- ]),
161
- ),
162
- tuples: new Map(
163
- collection.tuples.map((tpl) => [
164
- tpl.name,
165
- MetadataTuple._From_without_elements(tpl),
166
- ]),
167
- ),
168
- };
169
-
170
- for (const obj of collection.objects) {
171
- const initialized = dict.objects.get(obj.name)!;
172
- initialized.properties.push(
173
- ...obj.properties.map((prop) =>
174
- MetadataProperty._From(prop, dict),
175
- ),
176
- );
177
- }
178
- for (const alias of collection.aliases)
179
- Writable(dict.aliases.get(alias.name)!).value = this._From(
180
- alias.value,
181
- dict,
182
- );
183
- for (const array of collection.arrays)
184
- Writable(dict.arrays.get(array.name)!).value = this._From(
185
- array.value,
186
- dict,
187
- );
188
- for (const tuple of collection.tuples)
189
- Writable(dict.tuples.get(tuple.name)!).elements =
190
- tuple.elements.map((elem) => this._From(elem, dict));
191
-
192
- return this._From(meta, dict);
193
- }
194
-
195
- /**
196
- * @internal
197
- */
198
- public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
199
- return this.create({
200
- any: meta.any,
201
- required: meta.required,
202
- optional: meta.optional,
203
- nullable: meta.nullable,
204
- functional: meta.functional,
205
-
206
- constants: JSON.parse(JSON.stringify(meta.constants)),
207
- atomics: meta.atomics.slice(),
208
- templates: meta.templates.map((tpl) =>
209
- tpl.map((meta) => this._From(meta, dict)),
210
- ),
211
- resolved: meta.resolved
212
- ? MetadataResolved._From(meta.resolved, dict)
213
- : null,
214
-
215
- rest: meta.rest ? this._From(meta.rest, dict) : null,
216
- arrays: meta.arrays.map((id) => {
217
- const array = dict.arrays.get(id);
218
- if (array === undefined)
219
- throw new Error(
220
- `Error on Metadata.from(): failed to find array "${id}".`,
221
- );
222
- return array;
223
- }),
224
- tuples: meta.tuples.map((id) => {
225
- const tuple = dict.tuples.get(id);
226
- if (tuple === undefined)
227
- throw new Error(
228
- `Error on Metadata.from(): failed to find tuple "${id}".`,
229
- );
230
- return tuple;
231
- }),
232
- objects: meta.objects.map((name) => {
233
- const found = dict.objects.get(name);
234
- if (found === undefined)
235
- throw new Error(
236
- `Error on Metadata.from(): failed to find object "${name}".`,
237
- );
238
- return found;
239
- }),
240
- aliases: meta.aliases.map((alias) => {
241
- const found = dict.aliases.get(alias);
242
- if (found === undefined)
243
- throw new Error(
244
- `Error on Metadata.from(): failed to find alias "${alias}".`,
245
- );
246
- return found;
247
- }),
248
-
249
- natives: meta.natives.slice(),
250
- sets: meta.sets.map((meta) => this._From(meta, dict)),
251
- maps: meta.maps.map((entry) => ({
252
- key: this._From(entry.key, dict),
253
- value: this._From(entry.value, dict),
254
- })),
255
- });
256
- }
257
-
258
- /* -----------------------------------------------------------
259
- ACCESSORS
260
- ----------------------------------------------------------- */
261
- public getName(): string {
262
- this.name_ ??= getName(this);
263
- return this.name_;
264
- }
265
-
266
- public empty(): boolean {
267
- return this.bucket() === 0 || this.size() === 0;
268
- }
269
- public size(): number {
270
- return (
271
- (this.any ? 1 : 0) +
272
- (this.resolved ? 1 : 0) +
273
- (this.functional ? 1 : 0) +
274
- (this.rest ? this.rest.size() : 0) +
275
- this.templates.length +
276
- this.atomics.length +
277
- this.constants
278
- .map((c) => c.values.length)
279
- .reduce((x, y) => x + y, 0) +
280
- this.arrays.length +
281
- this.tuples.length +
282
- this.natives.length +
283
- this.maps.length +
284
- this.sets.length +
285
- this.objects.length +
286
- this.aliases.length
287
- );
288
- }
289
- public bucket(): number {
290
- return (
291
- (this.any ? 1 : 0) +
292
- (this.resolved ? 1 : 0) +
293
- (this.functional ? 1 : 0) +
294
- (this.templates.length ? 1 : 0) +
295
- (this.atomics.length ? 1 : 0) +
296
- (this.constants.length ? 1 : 0) +
297
- (this.rest ? this.rest.size() : 0) +
298
- (this.arrays.length ? 1 : 0) +
299
- (this.tuples.length ? 1 : 0) +
300
- (this.natives.length ? 1 : 0) +
301
- (this.sets.length ? 1 : 0) +
302
- (this.maps.length ? 1 : 0) +
303
- (this.objects.length ? 1 : 0) +
304
- (this.aliases.length ? 1 : 0)
305
- );
306
- }
307
- public isConstant(): boolean {
308
- return this.bucket() === (this.constants.length ? 1 : 0);
309
- }
310
-
311
- public isRequired(): boolean {
312
- return this.required === true && this.optional === false;
313
- }
314
-
315
- /**
316
- * @internal
317
- */
318
- public isUnionBucket(): boolean {
319
- const size: number = this.bucket();
320
- const emended: number = this.constants.length ? size - 1 : size;
321
- return emended > 1;
322
- }
323
-
324
- /**
325
- * @internal
326
- */
327
- public getSoleLiteral(): string | null {
328
- if (
329
- this.size() === 1 &&
330
- this.constants.length === 1 &&
331
- this.constants[0]!.type === "string" &&
332
- this.constants[0]!.values.length === 1
333
- )
334
- return this.constants[0]!.values[0] as string;
335
- else return null;
336
- }
337
-
338
- public isSoleLiteral(): boolean {
339
- return this.getSoleLiteral() !== null;
340
- }
341
-
342
- /**
343
- * @internal
344
- */
345
- public isParentResolved(): boolean {
346
- return this.parent_resolved_;
347
- }
348
- }
349
- export namespace Metadata {
350
- export const intersects = (x: Metadata, y: Metadata): boolean => {
351
- // CHECK ANY & OPTIONAL
352
- if (x.any || y.any) return true;
353
- if (x.isRequired() === false && false === y.isRequired()) return true;
354
- if (x.nullable === true && true === y.nullable) return true;
355
- if (x.functional === true && y.functional === true) return true;
356
-
357
- //----
358
- // INSTANCES
359
- //----
360
- // ARRAYS
361
- if (x.arrays.length && y.arrays.length) return true;
362
- if (x.tuples.length && y.tuples.length) return true;
363
- if (x.objects.length && y.objects.length) return true;
364
- if (x.aliases.length && y.aliases.length) return true;
365
-
366
- // NATIVES
367
- if (x.natives.length && y.natives.length)
368
- if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
369
- return true;
370
-
371
- //----
372
- // VALUES
373
- //----
374
- // ATOMICS
375
- for (const atomic of x.atomics)
376
- if (y.atomics.includes(atomic)) return true;
377
-
378
- // CONSTANTS
379
- for (const constant of x.constants) {
380
- const opposite: MetadataConstant | undefined = y.constants.find(
381
- (elem) => elem.type === constant.type,
382
- );
383
- if (opposite === undefined) continue;
384
-
385
- const values: Set<any> = new Set([
386
- ...constant.values,
387
- ...opposite.values,
388
- ]);
389
- if (values.size !== constant.values.length + opposite.values.length)
390
- return true;
391
- }
392
- return false;
393
- };
394
-
395
- export const covers = (
396
- x: Metadata,
397
- y: Metadata,
398
- level: number = 0,
399
- ): boolean => {
400
- // CHECK ANY
401
- if (x === y) return false;
402
- else if (x.any) return true;
403
- else if (y.any) return false;
404
-
405
- //----
406
- // INSTANCES
407
- //----
408
- if (level === 0) {
409
- // ARRAYS
410
- for (const ya of y.arrays)
411
- if (
412
- !x.arrays.some((xa) =>
413
- covers(xa.value, ya.value, level + 1),
414
- )
415
- ) {
416
- return false;
417
- }
418
-
419
- // TUPLES
420
- for (const yt of y.tuples)
421
- if (
422
- yt.elements.length !== 0 &&
423
- x.tuples.some(
424
- (xt) =>
425
- xt.elements.length >= yt.elements.length &&
426
- xt.elements
427
- .slice(yt.elements.length)
428
- .every((xv, i) =>
429
- covers(xv, yt.elements[i]!, level + 1),
430
- ),
431
- ) === false
432
- )
433
- return false;
434
- }
435
-
436
- // OBJECTS
437
- for (const yo of y.objects)
438
- if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
439
- return false;
440
-
441
- // ALIASES
442
- for (const yd of y.aliases)
443
- if (x.aliases.some((xd) => xd.name === yd.name) === false)
444
- return false;
445
-
446
- // NATIVES
447
- for (const yn of y.natives)
448
- if (x.natives.some((xn) => xn === yn) === false) return false;
449
-
450
- // SETS
451
- for (const ys of y.sets)
452
- if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
453
-
454
- //----
455
- // VALUES
456
- //----
457
- // ATOMICS
458
- if (y.atomics.some((atomic) => x.atomics.includes(atomic) === false))
459
- return false;
460
-
461
- // CONSTANTS
462
- for (const yc of y.constants) {
463
- if (x.atomics.some((type) => yc.type === type)) continue;
464
- const xc: MetadataConstant | undefined = x.constants.find(
465
- (elem) => elem.type === yc.type,
466
- );
467
- if (xc === undefined) return false;
468
- else if (
469
- (yc.values as number[]).some(
470
- (yv) => xc.values.includes(yv as never) === false,
471
- )
472
- )
473
- return false;
474
- }
475
-
476
- // FUNCTIONAL
477
- if (x.functional === false && y.functional) return false;
478
-
479
- // SUCCESS
480
- return true;
481
- };
482
-
483
- /**
484
- * @internal
485
- */
486
- export const merge = (x: Metadata, y: Metadata): Metadata => {
487
- const output: Metadata = Metadata.create({
488
- any: x.any || y.any,
489
- nullable: x.nullable || y.nullable,
490
- required: x.required && y.required,
491
- optional: x.optional || y.optional,
492
- functional: x.functional || y.functional,
493
-
494
- resolved:
495
- x.resolved !== null && y.resolved !== null
496
- ? //? merge(x.resolved, y.resolved)
497
- MetadataResolved.create({
498
- original: merge(
499
- x.resolved.original,
500
- y.resolved.original,
501
- ),
502
- returns: merge(
503
- x.resolved.returns,
504
- y.resolved.returns,
505
- ),
506
- })
507
- : x.resolved ?? y.resolved,
508
- atomics: [...new Set([...x.atomics, ...y.atomics])],
509
- constants: [...x.constants],
510
- templates: x.templates.slice(),
511
-
512
- rest:
513
- x.rest !== null && y.rest !== null
514
- ? merge(x.rest, y.rest)
515
- : x.rest ?? y.rest,
516
- arrays: x.arrays.slice(),
517
- tuples: x.tuples.slice(),
518
- objects: x.objects.slice(),
519
- aliases: x.aliases.slice(),
520
-
521
- natives: [...new Set([...x.natives, ...y.natives])],
522
- sets: x.sets.slice(),
523
- maps: x.maps.slice(),
524
- });
525
- for (const constant of y.constants) {
526
- const target: MetadataConstant = ArrayUtil.take(
527
- output.constants,
528
- (elem) => elem.type === constant.type,
529
- () => ({
530
- type: constant.type,
531
- values: [],
532
- }),
533
- );
534
- for (const value of constant.values)
535
- ArrayUtil.add(target.values, value);
536
- }
537
- for (const array of y.arrays)
538
- ArrayUtil.set(output.arrays, array, (elem) => elem.name);
539
- for (const tuple of y.tuples)
540
- ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
541
- for (const obj of y.objects)
542
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
543
- for (const alias of y.aliases)
544
- ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
545
-
546
- return output;
547
- };
548
- }
549
-
550
- const getName = (metadata: Metadata): string => {
551
- if (metadata.any === true) return "any";
552
-
553
- const elements: string[] = [];
554
-
555
- // OPTIONAL
556
- if (metadata.nullable === true) elements.push("null");
557
- if (metadata.isRequired() === false) elements.push("undefined");
558
-
559
- // ATOMIC
560
- for (const type of metadata.atomics) {
561
- elements.push(type);
562
- }
563
- for (const constant of metadata.constants)
564
- for (const value of constant.values)
565
- elements.push(JSON.stringify(value));
566
- for (const template of metadata.templates)
567
- elements.push(
568
- "`" +
569
- template
570
- .map((child) =>
571
- child.isConstant() && child.size() === 1
572
- ? child.constants[0]!.values[0]!
573
- : `$\{${child.getName()}\}`,
574
- )
575
- .join("")
576
- .split("`")
577
- .join("\\`") +
578
- "`",
579
- );
580
-
581
- // NATIVES
582
- for (const native of metadata.natives) elements.push(native);
583
- for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
584
- for (const map of metadata.maps)
585
- elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
586
-
587
- // INSTANCES
588
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
589
- for (const tuple of metadata.tuples) elements.push(tuple.name);
590
- for (const array of metadata.arrays) elements.push(array.name);
591
- for (const object of metadata.objects) elements.push(object.name);
592
- for (const alias of metadata.aliases) elements.push(alias.name);
593
- if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
594
-
595
- // RETURNS
596
- if (elements.length === 0) return "unknown";
597
- else if (elements.length === 1) return elements[0]!;
598
-
599
- elements.sort();
600
- return `(${elements.join(" | ")})`;
601
- };
602
- export namespace Metadata {
603
- export interface Entry {
604
- key: Metadata;
605
- value: Metadata;
606
- }
607
- }
1
+ import { Atomic } from "../typings/Atomic";
2
+ import { ClassProperties } from "../typings/ClassProperties";
3
+ import { Writable } from "../typings/Writable";
4
+
5
+ import { ArrayUtil } from "../utils/ArrayUtil";
6
+
7
+ import { IMetadata } from "./IMetadata";
8
+ import { IMetadataCollection } from "./IMetadataCollection";
9
+ import { IMetadataDictionary } from "./IMetadataDictionary";
10
+ import { MetadataAlias } from "./MetadataAlias";
11
+ import { MetadataArray } from "./MetadataArray";
12
+ import { MetadataConstant } from "./MetadataConstant";
13
+ import { MetadataObject } from "./MetadataObject";
14
+ import { MetadataProperty } from "./MetadataProperty";
15
+ import { MetadataResolved } from "./MetadataResolved";
16
+ import { MetadataTuple } from "./MetadataTuple";
17
+
18
+ export class Metadata {
19
+ public any: boolean;
20
+ public required: boolean;
21
+ public optional: boolean;
22
+ public nullable: boolean;
23
+ public functional: boolean;
24
+
25
+ public resolved: MetadataResolved | null;
26
+ public atomics: Atomic.Literal[];
27
+ public constants: MetadataConstant[];
28
+ public templates: Metadata[][];
29
+
30
+ public rest: Metadata | null;
31
+ public aliases: MetadataAlias[];
32
+ public arrays: MetadataArray[];
33
+ public tuples: MetadataTuple[];
34
+ public objects: MetadataObject[];
35
+
36
+ public natives: string[];
37
+ public sets: Metadata[];
38
+ public maps: Metadata.Entry[];
39
+
40
+ /** @internal */ private name_?: string;
41
+ /** @internal */ private parent_resolved_: boolean = false;
42
+ /** @internal */ public union_index?: number;
43
+
44
+ /* -----------------------------------------------------------
45
+ CONSTRUCTORS
46
+ ----------------------------------------------------------- */
47
+ /**
48
+ * @hidden
49
+ */
50
+ private constructor(props: ClassProperties<Metadata>) {
51
+ this.any = props.any;
52
+ this.required = props.required;
53
+ this.optional = props.optional;
54
+ this.nullable = props.nullable;
55
+ this.functional = props.functional;
56
+
57
+ this.resolved = props.resolved;
58
+ this.atomics = props.atomics;
59
+ this.constants = props.constants;
60
+ this.templates = props.templates;
61
+
62
+ this.rest = props.rest;
63
+ this.arrays = props.arrays;
64
+ this.tuples = props.tuples;
65
+ this.objects = props.objects;
66
+ this.aliases = props.aliases;
67
+
68
+ this.natives = props.natives;
69
+ this.sets = props.sets;
70
+ this.maps = props.maps;
71
+ }
72
+
73
+ /**
74
+ * @internal
75
+ */
76
+ public static create(props: ClassProperties<Metadata>): Metadata {
77
+ return new Metadata(props);
78
+ }
79
+
80
+ /**
81
+ * @internal
82
+ */
83
+ public static initialize(parentResolved: boolean = false): Metadata {
84
+ const meta: Metadata = this.create({
85
+ any: false,
86
+ nullable: false,
87
+ required: true,
88
+ optional: false,
89
+ functional: false,
90
+
91
+ resolved: null,
92
+ constants: [],
93
+ atomics: [],
94
+ templates: [],
95
+ arrays: [],
96
+ tuples: [],
97
+ objects: [],
98
+ aliases: [],
99
+
100
+ rest: null,
101
+ natives: [],
102
+ sets: [],
103
+ maps: [],
104
+ });
105
+ meta.parent_resolved_ = parentResolved;
106
+ return meta;
107
+ }
108
+
109
+ public toJSON(): IMetadata {
110
+ return {
111
+ any: this.any,
112
+ required: this.required,
113
+ optional: this.optional,
114
+ nullable: this.nullable,
115
+ functional: this.functional,
116
+
117
+ atomics: this.atomics.slice(),
118
+ constants: JSON.parse(JSON.stringify(this.constants)),
119
+ templates: this.templates.map((tpl) =>
120
+ tpl.map((meta) => meta.toJSON()),
121
+ ),
122
+ resolved: this.resolved ? this.resolved.toJSON() : null,
123
+
124
+ rest: this.rest ? this.rest.toJSON() : null,
125
+ arrays: this.arrays.map((array) => array.name),
126
+ tuples: this.tuples.map((tuple) => tuple.name),
127
+ objects: this.objects.map((obj) => obj.name),
128
+ aliases: this.aliases.map((alias) => alias.name),
129
+
130
+ natives: this.natives.slice(),
131
+ sets: this.sets.map((meta) => meta.toJSON()),
132
+ maps: this.maps.map((entry) => ({
133
+ key: entry.key.toJSON(),
134
+ value: entry.value.toJSON(),
135
+ })),
136
+ };
137
+ }
138
+
139
+ public static from(
140
+ meta: IMetadata,
141
+ collection: IMetadataCollection,
142
+ ): Metadata {
143
+ const dict: IMetadataDictionary = {
144
+ objects: new Map(
145
+ collection.objects.map((obj) => [
146
+ obj.name,
147
+ MetadataObject._From_without_properties(obj),
148
+ ]),
149
+ ),
150
+ aliases: new Map(
151
+ collection.aliases.map((alias) => [
152
+ alias.name,
153
+ MetadataAlias._From_without_value(alias),
154
+ ]),
155
+ ),
156
+ arrays: new Map(
157
+ collection.arrays.map((arr) => [
158
+ arr.name,
159
+ MetadataArray._From_without_value(arr),
160
+ ]),
161
+ ),
162
+ tuples: new Map(
163
+ collection.tuples.map((tpl) => [
164
+ tpl.name,
165
+ MetadataTuple._From_without_elements(tpl),
166
+ ]),
167
+ ),
168
+ };
169
+
170
+ for (const obj of collection.objects) {
171
+ const initialized = dict.objects.get(obj.name)!;
172
+ initialized.properties.push(
173
+ ...obj.properties.map((prop) =>
174
+ MetadataProperty._From(prop, dict),
175
+ ),
176
+ );
177
+ }
178
+ for (const alias of collection.aliases)
179
+ Writable(dict.aliases.get(alias.name)!).value = this._From(
180
+ alias.value,
181
+ dict,
182
+ );
183
+ for (const array of collection.arrays)
184
+ Writable(dict.arrays.get(array.name)!).value = this._From(
185
+ array.value,
186
+ dict,
187
+ );
188
+ for (const tuple of collection.tuples)
189
+ Writable(dict.tuples.get(tuple.name)!).elements =
190
+ tuple.elements.map((elem) => this._From(elem, dict));
191
+
192
+ return this._From(meta, dict);
193
+ }
194
+
195
+ /**
196
+ * @internal
197
+ */
198
+ public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
199
+ return this.create({
200
+ any: meta.any,
201
+ required: meta.required,
202
+ optional: meta.optional,
203
+ nullable: meta.nullable,
204
+ functional: meta.functional,
205
+
206
+ constants: JSON.parse(JSON.stringify(meta.constants)),
207
+ atomics: meta.atomics.slice(),
208
+ templates: meta.templates.map((tpl) =>
209
+ tpl.map((meta) => this._From(meta, dict)),
210
+ ),
211
+ resolved: meta.resolved
212
+ ? MetadataResolved._From(meta.resolved, dict)
213
+ : null,
214
+
215
+ rest: meta.rest ? this._From(meta.rest, dict) : null,
216
+ arrays: meta.arrays.map((id) => {
217
+ const array = dict.arrays.get(id);
218
+ if (array === undefined)
219
+ throw new Error(
220
+ `Error on Metadata.from(): failed to find array "${id}".`,
221
+ );
222
+ return array;
223
+ }),
224
+ tuples: meta.tuples.map((id) => {
225
+ const tuple = dict.tuples.get(id);
226
+ if (tuple === undefined)
227
+ throw new Error(
228
+ `Error on Metadata.from(): failed to find tuple "${id}".`,
229
+ );
230
+ return tuple;
231
+ }),
232
+ objects: meta.objects.map((name) => {
233
+ const found = dict.objects.get(name);
234
+ if (found === undefined)
235
+ throw new Error(
236
+ `Error on Metadata.from(): failed to find object "${name}".`,
237
+ );
238
+ return found;
239
+ }),
240
+ aliases: meta.aliases.map((alias) => {
241
+ const found = dict.aliases.get(alias);
242
+ if (found === undefined)
243
+ throw new Error(
244
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
245
+ );
246
+ return found;
247
+ }),
248
+
249
+ natives: meta.natives.slice(),
250
+ sets: meta.sets.map((meta) => this._From(meta, dict)),
251
+ maps: meta.maps.map((entry) => ({
252
+ key: this._From(entry.key, dict),
253
+ value: this._From(entry.value, dict),
254
+ })),
255
+ });
256
+ }
257
+
258
+ /* -----------------------------------------------------------
259
+ ACCESSORS
260
+ ----------------------------------------------------------- */
261
+ public getName(): string {
262
+ this.name_ ??= getName(this);
263
+ return this.name_;
264
+ }
265
+
266
+ public empty(): boolean {
267
+ return this.bucket() === 0 || this.size() === 0;
268
+ }
269
+ public size(): number {
270
+ return (
271
+ (this.any ? 1 : 0) +
272
+ (this.resolved ? 1 : 0) +
273
+ (this.functional ? 1 : 0) +
274
+ (this.rest ? this.rest.size() : 0) +
275
+ this.templates.length +
276
+ this.atomics.length +
277
+ this.constants
278
+ .map((c) => c.values.length)
279
+ .reduce((x, y) => x + y, 0) +
280
+ this.arrays.length +
281
+ this.tuples.length +
282
+ this.natives.length +
283
+ this.maps.length +
284
+ this.sets.length +
285
+ this.objects.length +
286
+ this.aliases.length
287
+ );
288
+ }
289
+ public bucket(): number {
290
+ return (
291
+ (this.any ? 1 : 0) +
292
+ (this.resolved ? 1 : 0) +
293
+ (this.functional ? 1 : 0) +
294
+ (this.templates.length ? 1 : 0) +
295
+ (this.atomics.length ? 1 : 0) +
296
+ (this.constants.length ? 1 : 0) +
297
+ (this.rest ? this.rest.size() : 0) +
298
+ (this.arrays.length ? 1 : 0) +
299
+ (this.tuples.length ? 1 : 0) +
300
+ (this.natives.length ? 1 : 0) +
301
+ (this.sets.length ? 1 : 0) +
302
+ (this.maps.length ? 1 : 0) +
303
+ (this.objects.length ? 1 : 0) +
304
+ (this.aliases.length ? 1 : 0)
305
+ );
306
+ }
307
+ public isConstant(): boolean {
308
+ return this.bucket() === (this.constants.length ? 1 : 0);
309
+ }
310
+
311
+ public isRequired(): boolean {
312
+ return this.required === true && this.optional === false;
313
+ }
314
+
315
+ /**
316
+ * @internal
317
+ */
318
+ public isUnionBucket(): boolean {
319
+ const size: number = this.bucket();
320
+ const emended: number = this.constants.length ? size - 1 : size;
321
+ return emended > 1;
322
+ }
323
+
324
+ /**
325
+ * @internal
326
+ */
327
+ public getSoleLiteral(): string | null {
328
+ if (
329
+ this.size() === 1 &&
330
+ this.constants.length === 1 &&
331
+ this.constants[0]!.type === "string" &&
332
+ this.constants[0]!.values.length === 1
333
+ )
334
+ return this.constants[0]!.values[0] as string;
335
+ else return null;
336
+ }
337
+
338
+ public isSoleLiteral(): boolean {
339
+ return this.getSoleLiteral() !== null;
340
+ }
341
+
342
+ /**
343
+ * @internal
344
+ */
345
+ public isParentResolved(): boolean {
346
+ return this.parent_resolved_;
347
+ }
348
+ }
349
+ export namespace Metadata {
350
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
351
+ // CHECK ANY & OPTIONAL
352
+ if (x.any || y.any) return true;
353
+ if (x.isRequired() === false && false === y.isRequired()) return true;
354
+ if (x.nullable === true && true === y.nullable) return true;
355
+ if (x.functional === true && y.functional === true) return true;
356
+
357
+ //----
358
+ // INSTANCES
359
+ //----
360
+ // ARRAYS
361
+ if (x.arrays.length && y.arrays.length) return true;
362
+ if (x.tuples.length && y.tuples.length) return true;
363
+ if (x.objects.length && y.objects.length) return true;
364
+ if (x.aliases.length && y.aliases.length) return true;
365
+
366
+ // NATIVES
367
+ if (x.natives.length && y.natives.length)
368
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
369
+ return true;
370
+
371
+ //----
372
+ // VALUES
373
+ //----
374
+ // ATOMICS
375
+ for (const atomic of x.atomics)
376
+ if (y.atomics.includes(atomic)) return true;
377
+
378
+ // CONSTANTS
379
+ for (const constant of x.constants) {
380
+ const opposite: MetadataConstant | undefined = y.constants.find(
381
+ (elem) => elem.type === constant.type,
382
+ );
383
+ if (opposite === undefined) continue;
384
+
385
+ const values: Set<any> = new Set([
386
+ ...constant.values,
387
+ ...opposite.values,
388
+ ]);
389
+ if (values.size !== constant.values.length + opposite.values.length)
390
+ return true;
391
+ }
392
+ return false;
393
+ };
394
+
395
+ export const covers = (
396
+ x: Metadata,
397
+ y: Metadata,
398
+ level: number = 0,
399
+ ): boolean => {
400
+ // CHECK ANY
401
+ if (x === y) return false;
402
+ else if (x.any) return true;
403
+ else if (y.any) return false;
404
+
405
+ //----
406
+ // INSTANCES
407
+ //----
408
+ if (level === 0) {
409
+ // ARRAYS
410
+ for (const ya of y.arrays)
411
+ if (
412
+ !x.arrays.some((xa) =>
413
+ covers(xa.value, ya.value, level + 1),
414
+ )
415
+ ) {
416
+ return false;
417
+ }
418
+
419
+ // TUPLES
420
+ for (const yt of y.tuples)
421
+ if (
422
+ yt.elements.length !== 0 &&
423
+ x.tuples.some(
424
+ (xt) =>
425
+ xt.elements.length >= yt.elements.length &&
426
+ xt.elements
427
+ .slice(yt.elements.length)
428
+ .every((xv, i) =>
429
+ covers(xv, yt.elements[i]!, level + 1),
430
+ ),
431
+ ) === false
432
+ )
433
+ return false;
434
+ }
435
+
436
+ // OBJECTS
437
+ for (const yo of y.objects)
438
+ if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
439
+ return false;
440
+
441
+ // ALIASES
442
+ for (const yd of y.aliases)
443
+ if (x.aliases.some((xd) => xd.name === yd.name) === false)
444
+ return false;
445
+
446
+ // NATIVES
447
+ for (const yn of y.natives)
448
+ if (x.natives.some((xn) => xn === yn) === false) return false;
449
+
450
+ // SETS
451
+ for (const ys of y.sets)
452
+ if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
453
+
454
+ //----
455
+ // VALUES
456
+ //----
457
+ // ATOMICS
458
+ if (y.atomics.some((atomic) => x.atomics.includes(atomic) === false))
459
+ return false;
460
+
461
+ // CONSTANTS
462
+ for (const yc of y.constants) {
463
+ if (x.atomics.some((type) => yc.type === type)) continue;
464
+ const xc: MetadataConstant | undefined = x.constants.find(
465
+ (elem) => elem.type === yc.type,
466
+ );
467
+ if (xc === undefined) return false;
468
+ else if (
469
+ (yc.values as number[]).some(
470
+ (yv) => xc.values.includes(yv as never) === false,
471
+ )
472
+ )
473
+ return false;
474
+ }
475
+
476
+ // FUNCTIONAL
477
+ if (x.functional === false && y.functional) return false;
478
+
479
+ // SUCCESS
480
+ return true;
481
+ };
482
+
483
+ /**
484
+ * @internal
485
+ */
486
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
487
+ const output: Metadata = Metadata.create({
488
+ any: x.any || y.any,
489
+ nullable: x.nullable || y.nullable,
490
+ required: x.required && y.required,
491
+ optional: x.optional || y.optional,
492
+ functional: x.functional || y.functional,
493
+
494
+ resolved:
495
+ x.resolved !== null && y.resolved !== null
496
+ ? //? merge(x.resolved, y.resolved)
497
+ MetadataResolved.create({
498
+ original: merge(
499
+ x.resolved.original,
500
+ y.resolved.original,
501
+ ),
502
+ returns: merge(
503
+ x.resolved.returns,
504
+ y.resolved.returns,
505
+ ),
506
+ })
507
+ : x.resolved ?? y.resolved,
508
+ atomics: [...new Set([...x.atomics, ...y.atomics])],
509
+ constants: [...x.constants],
510
+ templates: x.templates.slice(),
511
+
512
+ rest:
513
+ x.rest !== null && y.rest !== null
514
+ ? merge(x.rest, y.rest)
515
+ : x.rest ?? y.rest,
516
+ arrays: x.arrays.slice(),
517
+ tuples: x.tuples.slice(),
518
+ objects: x.objects.slice(),
519
+ aliases: x.aliases.slice(),
520
+
521
+ natives: [...new Set([...x.natives, ...y.natives])],
522
+ sets: x.sets.slice(),
523
+ maps: x.maps.slice(),
524
+ });
525
+ for (const constant of y.constants) {
526
+ const target: MetadataConstant = ArrayUtil.take(
527
+ output.constants,
528
+ (elem) => elem.type === constant.type,
529
+ () => ({
530
+ type: constant.type,
531
+ values: [],
532
+ }),
533
+ );
534
+ for (const value of constant.values)
535
+ ArrayUtil.add(target.values, value);
536
+ }
537
+ for (const array of y.arrays)
538
+ ArrayUtil.set(output.arrays, array, (elem) => elem.name);
539
+ for (const tuple of y.tuples)
540
+ ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
541
+ for (const obj of y.objects)
542
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
543
+ for (const alias of y.aliases)
544
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
545
+
546
+ return output;
547
+ };
548
+ }
549
+
550
+ const getName = (metadata: Metadata): string => {
551
+ if (metadata.any === true) return "any";
552
+
553
+ const elements: string[] = [];
554
+
555
+ // OPTIONAL
556
+ if (metadata.nullable === true) elements.push("null");
557
+ if (metadata.isRequired() === false) elements.push("undefined");
558
+
559
+ // ATOMIC
560
+ for (const type of metadata.atomics) {
561
+ elements.push(type);
562
+ }
563
+ for (const constant of metadata.constants)
564
+ for (const value of constant.values)
565
+ elements.push(JSON.stringify(value));
566
+ for (const template of metadata.templates)
567
+ elements.push(
568
+ "`" +
569
+ template
570
+ .map((child) =>
571
+ child.isConstant() && child.size() === 1
572
+ ? child.constants[0]!.values[0]!
573
+ : `$\{${child.getName()}\}`,
574
+ )
575
+ .join("")
576
+ .split("`")
577
+ .join("\\`") +
578
+ "`",
579
+ );
580
+
581
+ // NATIVES
582
+ for (const native of metadata.natives) elements.push(native);
583
+ for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
584
+ for (const map of metadata.maps)
585
+ elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
586
+
587
+ // INSTANCES
588
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
589
+ for (const tuple of metadata.tuples) elements.push(tuple.name);
590
+ for (const array of metadata.arrays) elements.push(array.name);
591
+ for (const object of metadata.objects) elements.push(object.name);
592
+ for (const alias of metadata.aliases) elements.push(alias.name);
593
+ if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
594
+
595
+ // RETURNS
596
+ if (elements.length === 0) return "unknown";
597
+ else if (elements.length === 1) return elements[0]!;
598
+
599
+ elements.sort();
600
+ return `(${elements.join(" | ")})`;
601
+ };
602
+ export namespace Metadata {
603
+ export interface Entry {
604
+ key: Metadata;
605
+ value: Metadata;
606
+ }
607
+ }