typia 5.0.4 → 5.0.5-dev.20230921-2

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 (293) hide show
  1. package/README.md +1 -1
  2. package/lib/programmers/TypiaProgrammer.js +6 -1
  3. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  4. package/package.json +1 -1
  5. package/src/IRandomGenerator.ts +35 -35
  6. package/src/IValidation.ts +21 -21
  7. package/src/Primitive.ts +135 -135
  8. package/src/Resolved.ts +116 -116
  9. package/src/TypeGuardError.ts +36 -36
  10. package/src/executable/TypiaGenerateWizard.ts +85 -85
  11. package/src/executable/TypiaSetupWizard.ts +153 -153
  12. package/src/executable/setup/ArgumentParser.ts +45 -45
  13. package/src/executable/setup/CommandExecutor.ts +8 -8
  14. package/src/executable/setup/FileRetriever.ts +22 -22
  15. package/src/executable/setup/PackageManager.ts +71 -71
  16. package/src/executable/setup/PluginConfigurator.ts +70 -70
  17. package/src/executable/typia.ts +52 -52
  18. package/src/factories/CommentFactory.ts +84 -84
  19. package/src/factories/ExpressionFactory.ts +159 -159
  20. package/src/factories/IdentifierFactory.ts +74 -74
  21. package/src/factories/JsonMetadataFactory.ts +43 -43
  22. package/src/factories/LiteralFactory.ts +47 -47
  23. package/src/factories/MetadataCollection.ts +269 -269
  24. package/src/factories/MetadataCommentTagFactory.ts +629 -629
  25. package/src/factories/MetadataFactory.ts +214 -214
  26. package/src/factories/MetadataTypeTagFactory.ts +313 -313
  27. package/src/factories/NumericRangeFactory.ts +33 -33
  28. package/src/factories/ProtobufFactory.ts +272 -272
  29. package/src/factories/StatementFactory.ts +72 -72
  30. package/src/factories/TemplateFactory.ts +58 -58
  31. package/src/factories/TypeFactory.ts +119 -119
  32. package/src/factories/ValueFactory.ts +12 -12
  33. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  34. package/src/factories/internal/metadata/emend_metadata_atomics.ts +40 -40
  35. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  36. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +41 -41
  37. package/src/factories/internal/metadata/emplace_metadata_object.ts +150 -150
  38. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +60 -60
  39. package/src/factories/internal/metadata/explore_metadata.ts +32 -32
  40. package/src/factories/internal/metadata/iterate_metadata.ts +101 -101
  41. package/src/factories/internal/metadata/iterate_metadata_alias.ts +35 -35
  42. package/src/factories/internal/metadata/iterate_metadata_array.ts +37 -37
  43. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  44. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +33 -33
  45. package/src/factories/internal/metadata/iterate_metadata_collection.ts +141 -141
  46. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +26 -26
  47. package/src/factories/internal/metadata/iterate_metadata_constant.ts +58 -58
  48. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +197 -197
  49. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  50. package/src/factories/internal/metadata/iterate_metadata_native.ts +210 -210
  51. package/src/factories/internal/metadata/iterate_metadata_object.ts +44 -44
  52. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +52 -52
  53. package/src/factories/internal/metadata/iterate_metadata_set.ts +42 -42
  54. package/src/factories/internal/metadata/iterate_metadata_sort.ts +69 -69
  55. package/src/factories/internal/metadata/iterate_metadata_template.ts +47 -47
  56. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  57. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  58. package/src/functional/$ProtobufReader.ts +201 -201
  59. package/src/functional/$ProtobufSizer.ts +147 -147
  60. package/src/functional/$ProtobufWriter.ts +151 -151
  61. package/src/functional/$any.ts +4 -4
  62. package/src/functional/$clone.ts +4 -4
  63. package/src/functional/$dictionary.ts +25 -25
  64. package/src/functional/$every.ts +11 -11
  65. package/src/functional/$guard.ts +35 -35
  66. package/src/functional/$is_between.ts +2 -2
  67. package/src/functional/$join.ts +46 -46
  68. package/src/functional/$number.ts +13 -13
  69. package/src/functional/$report.ts +15 -15
  70. package/src/functional/$rest.ts +3 -3
  71. package/src/functional/$string.ts +50 -50
  72. package/src/functional/$strlen.ts +7 -7
  73. package/src/functional/$tail.ts +5 -5
  74. package/src/functional/$varint.ts +130 -130
  75. package/src/functional/$zigzag.ts +39 -39
  76. package/src/functional/IProtobufWriter.ts +18 -18
  77. package/src/functional/Namespace.ts +133 -133
  78. package/src/index.ts +4 -4
  79. package/src/json.ts +648 -648
  80. package/src/misc.ts +651 -651
  81. package/src/module.ts +656 -656
  82. package/src/programmers/AssertProgrammer.ts +317 -317
  83. package/src/programmers/CheckerProgrammer.ts +1137 -1137
  84. package/src/programmers/FeatureProgrammer.ts +478 -478
  85. package/src/programmers/IsProgrammer.ts +252 -252
  86. package/src/programmers/RandomProgrammer.ts +878 -878
  87. package/src/programmers/TypiaProgrammer.ts +170 -163
  88. package/src/programmers/ValidateProgrammer.ts +346 -346
  89. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  90. package/src/programmers/helpers/CloneJoiner.ts +144 -144
  91. package/src/programmers/helpers/FunctionImporeter.ts +91 -91
  92. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  93. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  94. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  95. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  96. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  97. package/src/programmers/helpers/PruneJoiner.ts +143 -143
  98. package/src/programmers/helpers/RandomJoiner.ts +151 -151
  99. package/src/programmers/helpers/RandomRanger.ts +173 -173
  100. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  101. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  102. package/src/programmers/helpers/UnionExplorer.ts +305 -305
  103. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  104. package/src/programmers/helpers/disable_function_importer_declare.ts +32 -32
  105. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  106. package/src/programmers/internal/application_alias.ts +65 -65
  107. package/src/programmers/internal/application_array.ts +53 -53
  108. package/src/programmers/internal/application_boolean.ts +15 -15
  109. package/src/programmers/internal/application_constant.ts +26 -26
  110. package/src/programmers/internal/application_default.ts +17 -17
  111. package/src/programmers/internal/application_default_string.ts +37 -37
  112. package/src/programmers/internal/application_escaped.ts +55 -55
  113. package/src/programmers/internal/application_native.ts +39 -39
  114. package/src/programmers/internal/application_number.ts +88 -88
  115. package/src/programmers/internal/application_object.ts +162 -162
  116. package/src/programmers/internal/application_schema.ts +175 -175
  117. package/src/programmers/internal/application_string.ts +51 -51
  118. package/src/programmers/internal/application_templates.ts +25 -25
  119. package/src/programmers/internal/application_tuple.ts +58 -58
  120. package/src/programmers/internal/check_array_length.ts +41 -41
  121. package/src/programmers/internal/check_bigint.ts +45 -45
  122. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  123. package/src/programmers/internal/check_everything.ts +28 -28
  124. package/src/programmers/internal/check_native.ts +21 -21
  125. package/src/programmers/internal/check_number.ts +105 -105
  126. package/src/programmers/internal/check_object.ts +55 -55
  127. package/src/programmers/internal/check_string.ts +45 -45
  128. package/src/programmers/internal/check_template.ts +61 -61
  129. package/src/programmers/internal/check_union_array_like.ts +323 -323
  130. package/src/programmers/internal/decode_union_object.ts +84 -84
  131. package/src/programmers/internal/feature_object_entries.ts +58 -58
  132. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  133. package/src/programmers/internal/prune_object_properties.ts +60 -60
  134. package/src/programmers/internal/random_custom.ts +37 -37
  135. package/src/programmers/internal/stringify_dynamic_properties.ts +171 -171
  136. package/src/programmers/internal/stringify_native.ts +7 -7
  137. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  138. package/src/programmers/internal/template_to_pattern.ts +15 -15
  139. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  140. package/src/programmers/json/JsonApplicationProgrammer.ts +50 -50
  141. package/src/programmers/json/JsonAssertParseProgrammer.ts +71 -71
  142. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +66 -66
  143. package/src/programmers/json/JsonIsParseProgrammer.ts +77 -77
  144. package/src/programmers/json/JsonIsStringifyProgrammer.ts +76 -76
  145. package/src/programmers/json/JsonStringifyProgrammer.ts +964 -964
  146. package/src/programmers/json/JsonValidateParseProgrammer.ts +68 -68
  147. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +84 -84
  148. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +71 -71
  149. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +68 -68
  150. package/src/programmers/misc/MiscCloneProgrammer.ts +774 -774
  151. package/src/programmers/misc/MiscIsCloneProgrammer.ts +78 -78
  152. package/src/programmers/misc/MiscIsPruneProgrammer.ts +73 -73
  153. package/src/programmers/misc/MiscLiteralsProgrammer.ts +69 -69
  154. package/src/programmers/misc/MiscPruneProgrammer.ts +550 -550
  155. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +85 -85
  156. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +78 -78
  157. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +75 -75
  158. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +66 -66
  159. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +655 -655
  160. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +883 -883
  161. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +85 -85
  162. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +76 -76
  163. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +165 -165
  164. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +75 -75
  165. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +86 -86
  166. package/src/protobuf.ts +881 -881
  167. package/src/schemas/json/IJsonApplication.ts +8 -8
  168. package/src/schemas/json/IJsonComponents.ts +33 -33
  169. package/src/schemas/json/IJsonSchema.ts +110 -110
  170. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  171. package/src/schemas/metadata/IMetadata.ts +34 -34
  172. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  173. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  174. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  175. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  176. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  177. package/src/schemas/metadata/IMetadataCollection.ts +11 -11
  178. package/src/schemas/metadata/IMetadataConstant.ts +16 -16
  179. package/src/schemas/metadata/IMetadataDictionary.ts +14 -14
  180. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  181. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  182. package/src/schemas/metadata/IMetadataObject.ts +18 -18
  183. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  184. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  185. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  186. package/src/schemas/metadata/IMetadataTypeTag.ts +8 -8
  187. package/src/schemas/metadata/Metadata.ts +685 -685
  188. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  189. package/src/schemas/metadata/MetadataArray.ts +49 -49
  190. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  191. package/src/schemas/metadata/MetadataAtomic.ts +42 -42
  192. package/src/schemas/metadata/MetadataConstant.ts +3 -3
  193. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  194. package/src/schemas/metadata/MetadataObject.ts +139 -139
  195. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  196. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  197. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  198. package/src/tags/ExclusiveMaximum.ts +13 -13
  199. package/src/tags/ExclusiveMinimum.ts +13 -13
  200. package/src/tags/Format.ts +30 -30
  201. package/src/tags/MaxItems.ts +9 -9
  202. package/src/tags/MaxLength.ts +9 -9
  203. package/src/tags/Maximum.ts +13 -13
  204. package/src/tags/MinItems.ts +9 -9
  205. package/src/tags/MinLength.ts +9 -9
  206. package/src/tags/Minimum.ts +13 -13
  207. package/src/tags/MultipleOf.ts +15 -15
  208. package/src/tags/Pattern.ts +8 -8
  209. package/src/tags/TagBase.ts +68 -68
  210. package/src/tags/Type.ts +27 -27
  211. package/src/tags/index.ts +13 -13
  212. package/src/transform.ts +35 -35
  213. package/src/transformers/CallExpressionTransformer.ts +243 -243
  214. package/src/transformers/FileTransformer.ts +57 -57
  215. package/src/transformers/IProject.ts +15 -15
  216. package/src/transformers/ITransformOptions.ts +62 -62
  217. package/src/transformers/ImportTransformer.ts +66 -66
  218. package/src/transformers/NodeTransformer.ts +13 -13
  219. package/src/transformers/TransformerError.ts +55 -55
  220. package/src/transformers/features/AssertTransformer.ts +11 -11
  221. package/src/transformers/features/CreateAssertTransformer.ts +13 -13
  222. package/src/transformers/features/CreateIsTransformer.ts +11 -11
  223. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  224. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  225. package/src/transformers/features/IsTransformer.ts +11 -11
  226. package/src/transformers/features/RandomTransformer.ts +46 -46
  227. package/src/transformers/features/ValidateTransformer.ts +11 -11
  228. package/src/transformers/features/json/JsonApplicationTransformer.ts +118 -118
  229. package/src/transformers/features/json/JsonAssertParseTransformer.ts +10 -10
  230. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  231. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +10 -10
  232. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  233. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  234. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +10 -10
  235. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  236. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +10 -10
  237. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  238. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  239. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +10 -10
  240. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  241. package/src/transformers/features/json/JsonValidateParseTransformer.ts +10 -10
  242. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  243. package/src/transformers/features/misc/MetadataTransformer.ts +61 -61
  244. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +10 -10
  245. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +10 -10
  246. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  247. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +10 -10
  248. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +10 -10
  249. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  250. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  251. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  252. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  253. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +10 -10
  254. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +10 -10
  255. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  256. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  257. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  258. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  259. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +10 -10
  260. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +10 -10
  261. package/src/transformers/features/protobuf/CreateProtobufAssertDecodeTransformer.ts +12 -12
  262. package/src/transformers/features/protobuf/CreateProtobufAssertEncodeTransformer.ts +12 -12
  263. package/src/transformers/features/protobuf/CreateProtobufDecodeTransformer.ts +9 -9
  264. package/src/transformers/features/protobuf/CreateProtobufEncodeTransformer.ts +9 -9
  265. package/src/transformers/features/protobuf/CreateProtobufIsDecodeTransformer.ts +12 -12
  266. package/src/transformers/features/protobuf/CreateProtobufIsEncodeTransformer.ts +12 -12
  267. package/src/transformers/features/protobuf/CreateProtobufValidateDecodeTransformer.ts +12 -12
  268. package/src/transformers/features/protobuf/CreateProtobufValidateEncodeTransformer.ts +12 -12
  269. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  270. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  271. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +10 -10
  272. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +10 -10
  273. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +10 -10
  274. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +10 -10
  275. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  276. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +12 -12
  277. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +12 -12
  278. package/src/transformers/internal/GenericTransformer.ts +104 -104
  279. package/src/typings/Atomic.ts +18 -18
  280. package/src/typings/ClassProperties.ts +5 -5
  281. package/src/typings/Customizable.ts +5 -5
  282. package/src/typings/OmitNever.ts +3 -3
  283. package/src/typings/ProtobufAtomic.ts +19 -19
  284. package/src/typings/SpecialFields.ts +3 -3
  285. package/src/typings/ValidationPipe.ts +9 -9
  286. package/src/typings/Writable.ts +11 -11
  287. package/src/utils/ArrayUtil.ts +45 -45
  288. package/src/utils/Escaper.ts +46 -46
  289. package/src/utils/MapUtil.ts +12 -12
  290. package/src/utils/NameEncoder.ts +32 -32
  291. package/src/utils/PatternUtil.ts +33 -33
  292. package/src/utils/RandomGenerator.ts +83 -83
  293. package/src/utils/Singleton.ts +17 -17
