typia 3.6.0-dev.20230219 → 3.6.0-dev.20230225

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