typia 3.9.0-dev.20230603 → 3.9.0-dev.20230604-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 (318) hide show
  1. package/lib/executable/TypiaGenerateWizard.js +1 -1
  2. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  3. package/lib/executable/TypiaSetupWizard.js +1 -1
  4. package/lib/executable/TypiaSetupWizard.js.map +1 -1
  5. package/lib/executable/setup/ArgumentParser.js +1 -1
  6. package/lib/executable/setup/ArgumentParser.js.map +1 -1
  7. package/lib/executable/setup/CommandExecutor.js +1 -1
  8. package/lib/executable/setup/CommandExecutor.js.map +1 -1
  9. package/lib/executable/setup/FileRetriever.js +1 -1
  10. package/lib/executable/setup/FileRetriever.js.map +1 -1
  11. package/lib/executable/setup/PluginConfigurator.js +1 -1
  12. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  13. package/lib/factories/CommentFactory.js +1 -1
  14. package/lib/factories/CommentFactory.js.map +1 -1
  15. package/lib/factories/ExpressionFactory.js +1 -1
  16. package/lib/factories/ExpressionFactory.js.map +1 -1
  17. package/lib/factories/IdentifierFactory.js +1 -1
  18. package/lib/factories/IdentifierFactory.js.map +1 -1
  19. package/lib/factories/LiteralFactory.js +1 -1
  20. package/lib/factories/LiteralFactory.js.map +1 -1
  21. package/lib/factories/MetadataCollection.d.ts +4 -4
  22. package/lib/factories/MetadataCollection.js +13 -14
  23. package/lib/factories/MetadataCollection.js.map +1 -1
  24. package/lib/factories/MetadataFactory.js +1 -1
  25. package/lib/factories/MetadataFactory.js.map +1 -1
  26. package/lib/factories/MetadataTagFactory.js +4 -2
  27. package/lib/factories/MetadataTagFactory.js.map +1 -1
  28. package/lib/factories/StatementFactory.js +1 -1
  29. package/lib/factories/StatementFactory.js.map +1 -1
  30. package/lib/factories/TemplateFactory.js +1 -1
  31. package/lib/factories/TemplateFactory.js.map +1 -1
  32. package/lib/factories/TypeFactory.js +1 -1
  33. package/lib/factories/TypeFactory.js.map +1 -1
  34. package/lib/factories/ValueFactory.js +1 -1
  35. package/lib/factories/ValueFactory.js.map +1 -1
  36. package/lib/factories/internal/metadata/MetadataHelper.js +1 -1
  37. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -1
  38. package/lib/factories/internal/metadata/emplace_metadata_definition.d.ts +2 -2
  39. package/lib/factories/internal/metadata/emplace_metadata_definition.js +1 -1
  40. package/lib/factories/internal/metadata/emplace_metadata_definition.js.map +1 -1
  41. package/lib/factories/internal/metadata/iterate_metadata_collection.js +4 -4
  42. package/lib/factories/internal/metadata/iterate_metadata_collection.js.map +1 -1
  43. package/lib/factories/internal/metadata/iterate_metadata_definition.js +2 -2
  44. package/lib/factories/internal/metadata/iterate_metadata_definition.js.map +1 -1
  45. package/lib/functional/Namespace.js +1 -1
  46. package/lib/functional/Namespace.js.map +1 -1
  47. package/lib/metadata/IMetadata.d.ts +1 -1
  48. package/lib/metadata/{IMetadataDefinition.d.ts → IMetadataAlias.d.ts} +1 -1
  49. package/lib/metadata/{IMetadataDefinition.js → IMetadataAlias.js} +1 -1
  50. package/lib/metadata/IMetadataAlias.js.map +1 -0
  51. package/lib/metadata/IMetadataCollection.d.ts +2 -2
  52. package/lib/metadata/Metadata.d.ts +2 -2
  53. package/lib/metadata/Metadata.js +26 -27
  54. package/lib/metadata/Metadata.js.map +1 -1
  55. package/lib/metadata/{MetadataDefinition.d.ts → MetadataAlias.d.ts} +3 -3
  56. package/lib/metadata/{MetadataDefinition.js → MetadataAlias.js} +10 -10
  57. package/lib/metadata/MetadataAlias.js.map +1 -0
  58. package/lib/metadata/MetadataObject.js +1 -2
  59. package/lib/metadata/MetadataObject.js.map +1 -1
  60. package/lib/programmers/ApplicationProgrammer.js +1 -1
  61. package/lib/programmers/ApplicationProgrammer.js.map +1 -1
  62. package/lib/programmers/AssertCloneProgrammer.js +1 -1
  63. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  64. package/lib/programmers/AssertParseProgrammer.js +1 -1
  65. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  66. package/lib/programmers/AssertProgrammer.js +1 -1
  67. package/lib/programmers/AssertProgrammer.js.map +1 -1
  68. package/lib/programmers/AssertPruneProgrammer.js +1 -1
  69. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  70. package/lib/programmers/AssertStringifyProgrammer.js +1 -1
  71. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  72. package/lib/programmers/CheckerProgrammer.js +1 -1
  73. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  74. package/lib/programmers/CloneProgrammer.js +1 -1
  75. package/lib/programmers/CloneProgrammer.js.map +1 -1
  76. package/lib/programmers/FeatureProgrammer.js +1 -1
  77. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  78. package/lib/programmers/IsCloneProgrammer.js +1 -1
  79. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  80. package/lib/programmers/IsParseProgrammer.js +1 -1
  81. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  82. package/lib/programmers/IsProgrammer.js +1 -1
  83. package/lib/programmers/IsProgrammer.js.map +1 -1
  84. package/lib/programmers/IsPruneProgrammer.js +1 -1
  85. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  86. package/lib/programmers/IsStringifyProgrammer.js +1 -1
  87. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  88. package/lib/programmers/LiteralsProgrammer.js +1 -1
  89. package/lib/programmers/LiteralsProgrammer.js.map +1 -1
  90. package/lib/programmers/PruneProgrammer.js +1 -1
  91. package/lib/programmers/PruneProgrammer.js.map +1 -1
  92. package/lib/programmers/RandomProgrammer.js +1 -1
  93. package/lib/programmers/RandomProgrammer.js.map +1 -1
  94. package/lib/programmers/StringifyProgrammer.js +1 -1
  95. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  96. package/lib/programmers/TypiaProgrammer.js +1 -1
  97. package/lib/programmers/TypiaProgrammer.js.map +1 -1
  98. package/lib/programmers/ValidateCloneProgrammer.js +1 -1
  99. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  100. package/lib/programmers/ValidateParseProgrammer.js +1 -1
  101. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  102. package/lib/programmers/ValidateProgrammer.js +1 -1
  103. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  104. package/lib/programmers/ValidatePruneProgrammer.js +1 -1
  105. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  106. package/lib/programmers/ValidateStringifyProgrammer.js +1 -1
  107. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  108. package/lib/programmers/helpers/AtomicPredicator.js +1 -1
  109. package/lib/programmers/helpers/AtomicPredicator.js.map +1 -1
  110. package/lib/programmers/helpers/CloneJoiner.js +1 -1
  111. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  112. package/lib/programmers/helpers/OptionPredicator.js +1 -1
  113. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  114. package/lib/programmers/helpers/PruneJoiner.js +1 -1
  115. package/lib/programmers/helpers/PruneJoiner.js.map +1 -1
  116. package/lib/programmers/helpers/RandomJoiner.js +1 -1
  117. package/lib/programmers/helpers/RandomJoiner.js.map +1 -1
  118. package/lib/programmers/helpers/RandomRanger.js +1 -1
  119. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  120. package/lib/programmers/helpers/StringifyJoinder.js +1 -1
  121. package/lib/programmers/helpers/StringifyJoinder.js.map +1 -1
  122. package/lib/programmers/helpers/StringifyPredicator.js +1 -1
  123. package/lib/programmers/helpers/StringifyPredicator.js.map +1 -1
  124. package/lib/programmers/helpers/UnionExplorer.js +1 -1
  125. package/lib/programmers/helpers/UnionExplorer.js.map +1 -1
  126. package/lib/programmers/helpers/UnionPredicator.js +1 -1
  127. package/lib/programmers/helpers/UnionPredicator.js.map +1 -1
  128. package/lib/programmers/internal/application_boolean.js +1 -1
  129. package/lib/programmers/internal/application_boolean.js.map +1 -1
  130. package/lib/programmers/internal/application_constant.js +2 -2
  131. package/lib/programmers/internal/application_constant.js.map +1 -1
  132. package/lib/programmers/internal/application_default.js +3 -3
  133. package/lib/programmers/internal/application_default.js.map +1 -1
  134. package/lib/programmers/internal/application_definition.d.ts +2 -2
  135. package/lib/programmers/internal/application_definition.js +11 -11
  136. package/lib/programmers/internal/application_definition.js.map +1 -1
  137. package/lib/programmers/internal/application_number.js +4 -1
  138. package/lib/programmers/internal/application_number.js.map +1 -1
  139. package/lib/programmers/internal/application_schema.js +3 -3
  140. package/lib/programmers/internal/application_schema.js.map +1 -1
  141. package/lib/schemas/IJsonComponents.d.ts +2 -2
  142. package/lib/transformers/CallExpressionTransformer.js +1 -1
  143. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  144. package/lib/transformers/FileTransformer.js +1 -1
  145. package/lib/transformers/FileTransformer.js.map +1 -1
  146. package/lib/transformers/ImportTransformer.js +1 -1
  147. package/lib/transformers/ImportTransformer.js.map +1 -1
  148. package/lib/transformers/NodeTransformer.js +1 -1
  149. package/lib/transformers/NodeTransformer.js.map +1 -1
  150. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -1
  151. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  152. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js +1 -1
  153. package/lib/transformers/features/miscellaneous/AssertCloneTransformer.js.map +1 -1
  154. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js +1 -1
  155. package/lib/transformers/features/miscellaneous/AssertPruneTransformer.js.map +1 -1
  156. package/lib/transformers/features/miscellaneous/CloneTransformer.js +1 -1
  157. package/lib/transformers/features/miscellaneous/CloneTransformer.js.map +1 -1
  158. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js +1 -1
  159. package/lib/transformers/features/miscellaneous/CreateAssertCloneTransformer.js.map +1 -1
  160. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js +1 -1
  161. package/lib/transformers/features/miscellaneous/CreateAssertPruneTransformer.js.map +1 -1
  162. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js +1 -1
  163. package/lib/transformers/features/miscellaneous/CreateCloneTransformer.js.map +1 -1
  164. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js +1 -1
  165. package/lib/transformers/features/miscellaneous/CreateIsCloneTransformer.js.map +1 -1
  166. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js +1 -1
  167. package/lib/transformers/features/miscellaneous/CreateIsPruneTransformer.js.map +1 -1
  168. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js +1 -1
  169. package/lib/transformers/features/miscellaneous/CreatePruneTransformer.js.map +1 -1
  170. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js +1 -1
  171. package/lib/transformers/features/miscellaneous/CreateRandomTransformer.js.map +1 -1
  172. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js +1 -1
  173. package/lib/transformers/features/miscellaneous/CreateValidateCloneTransformer.js.map +1 -1
  174. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js +1 -1
  175. package/lib/transformers/features/miscellaneous/CreateValidatePruneTransformer.js.map +1 -1
  176. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js +1 -1
  177. package/lib/transformers/features/miscellaneous/IsCloneTransformer.js.map +1 -1
  178. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js +1 -1
  179. package/lib/transformers/features/miscellaneous/IsPruneTransformer.js.map +1 -1
  180. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js +1 -1
  181. package/lib/transformers/features/miscellaneous/LiteralsTransformer.js.map +1 -1
  182. package/lib/transformers/features/miscellaneous/MetadataTransformer.js +1 -1
  183. package/lib/transformers/features/miscellaneous/MetadataTransformer.js.map +1 -1
  184. package/lib/transformers/features/miscellaneous/PruneTransformer.js +1 -1
  185. package/lib/transformers/features/miscellaneous/PruneTransformer.js.map +1 -1
  186. package/lib/transformers/features/miscellaneous/RandomTransformer.js +1 -1
  187. package/lib/transformers/features/miscellaneous/RandomTransformer.js.map +1 -1
  188. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js +1 -1
  189. package/lib/transformers/features/miscellaneous/ValidateCloneTransformer.js.map +1 -1
  190. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js +1 -1
  191. package/lib/transformers/features/miscellaneous/ValidatePruneTransformer.js.map +1 -1
  192. package/lib/transformers/features/parsers/AssertParseTransformer.js +1 -1
  193. package/lib/transformers/features/parsers/AssertParseTransformer.js.map +1 -1
  194. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js +1 -1
  195. package/lib/transformers/features/parsers/CreateAssertParseTransformer.js.map +1 -1
  196. package/lib/transformers/features/parsers/CreateIsParseTransformer.js +1 -1
  197. package/lib/transformers/features/parsers/CreateIsParseTransformer.js.map +1 -1
  198. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js +1 -1
  199. package/lib/transformers/features/parsers/CreateValidateParseTransformer.js.map +1 -1
  200. package/lib/transformers/features/parsers/IsParseTransformer.js +1 -1
  201. package/lib/transformers/features/parsers/IsParseTransformer.js.map +1 -1
  202. package/lib/transformers/features/parsers/ValidateParseTransformer.js +1 -1
  203. package/lib/transformers/features/parsers/ValidateParseTransformer.js.map +1 -1
  204. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js +1 -1
  205. package/lib/transformers/features/stringifiers/AssertStringifyTransformer.js.map +1 -1
  206. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js +1 -1
  207. package/lib/transformers/features/stringifiers/CreateAssertStringifyTransformer.js.map +1 -1
  208. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js +1 -1
  209. package/lib/transformers/features/stringifiers/CreateIsStringifyTransformer.js.map +1 -1
  210. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js +1 -1
  211. package/lib/transformers/features/stringifiers/CreateStringifyTransformer.js.map +1 -1
  212. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js +1 -1
  213. package/lib/transformers/features/stringifiers/CreateValidateStringifyProgrammer.js.map +1 -1
  214. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js +1 -1
  215. package/lib/transformers/features/stringifiers/IsStringifyTransformer.js.map +1 -1
  216. package/lib/transformers/features/stringifiers/StringifyTransformer.js +1 -1
  217. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  218. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js +1 -1
  219. package/lib/transformers/features/stringifiers/ValidateStringifyTransformer.js.map +1 -1
  220. package/lib/transformers/features/validators/AssertTransformer.js +1 -1
  221. package/lib/transformers/features/validators/AssertTransformer.js.map +1 -1
  222. package/lib/transformers/features/validators/CreateAssertTransformer.js +1 -1
  223. package/lib/transformers/features/validators/CreateAssertTransformer.js.map +1 -1
  224. package/lib/transformers/features/validators/CreateIsTransformer.js +1 -1
  225. package/lib/transformers/features/validators/CreateIsTransformer.js.map +1 -1
  226. package/lib/transformers/features/validators/CreateValidateTransformer.js +1 -1
  227. package/lib/transformers/features/validators/CreateValidateTransformer.js.map +1 -1
  228. package/lib/transformers/features/validators/IsTransformer.js +1 -1
  229. package/lib/transformers/features/validators/IsTransformer.js.map +1 -1
  230. package/lib/transformers/features/validators/ValidateTransformer.js +1 -1
  231. package/lib/transformers/features/validators/ValidateTransformer.js.map +1 -1
  232. package/lib/transformers/internal/GenericTransformer.js +1 -1
  233. package/lib/transformers/internal/GenericTransformer.js.map +1 -1
  234. package/lib/utils/ArrayUtil.js +1 -1
  235. package/lib/utils/ArrayUtil.js.map +1 -1
  236. package/lib/utils/Escaper.js +1 -1
  237. package/lib/utils/Escaper.js.map +1 -1
  238. package/lib/utils/MapUtil.js +1 -1
  239. package/lib/utils/MapUtil.js.map +1 -1
  240. package/lib/utils/PatternUtil.js +1 -1
  241. package/lib/utils/PatternUtil.js.map +1 -1
  242. package/lib/utils/RandomGenerator.js +1 -1
  243. package/lib/utils/RandomGenerator.js.map +1 -1
  244. package/package.json +1 -1
  245. package/src/IRandomGenerator.ts +34 -34
  246. package/src/factories/IdentifierFactory.ts +65 -65
  247. package/src/factories/MetadataCollection.ts +254 -257
  248. package/src/factories/MetadataFactory.ts +40 -40
  249. package/src/factories/MetadataTagFactory.ts +300 -298
  250. package/src/factories/internal/metadata/emplace_metadata_array.ts +34 -34
  251. package/src/factories/internal/metadata/emplace_metadata_definition.ts +35 -35
  252. package/src/factories/internal/metadata/emplace_metadata_object.ts +142 -142
  253. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +50 -50
  254. package/src/factories/internal/metadata/explore_metadata.ts +66 -66
  255. package/src/factories/internal/metadata/iterate_metadata.ts +77 -77
  256. package/src/factories/internal/metadata/iterate_metadata_array.ts +25 -25
  257. package/src/factories/internal/metadata/iterate_metadata_collection.ts +130 -130
  258. package/src/factories/internal/metadata/iterate_metadata_definition.ts +30 -34
  259. package/src/factories/internal/metadata/iterate_metadata_object.ts +49 -49
  260. package/src/factories/internal/metadata/iterate_metadata_sort.ts +68 -68
  261. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +24 -24
  262. package/src/factories/internal/metadata/iterate_metadata_union.ts +68 -68
  263. package/src/metadata/IMetadata.ts +27 -27
  264. package/src/metadata/{IMetadataDefinition.ts → IMetadataAlias.ts} +12 -12
  265. package/src/metadata/IMetadataApplication.ts +7 -7
  266. package/src/metadata/IMetadataArray.ts +10 -10
  267. package/src/metadata/IMetadataCollection.ts +11 -11
  268. package/src/metadata/IMetadataDictionary.ts +14 -14
  269. package/src/metadata/IMetadataObject.ts +18 -18
  270. package/src/metadata/IMetadataProperty.ts +11 -11
  271. package/src/metadata/IMetadataTuple.ts +10 -10
  272. package/src/metadata/Metadata.ts +585 -878
  273. package/src/metadata/{MetadataDefinition.ts → MetadataAlias.ts} +61 -65
  274. package/src/metadata/MetadataArray.ts +52 -52
  275. package/src/metadata/MetadataObject.ts +114 -114
  276. package/src/metadata/MetadataProperty.ts +64 -64
  277. package/src/metadata/MetadataTuple.ts +53 -53
  278. package/src/programmers/ApplicationProgrammer.ts +55 -55
  279. package/src/programmers/AssertProgrammer.ts +291 -291
  280. package/src/programmers/CheckerProgrammer.ts +1182 -1182
  281. package/src/programmers/CloneProgrammer.ts +595 -595
  282. package/src/programmers/FeatureProgrammer.ts +495 -495
  283. package/src/programmers/IsProgrammer.ts +250 -250
  284. package/src/programmers/LiteralsProgrammer.ts +66 -66
  285. package/src/programmers/PruneProgrammer.ts +550 -550
  286. package/src/programmers/RandomProgrammer.ts +589 -589
  287. package/src/programmers/StringifyProgrammer.ts +990 -990
  288. package/src/programmers/ValidateProgrammer.ts +313 -313
  289. package/src/programmers/helpers/FunctionImporeter.ts +78 -78
  290. package/src/programmers/helpers/RandomJoiner.ts +173 -173
  291. package/src/programmers/helpers/UnionExplorer.ts +301 -301
  292. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  293. package/src/programmers/helpers/disable_function_importer_declare.ts +26 -26
  294. package/src/programmers/internal/JSON_SCHEMA_PREFIX.ts +1 -1
  295. package/src/programmers/internal/application_array.ts +64 -64
  296. package/src/programmers/internal/application_boolean.ts +15 -15
  297. package/src/programmers/internal/application_constant.ts +26 -26
  298. package/src/programmers/internal/application_default.ts +17 -17
  299. package/src/programmers/internal/application_definition.ts +45 -45
  300. package/src/programmers/internal/application_native.ts +39 -39
  301. package/src/programmers/internal/application_number.ts +4 -1
  302. package/src/programmers/internal/application_object.ts +167 -167
  303. package/src/programmers/internal/application_schema.ts +164 -164
  304. package/src/programmers/internal/application_tuple.ts +77 -77
  305. package/src/programmers/internal/check_union_array_like.ts +329 -329
  306. package/src/programmers/internal/feature_object_entries.ts +63 -63
  307. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +16 -16
  308. package/src/schemas/IJsonApplication.ts +8 -8
  309. package/src/schemas/IJsonComponents.ts +45 -45
  310. package/src/schemas/IJsonSchema.ts +134 -134
  311. package/src/transformers/CallExpressionTransformer.ts +179 -179
  312. package/src/transformers/FileTransformer.ts +47 -47
  313. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +104 -104
  314. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +53 -53
  315. package/src/utils/ArrayUtil.ts +45 -45
  316. package/src/utils/RandomGenerator.ts +81 -81
  317. package/lib/metadata/IMetadataDefinition.js.map +0 -1
  318. package/lib/metadata/MetadataDefinition.js.map +0 -1