@@ -1,685 +1,685 @@
1
- import { ClassProperties } from "../../typings/ClassProperties";
2
- import { Writable } from "../../typings/Writable";
3
-
4
- import { ArrayUtil } from "../../utils/ArrayUtil";
5
-
6
- import { IMetadata } from "./IMetadata";
7
- import { IMetadataCollection } from "./IMetadataCollection";
8
- import { IMetadataDictionary } from "./IMetadataDictionary";
9
- import { IMetadataTypeTag } from "./IMetadataTypeTag";
10
- import { MetadataAlias } from "./MetadataAlias";
11
- import { MetadataArray } from "./MetadataArray";
12
- import { MetadataArrayType } from "./MetadataArrayType";
13
- import { MetadataAtomic } from "./MetadataAtomic";
14
- import { MetadataConstant } from "./MetadataConstant";
15
- import { MetadataEscaped } from "./MetadataEscaped";
16
- import { MetadataObject } from "./MetadataObject";
17
- import { MetadataProperty } from "./MetadataProperty";
18
- import { MetadataTuple } from "./MetadataTuple";
19
- import { MetadataTupleType } from "./MetadataTupleType";
20
-
21
- export class Metadata {
22
- public any: boolean;
23
- public required: boolean;
24
- public optional: boolean;
25
- public nullable: boolean;
26
- public functional: boolean;
27
-
28
- public escaped: MetadataEscaped | null;
29
- public atomics: MetadataAtomic[];
30
- public constants: MetadataConstant[];
31
- public templates: Metadata[][];
32
-
33
- public rest: Metadata | null;
34
- public aliases: MetadataAlias[];
35
- public arrays: MetadataArray[];
36
- public tuples: MetadataTuple[];
37
- public objects: MetadataObject[];
38
-
39
- public natives: string[];
40
- public sets: Metadata[];
41
- public maps: Metadata.Entry[];
42
-
43
- /** @internal */ private name_?: string;
44
- /** @internal */ private parent_resolved_: boolean = false;
45
- /** @internal */ public union_index?: number;
46
- /** @internal */ public fixed_?: number | null;
47
-
48
- /* -----------------------------------------------------------
49
- CONSTRUCTORS
50
- ----------------------------------------------------------- */
51
- /**
52
- * @hidden
53
- */
54
- private constructor(props: ClassProperties<Metadata>) {
55
- this.any = props.any;
56
- this.required = props.required;
57
- this.optional = props.optional;
58
- this.nullable = props.nullable;
59
- this.functional = props.functional;
60
-
61
- this.escaped = props.escaped;
62
- this.atomics = props.atomics;
63
- this.constants = props.constants;
64
- this.templates = props.templates;
65
-
66
- this.rest = props.rest;
67
- this.arrays = props.arrays;
68
- this.tuples = props.tuples;
69
- this.objects = props.objects;
70
- this.aliases = props.aliases;
71
-
72
- this.natives = props.natives;
73
- this.sets = props.sets;
74
- this.maps = props.maps;
75
- }
76
-
77
- /**
78
- * @internal
79
- */
80
- public static create(props: ClassProperties<Metadata>): Metadata {
81
- return new Metadata(props);
82
- }
83
-
84
- /**
85
- * @internal
86
- */
87
- public static initialize(parentResolved: boolean = false): Metadata {
88
- const meta: Metadata = this.create({
89
- any: false,
90
- nullable: false,
91
- required: true,
92
- optional: false,
93
- functional: false,
94
-
95
- escaped: null,
96
- constants: [],
97
- atomics: [],
98
- templates: [],
99
- arrays: [],
100
- tuples: [],
101
- objects: [],
102
- aliases: [],
103
-
104
- rest: null,
105
- natives: [],
106
- sets: [],
107
- maps: [],
108
- });
109
- meta.parent_resolved_ = parentResolved;
110
- return meta;
111
- }
112
-
113
- public toJSON(): IMetadata {
114
- return {
115
- any: this.any,
116
- required: this.required,
117
- optional: this.optional,
118
- nullable: this.nullable,
119
- functional: this.functional,
120
-
121
- atomics: this.atomics.map((a) =>
122
- MetadataAtomic.create({
123
- type: a.type,
124
- tags: a.tags.map((r) => r.slice()),
125
- }),
126
- ),
127
- constants: this.constants.map((c) => ({
128
- type: c.type,
129
- values: c.values.slice() as any,
130
- })),
131
- templates: this.templates.map((tpl) =>
132
- tpl.map((meta) => meta.toJSON()),
133
- ),
134
- escaped: this.escaped ? this.escaped.toJSON() : null,
135
-
136
- rest: this.rest ? this.rest.toJSON() : null,
137
- arrays: this.arrays.map((array) => ({
138
- name: array.type.name,
139
- tags: array.tags.map((r) => r.slice()),
140
- })),
141
- tuples: this.tuples.map((tuple) => ({
142
- name: tuple.type.name,
143
- tags: tuple.tags.map((r) => r.slice()),
144
- })),
145
- objects: this.objects.map((obj) => obj.name),
146
- aliases: this.aliases.map((alias) => alias.name),
147
-
148
- natives: this.natives.slice(),
149
- sets: this.sets.map((meta) => meta.toJSON()),
150
- maps: this.maps.map((entry) => ({
151
- key: entry.key.toJSON(),
152
- value: entry.value.toJSON(),
153
- })),
154
- };
155
- }
156
-
157
- public static from(
158
- meta: IMetadata,
159
- collection: IMetadataCollection,
160
- ): Metadata {
161
- const dict: IMetadataDictionary = {
162
- objects: new Map(
163
- collection.objects.map((obj) => [
164
- obj.name,
165
- MetadataObject._From_without_properties(obj),
166
- ]),
167
- ),
168
- aliases: new Map(
169
- collection.aliases.map((alias) => [
170
- alias.name,
171
- MetadataAlias._From_without_value(alias),
172
- ]),
173
- ),
174
- arrays: new Map(
175
- collection.arrays.map((arr) => [
176
- arr.name,
177
- MetadataArrayType._From_without_value(arr),
178
- ]),
179
- ),
180
- tuples: new Map(
181
- collection.tuples.map((tpl) => [
182
- tpl.name,
183
- MetadataTupleType._From_without_elements(tpl),
184
- ]),
185
- ),
186
- };
187
-
188
- for (const obj of collection.objects) {
189
- const initialized = dict.objects.get(obj.name)!;
190
- initialized.properties.push(
191
- ...obj.properties.map((prop) =>
192
- MetadataProperty._From(prop, dict),
193
- ),
194
- );
195
- }
196
- for (const alias of collection.aliases)
197
- Writable(dict.aliases.get(alias.name)!).value = this._From(
198
- alias.value,
199
- dict,
200
- );
201
- for (const array of collection.arrays)
202
- Writable(dict.arrays.get(array.name)!).value = this._From(
203
- array.value,
204
- dict,
205
- );
206
- for (const tuple of collection.tuples)
207
- Writable(dict.tuples.get(tuple.name)!).elements =
208
- tuple.elements.map((elem) => this._From(elem, dict));
209
-
210
- return this._From(meta, dict);
211
- }
212
-
213
- /**
214
- * @internal
215
- */
216
- public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
217
- return this.create({
218
- any: meta.any,
219
- required: meta.required,
220
- optional: meta.optional,
221
- nullable: meta.nullable,
222
- functional: meta.functional,
223
-
224
- constants: meta.constants.slice(),
225
- atomics: meta.atomics.map((a) =>
226
- MetadataAtomic.create({ type: a.type, tags: a.tags }),
227
- ),
228
- templates: meta.templates.map((tpl) =>
229
- tpl.map((meta) => this._From(meta, dict)),
230
- ),
231
- escaped: meta.escaped
232
- ? MetadataEscaped._From(meta.escaped, dict)
233
- : null,
234
-
235
- rest: meta.rest ? this._From(meta.rest, dict) : null,
236
- arrays: meta.arrays.map((ref) => {
237
- const type = dict.arrays.get(ref.name);
238
- if (type === undefined)
239
- throw new RangeError(
240
- `Error on Metadata.from(): failed to find array "${ref.name}".`,
241
- );
242
- return MetadataArray.create({
243
- type,
244
- tags: ref.tags.map((row) => row.slice()),
245
- });
246
- }),
247
- tuples: meta.tuples.map((t) => {
248
- const type = dict.tuples.get(t.name);
249
- if (type === undefined)
250
- throw new RangeError(
251
- `Error on Metadata.from(): failed to find tuple "${t.name}".`,
252
- );
253
- return MetadataTuple.create({
254
- type,
255
- tags: t.tags.map((r) => r.slice()),
256
- });
257
- }),
258
- objects: meta.objects.map((name) => {
259
- const found = dict.objects.get(name);
260
- if (found === undefined)
261
- throw new RangeError(
262
- `Error on Metadata.from(): failed to find object "${name}".`,
263
- );
264
- return found;
265
- }),
266
- aliases: meta.aliases.map((alias) => {
267
- const found = dict.aliases.get(alias);
268
- if (found === undefined)
269
- throw new RangeError(
270
- `Error on Metadata.from(): failed to find alias "${alias}".`,
271
- );
272
- return found;
273
- }),
274
-
275
- natives: meta.natives.slice(),
276
- sets: meta.sets.map((meta) => this._From(meta, dict)),
277
- maps: meta.maps.map((entry) => ({
278
- key: this._From(entry.key, dict),
279
- value: this._From(entry.value, dict),
280
- })),
281
- });
282
- }
283
-
284
- /* -----------------------------------------------------------
285
- ACCESSORS
286
- ----------------------------------------------------------- */
287
- public getName(): string {
288
- return (this.name_ ??= getName(this));
289
- }
290
-
291
- public empty(): boolean {
292
- return this.bucket() === 0 || this.size() === 0;
293
- }
294
-
295
- public size(): number {
296
- return (
297
- (this.any ? 1 : 0) +
298
- (this.escaped ? 1 : 0) +
299
- (this.functional ? 1 : 0) +
300
- (this.rest ? this.rest.size() : 0) +
301
- this.templates.length +
302
- this.atomics.length +
303
- this.constants
304
- .map((c) => c.values.length)
305
- .reduce((x, y) => x + y, 0) +
306
- this.arrays.length +
307
- this.tuples.length +
308
- this.natives.length +
309
- this.maps.length +
310
- this.sets.length +
311
- this.objects.length +
312
- this.aliases.length
313
- );
314
- }
315
-
316
- public bucket(): number {
317
- return (
318
- (this.any ? 1 : 0) +
319
- (this.escaped ? 1 : 0) +
320
- (this.functional ? 1 : 0) +
321
- (this.templates.length ? 1 : 0) +
322
- (this.atomics.length ? 1 : 0) +
323
- (this.constants.length ? 1 : 0) +
324
- (this.rest ? this.rest.size() : 0) +
325
- (this.arrays.length ? 1 : 0) +
326
- (this.tuples.length ? 1 : 0) +
327
- (this.natives.length ? 1 : 0) +
328
- (this.sets.length ? 1 : 0) +
329
- (this.maps.length ? 1 : 0) +
330
- (this.objects.length ? 1 : 0) +
331
- (this.aliases.length ? 1 : 0)
332
- );
333
- }
334
-
335
- public isConstant(): boolean {
336
- return this.bucket() === (this.constants.length ? 1 : 0);
337
- }
338
-
339
- public isRequired(): boolean {
340
- return this.required === true && this.optional === false;
341
- }
342
-
343
- /**
344
- * @internal
345
- */
346
- public isUnionBucket(): boolean {
347
- const size: number = this.bucket();
348
- const emended: number =
349
- !!this.atomics.length && !!this.constants.length ? size - 1 : size;
350
- return emended > 1;
351
- }
352
-
353
- /**
354
- * @internal
355
- */
356
- public getSoleLiteral(): string | null {
357
- if (
358
- this.size() === 1 &&
359
- this.constants.length === 1 &&
360
- this.constants[0]!.type === "string" &&
361
- this.constants[0]!.values.length === 1
362
- )
363
- return this.constants[0]!.values[0] as string;
364
- else return null;
365
- }
366
-
367
- public isSoleLiteral(): boolean {
368
- return this.getSoleLiteral() !== null;
369
- }
370
-
371
- /**
372
- * @internal
373
- */
374
- public isParentResolved(): boolean {
375
- return this.parent_resolved_;
376
- }
377
- }
378
- export namespace Metadata {
379
- export const intersects = (x: Metadata, y: Metadata): boolean => {
380
- // CHECK ANY & OPTIONAL
381
- if (x.any || y.any) return true;
382
- if (x.isRequired() === false && false === y.isRequired()) return true;
383
- if (x.nullable === true && true === y.nullable) return true;
384
- if (x.functional === true && y.functional === true) return true;
385
-
386
- //----
387
- // INSTANCES
388
- //----
389
- // ARRAYS
390
- if (x.arrays.length && y.arrays.length) return true;
391
- if (x.tuples.length && y.tuples.length) return true;
392
- if (x.objects.length && y.objects.length) return true;
393
- if (x.aliases.length && y.aliases.length) return true;
394
-
395
- // NATIVES
396
- if (x.natives.length && y.natives.length)
397
- if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
398
- return true;
399
-
400
- //----
401
- // VALUES
402
- //----
403
- // ATOMICS
404
- for (const atomic of x.atomics)
405
- if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
406
-
407
- // CONSTANTS
408
- for (const constant of x.constants) {
409
- const opposite: MetadataConstant | undefined = y.constants.find(
410
- (elem) => elem.type === constant.type,
411
- );
412
- if (opposite === undefined) continue;
413
-
414
- const values: Set<any> = new Set([
415
- ...constant.values,
416
- ...opposite.values,
417
- ]);
418
- if (values.size !== constant.values.length + opposite.values.length)
419
- return true;
420
- }
421
- return false;
422
- };
423
-
424
- export const covers = (
425
- x: Metadata,
426
- y: Metadata,
427
- level: number = 0,
428
- ): boolean => {
429
- // CHECK ANY
430
- if (x === y) return false;
431
- else if (x.any) return true;
432
- else if (y.any) return false;
433
-
434
- //----
435
- // INSTANCES
436
- //----
437
- if (level === 0) {
438
- // ARRAYS
439
- for (const ya of y.arrays)
440
- if (
441
- !x.arrays.some((xa) =>
442
- covers(xa.type.value, ya.type.value, level + 1),
443
- )
444
- ) {
445
- return false;
446
- }
447
-
448
- // TUPLES
449
- for (const yt of y.tuples)
450
- if (
451
- yt.type.elements.length !== 0 &&
452
- x.tuples.some(
453
- (xt) =>
454
- xt.type.elements.length >=
455
- yt.type.elements.length &&
456
- xt.type.elements
457
- .slice(yt.type.elements.length)
458
- .every((xv, i) =>
459
- covers(xv, yt.type.elements[i]!, level + 1),
460
- ),
461
- ) === false
462
- )
463
- return false;
464
- }
465
-
466
- // OBJECTS
467
- for (const yo of y.objects)
468
- if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
469
- return false;
470
-
471
- // ALIASES
472
- for (const yd of y.aliases)
473
- if (x.aliases.some((xd) => xd.name === yd.name) === false)
474
- return false;
475
-
476
- // NATIVES
477
- for (const yn of y.natives)
478
- if (x.natives.some((xn) => xn === yn) === false) return false;
479
-
480
- // SETS
481
- for (const ys of y.sets)
482
- if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
483
-
484
- //----
485
- // VALUES
486
- //----
487
- // ATOMICS
488
- if (
489
- y.atomics.some(
490
- (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
491
- )
492
- )
493
- return false;
494
-
495
- // CONSTANTS
496
- for (const yc of y.constants) {
497
- if (x.atomics.some((atom) => yc.type === atom.type)) continue;
498
- const xc: MetadataConstant | undefined = x.constants.find(
499
- (elem) => elem.type === yc.type,
500
- );
501
- if (xc === undefined) return false;
502
- else if (
503
- (yc.values as number[]).some(
504
- (yv) => xc.values.includes(yv as never) === false,
505
- )
506
- )
507
- return false;
508
- }
509
-
510
- // FUNCTIONAL
511
- if (x.functional === false && y.functional) return false;
512
-
513
- // SUCCESS
514
- return true;
515
- };
516
-
517
- /**
518
- * @internal
519
- */
520
- export const merge = (x: Metadata, y: Metadata): Metadata => {
521
- const output: Metadata = Metadata.create({
522
- any: x.any || y.any,
523
- nullable: x.nullable || y.nullable,
524
- required: x.required && y.required,
525
- optional: x.optional || y.optional,
526
- functional: x.functional || y.functional,
527
-
528
- escaped:
529
- x.escaped !== null && y.escaped !== null
530
- ? MetadataEscaped.create({
531
- original: merge(
532
- x.escaped.original,
533
- y.escaped.original,
534
- ),
535
- returns: merge(x.escaped.returns, y.escaped.returns),
536
- })
537
- : x.escaped ?? y.escaped,
538
- atomics: mergeTaggedTypes({
539
- container: x.atomics,
540
- equals: (x, y) => x.type === y.type,
541
- getter: (x) => x.tags,
542
- })(y.atomics),
543
- constants: [...x.constants],
544
- templates: x.templates.slice(),
545
-
546
- rest:
547
- x.rest !== null && y.rest !== null
548
- ? merge(x.rest, y.rest)
549
- : x.rest ?? y.rest,
550
- // arrays: x.arrays.slice(),
551
- arrays: mergeTaggedTypes({
552
- container: x.arrays,
553
- equals: (x, y) => x.type.name === y.type.name,
554
- getter: (x) => x.tags,
555
- })(y.arrays),
556
- tuples: mergeTaggedTypes({
557
- container: x.tuples,
558
- equals: (x, y) => x.type.name === y.type.name,
559
- getter: (x) => x.tags,
560
- })(y.tuples),
561
- objects: x.objects.slice(),
562
- aliases: x.aliases.slice(),
563
-
564
- natives: [...new Set([...x.natives, ...y.natives])],
565
- sets: x.sets.slice(),
566
- maps: x.maps.slice(),
567
- });
568
- for (const constant of y.constants) {
569
- const target: MetadataConstant = ArrayUtil.take(
570
- output.constants,
571
- (elem) => elem.type === constant.type,
572
- () => ({
573
- type: constant.type,
574
- values: [],
575
- }),
576
- );
577
- for (const value of constant.values)
578
- ArrayUtil.add(target.values, value);
579
- }
580
- for (const obj of y.objects)
581
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
582
- for (const alias of y.aliases)
583
- ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
584
-
585
- return output;
586
- };
587
- }
588
-
589
- const getName = (metadata: Metadata): string => {
590
- if (metadata.any === true) return "any";
591
-
592
- const elements: string[] = [];
593
-
594
- // OPTIONAL
595
- if (metadata.nullable === true) elements.push("null");
596
- if (metadata.isRequired() === false) elements.push("undefined");
597
-
598
- // ATOMIC
599
- for (const atom of metadata.atomics) {
600
- elements.push(atom.getName());
601
- }
602
- for (const constant of metadata.constants)
603
- for (const value of constant.values)
604
- elements.push(
605
- constant.type === "string"
606
- ? JSON.stringify(value)
607
- : value.toString(),
608
- );
609
- for (const template of metadata.templates)
610
- elements.push(
611
- "`" +
612
- template
613
- .map((child) =>
614
- child.isConstant() && child.size() === 1
615
- ? child.constants[0]!.values[0]!
616
- : `$\{${child.getName()}\}`,
617
- )
618
- .join("")
619
- .split("`")
620
- .join("\\`") +
621
- "`",
622
- );
623
-
624
- // NATIVES
625
- for (const native of metadata.natives) elements.push(native);
626
- for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
627
- for (const map of metadata.maps)
628
- elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
629
-
630
- // INSTANCES
631
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
632
- for (const tuple of metadata.tuples) elements.push(tuple.type.name);
633
- for (const array of metadata.arrays) elements.push(array.getName());
634
- for (const object of metadata.objects) elements.push(object.name);
635
- for (const alias of metadata.aliases) elements.push(alias.name);
636
- if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
637
-
638
- // RETURNS
639
- if (elements.length === 0) return "unknown";
640
- else if (elements.length === 1) return elements[0]!;
641
-
642
- elements.sort();
643
- return `(${elements.join(" | ")})`;
644
- };
645
- export namespace Metadata {
646
- export interface Entry {
647
- key: Metadata;
648
- value: Metadata;
649
- }
650
- }
651
-
652
- const mergeTaggedTypes =
653
- <T>(props: {
654
- container: T[];
655
- equals: (x: T, y: T) => boolean;
656
- getter: (x: T) => IMetadataTypeTag[][];
657
- }) =>
658
- (opposite: T[]) => {
659
- const output: T[] = [...props.container];
660
- for (const elem of opposite) {
661
- const equal = props.container.find((x) => props.equals(x, elem));
662
- if (equal === undefined) {
663
- output.push(elem);
664
- continue;
665
- }
666
-
667
- const matrix: string[][] = props
668
- .getter(equal)
669
- .map((tags) => tags.map((t) => t.name))
670
- .sort();
671
- for (const tags of props.getter(elem)) {
672
- const names: string[] = tags.map((t) => t.name).sort();
673
- if (
674
- matrix.some(
675
- (m) =>
676
- m.length === names.length &&
677
- m.every((s, i) => s === names[i]),
678
- )
679
- )
680
- continue;
681
- props.getter(equal).push(tags);
682
- }
683
- }
684
- return output;
685
- };
1
+ import { ClassProperties } from "../../typings/ClassProperties";
2
+ import { Writable } from "../../typings/Writable";
3
+
4
+ import { ArrayUtil } from "../../utils/ArrayUtil";
5
+
6
+ import { IMetadata } from "./IMetadata";
7
+ import { IMetadataCollection } from "./IMetadataCollection";
8
+ import { IMetadataDictionary } from "./IMetadataDictionary";
9
+ import { IMetadataTypeTag } from "./IMetadataTypeTag";
10
+ import { MetadataAlias } from "./MetadataAlias";
11
+ import { MetadataArray } from "./MetadataArray";
12
+ import { MetadataArrayType } from "./MetadataArrayType";
13
+ import { MetadataAtomic } from "./MetadataAtomic";
14
+ import { MetadataConstant } from "./MetadataConstant";
15
+ import { MetadataEscaped } from "./MetadataEscaped";
16
+ import { MetadataObject } from "./MetadataObject";
17
+ import { MetadataProperty } from "./MetadataProperty";
18
+ import { MetadataTuple } from "./MetadataTuple";
19
+ import { MetadataTupleType } from "./MetadataTupleType";
20
+
21
+ export class Metadata {
22
+ public any: boolean;
23
+ public required: boolean;
24
+ public optional: boolean;
25
+ public nullable: boolean;
26
+ public functional: boolean;
27
+
28
+ public escaped: MetadataEscaped | null;
29
+ public atomics: MetadataAtomic[];
30
+ public constants: MetadataConstant[];
31
+ public templates: Metadata[][];
32
+
33
+ public rest: Metadata | null;
34
+ public aliases: MetadataAlias[];
35
+ public arrays: MetadataArray[];
36
+ public tuples: MetadataTuple[];
37
+ public objects: MetadataObject[];
38
+
39
+ public natives: string[];
40
+ public sets: Metadata[];
41
+ public maps: Metadata.Entry[];
42
+
43
+ /** @internal */ private name_?: string;
44
+ /** @internal */ private parent_resolved_: boolean = false;
45
+ /** @internal */ public union_index?: number;
46
+ /** @internal */ public fixed_?: number | null;
47
+
48
+ /* -----------------------------------------------------------
49
+ CONSTRUCTORS
50
+ ----------------------------------------------------------- */
51
+ /**
52
+ * @hidden
53
+ */
54
+ private constructor(props: ClassProperties<Metadata>) {
55
+ this.any = props.any;
56
+ this.required = props.required;
57
+ this.optional = props.optional;
58
+ this.nullable = props.nullable;
59
+ this.functional = props.functional;
60
+
61
+ this.escaped = props.escaped;
62
+ this.atomics = props.atomics;
63
+ this.constants = props.constants;
64
+ this.templates = props.templates;
65
+
66
+ this.rest = props.rest;
67
+ this.arrays = props.arrays;
68
+ this.tuples = props.tuples;
69
+ this.objects = props.objects;
70
+ this.aliases = props.aliases;
71
+
72
+ this.natives = props.natives;
73
+ this.sets = props.sets;
74
+ this.maps = props.maps;
75
+ }
76
+
77
+ /**
78
+ * @internal
79
+ */
80
+ public static create(props: ClassProperties<Metadata>): Metadata {
81
+ return new Metadata(props);
82
+ }
83
+
84
+ /**
85
+ * @internal
86
+ */
87
+ public static initialize(parentResolved: boolean = false): Metadata {
88
+ const meta: Metadata = this.create({
89
+ any: false,
90
+ nullable: false,
91
+ required: true,
92
+ optional: false,
93
+ functional: false,
94
+
95
+ escaped: null,
96
+ constants: [],
97
+ atomics: [],
98
+ templates: [],
99
+ arrays: [],
100
+ tuples: [],
101
+ objects: [],
102
+ aliases: [],
103
+
104
+ rest: null,
105
+ natives: [],
106
+ sets: [],
107
+ maps: [],
108
+ });
109
+ meta.parent_resolved_ = parentResolved;
110
+ return meta;
111
+ }
112
+
113
+ public toJSON(): IMetadata {
114
+ return {
115
+ any: this.any,
116
+ required: this.required,
117
+ optional: this.optional,
118
+ nullable: this.nullable,
119
+ functional: this.functional,
120
+
121
+ atomics: this.atomics.map((a) =>
122
+ MetadataAtomic.create({
123
+ type: a.type,
124
+ tags: a.tags.map((r) => r.slice()),
125
+ }),
126
+ ),
127
+ constants: this.constants.map((c) => ({
128
+ type: c.type,
129
+ values: c.values.slice() as any,
130
+ })),
131
+ templates: this.templates.map((tpl) =>
132
+ tpl.map((meta) => meta.toJSON()),
133
+ ),
134
+ escaped: this.escaped ? this.escaped.toJSON() : null,
135
+
136
+ rest: this.rest ? this.rest.toJSON() : null,
137
+ arrays: this.arrays.map((array) => ({
138
+ name: array.type.name,
139
+ tags: array.tags.map((r) => r.slice()),
140
+ })),
141
+ tuples: this.tuples.map((tuple) => ({
142
+ name: tuple.type.name,
143
+ tags: tuple.tags.map((r) => r.slice()),
144
+ })),
145
+ objects: this.objects.map((obj) => obj.name),
146
+ aliases: this.aliases.map((alias) => alias.name),
147
+
148
+ natives: this.natives.slice(),
149
+ sets: this.sets.map((meta) => meta.toJSON()),
150
+ maps: this.maps.map((entry) => ({
151
+ key: entry.key.toJSON(),
152
+ value: entry.value.toJSON(),
153
+ })),
154
+ };
155
+ }
156
+
157
+ public static from(
158
+ meta: IMetadata,
159
+ collection: IMetadataCollection,
160
+ ): Metadata {
161
+ const dict: IMetadataDictionary = {
162
+ objects: new Map(
163
+ collection.objects.map((obj) => [
164
+ obj.name,
165
+ MetadataObject._From_without_properties(obj),
166
+ ]),
167
+ ),
168
+ aliases: new Map(
169
+ collection.aliases.map((alias) => [
170
+ alias.name,
171
+ MetadataAlias._From_without_value(alias),
172
+ ]),
173
+ ),
174
+ arrays: new Map(
175
+ collection.arrays.map((arr) => [
176
+ arr.name,
177
+ MetadataArrayType._From_without_value(arr),
178
+ ]),
179
+ ),
180
+ tuples: new Map(
181
+ collection.tuples.map((tpl) => [
182
+ tpl.name,
183
+ MetadataTupleType._From_without_elements(tpl),
184
+ ]),
185
+ ),
186
+ };
187
+
188
+ for (const obj of collection.objects) {
189
+ const initialized = dict.objects.get(obj.name)!;
190
+ initialized.properties.push(
191
+ ...obj.properties.map((prop) =>
192
+ MetadataProperty._From(prop, dict),
193
+ ),
194
+ );
195
+ }
196
+ for (const alias of collection.aliases)
197
+ Writable(dict.aliases.get(alias.name)!).value = this._From(
198
+ alias.value,
199
+ dict,
200
+ );
201
+ for (const array of collection.arrays)
202
+ Writable(dict.arrays.get(array.name)!).value = this._From(
203
+ array.value,
204
+ dict,
205
+ );
206
+ for (const tuple of collection.tuples)
207
+ Writable(dict.tuples.get(tuple.name)!).elements =
208
+ tuple.elements.map((elem) => this._From(elem, dict));
209
+
210
+ return this._From(meta, dict);
211
+ }
212
+
213
+ /**
214
+ * @internal
215
+ */
216
+ public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
217
+ return this.create({
218
+ any: meta.any,
219
+ required: meta.required,
220
+ optional: meta.optional,
221
+ nullable: meta.nullable,
222
+ functional: meta.functional,
223
+
224
+ constants: meta.constants.slice(),
225
+ atomics: meta.atomics.map((a) =>
226
+ MetadataAtomic.create({ type: a.type, tags: a.tags }),
227
+ ),
228
+ templates: meta.templates.map((tpl) =>
229
+ tpl.map((meta) => this._From(meta, dict)),
230
+ ),
231
+ escaped: meta.escaped
232
+ ? MetadataEscaped._From(meta.escaped, dict)
233
+ : null,
234
+
235
+ rest: meta.rest ? this._From(meta.rest, dict) : null,
236
+ arrays: meta.arrays.map((ref) => {
237
+ const type = dict.arrays.get(ref.name);
238
+ if (type === undefined)
239
+ throw new RangeError(
240
+ `Error on Metadata.from(): failed to find array "${ref.name}".`,
241
+ );
242
+ return MetadataArray.create({
243
+ type,
244
+ tags: ref.tags.map((row) => row.slice()),
245
+ });
246
+ }),
247
+ tuples: meta.tuples.map((t) => {
248
+ const type = dict.tuples.get(t.name);
249
+ if (type === undefined)
250
+ throw new RangeError(
251
+ `Error on Metadata.from(): failed to find tuple "${t.name}".`,
252
+ );
253
+ return MetadataTuple.create({
254
+ type,
255
+ tags: t.tags.map((r) => r.slice()),
256
+ });
257
+ }),
258
+ objects: meta.objects.map((name) => {
259
+ const found = dict.objects.get(name);
260
+ if (found === undefined)
261
+ throw new RangeError(
262
+ `Error on Metadata.from(): failed to find object "${name}".`,
263
+ );
264
+ return found;
265
+ }),
266
+ aliases: meta.aliases.map((alias) => {
267
+ const found = dict.aliases.get(alias);
268
+ if (found === undefined)
269
+ throw new RangeError(
270
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
271
+ );
272
+ return found;
273
+ }),
274
+
275
+ natives: meta.natives.slice(),
276
+ sets: meta.sets.map((meta) => this._From(meta, dict)),
277
+ maps: meta.maps.map((entry) => ({
278
+ key: this._From(entry.key, dict),
279
+ value: this._From(entry.value, dict),
280
+ })),
281
+ });
282
+ }
283
+
284
+ /* -----------------------------------------------------------
285
+ ACCESSORS
286
+ ----------------------------------------------------------- */
287
+ public getName(): string {
288
+ return (this.name_ ??= getName(this));
289
+ }
290
+
291
+ public empty(): boolean {
292
+ return this.bucket() === 0 || this.size() === 0;
293
+ }
294
+
295
+ public size(): number {
296
+ return (
297
+ (this.any ? 1 : 0) +
298
+ (this.escaped ? 1 : 0) +
299
+ (this.functional ? 1 : 0) +
300
+ (this.rest ? this.rest.size() : 0) +
301
+ this.templates.length +
302
+ this.atomics.length +
303
+ this.constants
304
+ .map((c) => c.values.length)
305
+ .reduce((x, y) => x + y, 0) +
306
+ this.arrays.length +
307
+ this.tuples.length +
308
+ this.natives.length +
309
+ this.maps.length +
310
+ this.sets.length +
311
+ this.objects.length +
312
+ this.aliases.length
313
+ );
314
+ }
315
+
316
+ public bucket(): number {
317
+ return (
318
+ (this.any ? 1 : 0) +
319
+ (this.escaped ? 1 : 0) +
320
+ (this.functional ? 1 : 0) +
321
+ (this.templates.length ? 1 : 0) +
322
+ (this.atomics.length ? 1 : 0) +
323
+ (this.constants.length ? 1 : 0) +
324
+ (this.rest ? this.rest.size() : 0) +
325
+ (this.arrays.length ? 1 : 0) +
326
+ (this.tuples.length ? 1 : 0) +
327
+ (this.natives.length ? 1 : 0) +
328
+ (this.sets.length ? 1 : 0) +
329
+ (this.maps.length ? 1 : 0) +
330
+ (this.objects.length ? 1 : 0) +
331
+ (this.aliases.length ? 1 : 0)
332
+ );
333
+ }
334
+
335
+ public isConstant(): boolean {
336
+ return this.bucket() === (this.constants.length ? 1 : 0);
337
+ }
338
+
339
+ public isRequired(): boolean {
340
+ return this.required === true && this.optional === false;
341
+ }
342
+
343
+ /**
344
+ * @internal
345
+ */
346
+ public isUnionBucket(): boolean {
347
+ const size: number = this.bucket();
348
+ const emended: number =
349
+ !!this.atomics.length && !!this.constants.length ? size - 1 : size;
350
+ return emended > 1;
351
+ }
352
+
353
+ /**
354
+ * @internal
355
+ */
356
+ public getSoleLiteral(): string | null {
357
+ if (
358
+ this.size() === 1 &&
359
+ this.constants.length === 1 &&
360
+ this.constants[0]!.type === "string" &&
361
+ this.constants[0]!.values.length === 1
362
+ )
363
+ return this.constants[0]!.values[0] as string;
364
+ else return null;
365
+ }
366
+
367
+ public isSoleLiteral(): boolean {
368
+ return this.getSoleLiteral() !== null;
369
+ }
370
+
371
+ /**
372
+ * @internal
373
+ */
374
+ public isParentResolved(): boolean {
375
+ return this.parent_resolved_;
376
+ }
377
+ }
378
+ export namespace Metadata {
379
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
380
+ // CHECK ANY & OPTIONAL
381
+ if (x.any || y.any) return true;
382
+ if (x.isRequired() === false && false === y.isRequired()) return true;
383
+ if (x.nullable === true && true === y.nullable) return true;
384
+ if (x.functional === true && y.functional === true) return true;
385
+
386
+ //----
387
+ // INSTANCES
388
+ //----
389
+ // ARRAYS
390
+ if (x.arrays.length && y.arrays.length) return true;
391
+ if (x.tuples.length && y.tuples.length) return true;
392
+ if (x.objects.length && y.objects.length) return true;
393
+ if (x.aliases.length && y.aliases.length) return true;
394
+
395
+ // NATIVES
396
+ if (x.natives.length && y.natives.length)
397
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
398
+ return true;
399
+
400
+ //----
401
+ // VALUES
402
+ //----
403
+ // ATOMICS
404
+ for (const atomic of x.atomics)
405
+ if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
406
+
407
+ // CONSTANTS
408
+ for (const constant of x.constants) {
409
+ const opposite: MetadataConstant | undefined = y.constants.find(
410
+ (elem) => elem.type === constant.type,
411
+ );
412
+ if (opposite === undefined) continue;
413
+
414
+ const values: Set<any> = new Set([
415
+ ...constant.values,
416
+ ...opposite.values,
417
+ ]);
418
+ if (values.size !== constant.values.length + opposite.values.length)
419
+ return true;
420
+ }
421
+ return false;
422
+ };
423
+
424
+ export const covers = (
425
+ x: Metadata,
426
+ y: Metadata,
427
+ level: number = 0,
428
+ ): boolean => {
429
+ // CHECK ANY
430
+ if (x === y) return false;
431
+ else if (x.any) return true;
432
+ else if (y.any) return false;
433
+
434
+ //----
435
+ // INSTANCES
436
+ //----
437
+ if (level === 0) {
438
+ // ARRAYS
439
+ for (const ya of y.arrays)
440
+ if (
441
+ !x.arrays.some((xa) =>
442
+ covers(xa.type.value, ya.type.value, level + 1),
443
+ )
444
+ ) {
445
+ return false;
446
+ }
447
+
448
+ // TUPLES
449
+ for (const yt of y.tuples)
450
+ if (
451
+ yt.type.elements.length !== 0 &&
452
+ x.tuples.some(
453
+ (xt) =>
454
+ xt.type.elements.length >=
455
+ yt.type.elements.length &&
456
+ xt.type.elements
457
+ .slice(yt.type.elements.length)
458
+ .every((xv, i) =>
459
+ covers(xv, yt.type.elements[i]!, level + 1),
460
+ ),
461
+ ) === false
462
+ )
463
+ return false;
464
+ }
465
+
466
+ // OBJECTS
467
+ for (const yo of y.objects)
468
+ if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
469
+ return false;
470
+
471
+ // ALIASES
472
+ for (const yd of y.aliases)
473
+ if (x.aliases.some((xd) => xd.name === yd.name) === false)
474
+ return false;
475
+
476
+ // NATIVES
477
+ for (const yn of y.natives)
478
+ if (x.natives.some((xn) => xn === yn) === false) return false;
479
+
480
+ // SETS
481
+ for (const ys of y.sets)
482
+ if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
483
+
484
+ //----
485
+ // VALUES
486
+ //----
487
+ // ATOMICS
488
+ if (
489
+ y.atomics.some(
490
+ (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
491
+ )
492
+ )
493
+ return false;
494
+
495
+ // CONSTANTS
496
+ for (const yc of y.constants) {
497
+ if (x.atomics.some((atom) => yc.type === atom.type)) continue;
498
+ const xc: MetadataConstant | undefined = x.constants.find(
499
+ (elem) => elem.type === yc.type,
500
+ );
501
+ if (xc === undefined) return false;
502
+ else if (
503
+ (yc.values as number[]).some(
504
+ (yv) => xc.values.includes(yv as never) === false,
505
+ )
506
+ )
507
+ return false;
508
+ }
509
+
510
+ // FUNCTIONAL
511
+ if (x.functional === false && y.functional) return false;
512
+
513
+ // SUCCESS
514
+ return true;
515
+ };
516
+
517
+ /**
518
+ * @internal
519
+ */
520
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
521
+ const output: Metadata = Metadata.create({
522
+ any: x.any || y.any,
523
+ nullable: x.nullable || y.nullable,
524
+ required: x.required && y.required,
525
+ optional: x.optional || y.optional,
526
+ functional: x.functional || y.functional,
527
+
528
+ escaped:
529
+ x.escaped !== null && y.escaped !== null
530
+ ? MetadataEscaped.create({
531
+ original: merge(
532
+ x.escaped.original,
533
+ y.escaped.original,
534
+ ),
535
+ returns: merge(x.escaped.returns, y.escaped.returns),
536
+ })
537
+ : x.escaped ?? y.escaped,
538
+ atomics: mergeTaggedTypes({
539
+ container: x.atomics,
540
+ equals: (x, y) => x.type === y.type,
541
+ getter: (x) => x.tags,
542
+ })(y.atomics),
543
+ constants: [...x.constants],
544
+ templates: x.templates.slice(),
545
+
546
+ rest:
547
+ x.rest !== null && y.rest !== null
548
+ ? merge(x.rest, y.rest)
549
+ : x.rest ?? y.rest,
550
+ // arrays: x.arrays.slice(),
551
+ arrays: mergeTaggedTypes({
552
+ container: x.arrays,
553
+ equals: (x, y) => x.type.name === y.type.name,
554
+ getter: (x) => x.tags,
555
+ })(y.arrays),
556
+ tuples: mergeTaggedTypes({
557
+ container: x.tuples,
558
+ equals: (x, y) => x.type.name === y.type.name,
559
+ getter: (x) => x.tags,
560
+ })(y.tuples),
561
+ objects: x.objects.slice(),
562
+ aliases: x.aliases.slice(),
563
+
564
+ natives: [...new Set([...x.natives, ...y.natives])],
565
+ sets: x.sets.slice(),
566
+ maps: x.maps.slice(),
567
+ });
568
+ for (const constant of y.constants) {
569
+ const target: MetadataConstant = ArrayUtil.take(
570
+ output.constants,
571
+ (elem) => elem.type === constant.type,
572
+ () => ({
573
+ type: constant.type,
574
+ values: [],
575
+ }),
576
+ );
577
+ for (const value of constant.values)
578
+ ArrayUtil.add(target.values, value);
579
+ }
580
+ for (const obj of y.objects)
581
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
582
+ for (const alias of y.aliases)
583
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
584
+
585
+ return output;
586
+ };
587
+ }
588
+
589
+ const getName = (metadata: Metadata): string => {
590
+ if (metadata.any === true) return "any";
591
+
592
+ const elements: string[] = [];
593
+
594
+ // OPTIONAL
595
+ if (metadata.nullable === true) elements.push("null");
596
+ if (metadata.isRequired() === false) elements.push("undefined");
597
+
598
+ // ATOMIC
599
+ for (const atom of metadata.atomics) {
600
+ elements.push(atom.getName());
601
+ }
602
+ for (const constant of metadata.constants)
603
+ for (const value of constant.values)
604
+ elements.push(
605
+ constant.type === "string"
606
+ ? JSON.stringify(value)
607
+ : value.toString(),
608
+ );
609
+ for (const template of metadata.templates)
610
+ elements.push(
611
+ "`" +
612
+ template
613
+ .map((child) =>
614
+ child.isConstant() && child.size() === 1
615
+ ? child.constants[0]!.values[0]!
616
+ : `$\{${child.getName()}\}`,
617
+ )
618
+ .join("")
619
+ .split("`")
620
+ .join("\\`") +
621
+ "`",
622
+ );
623
+
624
+ // NATIVES
625
+ for (const native of metadata.natives) elements.push(native);
626
+ for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
627
+ for (const map of metadata.maps)
628
+ elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
629
+
630
+ // INSTANCES
631
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
632
+ for (const tuple of metadata.tuples) elements.push(tuple.type.name);
633
+ for (const array of metadata.arrays) elements.push(array.getName());
634
+ for (const object of metadata.objects) elements.push(object.name);
635
+ for (const alias of metadata.aliases) elements.push(alias.name);
636
+ if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
637
+
638
+ // RETURNS
639
+ if (elements.length === 0) return "unknown";
640
+ else if (elements.length === 1) return elements[0]!;
641
+
642
+ elements.sort();
643
+ return `(${elements.join(" | ")})`;
644
+ };
645
+ export namespace Metadata {
646
+ export interface Entry {
647
+ key: Metadata;
648
+ value: Metadata;
649
+ }
650
+ }
651
+
652
+ const mergeTaggedTypes =
653
+ <T>(props: {
654
+ container: T[];
655
+ equals: (x: T, y: T) => boolean;
656
+ getter: (x: T) => IMetadataTypeTag[][];
657
+ }) =>
658
+ (opposite: T[]) => {
659
+ const output: T[] = [...props.container];
660
+ for (const elem of opposite) {
661
+ const equal = props.container.find((x) => props.equals(x, elem));
662
+ if (equal === undefined) {
663
+ output.push(elem);
664
+ continue;
665
+ }
666
+
667
+ const matrix: string[][] = props
668
+ .getter(equal)
669
+ .map((tags) => tags.map((t) => t.name))
670
+ .sort();
671
+ for (const tags of props.getter(elem)) {
672
+ const names: string[] = tags.map((t) => t.name).sort();
673
+ if (
674
+ matrix.some(
675
+ (m) =>
676
+ m.length === names.length &&
677
+ m.every((s, i) => s === names[i]),
678
+ )
679
+ )
680
+ continue;
681
+ props.getter(equal).push(tags);
682
+ }
683
+ }
684
+ return output;
685
+ };