@@ -1,878 +1,585 @@
1
- import { Atomic } from "../typings/Atomic";
2
- import { ClassProperties } from "../typings/ClassProperties";
3
- import { Writable } from "../typings/Writable";
4
-
5
- import { ArrayUtil } from "../utils/ArrayUtil";
6
-
7
- import { IMetadata } from "./IMetadata";
8
- import { IMetadataCollection } from "./IMetadataCollection";
9
- import { IMetadataDictionary } from "./IMetadataDictionary";
10
- import { MetadataArray } from "./MetadataArray";
11
- import { MetadataConstant } from "./MetadataConstant";
12
- import { MetadataDefinition } from "./MetadataDefinition";
13
- import { MetadataObject } from "./MetadataObject";
14
- import { MetadataProperty } from "./MetadataProperty";
15
- import { MetadataTuple } from "./MetadataTuple";
16
-
17
- export class Metadata {
18
- public any: boolean;
19
- public required: boolean;
20
- public optional: boolean;
21
- public nullable: boolean;
22
- public functional: boolean;
23
-
24
- public resolved: Metadata | null;
25
- public atomics: Atomic.Literal[];
26
- public constants: MetadataConstant[];
27
- public templates: Metadata[][];
28
-
29
- public rest: Metadata | null;
30
- public arrays: MetadataArray[];
31
- public tuples: MetadataTuple[];
32
- public objects: MetadataObject[];
33
- public definitions: MetadataDefinition[];
34
-
35
- public natives: string[];
36
- public sets: Metadata[];
37
- public maps: Metadata.Entry[];
38
-
39
- /** @internal */ private name_?: string;
40
- /** @internal */ private parent_resolved_: boolean = false;
41
- /** @internal */ public union_index?: number;
42
-
43
- /* -----------------------------------------------------------
44
- CONSTRUCTORS
45
- ----------------------------------------------------------- */
46
- /**
47
- * @hidden
48
- */
49
- private constructor(props: ClassProperties<Metadata>) {
50
- this.any = props.any;
51
- this.required = props.required;
52
- this.optional = props.optional;
53
- this.nullable = props.nullable;
54
- this.functional = props.functional;
55
-
56
- this.resolved = props.resolved;
57
- this.atomics = props.atomics;
58
- this.constants = props.constants;
59
- this.templates = props.templates;
60
-
61
- this.rest = props.rest;
62
- this.arrays = props.arrays;
63
- this.tuples = props.tuples;
64
- this.objects = props.objects;
65
- this.definitions = props.definitions;
66
-
67
- this.natives = props.natives;
68
- this.sets = props.sets;
69
- this.maps = props.maps;
70
- }
71
-
72
- /**
73
- * @internal
74
- */
75
- public static create(props: ClassProperties<Metadata>): Metadata {
76
- return new Metadata(props);
77
- }
78
-
79
- /**
80
- * @internal
81
- */
82
- public static initialize(parentResolved: boolean = false): Metadata {
83
- const meta: Metadata = this.create({
84
- any: false,
85
- nullable: false,
86
- required: true,
87
- optional: false,
88
- functional: false,
89
-
90
- resolved: null,
91
- constants: [],
92
- atomics: [],
93
- templates: [],
94
- arrays: [],
95
- tuples: [],
96
- objects: [],
97
- definitions: [],
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
- optional: this.optional,
113
- nullable: this.nullable,
114
- functional: this.functional,
115
-
116
- atomics: this.atomics.slice(),
117
- constants: JSON.parse(JSON.stringify(this.constants)),
118
- templates: this.templates.map((tpl) =>
119
- tpl.map((meta) => meta.toJSON()),
120
- ),
121
- resolved: this.resolved ? this.resolved.toJSON() : null,
122
-
123
- rest: this.rest ? this.rest.toJSON() : null,
124
- arrays: this.arrays.map((array) => array.name),
125
- tuples: this.tuples.map((tuple) => tuple.name),
126
- objects: this.objects.map((obj) => obj.name),
127
- definitions: this.definitions.map((def) => def.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(
139
- meta: IMetadata,
140
- collection: IMetadataCollection,
141
- ): Metadata {
142
- const dict: IMetadataDictionary = {
143
- objects: new Map(
144
- collection.objects.map((obj) => [
145
- obj.name,
146
- MetadataObject._From_without_properties(obj),
147
- ]),
148
- ),
149
- definitions: new Map(
150
- collection.definitions.map((def) => [
151
- def.name,
152
- MetadataDefinition._From_without_value(def),
153
- ]),
154
- ),
155
- arrays: new Map(
156
- collection.arrays.map((arr) => [
157
- arr.name,
158
- MetadataArray._From_without_value(arr),
159
- ]),
160
- ),
161
- tuples: new Map(
162
- collection.tuples.map((tpl) => [
163
- tpl.name,
164
- MetadataTuple._From_without_elements(tpl),
165
- ]),
166
- ),
167
- };
168
-
169
- for (const obj of collection.objects) {
170
- const initialized = dict.objects.get(obj.name)!;
171
- initialized.properties.push(
172
- ...obj.properties.map((prop) =>
173
- MetadataProperty._From(prop, dict),
174
- ),
175
- );
176
- }
177
- for (const def of collection.definitions)
178
- Writable(dict.definitions.get(def.name)!).value = this._From(
179
- def.value,
180
- dict,
181
- );
182
- for (const array of collection.arrays)
183
- Writable(dict.arrays.get(array.name)!).value = this._From(
184
- array.value,
185
- dict,
186
- );
187
- for (const tuple of collection.tuples)
188
- Writable(dict.tuples.get(tuple.name)!).elements =
189
- tuple.elements.map((elem) => this._From(elem, dict));
190
-
191
- return this._From(meta, dict);
192
- }
193
-
194
- /**
195
- * @internal
196
- */
197
- public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
198
- return this.create({
199
- any: meta.any,
200
- required: meta.required,
201
- optional: meta.optional,
202
- nullable: meta.nullable,
203
- functional: meta.functional,
204
-
205
- constants: JSON.parse(JSON.stringify(meta.constants)),
206
- atomics: meta.atomics.slice(),
207
- templates: meta.templates.map((tpl) =>
208
- tpl.map((meta) => this._From(meta, dict)),
209
- ),
210
- resolved: meta.resolved ? this._From(meta.resolved, dict) : null,
211
-
212
- rest: meta.rest ? this._From(meta.rest, dict) : null,
213
- arrays: meta.arrays.map((id) => {
214
- const array = dict.arrays.get(id);
215
- if (array === undefined)
216
- throw new Error(
217
- `Error on Metadata.from(): failed to find array "${id}".`,
218
- );
219
- return array;
220
- }),
221
- tuples: meta.tuples.map((id) => {
222
- const tuple = dict.tuples.get(id);
223
- if (tuple === undefined)
224
- throw new Error(
225
- `Error on Metadata.from(): failed to find tuple "${id}".`,
226
- );
227
- return tuple;
228
- }),
229
- objects: meta.objects.map((name) => {
230
- const found = dict.objects.get(name);
231
- if (found === undefined)
232
- throw new Error(
233
- `Error on Metadata.from(): failed to find object "${name}".`,
234
- );
235
- return found;
236
- }),
237
- definitions: meta.definitions.map((def) => {
238
- const found = dict.definitions.get(def);
239
- if (found === undefined)
240
- throw new Error(
241
- `Error on Metadata.from(): failed to find definition "${def}".`,
242
- );
243
- return found;
244
- }),
245
-
246
- natives: meta.natives.slice(),
247
- sets: meta.sets.map((meta) => this._From(meta, dict)),
248
- maps: meta.maps.map((entry) => ({
249
- key: this._From(entry.key, dict),
250
- value: this._From(entry.value, dict),
251
- })),
252
- });
253
- }
254
-
255
- /* -----------------------------------------------------------
256
- ACCESSORS
257
- ----------------------------------------------------------- */
258
- public getName(): string {
259
- this.name_ ??= getName(this);
260
- return this.name_;
261
- }
262
-
263
- public empty(): boolean {
264
- return this.bucket() === 0 || this.size() === 0;
265
- }
266
- public size(): number {
267
- return (
268
- (this.resolved ? 1 : 0) +
269
- (this.functional ? 1 : 0) +
270
- (this.rest ? this.rest.size() : 0) +
271
- this.templates.length +
272
- this.atomics.length +
273
- this.constants
274
- .map((c) => c.values.length)
275
- .reduce((x, y) => x + y, 0) +
276
- this.arrays.length +
277
- this.tuples.length +
278
- this.natives.length +
279
- this.maps.length +
280
- this.sets.length +
281
- this.objects.length +
282
- this.definitions.length
283
- );
284
- }
285
- public bucket(): number {
286
- return (
287
- (this.resolved ? 1 : 0) +
288
- (this.functional ? 1 : 0) +
289
- (this.templates.length ? 1 : 0) +
290
- (this.atomics.length ? 1 : 0) +
291
- (this.constants.length ? 1 : 0) +
292
- (this.rest ? this.rest.size() : 0) +
293
- (this.arrays.length ? 1 : 0) +
294
- (this.tuples.length ? 1 : 0) +
295
- (this.natives.length ? 1 : 0) +
296
- (this.sets.length ? 1 : 0) +
297
- (this.maps.length ? 1 : 0) +
298
- (this.objects.length ? 1 : 0) +
299
- (this.definitions.length ? 1 : 0)
300
- );
301
- }
302
- public isConstant(): boolean {
303
- return this.bucket() === (this.constants.length ? 1 : 0);
304
- }
305
-
306
- /**
307
- * @internal
308
- */
309
- public isUnionBucket(): boolean {
310
- const size: number = this.bucket();
311
- const emended: number = this.constants.length ? size - 1 : size;
312
- return emended > 1;
313
- }
314
-
315
- /**
316
- * @internal
317
- */
318
- public getSoleLiteral(): string | null {
319
- if (
320
- this.size() === 1 &&
321
- this.constants.length === 1 &&
322
- this.constants[0]!.type === "string" &&
323
- this.constants[0]!.values.length === 1
324
- )
325
- return this.constants[0]!.values[0] as string;
326
- else return null;
327
- }
328
-
329
- /**
330
- * @internal
331
- */
332
- public isSoleLiteral(): boolean {
333
- return this.getSoleLiteral() !== null;
334
- }
335
-
336
- /**
337
- * @internal
338
- */
339
- public isParentResolved(): boolean {
340
- return this.parent_resolved_;
341
- }
342
-
343
- // /* -----------------------------------------------------------
344
- // COMBINERS
345
- // ----------------------------------------------------------- */
346
- // public computeEmpty(): boolean {
347
- // return this.computeSize() === 0;
348
- // }
349
-
350
- // public computeSize(): number {
351
- // return (this.computed_size_ ??=
352
- // (this.computeResolved() ? 1 : 0) +
353
- // (this.computeFunctional() ? 1 : 0) +
354
- // (this.computeRest() ? 1 : 0) +
355
- // this.computeTemplates().length +
356
- // this.computeAtomics().size +
357
- // [...this.computeConstants().values()]
358
- // .map((v) => v.size)
359
- // .reduce((a, b) => a + b, 0) +
360
- // this.computeArrays().length +
361
- // this.computeTuples().length +
362
- // this.computeObjects().length +
363
- // this.computeDefinitions().length +
364
- // this.computeNatives().size +
365
- // this.computeSets().length +
366
- // this.computeMaps().length);
367
- // }
368
-
369
- // public computeBucket(): number {
370
- // return (this.computed_bucket_ ??=
371
- // (this.computeResolved() ? 1 : 0) +
372
- // (this.computeFunctional() ? 1 : 0) +
373
- // (this.computeTemplates().length ? 1 : 0) +
374
- // (this.computeAtomics().size ? 1 : 0) +
375
- // (this.computeConstants().size ? 1 : 0) +
376
- // (this.computeRest() ? 1 : 0) +
377
- // (this.computeArrays().length ? 1 : 0) +
378
- // (this.computeTuples().length ? 1 : 0) +
379
- // (this.computeObjects().length ? 1 : 0) +
380
- // (this.computeNatives().size ? 1 : 0) +
381
- // (this.computeSets().length ? 1 : 0) +
382
- // (this.computeMaps().length ? 1 : 0));
383
- // }
384
-
385
- // public computeAny(): boolean {
386
- // return (this.computed_any_ ??= Metadata._Iterate([] as boolean[])(
387
- // (flags) => (meta) => flags.push(meta.any),
388
- // )(this).reduce((x, y) => x || y));
389
- // }
390
-
391
- // public computeRequired(): boolean {
392
- // return (this.computed_required_ ??= Metadata._Iterate([] as boolean[])(
393
- // (flags) => (meta) => flags.push(meta.required),
394
- // )(this).reduce((x, y) => x && y));
395
- // }
396
-
397
- // public computeOptional(): boolean {
398
- // return (this.computed_optional_ ??= Metadata._Iterate([] as boolean[])(
399
- // (flags) => (meta) => flags.push(meta.optional),
400
- // )(this).reduce((x, y) => x || y));
401
- // }
402
-
403
- // public computeNullable(): boolean {
404
- // return (this.computed_nullable_ ??= Metadata._Iterate([] as boolean[])(
405
- // (flags) => (meta) => flags.push(meta.nullable),
406
- // )(this).reduce((x, y) => x || y));
407
- // }
408
-
409
- // public computeFunctional(): boolean {
410
- // return (this.computed_functional_ ??= Metadata._Iterate(
411
- // [] as boolean[],
412
- // )((flags) => (meta) => flags.push(meta.any))(this).reduce(
413
- // (x, y) => x || y,
414
- // ));
415
- // }
416
-
417
- // public computeAtomics(): Set<Atomic.Literal> {
418
- // return (this.computed_atomics_ ??= Metadata._Iterate(
419
- // new Set<Atomic.Literal>(),
420
- // )((values) => (meta) => {
421
- // for (const atomic of meta.atomics) values.add(atomic);
422
- // })(this));
423
- // }
424
-
425
- // public computeConstants(): Map<Atomic.Literal, Set<Atomic.Type>> {
426
- // return (this.computed_constants_ ??= Metadata._Iterate(
427
- // new Map<Atomic.Literal, Set<Atomic.Type>>(),
428
- // )((container) => (meta) => {
429
- // for (const constant of meta.constants) {
430
- // const line = MapUtil.take(container)(
431
- // constant.type,
432
- // () => new Set(),
433
- // );
434
- // for (const v of constant.values) line.add(v);
435
- // }
436
- // })(this));
437
- // }
438
-
439
- // public computeTemplates(): Metadata[][] {
440
- // return (this.computed_templates_ ??= (() => {
441
- // const dict = Metadata._Iterate(new Map<string, Metadata[]>())(
442
- // (dict) => (meta) =>
443
- // meta.templates.forEach((tpl) =>
444
- // dict.set(tpl.map((t) => t.getName).join(","), tpl),
445
- // ),
446
- // )(this);
447
- // return [...dict.values()];
448
- // })());
449
- // }
450
-
451
- // public computeResolved(): Metadata | null {
452
- // return (this.computed_resolved_ ??= this.resolved);
453
- // }
454
-
455
- // public computeRest(): Metadata | null {
456
- // return (this.computed_rest_ ??= this.rest);
457
- // }
458
-
459
- // public computeArrays(): Metadata[] {
460
- // return (this.computed_arrays_ ??= (() => {
461
- // const dict = Metadata._Iterate(new Map<string, Metadata>())(
462
- // (dict) => (meta) =>
463
- // meta.arrays.forEach((array) =>
464
- // dict.set(array.getName(), array),
465
- // ),
466
- // )(this);
467
- // return [...dict.values()];
468
- // })());
469
- // }
470
-
471
- // public computeTuples(): Metadata[][] {
472
- // return (this.computed_tuples_ ??= (() => {
473
- // const dict = Metadata._Iterate(new Map<string, Metadata[]>())(
474
- // (dict) => (meta) =>
475
- // meta.tuples.forEach((tpl) =>
476
- // dict.set(tpl.map((t) => t.getName).join(","), tpl),
477
- // ),
478
- // )(this);
479
- // return [...dict.values()];
480
- // })());
481
- // }
482
-
483
- // public computeNatives(): Set<string> {
484
- // return (this.computed_natives_ ??= Metadata._Iterate(new Set<string>())(
485
- // (values) => (meta) => {
486
- // for (const native of meta.natives) values.add(native);
487
- // },
488
- // )(this));
489
- // }
490
-
491
- // public computeSets(): Metadata[] {
492
- // return (this.computed_sets_ ??= (() => {
493
- // const dict = Metadata._Iterate(new Map<string, Metadata>())(
494
- // (dict) => (meta) =>
495
- // meta.sets.forEach((set) => dict.set(set.getName(), set)),
496
- // )(this);
497
- // return [...dict.values()];
498
- // })());
499
- // }
500
-
501
- // public computeMaps(): Metadata.Entry[] {
502
- // return (this.computed_maps_ ??= (() => {
503
- // const dict = Metadata._Iterate(new Map<string, Metadata.Entry>())(
504
- // (dict) => (meta) =>
505
- // meta.maps.forEach((m) =>
506
- // dict.set(
507
- // [m.key.getName(), m.value.getName()].join(","),
508
- // m,
509
- // ),
510
- // ),
511
- // )(this);
512
- // return [...dict.values()];
513
- // })());
514
- // }
515
-
516
- // public computeObjects(): MetadataObject[] {
517
- // return (this.computed_objects_ ??= (() => {
518
- // const dict = Metadata._Iterate(new Map<string, MetadataObject>())(
519
- // (dict) => (meta) =>
520
- // meta.objects.forEach((obj) => dict.set(obj.name, obj)),
521
- // )(this);
522
- // return [...dict.values()];
523
- // })());
524
- // }
525
-
526
- // public computeDefinitions(): MetadataDefinition[] {
527
- // return (this.computed_definitions_ ??= (() => {
528
- // const dict = Metadata._Iterate(
529
- // new Map<string, MetadataDefinition>(),
530
- // )(
531
- // (dict) => (meta) =>
532
- // meta.definitions.forEach((def) => dict.set(def.name, def)),
533
- // )(this);
534
- // return [...dict.values()];
535
- // })());
536
- // }
537
-
538
- // public absorb(): void {
539
- // this._Absorb(new Set());
540
- // }
541
-
542
- // private _Absorb(visited: Set<Metadata>): void {
543
- // if (visited.has(this)) return;
544
- // visited.add(this);
545
-
546
- // if (this.size() === 1 && this.definitions.length === 1) return;
547
-
548
- // //----
549
- // // ITERATIONS
550
- // //----
551
- // if (this.resolved) this.resolved._Absorb(visited);
552
- // if (this.rest) this.rest._Absorb(visited);
553
-
554
- // for (const array of this.arrays) array._Absorb(visited);
555
- // for (const tuple of this.tuples)
556
- // for (const elem of tuple) elem._Absorb(visited);
557
-
558
- // for (const set of this.sets) set._Absorb(visited);
559
- // for (const map of this.maps) map.value._Absorb(visited);
560
- // for (const object of this.objects)
561
- // for (const property of object.properties)
562
- // property.value._Absorb(visited);
563
- // for (const definition of this.definitions)
564
- // definition.value._Absorb(visited);
565
-
566
- // //----
567
- // // MEMBERS
568
- // //----
569
- // // FLAGS
570
- // this.any = this.computeAny();
571
- // this.required = this.computeRequired();
572
- // this.optional = this.computeOptional();
573
- // this.nullable = this.computeNullable();
574
- // this.functional = this.computeFunctional();
575
-
576
- // // ATOMICS
577
- // this.atomics = [...this.computeAtomics()];
578
- // this.constants = [...this.computeConstants()].map(([type, values]) => ({
579
- // type,
580
- // values: [...values],
581
- // })) as MetadataConstant[];
582
- // this.templates = this.computeTemplates();
583
-
584
- // // INSTANCES
585
- // this.resolved = this.computeResolved();
586
- // this.rest = this.computeRest();
587
- // this.arrays = this.computeArrays();
588
- // this.tuples = this.computeTuples();
589
- // this.natives = [...this.computeNatives()];
590
- // this.maps = this.computeMaps();
591
- // this.sets = this.computeSets();
592
- // this.objects = this.computeObjects();
593
- // this.definitions = this.computeDefinitions();
594
- // }
595
-
596
- // private static _Iterate =
597
- // <T>(container: T) =>
598
- // (closure: (container: T) => (meta: Metadata) => any) => {
599
- // const visited: Set<string> = new Set();
600
- // const iterate = (meta: Metadata): T => {
601
- // closure(container)(meta);
602
- // for (const def of meta.definitions) {
603
- // const name: string = def.value.getName();
604
- // if (visited.has(name)) continue;
605
- // visited.add(name);
606
- // iterate(def.value);
607
- // }
608
- // return container;
609
- // };
610
- // return iterate;
611
- // };
612
-
613
- // /** @internal */ private computed_size_?: number;
614
- // /** @internal */ private computed_bucket_?: number;
615
- // /** @internal */ private computed_any_?: boolean;
616
- // /** @internal */ private computed_required_?: boolean;
617
- // /** @internal */ private computed_optional_?: boolean;
618
- // /** @internal */ private computed_nullable_?: boolean;
619
- // /** @internal */ private computed_functional_?: boolean;
620
- // /** @internal */ private computed_atomics_?: Set<Atomic.Literal>;
621
- // /** @internal */ private computed_constants_?: Map<
622
- // Atomic.Literal,
623
- // Set<Atomic.Type>
624
- // >;
625
- // /** @internal */ private computed_templates_?: Metadata[][];
626
- // /** @internal */ private computed_rest_?: Metadata | null;
627
- // /** @internal */ private computed_resolved_?: Metadata | null;
628
- // /** @internal */ private computed_arrays_?: Metadata[];
629
- // /** @internal */ private computed_tuples_?: Metadata[][];
630
- // /** @internal */ private computed_natives_?: Set<string>;
631
- // /** @internal */ private computed_sets_?: Metadata[];
632
- // /** @internal */ private computed_maps_?: Metadata.Entry[];
633
- // /** @internal */ private computed_objects_?: MetadataObject[];
634
- // /** @internal */ private computed_definitions_?: MetadataDefinition[];
635
- }
636
- export namespace Metadata {
637
- export const intersects = (x: Metadata, y: Metadata): boolean => {
638
- // CHECK ANY & OPTIONAL
639
- if (x.any || y.any) return true;
640
- if (x.required === false && false === y.required) return true;
641
- if (x.nullable === true && true === y.nullable) return true;
642
- if (x.functional === true && y.functional === true) return true;
643
-
644
- //----
645
- // INSTANCES
646
- //----
647
- // ARRAYS
648
- if (x.arrays.length && y.arrays.length) return true;
649
- if (x.tuples.length && y.tuples.length) return true;
650
- if (x.objects.length && y.objects.length) return true;
651
- if (x.definitions.length && y.definitions.length) return true;
652
-
653
- //----
654
- // VALUES
655
- //----
656
- // ATOMICS
657
- for (const atomic of x.atomics)
658
- if (y.atomics.includes(atomic)) return true;
659
-
660
- // CONSTANTS
661
- for (const constant of x.constants) {
662
- const opposite: MetadataConstant | undefined = y.constants.find(
663
- (elem) => elem.type === constant.type,
664
- );
665
- if (opposite === undefined) continue;
666
-
667
- const values: Set<any> = new Set([
668
- ...constant.values,
669
- ...opposite.values,
670
- ]);
671
- if (values.size !== constant.values.length + opposite.values.length)
672
- return true;
673
- }
674
- return false;
675
- };
676
-
677
- export const covers = (
678
- x: Metadata,
679
- y: Metadata,
680
- level: number = 0,
681
- ): boolean => {
682
- // CHECK ANY
683
- if (x === y) return false;
684
- else if (x.any) return true;
685
- else if (y.any) return false;
686
-
687
- //----
688
- // INSTANCES
689
- //----
690
- if (level === 0) {
691
- // ARRAYS
692
- for (const ya of y.arrays)
693
- if (
694
- !x.arrays.some((xa) =>
695
- covers(xa.value, ya.value, level + 1),
696
- )
697
- ) {
698
- return false;
699
- }
700
-
701
- // TUPLES
702
- for (const yt of y.tuples)
703
- if (
704
- yt.elements.length !== 0 &&
705
- x.tuples.some(
706
- (xt) =>
707
- xt.elements.length >= yt.elements.length &&
708
- xt.elements
709
- .slice(yt.elements.length)
710
- .every((xv, i) =>
711
- covers(xv, yt.elements[i]!, level + 1),
712
- ),
713
- ) === false
714
- )
715
- return false;
716
- }
717
-
718
- // OBJECTS
719
- for (const yo of y.objects)
720
- if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
721
- return false;
722
-
723
- // DEFINITIONS
724
- for (const yd of y.definitions)
725
- if (x.definitions.some((xd) => xd.name === yd.name) === false)
726
- return false;
727
-
728
- // NATIVES
729
- for (const yn of y.natives)
730
- if (x.natives.some((xn) => xn === yn) === false) return false;
731
-
732
- // SETS
733
- for (const ys of y.sets)
734
- if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
735
-
736
- //----
737
- // VALUES
738
- //----
739
- // ATOMICS
740
- if (y.atomics.some((atomic) => x.atomics.includes(atomic) === false))
741
- return false;
742
-
743
- // CONSTANTS
744
- for (const yc of y.constants) {
745
- const xc: MetadataConstant | undefined = x.constants.find(
746
- (elem) => elem.type === yc.type,
747
- );
748
- if (xc === undefined) return false;
749
- else if (
750
- (yc.values as number[]).some(
751
- (yv) => xc.values.includes(yv as never) === false,
752
- )
753
- )
754
- return false;
755
- }
756
-
757
- // FUNCTIONAL
758
- if (x.functional === false && y.functional) return false;
759
-
760
- // SUCCESS
761
- return true;
762
- };
763
-
764
- /**
765
- * @internal
766
- */
767
- export const merge = (x: Metadata, y: Metadata): Metadata => {
768
- const output: Metadata = Metadata.create({
769
- any: x.any || y.any,
770
- nullable: x.nullable || y.nullable,
771
- required: x.required && y.required,
772
- optional: x.optional || y.optional,
773
- functional: x.functional || y.functional,
774
-
775
- resolved:
776
- x.resolved !== null && y.resolved !== null
777
- ? merge(x.resolved, y.resolved)
778
- : x.resolved || y.resolved,
779
- atomics: [...new Set([...x.atomics, ...y.atomics])],
780
- constants: [...x.constants],
781
- templates: x.templates.slice(),
782
-
783
- rest:
784
- x.rest !== null && y.rest !== null
785
- ? merge(x.rest, y.rest)
786
- : x.rest ?? y.rest,
787
- arrays: x.arrays.slice(),
788
- tuples: x.tuples.slice(),
789
- objects: x.objects.slice(),
790
- definitions: x.definitions.slice(),
791
-
792
- natives: [...new Set([...x.natives, ...y.natives])],
793
- sets: x.sets.slice(),
794
- maps: x.maps.slice(),
795
- });
796
- for (const constant of y.constants) {
797
- const target: MetadataConstant = ArrayUtil.take(
798
- output.constants,
799
- (elem) => elem.type === constant.type,
800
- () => ({
801
- type: constant.type,
802
- values: [],
803
- }),
804
- );
805
- for (const value of constant.values)
806
- ArrayUtil.add(target.values, value);
807
- }
808
- for (const array of y.arrays)
809
- ArrayUtil.set(output.arrays, array, (elem) => elem.name);
810
- for (const tuple of y.tuples)
811
- ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
812
- for (const obj of y.objects)
813
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
814
- for (const def of y.definitions)
815
- ArrayUtil.set(output.definitions, def, (elem) => elem.name);
816
-
817
- return output;
818
- };
819
- }
820
-
821
- const getName = (metadata: Metadata): string => {
822
- if (metadata.any === true) return "any";
823
-
824
- const elements: string[] = [];
825
-
826
- // OPTIONAL
827
- if (metadata.nullable === true) elements.push("null");
828
- if (metadata.required === false) elements.push("undefined");
829
-
830
- // ATOMIC
831
- for (const type of metadata.atomics) {
832
- elements.push(type);
833
- }
834
- for (const constant of metadata.constants)
835
- for (const value of constant.values)
836
- elements.push(JSON.stringify(value));
837
- for (const template of metadata.templates)
838
- elements.push(
839
- "`" +
840
- template
841
- .map((child) =>
842
- child.isConstant() && child.size() === 1
843
- ? child.constants[0]!.values[0]!
844
- : `$\{${child.getName()}\}`,
845
- )
846
- .join("")
847
- .split("`")
848
- .join("\\`") +
849
- "`",
850
- );
851
-
852
- // NATIVES
853
- for (const native of metadata.natives) elements.push(native);
854
- for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
855
- for (const map of metadata.maps)
856
- elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
857
-
858
- // INSTANCES
859
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
860
- for (const tuple of metadata.tuples) elements.push(tuple.name);
861
- for (const array of metadata.arrays) elements.push(array.name);
862
- for (const object of metadata.objects) elements.push(object.name);
863
- for (const def of metadata.definitions) elements.push(def.name);
864
- if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
865
-
866
- // RETURNS
867
- if (elements.length === 0) return "unknown";
868
- else if (elements.length === 1) return elements[0]!;
869
-
870
- elements.sort();
871
- return `(${elements.join(" | ")})`;
872
- };
873
- export namespace Metadata {
874
- export interface Entry {
875
- key: Metadata;
876
- value: Metadata;
877
- }
878
- }
1
+ import { Atomic } from "../typings/Atomic";
2
+ import { ClassProperties } from "../typings/ClassProperties";
3
+ import { Writable } from "../typings/Writable";
4
+
5
+ import { ArrayUtil } from "../utils/ArrayUtil";
6
+
7
+ import { IMetadata } from "./IMetadata";
8
+ import { IMetadataCollection } from "./IMetadataCollection";
9
+ import { IMetadataDictionary } from "./IMetadataDictionary";
10
+ import { MetadataAlias } from "./MetadataAlias";
11
+ import { MetadataArray } from "./MetadataArray";
12
+ import { MetadataConstant } from "./MetadataConstant";
13
+ import { MetadataObject } from "./MetadataObject";
14
+ import { MetadataProperty } from "./MetadataProperty";
15
+ import { MetadataTuple } from "./MetadataTuple";
16
+
17
+ export class Metadata {
18
+ public any: boolean;
19
+ public required: boolean;
20
+ public optional: boolean;
21
+ public nullable: boolean;
22
+ public functional: boolean;
23
+
24
+ public resolved: Metadata | null;
25
+ public atomics: Atomic.Literal[];
26
+ public constants: MetadataConstant[];
27
+ public templates: Metadata[][];
28
+
29
+ public rest: Metadata | null;
30
+ public aliases: MetadataAlias[];
31
+ public arrays: MetadataArray[];
32
+ public tuples: MetadataTuple[];
33
+ public objects: MetadataObject[];
34
+
35
+ public natives: string[];
36
+ public sets: Metadata[];
37
+ public maps: Metadata.Entry[];
38
+
39
+ /** @internal */ private name_?: string;
40
+ /** @internal */ private parent_resolved_: boolean = false;
41
+ /** @internal */ public union_index?: number;
42
+
43
+ /* -----------------------------------------------------------
44
+ CONSTRUCTORS
45
+ ----------------------------------------------------------- */
46
+ /**
47
+ * @hidden
48
+ */
49
+ private constructor(props: ClassProperties<Metadata>) {
50
+ this.any = props.any;
51
+ this.required = props.required;
52
+ this.optional = props.optional;
53
+ this.nullable = props.nullable;
54
+ this.functional = props.functional;
55
+
56
+ this.resolved = props.resolved;
57
+ this.atomics = props.atomics;
58
+ this.constants = props.constants;
59
+ this.templates = props.templates;
60
+
61
+ this.rest = props.rest;
62
+ this.arrays = props.arrays;
63
+ this.tuples = props.tuples;
64
+ this.objects = props.objects;
65
+ this.aliases = props.aliases;
66
+
67
+ this.natives = props.natives;
68
+ this.sets = props.sets;
69
+ this.maps = props.maps;
70
+ }
71
+
72
+ /**
73
+ * @internal
74
+ */
75
+ public static create(props: ClassProperties<Metadata>): Metadata {
76
+ return new Metadata(props);
77
+ }
78
+
79
+ /**
80
+ * @internal
81
+ */
82
+ public static initialize(parentResolved: boolean = false): Metadata {
83
+ const meta: Metadata = this.create({
84
+ any: false,
85
+ nullable: false,
86
+ required: true,
87
+ optional: false,
88
+ functional: false,
89
+
90
+ resolved: null,
91
+ constants: [],
92
+ atomics: [],
93
+ templates: [],
94
+ arrays: [],
95
+ tuples: [],
96
+ objects: [],
97
+ aliases: [],
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
+ optional: this.optional,
113
+ nullable: this.nullable,
114
+ functional: this.functional,
115
+
116
+ atomics: this.atomics.slice(),
117
+ constants: JSON.parse(JSON.stringify(this.constants)),
118
+ templates: this.templates.map((tpl) =>
119
+ tpl.map((meta) => meta.toJSON()),
120
+ ),
121
+ resolved: this.resolved ? this.resolved.toJSON() : null,
122
+
123
+ rest: this.rest ? this.rest.toJSON() : null,
124
+ arrays: this.arrays.map((array) => array.name),
125
+ tuples: this.tuples.map((tuple) => tuple.name),
126
+ objects: this.objects.map((obj) => obj.name),
127
+ aliases: this.aliases.map((alias) => alias.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(
139
+ meta: IMetadata,
140
+ collection: IMetadataCollection,
141
+ ): Metadata {
142
+ const dict: IMetadataDictionary = {
143
+ objects: new Map(
144
+ collection.objects.map((obj) => [
145
+ obj.name,
146
+ MetadataObject._From_without_properties(obj),
147
+ ]),
148
+ ),
149
+ aliases: new Map(
150
+ collection.aliases.map((alias) => [
151
+ alias.name,
152
+ MetadataAlias._From_without_value(alias),
153
+ ]),
154
+ ),
155
+ arrays: new Map(
156
+ collection.arrays.map((arr) => [
157
+ arr.name,
158
+ MetadataArray._From_without_value(arr),
159
+ ]),
160
+ ),
161
+ tuples: new Map(
162
+ collection.tuples.map((tpl) => [
163
+ tpl.name,
164
+ MetadataTuple._From_without_elements(tpl),
165
+ ]),
166
+ ),
167
+ };
168
+
169
+ for (const obj of collection.objects) {
170
+ const initialized = dict.objects.get(obj.name)!;
171
+ initialized.properties.push(
172
+ ...obj.properties.map((prop) =>
173
+ MetadataProperty._From(prop, dict),
174
+ ),
175
+ );
176
+ }
177
+ for (const alias of collection.aliases)
178
+ Writable(dict.aliases.get(alias.name)!).value = this._From(
179
+ alias.value,
180
+ dict,
181
+ );
182
+ for (const array of collection.arrays)
183
+ Writable(dict.arrays.get(array.name)!).value = this._From(
184
+ array.value,
185
+ dict,
186
+ );
187
+ for (const tuple of collection.tuples)
188
+ Writable(dict.tuples.get(tuple.name)!).elements =
189
+ tuple.elements.map((elem) => this._From(elem, dict));
190
+
191
+ return this._From(meta, dict);
192
+ }
193
+
194
+ /**
195
+ * @internal
196
+ */
197
+ public static _From(meta: IMetadata, dict: IMetadataDictionary): Metadata {
198
+ return this.create({
199
+ any: meta.any,
200
+ required: meta.required,
201
+ optional: meta.optional,
202
+ nullable: meta.nullable,
203
+ functional: meta.functional,
204
+
205
+ constants: JSON.parse(JSON.stringify(meta.constants)),
206
+ atomics: meta.atomics.slice(),
207
+ templates: meta.templates.map((tpl) =>
208
+ tpl.map((meta) => this._From(meta, dict)),
209
+ ),
210
+ resolved: meta.resolved ? this._From(meta.resolved, dict) : null,
211
+
212
+ rest: meta.rest ? this._From(meta.rest, dict) : null,
213
+ arrays: meta.arrays.map((id) => {
214
+ const array = dict.arrays.get(id);
215
+ if (array === undefined)
216
+ throw new Error(
217
+ `Error on Metadata.from(): failed to find array "${id}".`,
218
+ );
219
+ return array;
220
+ }),
221
+ tuples: meta.tuples.map((id) => {
222
+ const tuple = dict.tuples.get(id);
223
+ if (tuple === undefined)
224
+ throw new Error(
225
+ `Error on Metadata.from(): failed to find tuple "${id}".`,
226
+ );
227
+ return tuple;
228
+ }),
229
+ objects: meta.objects.map((name) => {
230
+ const found = dict.objects.get(name);
231
+ if (found === undefined)
232
+ throw new Error(
233
+ `Error on Metadata.from(): failed to find object "${name}".`,
234
+ );
235
+ return found;
236
+ }),
237
+ aliases: meta.aliases.map((alias) => {
238
+ const found = dict.aliases.get(alias);
239
+ if (found === undefined)
240
+ throw new Error(
241
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
242
+ );
243
+ return found;
244
+ }),
245
+
246
+ natives: meta.natives.slice(),
247
+ sets: meta.sets.map((meta) => this._From(meta, dict)),
248
+ maps: meta.maps.map((entry) => ({
249
+ key: this._From(entry.key, dict),
250
+ value: this._From(entry.value, dict),
251
+ })),
252
+ });
253
+ }
254
+
255
+ /* -----------------------------------------------------------
256
+ ACCESSORS
257
+ ----------------------------------------------------------- */
258
+ public getName(): string {
259
+ this.name_ ??= getName(this);
260
+ return this.name_;
261
+ }
262
+
263
+ public empty(): boolean {
264
+ return this.bucket() === 0 || this.size() === 0;
265
+ }
266
+ public size(): number {
267
+ return (
268
+ (this.resolved ? 1 : 0) +
269
+ (this.functional ? 1 : 0) +
270
+ (this.rest ? this.rest.size() : 0) +
271
+ this.templates.length +
272
+ this.atomics.length +
273
+ this.constants
274
+ .map((c) => c.values.length)
275
+ .reduce((x, y) => x + y, 0) +
276
+ this.arrays.length +
277
+ this.tuples.length +
278
+ this.natives.length +
279
+ this.maps.length +
280
+ this.sets.length +
281
+ this.objects.length +
282
+ this.aliases.length
283
+ );
284
+ }
285
+ public bucket(): number {
286
+ return (
287
+ (this.resolved ? 1 : 0) +
288
+ (this.functional ? 1 : 0) +
289
+ (this.templates.length ? 1 : 0) +
290
+ (this.atomics.length ? 1 : 0) +
291
+ (this.constants.length ? 1 : 0) +
292
+ (this.rest ? this.rest.size() : 0) +
293
+ (this.arrays.length ? 1 : 0) +
294
+ (this.tuples.length ? 1 : 0) +
295
+ (this.natives.length ? 1 : 0) +
296
+ (this.sets.length ? 1 : 0) +
297
+ (this.maps.length ? 1 : 0) +
298
+ (this.objects.length ? 1 : 0) +
299
+ (this.aliases.length ? 1 : 0)
300
+ );
301
+ }
302
+ public isConstant(): boolean {
303
+ return this.bucket() === (this.constants.length ? 1 : 0);
304
+ }
305
+
306
+ /**
307
+ * @internal
308
+ */
309
+ public isUnionBucket(): boolean {
310
+ const size: number = this.bucket();
311
+ const emended: number = this.constants.length ? size - 1 : size;
312
+ return emended > 1;
313
+ }
314
+
315
+ /**
316
+ * @internal
317
+ */
318
+ public getSoleLiteral(): string | null {
319
+ if (
320
+ this.size() === 1 &&
321
+ this.constants.length === 1 &&
322
+ this.constants[0]!.type === "string" &&
323
+ this.constants[0]!.values.length === 1
324
+ )
325
+ return this.constants[0]!.values[0] as string;
326
+ else return null;
327
+ }
328
+
329
+ /**
330
+ * @internal
331
+ */
332
+ public isSoleLiteral(): boolean {
333
+ return this.getSoleLiteral() !== null;
334
+ }
335
+
336
+ /**
337
+ * @internal
338
+ */
339
+ public isParentResolved(): boolean {
340
+ return this.parent_resolved_;
341
+ }
342
+ }
343
+ export namespace Metadata {
344
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
345
+ // CHECK ANY & OPTIONAL
346
+ if (x.any || y.any) return true;
347
+ if (x.required === false && false === y.required) return true;
348
+ if (x.nullable === true && true === y.nullable) return true;
349
+ if (x.functional === true && y.functional === true) return true;
350
+
351
+ //----
352
+ // INSTANCES
353
+ //----
354
+ // ARRAYS
355
+ if (x.arrays.length && y.arrays.length) return true;
356
+ if (x.tuples.length && y.tuples.length) return true;
357
+ if (x.objects.length && y.objects.length) return true;
358
+ if (x.aliases.length && y.aliases.length) return true;
359
+
360
+ //----
361
+ // VALUES
362
+ //----
363
+ // ATOMICS
364
+ for (const atomic of x.atomics)
365
+ if (y.atomics.includes(atomic)) return true;
366
+
367
+ // CONSTANTS
368
+ for (const constant of x.constants) {
369
+ const opposite: MetadataConstant | undefined = y.constants.find(
370
+ (elem) => elem.type === constant.type,
371
+ );
372
+ if (opposite === undefined) continue;
373
+
374
+ const values: Set<any> = new Set([
375
+ ...constant.values,
376
+ ...opposite.values,
377
+ ]);
378
+ if (values.size !== constant.values.length + opposite.values.length)
379
+ return true;
380
+ }
381
+ return false;
382
+ };
383
+
384
+ export const covers = (
385
+ x: Metadata,
386
+ y: Metadata,
387
+ level: number = 0,
388
+ ): boolean => {
389
+ // CHECK ANY
390
+ if (x === y) return false;
391
+ else if (x.any) return true;
392
+ else if (y.any) return false;
393
+
394
+ //----
395
+ // INSTANCES
396
+ //----
397
+ if (level === 0) {
398
+ // ARRAYS
399
+ for (const ya of y.arrays)
400
+ if (
401
+ !x.arrays.some((xa) =>
402
+ covers(xa.value, ya.value, level + 1),
403
+ )
404
+ ) {
405
+ return false;
406
+ }
407
+
408
+ // TUPLES
409
+ for (const yt of y.tuples)
410
+ if (
411
+ yt.elements.length !== 0 &&
412
+ x.tuples.some(
413
+ (xt) =>
414
+ xt.elements.length >= yt.elements.length &&
415
+ xt.elements
416
+ .slice(yt.elements.length)
417
+ .every((xv, i) =>
418
+ covers(xv, yt.elements[i]!, level + 1),
419
+ ),
420
+ ) === false
421
+ )
422
+ return false;
423
+ }
424
+
425
+ // OBJECTS
426
+ for (const yo of y.objects)
427
+ if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
428
+ return false;
429
+
430
+ // ALIASES
431
+ for (const yd of y.aliases)
432
+ if (x.aliases.some((xd) => xd.name === yd.name) === false)
433
+ return false;
434
+
435
+ // NATIVES
436
+ for (const yn of y.natives)
437
+ if (x.natives.some((xn) => xn === yn) === false) return false;
438
+
439
+ // SETS
440
+ for (const ys of y.sets)
441
+ if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
442
+
443
+ //----
444
+ // VALUES
445
+ //----
446
+ // ATOMICS
447
+ if (y.atomics.some((atomic) => x.atomics.includes(atomic) === false))
448
+ return false;
449
+
450
+ // CONSTANTS
451
+ for (const yc of y.constants) {
452
+ const xc: MetadataConstant | undefined = x.constants.find(
453
+ (elem) => elem.type === yc.type,
454
+ );
455
+ if (xc === undefined) return false;
456
+ else if (
457
+ (yc.values as number[]).some(
458
+ (yv) => xc.values.includes(yv as never) === false,
459
+ )
460
+ )
461
+ return false;
462
+ }
463
+
464
+ // FUNCTIONAL
465
+ if (x.functional === false && y.functional) return false;
466
+
467
+ // SUCCESS
468
+ return true;
469
+ };
470
+
471
+ /**
472
+ * @internal
473
+ */
474
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
475
+ const output: Metadata = Metadata.create({
476
+ any: x.any || y.any,
477
+ nullable: x.nullable || y.nullable,
478
+ required: x.required && y.required,
479
+ optional: x.optional || y.optional,
480
+ functional: x.functional || y.functional,
481
+
482
+ resolved:
483
+ x.resolved !== null && y.resolved !== null
484
+ ? merge(x.resolved, y.resolved)
485
+ : x.resolved || y.resolved,
486
+ atomics: [...new Set([...x.atomics, ...y.atomics])],
487
+ constants: [...x.constants],
488
+ templates: x.templates.slice(),
489
+
490
+ rest:
491
+ x.rest !== null && y.rest !== null
492
+ ? merge(x.rest, y.rest)
493
+ : x.rest ?? y.rest,
494
+ arrays: x.arrays.slice(),
495
+ tuples: x.tuples.slice(),
496
+ objects: x.objects.slice(),
497
+ aliases: x.aliases.slice(),
498
+
499
+ natives: [...new Set([...x.natives, ...y.natives])],
500
+ sets: x.sets.slice(),
501
+ maps: x.maps.slice(),
502
+ });
503
+ for (const constant of y.constants) {
504
+ const target: MetadataConstant = ArrayUtil.take(
505
+ output.constants,
506
+ (elem) => elem.type === constant.type,
507
+ () => ({
508
+ type: constant.type,
509
+ values: [],
510
+ }),
511
+ );
512
+ for (const value of constant.values)
513
+ ArrayUtil.add(target.values, value);
514
+ }
515
+ for (const array of y.arrays)
516
+ ArrayUtil.set(output.arrays, array, (elem) => elem.name);
517
+ for (const tuple of y.tuples)
518
+ ArrayUtil.set(output.tuples, tuple, (elem) => elem.name);
519
+ for (const obj of y.objects)
520
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
521
+ for (const alias of y.aliases)
522
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
523
+
524
+ return output;
525
+ };
526
+ }
527
+
528
+ const getName = (metadata: Metadata): string => {
529
+ if (metadata.any === true) return "any";
530
+
531
+ const elements: string[] = [];
532
+
533
+ // OPTIONAL
534
+ if (metadata.nullable === true) elements.push("null");
535
+ if (metadata.required === false) elements.push("undefined");
536
+
537
+ // ATOMIC
538
+ for (const type of metadata.atomics) {
539
+ elements.push(type);
540
+ }
541
+ for (const constant of metadata.constants)
542
+ for (const value of constant.values)
543
+ elements.push(JSON.stringify(value));
544
+ for (const template of metadata.templates)
545
+ elements.push(
546
+ "`" +
547
+ template
548
+ .map((child) =>
549
+ child.isConstant() && child.size() === 1
550
+ ? child.constants[0]!.values[0]!
551
+ : `$\{${child.getName()}\}`,
552
+ )
553
+ .join("")
554
+ .split("`")
555
+ .join("\\`") +
556
+ "`",
557
+ );
558
+
559
+ // NATIVES
560
+ for (const native of metadata.natives) elements.push(native);
561
+ for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
562
+ for (const map of metadata.maps)
563
+ elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
564
+
565
+ // INSTANCES
566
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
567
+ for (const tuple of metadata.tuples) elements.push(tuple.name);
568
+ for (const array of metadata.arrays) elements.push(array.name);
569
+ for (const object of metadata.objects) elements.push(object.name);
570
+ for (const alias of metadata.aliases) elements.push(alias.name);
571
+ if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
572
+
573
+ // RETURNS
574
+ if (elements.length === 0) return "unknown";
575
+ else if (elements.length === 1) return elements[0]!;
576
+
577
+ elements.sort();
578
+ return `(${elements.join(" | ")})`;
579
+ };
580
+ export namespace Metadata {
581
+ export interface Entry {
582
+ key: Metadata;
583
+ value: Metadata;
584
+ }
585
+ }