typia 6.10.1 → 6.10.2-dev.20240920

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 (434) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +118 -118
  3. package/lib/programmers/helpers/RandomRanger.js +1 -1
  4. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/AssertionGuard.ts +1 -1
  7. package/src/CamelCase.ts +75 -75
  8. package/src/IRandomGenerator.ts +66 -66
  9. package/src/IValidation.ts +21 -21
  10. package/src/PascalCase.ts +71 -71
  11. package/src/Primitive.ts +92 -92
  12. package/src/Resolved.ts +74 -74
  13. package/src/SnakeCase.ts +126 -126
  14. package/src/TypeGuardError.ts +37 -37
  15. package/src/executable/TypiaGenerateWizard.ts +83 -83
  16. package/src/executable/TypiaPatchWizard.ts +42 -42
  17. package/src/executable/TypiaSetupWizard.ts +174 -174
  18. package/src/executable/setup/ArgumentParser.ts +43 -43
  19. package/src/executable/setup/CommandExecutor.ts +8 -8
  20. package/src/executable/setup/FileRetriever.ts +22 -22
  21. package/src/executable/setup/PackageManager.ts +86 -86
  22. package/src/executable/setup/PluginConfigurator.ts +69 -69
  23. package/src/executable/typia.ts +55 -55
  24. package/src/factories/CommentFactory.ts +79 -79
  25. package/src/factories/ExpressionFactory.ts +150 -150
  26. package/src/factories/IdentifierFactory.ts +70 -70
  27. package/src/factories/JsonMetadataFactory.ts +53 -53
  28. package/src/factories/LiteralFactory.ts +47 -47
  29. package/src/factories/MetadataCollection.ts +274 -274
  30. package/src/factories/MetadataCommentTagFactory.ts +534 -534
  31. package/src/factories/MetadataFactory.ts +314 -314
  32. package/src/factories/MetadataTypeTagFactory.ts +336 -336
  33. package/src/factories/MetadataTypeTagSchemaFactory.ts +59 -59
  34. package/src/factories/NumericRangeFactory.ts +72 -72
  35. package/src/factories/ProtobufFactory.ts +267 -267
  36. package/src/factories/StatementFactory.ts +74 -74
  37. package/src/factories/TemplateFactory.ts +56 -56
  38. package/src/factories/TypeFactory.ts +118 -118
  39. package/src/factories/ValueFactory.ts +12 -12
  40. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  41. package/src/factories/internal/metadata/emend_metadata_atomics.ts +45 -45
  42. package/src/factories/internal/metadata/emplace_metadata_alias.ts +41 -41
  43. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +42 -42
  44. package/src/factories/internal/metadata/emplace_metadata_object.ts +186 -186
  45. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  46. package/src/factories/internal/metadata/explore_metadata.ts +28 -28
  47. package/src/factories/internal/metadata/iterate_metadata.ts +100 -100
  48. package/src/factories/internal/metadata/iterate_metadata_alias.ts +34 -34
  49. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  50. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  51. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  52. package/src/factories/internal/metadata/iterate_metadata_collection.ts +131 -131
  53. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +28 -28
  54. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  55. package/src/factories/internal/metadata/iterate_metadata_escape.ts +52 -52
  56. package/src/factories/internal/metadata/iterate_metadata_function.ts +89 -89
  57. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  58. package/src/factories/internal/metadata/iterate_metadata_map.ts +50 -50
  59. package/src/factories/internal/metadata/iterate_metadata_native.ts +220 -220
  60. package/src/factories/internal/metadata/iterate_metadata_object.ts +33 -33
  61. package/src/factories/internal/metadata/iterate_metadata_set.ts +41 -41
  62. package/src/factories/internal/metadata/iterate_metadata_sort.ts +74 -74
  63. package/src/factories/internal/metadata/iterate_metadata_template.ts +44 -44
  64. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +37 -37
  65. package/src/factories/internal/metadata/iterate_metadata_union.ts +27 -27
  66. package/src/functional/$FormDataReader/$FormDataReader.ts +83 -83
  67. package/src/functional/$FormDataReader/index.ts +1 -1
  68. package/src/functional/$HeadersReader/$HeadersReader.ts +26 -26
  69. package/src/functional/$HeadersReader/index.ts +1 -1
  70. package/src/functional/$ParameterReader/$ParameterReader.ts +29 -29
  71. package/src/functional/$ParameterReader/index.ts +1 -1
  72. package/src/functional/$ProtobufReader.ts +194 -194
  73. package/src/functional/$ProtobufSizer.ts +144 -144
  74. package/src/functional/$ProtobufWriter.ts +145 -145
  75. package/src/functional/$QueryReader/$QueryReader.ts +46 -46
  76. package/src/functional/$QueryReader/index.ts +1 -1
  77. package/src/functional/$any.ts +3 -3
  78. package/src/functional/$clone.ts +48 -48
  79. package/src/functional/$convention.ts +37 -37
  80. package/src/functional/$dictionary.ts +22 -22
  81. package/src/functional/$every.ts +11 -11
  82. package/src/functional/$guard.ts +21 -21
  83. package/src/functional/$is_between.ts +2 -2
  84. package/src/functional/$join.ts +46 -46
  85. package/src/functional/$number.ts +12 -12
  86. package/src/functional/$report.ts +13 -13
  87. package/src/functional/$rest.ts +3 -3
  88. package/src/functional/$stoll.ts +8 -8
  89. package/src/functional/$string.ts +43 -43
  90. package/src/functional/$strlen.ts +7 -7
  91. package/src/functional/$tail.ts +5 -5
  92. package/src/functional/$throws.ts +10 -10
  93. package/src/functional/$varint.ts +130 -130
  94. package/src/functional/$zigzag.ts +39 -39
  95. package/src/functional/IProtobufWriter.ts +18 -18
  96. package/src/functional/Namespace/functional.ts +5 -5
  97. package/src/functional/Namespace/http.ts +9 -9
  98. package/src/functional/Namespace/index.ts +77 -77
  99. package/src/functional/Namespace/json.ts +15 -15
  100. package/src/functional/Namespace/llm.ts +20 -20
  101. package/src/functional/Namespace/misc.ts +14 -14
  102. package/src/functional/Namespace/notations.ts +23 -23
  103. package/src/functional/Namespace/protobuf.ts +20 -20
  104. package/src/functional/is.ts +10 -10
  105. package/src/functional.ts +872 -872
  106. package/src/http.ts +1266 -1266
  107. package/src/index.ts +4 -4
  108. package/src/json.ts +738 -738
  109. package/src/llm.ts +186 -186
  110. package/src/misc.ts +757 -757
  111. package/src/module.ts +1023 -1023
  112. package/src/notations.ts +1020 -1020
  113. package/src/programmers/AssertProgrammer.ts +397 -397
  114. package/src/programmers/CheckerProgrammer.ts +1138 -1138
  115. package/src/programmers/FeatureProgrammer.ts +549 -549
  116. package/src/programmers/IsProgrammer.ts +220 -220
  117. package/src/programmers/RandomProgrammer.ts +955 -955
  118. package/src/programmers/TypiaProgrammer.ts +157 -157
  119. package/src/programmers/ValidateProgrammer.ts +382 -382
  120. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +141 -141
  121. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +108 -108
  122. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +98 -98
  123. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  124. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +101 -101
  125. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +106 -106
  126. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +123 -123
  127. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +267 -267
  128. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +126 -126
  129. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  130. package/src/programmers/helpers/AtomicPredicator.ts +24 -24
  131. package/src/programmers/helpers/CloneJoiner.ts +130 -130
  132. package/src/programmers/helpers/FunctionImporeter.ts +1 -1
  133. package/src/programmers/helpers/FunctionImporter.ts +97 -97
  134. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  135. package/src/programmers/helpers/ICheckEntry.ts +13 -13
  136. package/src/programmers/helpers/IExpressionEntry.ts +12 -12
  137. package/src/programmers/helpers/NotationJoiner.ts +132 -132
  138. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  139. package/src/programmers/helpers/ProtobufUtil.ts +125 -125
  140. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  141. package/src/programmers/helpers/PruneJoiner.ts +139 -139
  142. package/src/programmers/helpers/RandomJoiner.ts +145 -145
  143. package/src/programmers/helpers/RandomRanger.ts +171 -171
  144. package/src/programmers/helpers/StringifyJoinder.ts +105 -105
  145. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  146. package/src/programmers/helpers/UnionExplorer.ts +269 -269
  147. package/src/programmers/helpers/UnionPredicator.ts +77 -77
  148. package/src/programmers/helpers/disable_function_importer_declare.ts +33 -33
  149. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +91 -91
  150. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +91 -91
  151. package/src/programmers/http/HttpAssertQueryProgrammer.ts +93 -93
  152. package/src/programmers/http/HttpFormDataProgrammer.ts +278 -278
  153. package/src/programmers/http/HttpHeadersProgrammer.ts +347 -347
  154. package/src/programmers/http/HttpIsFormDataProgrammer.ts +102 -102
  155. package/src/programmers/http/HttpIsHeadersProgrammer.ts +102 -102
  156. package/src/programmers/http/HttpIsQueryProgrammer.ts +104 -104
  157. package/src/programmers/http/HttpParameterProgrammer.ts +97 -97
  158. package/src/programmers/http/HttpQueryProgrammer.ts +298 -298
  159. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +85 -85
  160. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +85 -85
  161. package/src/programmers/http/HttpValidateQueryProgrammer.ts +87 -87
  162. package/src/programmers/internal/application_array.ts +61 -61
  163. package/src/programmers/internal/application_bigint.ts +25 -25
  164. package/src/programmers/internal/application_boolean.ts +25 -25
  165. package/src/programmers/internal/application_description.ts +12 -12
  166. package/src/programmers/internal/application_escaped.ts +74 -74
  167. package/src/programmers/internal/application_number.ts +25 -25
  168. package/src/programmers/internal/application_plugin.ts +19 -19
  169. package/src/programmers/internal/application_string.ts +25 -25
  170. package/src/programmers/internal/application_templates.ts +62 -62
  171. package/src/programmers/internal/application_title.ts +20 -20
  172. package/src/programmers/internal/application_union_discriminator.ts +35 -35
  173. package/src/programmers/internal/application_v30_alias.ts +52 -52
  174. package/src/programmers/internal/application_v30_constant.ts +18 -18
  175. package/src/programmers/internal/application_v30_native.ts +28 -28
  176. package/src/programmers/internal/application_v30_object.ts +149 -149
  177. package/src/programmers/internal/application_v30_schema.ts +161 -161
  178. package/src/programmers/internal/application_v30_tuple.ts +33 -33
  179. package/src/programmers/internal/application_v31_alias.ts +41 -41
  180. package/src/programmers/internal/application_v31_constant.ts +29 -29
  181. package/src/programmers/internal/application_v31_native.ts +24 -24
  182. package/src/programmers/internal/application_v31_object.ts +130 -130
  183. package/src/programmers/internal/application_v31_schema.ts +159 -159
  184. package/src/programmers/internal/application_v31_tuple.ts +21 -21
  185. package/src/programmers/internal/check_array_length.ts +45 -45
  186. package/src/programmers/internal/check_bigint.ts +49 -49
  187. package/src/programmers/internal/check_dynamic_key.ts +174 -174
  188. package/src/programmers/internal/check_dynamic_properties.ts +211 -211
  189. package/src/programmers/internal/check_everything.ts +23 -23
  190. package/src/programmers/internal/check_native.ts +21 -21
  191. package/src/programmers/internal/check_number.ts +107 -107
  192. package/src/programmers/internal/check_object.ts +61 -61
  193. package/src/programmers/internal/check_string.ts +48 -48
  194. package/src/programmers/internal/check_template.ts +46 -46
  195. package/src/programmers/internal/check_union_array_like.ts +307 -307
  196. package/src/programmers/internal/decode_union_object.ts +99 -99
  197. package/src/programmers/internal/feature_object_entries.ts +58 -58
  198. package/src/programmers/internal/llm_schema_array.ts +22 -22
  199. package/src/programmers/internal/llm_schema_escaped.ts +61 -61
  200. package/src/programmers/internal/llm_schema_native.ts +17 -17
  201. package/src/programmers/internal/llm_schema_object.ts +129 -129
  202. package/src/programmers/internal/llm_schema_station.ts +185 -185
  203. package/src/programmers/internal/llm_schema_tuple.ts +31 -31
  204. package/src/programmers/internal/metadata_to_pattern.ts +34 -34
  205. package/src/programmers/internal/postfix_of_tuple.ts +2 -2
  206. package/src/programmers/internal/prune_object_properties.ts +60 -60
  207. package/src/programmers/internal/random_custom.ts +37 -37
  208. package/src/programmers/internal/stringify_dynamic_properties.ts +157 -157
  209. package/src/programmers/internal/stringify_native.ts +7 -7
  210. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  211. package/src/programmers/internal/template_to_pattern.ts +15 -15
  212. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +20 -20
  213. package/src/programmers/json/JsonApplicationProgrammer.ts +82 -82
  214. package/src/programmers/json/JsonAssertParseProgrammer.ts +96 -96
  215. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +104 -104
  216. package/src/programmers/json/JsonIsParseProgrammer.ts +110 -110
  217. package/src/programmers/json/JsonIsStringifyProgrammer.ts +102 -102
  218. package/src/programmers/json/JsonStringifyProgrammer.ts +909 -909
  219. package/src/programmers/json/JsonValidateParseProgrammer.ts +87 -87
  220. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +111 -111
  221. package/src/programmers/llm/LlmApplicationProgrammer.ts +216 -216
  222. package/src/programmers/llm/LlmSchemaProgrammer.ts +49 -49
  223. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +87 -87
  224. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +105 -105
  225. package/src/programmers/misc/MiscCloneProgrammer.ts +781 -781
  226. package/src/programmers/misc/MiscIsCloneProgrammer.ts +93 -93
  227. package/src/programmers/misc/MiscIsPruneProgrammer.ts +91 -91
  228. package/src/programmers/misc/MiscLiteralsProgrammer.ts +70 -70
  229. package/src/programmers/misc/MiscPruneProgrammer.ts +560 -560
  230. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +104 -104
  231. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +101 -101
  232. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +91 -91
  233. package/src/programmers/notations/NotationGeneralProgrammer.ts +714 -714
  234. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +97 -97
  235. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +110 -110
  236. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +91 -91
  237. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +95 -95
  238. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +646 -646
  239. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +852 -852
  240. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +104 -104
  241. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +93 -93
  242. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +160 -160
  243. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +85 -85
  244. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +109 -109
  245. package/src/protobuf.ts +999 -999
  246. package/src/reflect.ts +63 -63
  247. package/src/schemas/json/IJsonApplication.ts +22 -22
  248. package/src/schemas/metadata/IJsDocTagInfo.ts +10 -10
  249. package/src/schemas/metadata/IMetadata.ts +36 -36
  250. package/src/schemas/metadata/IMetadataAlias.ts +12 -12
  251. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  252. package/src/schemas/metadata/IMetadataArray.ts +7 -7
  253. package/src/schemas/metadata/IMetadataArrayType.ts +10 -10
  254. package/src/schemas/metadata/IMetadataAtomic.ts +6 -6
  255. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  256. package/src/schemas/metadata/IMetadataConstant.ts +18 -18
  257. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  258. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  259. package/src/schemas/metadata/IMetadataEntry.ts +6 -6
  260. package/src/schemas/metadata/IMetadataEscaped.ts +6 -6
  261. package/src/schemas/metadata/IMetadataFunction.ts +8 -8
  262. package/src/schemas/metadata/IMetadataObject.ts +13 -13
  263. package/src/schemas/metadata/IMetadataParameter.ts +9 -9
  264. package/src/schemas/metadata/IMetadataProperty.ts +9 -9
  265. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  266. package/src/schemas/metadata/IMetadataTuple.ts +7 -7
  267. package/src/schemas/metadata/IMetadataTupleType.ts +10 -10
  268. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  269. package/src/schemas/metadata/Metadata.ts +616 -616
  270. package/src/schemas/metadata/MetadataAlias.ts +61 -61
  271. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  272. package/src/schemas/metadata/MetadataArray.ts +49 -49
  273. package/src/schemas/metadata/MetadataArrayType.ts +57 -57
  274. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  275. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  276. package/src/schemas/metadata/MetadataConstant.ts +34 -34
  277. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  278. package/src/schemas/metadata/MetadataEscaped.ts +51 -51
  279. package/src/schemas/metadata/MetadataFunction.ts +49 -49
  280. package/src/schemas/metadata/MetadataObject.ts +139 -139
  281. package/src/schemas/metadata/MetadataParameter.ts +50 -50
  282. package/src/schemas/metadata/MetadataProperty.ts +56 -56
  283. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  284. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  285. package/src/schemas/metadata/MetadataTupleType.ts +67 -67
  286. package/src/tags/Constant.ts +15 -15
  287. package/src/tags/ContentMediaType.ts +10 -10
  288. package/src/tags/Default.ts +22 -22
  289. package/src/tags/ExclusiveMaximum.ts +25 -25
  290. package/src/tags/ExclusiveMinimum.ts +25 -25
  291. package/src/tags/Format.ts +16 -16
  292. package/src/tags/JsonSchemaPlugin.ts +8 -8
  293. package/src/tags/MaxItems.ts +12 -12
  294. package/src/tags/MaxLength.ts +12 -12
  295. package/src/tags/Maximum.ts +19 -19
  296. package/src/tags/MinItems.ts +12 -12
  297. package/src/tags/MinLength.ts +12 -12
  298. package/src/tags/Minimum.ts +19 -19
  299. package/src/tags/MultipleOf.ts +21 -21
  300. package/src/tags/Pattern.ts +31 -31
  301. package/src/tags/TagBase.ts +76 -76
  302. package/src/tags/Type.ts +32 -32
  303. package/src/tags/UniqueItems.ts +14 -14
  304. package/src/tags/index.ts +18 -18
  305. package/src/tags/internal/FormatCheatSheet.ts +73 -73
  306. package/src/transform.ts +35 -35
  307. package/src/transformers/CallExpressionTransformer.ts +508 -508
  308. package/src/transformers/FileTransformer.ts +91 -91
  309. package/src/transformers/IProject.ts +15 -15
  310. package/src/transformers/ITransformOptions.ts +62 -62
  311. package/src/transformers/ImportTransformer.ts +66 -66
  312. package/src/transformers/NodeTransformer.ts +13 -13
  313. package/src/transformers/TransformerError.ts +60 -60
  314. package/src/transformers/features/AssertTransformer.ts +16 -16
  315. package/src/transformers/features/CreateAssertTransformer.ts +16 -16
  316. package/src/transformers/features/CreateIsTransformer.ts +10 -10
  317. package/src/transformers/features/CreateRandomTransformer.ts +40 -40
  318. package/src/transformers/features/CreateValidateTransformer.ts +13 -13
  319. package/src/transformers/features/IsTransformer.ts +10 -10
  320. package/src/transformers/features/RandomTransformer.ts +44 -44
  321. package/src/transformers/features/ValidateTransformer.ts +11 -11
  322. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  323. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +12 -12
  324. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +11 -11
  325. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +9 -9
  326. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +9 -9
  327. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +9 -9
  328. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +9 -9
  329. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +9 -9
  330. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +9 -9
  331. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +9 -9
  332. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +9 -9
  333. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +12 -12
  334. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +12 -12
  335. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +11 -11
  336. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +10 -10
  337. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +9 -9
  338. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +9 -9
  339. package/src/transformers/features/http/HttpFormDataTransformer.ts +9 -9
  340. package/src/transformers/features/http/HttpHeadersTransformer.ts +9 -9
  341. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +9 -9
  342. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +9 -9
  343. package/src/transformers/features/http/HttpIsQueryTransformer.ts +9 -9
  344. package/src/transformers/features/http/HttpParameterTransformer.ts +9 -9
  345. package/src/transformers/features/http/HttpQueryTransformer.ts +9 -9
  346. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +10 -10
  347. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +10 -10
  348. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +9 -9
  349. package/src/transformers/features/json/JsonApplicationTransformer.ts +124 -124
  350. package/src/transformers/features/json/JsonAssertParseTransformer.ts +9 -9
  351. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +10 -10
  352. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +9 -9
  353. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +12 -12
  354. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +9 -9
  355. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +9 -9
  356. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +9 -9
  357. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +11 -11
  358. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +12 -12
  359. package/src/transformers/features/json/JsonIsParseTransformer.ts +9 -9
  360. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +9 -9
  361. package/src/transformers/features/json/JsonStringifyTransformer.ts +9 -9
  362. package/src/transformers/features/json/JsonValidateParseTransformer.ts +9 -9
  363. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +10 -10
  364. package/src/transformers/features/llm/LlmApplicationTransformer.ts +83 -83
  365. package/src/transformers/features/llm/LlmSchemaTransformer.ts +53 -53
  366. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +9 -9
  367. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +9 -9
  368. package/src/transformers/features/misc/MiscCloneTransformer.ts +9 -9
  369. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +9 -9
  370. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +9 -9
  371. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +9 -9
  372. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +9 -9
  373. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +9 -9
  374. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +9 -9
  375. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +11 -11
  376. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +11 -11
  377. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +9 -9
  378. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +9 -9
  379. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +32 -32
  380. package/src/transformers/features/misc/MiscPruneTransformer.ts +9 -9
  381. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +9 -9
  382. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +9 -9
  383. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +15 -15
  384. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +15 -15
  385. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +15 -15
  386. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +15 -15
  387. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +15 -15
  388. package/src/transformers/features/notations/NotationGeneralTransformer.ts +11 -11
  389. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +15 -15
  390. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +15 -15
  391. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +10 -10
  392. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +10 -10
  393. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +12 -12
  394. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +12 -12
  395. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +9 -9
  396. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +9 -9
  397. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +9 -9
  398. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +9 -9
  399. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +12 -12
  400. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +12 -12
  401. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +9 -9
  402. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +9 -9
  403. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +9 -9
  404. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +9 -9
  405. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +33 -33
  406. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +10 -10
  407. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +10 -10
  408. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +63 -63
  409. package/src/transformers/features/reflect/ReflectNameTransformer.ts +66 -66
  410. package/src/transformers/internal/GenericTransformer.ts +104 -104
  411. package/src/typings/Atomic.ts +13 -13
  412. package/src/typings/ClassProperties.ts +5 -5
  413. package/src/typings/Customizable.ts +5 -5
  414. package/src/typings/Equal.ts +18 -18
  415. package/src/typings/IsTuple.ts +9 -9
  416. package/src/typings/NativeClass.ts +23 -23
  417. package/src/typings/OmitNever.ts +3 -3
  418. package/src/typings/ProtobufAtomic.ts +19 -19
  419. package/src/typings/SpecialFields.ts +3 -3
  420. package/src/typings/ValidationPipe.ts +9 -9
  421. package/src/typings/ValueOf.ts +20 -20
  422. package/src/typings/Writable.ts +11 -11
  423. package/src/utils/ArrayUtil.ts +41 -41
  424. package/src/utils/Escaper.ts +50 -50
  425. package/src/utils/MapUtil.ts +12 -12
  426. package/src/utils/NameEncoder.ts +32 -32
  427. package/src/utils/NamingConvention/NamingConvention.ts +89 -89
  428. package/src/utils/NamingConvention/index.ts +1 -1
  429. package/src/utils/PatternUtil.ts +29 -29
  430. package/src/utils/RandomGenerator/RandomGenerator.ts +119 -119
  431. package/src/utils/RandomGenerator/index.ts +1 -1
  432. package/src/utils/Singleton.ts +16 -16
  433. package/src/utils/StringUtil/StringUtil.ts +7 -7
  434. package/src/utils/StringUtil/index.ts +1 -1
@@ -1,616 +1,616 @@
1
- import { ClassProperties } from "../../typings/ClassProperties";
2
-
3
- import { ArrayUtil } from "../../utils/ArrayUtil";
4
-
5
- import { IMetadata } from "./IMetadata";
6
- import { IMetadataDictionary } from "./IMetadataDictionary";
7
- import { IMetadataTypeTag } from "./IMetadataTypeTag";
8
- import { MetadataAlias } from "./MetadataAlias";
9
- import { MetadataArray } from "./MetadataArray";
10
- import { MetadataAtomic } from "./MetadataAtomic";
11
- import { MetadataConstant } from "./MetadataConstant";
12
- import { MetadataEscaped } from "./MetadataEscaped";
13
- import { MetadataFunction } from "./MetadataFunction";
14
- import { MetadataObject } from "./MetadataObject";
15
- import { MetadataTemplate } from "./MetadataTemplate";
16
- import { MetadataTuple } from "./MetadataTuple";
17
-
18
- export class Metadata {
19
- public any: boolean;
20
- public required: boolean;
21
- public optional: boolean;
22
- public nullable: boolean;
23
-
24
- public escaped: MetadataEscaped | null;
25
- public atomics: MetadataAtomic[];
26
- public constants: MetadataConstant[];
27
- public templates: MetadataTemplate[];
28
-
29
- public rest: Metadata | null;
30
- public aliases: MetadataAlias[];
31
- public arrays: MetadataArray[];
32
- public tuples: MetadataTuple[];
33
- public objects: MetadataObject[];
34
- public functions: MetadataFunction[];
35
-
36
- public natives: string[];
37
- public sets: Metadata[];
38
- public maps: Metadata.Entry[];
39
-
40
- /** @internal */ private name_?: string;
41
- /** @internal */ private parent_resolved_: boolean = false;
42
- /** @internal */ public union_index?: number;
43
- /** @internal */ public fixed_?: number | null;
44
- /** @internal */ public boolean_literal_intersected_?: boolean;
45
-
46
- /* -----------------------------------------------------------
47
- CONSTRUCTORS
48
- ----------------------------------------------------------- */
49
- /**
50
- * @hidden
51
- */
52
- private constructor(props: ClassProperties<Metadata>) {
53
- this.any = props.any;
54
- this.required = props.required;
55
- this.optional = props.optional;
56
- this.nullable = props.nullable;
57
- this.functions = props.functions;
58
-
59
- this.escaped = props.escaped;
60
- this.atomics = props.atomics;
61
- this.constants = props.constants;
62
- this.templates = props.templates;
63
-
64
- this.rest = props.rest;
65
- this.arrays = props.arrays;
66
- this.tuples = props.tuples;
67
- this.objects = props.objects;
68
- this.aliases = props.aliases;
69
-
70
- this.natives = props.natives;
71
- this.sets = props.sets;
72
- this.maps = props.maps;
73
- }
74
-
75
- /**
76
- * @internal
77
- */
78
- public static create(props: ClassProperties<Metadata>): Metadata {
79
- return new Metadata(props);
80
- }
81
-
82
- /**
83
- * @internal
84
- */
85
- public static initialize(parentResolved: boolean = false): Metadata {
86
- const meta: Metadata = Metadata.create({
87
- any: false,
88
- nullable: false,
89
- required: true,
90
- optional: false,
91
-
92
- escaped: null,
93
- constants: [],
94
- atomics: [],
95
- templates: [],
96
- arrays: [],
97
- tuples: [],
98
- objects: [],
99
- aliases: [],
100
- functions: [],
101
-
102
- rest: null,
103
- natives: [],
104
- sets: [],
105
- maps: [],
106
- });
107
- meta.parent_resolved_ = parentResolved;
108
- return meta;
109
- }
110
-
111
- public toJSON(): IMetadata {
112
- return {
113
- any: this.any,
114
- required: this.required,
115
- optional: this.optional,
116
- nullable: this.nullable,
117
- functions: this.functions.map((f) => f.toJSON()),
118
-
119
- atomics: this.atomics.map((a) => a.toJSON()),
120
- constants: this.constants.map((c) => c.toJSON()),
121
- templates: this.templates.map((tpl) => tpl.toJSON()),
122
- escaped: this.escaped ? this.escaped.toJSON() : null,
123
-
124
- rest: this.rest ? this.rest.toJSON() : null,
125
- arrays: this.arrays.map((array) => ({
126
- name: array.type.name,
127
- tags: array.tags.map((r) => r.slice()),
128
- })),
129
- tuples: this.tuples.map((tuple) => ({
130
- name: tuple.type.name,
131
- tags: tuple.tags.map((r) => r.slice()),
132
- })),
133
- objects: this.objects.map((obj) => obj.name),
134
- aliases: this.aliases.map((alias) => alias.name),
135
-
136
- natives: this.natives.slice(),
137
- sets: this.sets.map((meta) => meta.toJSON()),
138
- maps: this.maps.map((entry) => ({
139
- key: entry.key.toJSON(),
140
- value: entry.value.toJSON(),
141
- })),
142
- };
143
- }
144
-
145
- public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
146
- return Metadata.create({
147
- any: meta.any,
148
- required: meta.required,
149
- optional: meta.optional,
150
- nullable: meta.nullable,
151
- functions: meta.functions.map((f) => MetadataFunction.from(f, dict)),
152
-
153
- constants: meta.constants.map(MetadataConstant.from),
154
- atomics: meta.atomics.map(MetadataAtomic.from),
155
- templates: meta.templates.map((tpl) => MetadataTemplate.from(tpl, dict)),
156
- escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
157
-
158
- rest: meta.rest ? this.from(meta.rest, dict) : null,
159
- arrays: meta.arrays.map((ref) => {
160
- const type = dict.arrays.get(ref.name);
161
- if (type === undefined)
162
- throw new RangeError(
163
- `Error on Metadata.from(): failed to find array "${ref.name}".`,
164
- );
165
- return MetadataArray.create({
166
- type,
167
- tags: ref.tags.map((row) => row.slice()),
168
- });
169
- }),
170
- tuples: meta.tuples.map((t) => {
171
- const type = dict.tuples.get(t.name);
172
- if (type === undefined)
173
- throw new RangeError(
174
- `Error on Metadata.from(): failed to find tuple "${t.name}".`,
175
- );
176
- return MetadataTuple.create({
177
- type,
178
- tags: t.tags.map((r) => r.slice()),
179
- });
180
- }),
181
- objects: meta.objects.map((name) => {
182
- const found = dict.objects.get(name);
183
- if (found === undefined)
184
- throw new RangeError(
185
- `Error on Metadata.from(): failed to find object "${name}".`,
186
- );
187
- return found;
188
- }),
189
- aliases: meta.aliases.map((alias) => {
190
- const found = dict.aliases.get(alias);
191
- if (found === undefined)
192
- throw new RangeError(
193
- `Error on Metadata.from(): failed to find alias "${alias}".`,
194
- );
195
- return found;
196
- }),
197
-
198
- natives: meta.natives.slice(),
199
- sets: meta.sets.map((meta) => this.from(meta, dict)),
200
- maps: meta.maps.map((entry) => ({
201
- key: this.from(entry.key, dict),
202
- value: this.from(entry.value, dict),
203
- })),
204
- });
205
- }
206
-
207
- /* -----------------------------------------------------------
208
- ACCESSORS
209
- ----------------------------------------------------------- */
210
- public getName(): string {
211
- return (this.name_ ??= getName(this));
212
- }
213
-
214
- public empty(): boolean {
215
- return this.bucket() === 0 || this.size() === 0;
216
- }
217
-
218
- public size(): number {
219
- return (
220
- (this.any ? 1 : 0) +
221
- (this.escaped ? 1 : 0) +
222
- (this.rest ? this.rest.size() : 0) +
223
- this.templates.length +
224
- this.atomics.length +
225
- this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
226
- this.arrays.length +
227
- this.tuples.length +
228
- this.natives.length +
229
- this.maps.length +
230
- this.sets.length +
231
- this.objects.length +
232
- this.functions.length +
233
- this.aliases.length
234
- );
235
- }
236
-
237
- public bucket(): number {
238
- return (
239
- (this.any ? 1 : 0) +
240
- (this.escaped ? 1 : 0) +
241
- (this.templates.length ? 1 : 0) +
242
- (this.atomics.length ? 1 : 0) +
243
- (this.constants.length ? 1 : 0) +
244
- (this.rest ? this.rest.size() : 0) +
245
- (this.arrays.length ? 1 : 0) +
246
- (this.tuples.length ? 1 : 0) +
247
- (this.natives.length ? 1 : 0) +
248
- (this.sets.length ? 1 : 0) +
249
- (this.maps.length ? 1 : 0) +
250
- (this.objects.length ? 1 : 0) +
251
- (this.functions.length ? 1 : 0) +
252
- (this.aliases.length ? 1 : 0)
253
- );
254
- }
255
-
256
- public isConstant(): boolean {
257
- return this.bucket() === (this.constants.length ? 1 : 0);
258
- }
259
-
260
- public isRequired(): boolean {
261
- return this.required === true && this.optional === false;
262
- }
263
-
264
- /**
265
- * @internal
266
- */
267
- public isUnionBucket(): boolean {
268
- const size: number = this.bucket();
269
- const emended: number =
270
- !!this.atomics.length && !!this.constants.length ? size - 1 : size;
271
- return emended > 1;
272
- }
273
-
274
- /**
275
- * @internal
276
- */
277
- public getSoleLiteral(): string | null {
278
- if (
279
- this.size() === 1 &&
280
- this.constants.length === 1 &&
281
- this.constants[0]!.type === "string" &&
282
- this.constants[0]!.values.length === 1
283
- )
284
- return this.constants[0]!.values[0]!.value as string;
285
- else return null;
286
- }
287
-
288
- public isSoleLiteral(): boolean {
289
- return this.getSoleLiteral() !== null;
290
- }
291
-
292
- /**
293
- * @internal
294
- */
295
- public isParentResolved(): boolean {
296
- return this.parent_resolved_;
297
- }
298
- }
299
- export namespace Metadata {
300
- export const intersects = (x: Metadata, y: Metadata): boolean => {
301
- // CHECK ANY & OPTIONAL
302
- if (x.any || y.any) return true;
303
- if (x.isRequired() === false && false === y.isRequired()) return true;
304
- if (x.nullable === true && true === y.nullable) return true;
305
- if (!!x.functions.length && !!y.functions.length === true) return true;
306
-
307
- //----
308
- // INSTANCES
309
- //----
310
- // ARRAYS
311
- if (x.arrays.length && y.arrays.length) return true;
312
- if (x.tuples.length && y.tuples.length) return true;
313
- if (x.objects.length && y.objects.length) return true;
314
- if (x.aliases.length && y.aliases.length) return true;
315
-
316
- // NATIVES
317
- if (x.natives.length && y.natives.length)
318
- if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
319
- return true;
320
-
321
- // ESCAPED
322
- if (x.escaped && y.escaped)
323
- return (
324
- intersects(x.escaped.original, y.escaped.original) ||
325
- intersects(x.escaped.returns, y.escaped.returns)
326
- );
327
-
328
- //----
329
- // VALUES
330
- //----
331
- // ATOMICS
332
- for (const atomic of x.atomics) {
333
- if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
334
- if (y.constants.some((yc) => atomic.type === yc.type)) return true;
335
- }
336
-
337
- // CONSTANTS
338
- for (const constant of x.constants) {
339
- const atomic: MetadataAtomic | undefined = y.atomics.find(
340
- (elem) => elem.type === constant.type,
341
- );
342
- if (atomic !== undefined) return true;
343
-
344
- const opposite: MetadataConstant | undefined = y.constants.find(
345
- (elem) => elem.type === constant.type,
346
- );
347
- if (opposite === undefined) continue;
348
-
349
- const values: Set<any> = new Set([
350
- ...constant.values.map((e) => e.value),
351
- ...opposite.values.map((e) => e.value),
352
- ]);
353
- if (values.size !== constant.values.length + opposite.values.length)
354
- return true;
355
- }
356
-
357
- // TEMPLATES
358
- if (!!x.templates.length && y.atomics.some((ya) => ya.type === "string"))
359
- return true;
360
- else if (
361
- !!y.templates.length &&
362
- x.atomics.some((xa) => xa.type === "string")
363
- )
364
- return true;
365
- return false;
366
- };
367
-
368
- export const covers = (
369
- x: Metadata,
370
- y: Metadata,
371
- level: number = 0,
372
- escaped: boolean = false,
373
- ): boolean => {
374
- // CHECK ANY
375
- if (x === y) return false;
376
- else if (x.any) return true;
377
- else if (y.any) return false;
378
-
379
- if (escaped === false) {
380
- if (x.escaped === null && y.escaped !== null) return false;
381
- else if (
382
- x.escaped !== null &&
383
- y.escaped !== null &&
384
- (!covers(x.escaped.original, y.escaped.original, level, true) ||
385
- !covers(x.escaped.returns, y.escaped.returns, level, true))
386
- )
387
- return false;
388
- }
389
-
390
- //----
391
- // INSTANCES
392
- //----
393
- if (level === 0) {
394
- // ARRAYS
395
- for (const ya of y.arrays)
396
- if (
397
- !x.arrays.some((xa) =>
398
- covers(xa.type.value, ya.type.value, level + 1),
399
- )
400
- ) {
401
- return false;
402
- }
403
-
404
- // TUPLES
405
- for (const yt of y.tuples)
406
- if (
407
- yt.type.elements.length !== 0 &&
408
- x.tuples.some(
409
- (xt) =>
410
- xt.type.elements.length >= yt.type.elements.length &&
411
- xt.type.elements
412
- .slice(yt.type.elements.length)
413
- .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
414
- ) === false
415
- )
416
- return false;
417
- }
418
-
419
- // OBJECTS
420
- for (const yo of y.objects)
421
- if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
422
- return false;
423
-
424
- // ALIASES
425
- for (const yd of y.aliases)
426
- if (x.aliases.some((xd) => xd.name === yd.name) === false) return false;
427
-
428
- // NATIVES
429
- for (const yn of y.natives)
430
- if (x.natives.some((xn) => xn === yn) === false) return false;
431
-
432
- // SETS
433
- for (const ys of y.sets)
434
- if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
435
-
436
- //----
437
- // VALUES
438
- //----
439
- // ATOMICS
440
- if (
441
- y.atomics.some(
442
- (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
443
- )
444
- )
445
- return false;
446
-
447
- // CONSTANTS
448
- for (const yc of y.constants) {
449
- if (x.atomics.some((atom) => yc.type === atom.type)) continue;
450
- const xc: MetadataConstant | undefined = x.constants.find(
451
- (elem) => elem.type === yc.type,
452
- );
453
- if (xc === undefined) return false;
454
- else if (
455
- (yc.values.map((e) => e.value) as number[]).some(
456
- (yv) => xc.values.includes(yv as never) === false,
457
- )
458
- )
459
- return false;
460
- }
461
-
462
- // FUNCTIONAL
463
- if (!!x.functions.length === false && !!y.functions.length) return false;
464
-
465
- // SUCCESS
466
- return true;
467
- };
468
-
469
- /**
470
- * @internal
471
- */
472
- export const merge = (x: Metadata, y: Metadata): Metadata => {
473
- const output: Metadata = Metadata.create({
474
- any: x.any || y.any,
475
- nullable: x.nullable || y.nullable,
476
- required: x.required && y.required,
477
- optional: x.optional || y.optional,
478
- functions: x.functions.length ? x.functions : y.functions, // @todo
479
-
480
- escaped:
481
- x.escaped !== null && y.escaped !== null
482
- ? MetadataEscaped.create({
483
- original: merge(x.escaped.original, y.escaped.original),
484
- returns: merge(x.escaped.returns, y.escaped.returns),
485
- })
486
- : (x.escaped ?? y.escaped),
487
- atomics: mergeTaggedTypes({
488
- container: x.atomics,
489
- equals: (x, y) => x.type === y.type,
490
- getter: (x) => x.tags,
491
- })(y.atomics),
492
- constants: [...x.constants],
493
- templates: x.templates.slice(),
494
-
495
- rest:
496
- x.rest !== null && y.rest !== null
497
- ? merge(x.rest, y.rest)
498
- : (x.rest ?? y.rest),
499
- // arrays: x.arrays.slice(),
500
- arrays: mergeTaggedTypes({
501
- container: x.arrays,
502
- equals: (x, y) => x.type.name === y.type.name,
503
- getter: (x) => x.tags,
504
- })(y.arrays),
505
- tuples: mergeTaggedTypes({
506
- container: x.tuples,
507
- equals: (x, y) => x.type.name === y.type.name,
508
- getter: (x) => x.tags,
509
- })(y.tuples),
510
- objects: x.objects.slice(),
511
- aliases: x.aliases.slice(),
512
-
513
- natives: [...new Set([...x.natives, ...y.natives])],
514
- sets: x.sets.slice(),
515
- maps: x.maps.slice(),
516
- });
517
- for (const constant of y.constants) {
518
- const target: MetadataConstant = ArrayUtil.take(
519
- output.constants,
520
- (elem) => elem.type === constant.type,
521
- () =>
522
- MetadataConstant.create({
523
- type: constant.type,
524
- values: [],
525
- }),
526
- );
527
- for (const value of constant.values)
528
- ArrayUtil.add(target.values, value, (a, b) => a.value === b.value);
529
- }
530
- for (const obj of y.objects)
531
- ArrayUtil.set(output.objects, obj, (elem) => elem.name);
532
- for (const alias of y.aliases)
533
- ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
534
-
535
- return output;
536
- };
537
- }
538
-
539
- const getName = (metadata: Metadata): string => {
540
- if (metadata.any === true) return "any";
541
-
542
- const elements: string[] = [];
543
-
544
- // OPTIONAL
545
- if (metadata.nullable === true) elements.push("null");
546
- if (metadata.isRequired() === false) elements.push("undefined");
547
-
548
- // ATOMIC
549
- for (const atom of metadata.atomics) {
550
- elements.push(atom.getName());
551
- }
552
- for (const constant of metadata.constants)
553
- for (const value of constant.values) elements.push(value.getName());
554
- for (const template of metadata.templates) elements.push(template.getName());
555
-
556
- // NATIVES
557
- for (const native of metadata.natives) elements.push(native);
558
- for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
559
- for (const map of metadata.maps)
560
- elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
561
-
562
- // INSTANCES
563
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
564
- for (const tuple of metadata.tuples) elements.push(tuple.type.name);
565
- for (const array of metadata.arrays) elements.push(array.getName());
566
- for (const object of metadata.objects) elements.push(object.name);
567
- for (const alias of metadata.aliases) elements.push(alias.name);
568
- if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
569
-
570
- // RETURNS
571
- if (elements.length === 0) return "unknown";
572
- else if (elements.length === 1) return elements[0]!;
573
-
574
- elements.sort();
575
- return `(${elements.join(" | ")})`;
576
- };
577
- export namespace Metadata {
578
- export interface Entry {
579
- key: Metadata;
580
- value: Metadata;
581
- }
582
- }
583
-
584
- const mergeTaggedTypes =
585
- <T>(props: {
586
- container: T[];
587
- equals: (x: T, y: T) => boolean;
588
- getter: (x: T) => IMetadataTypeTag[][];
589
- }) =>
590
- (opposite: T[]) => {
591
- const output: T[] = [...props.container];
592
- for (const elem of opposite) {
593
- const equal = props.container.find((x) => props.equals(x, elem));
594
- if (equal === undefined) {
595
- output.push(elem);
596
- continue;
597
- }
598
-
599
- const matrix: string[][] = props
600
- .getter(equal)
601
- .map((tags) => tags.map((t) => t.name))
602
- .sort();
603
- for (const tags of props.getter(elem)) {
604
- const names: string[] = tags.map((t) => t.name).sort();
605
- if (
606
- matrix.some(
607
- (m) =>
608
- m.length === names.length && m.every((s, i) => s === names[i]),
609
- )
610
- )
611
- continue;
612
- props.getter(equal).push(tags);
613
- }
614
- }
615
- return output;
616
- };
1
+ import { ClassProperties } from "../../typings/ClassProperties";
2
+
3
+ import { ArrayUtil } from "../../utils/ArrayUtil";
4
+
5
+ import { IMetadata } from "./IMetadata";
6
+ import { IMetadataDictionary } from "./IMetadataDictionary";
7
+ import { IMetadataTypeTag } from "./IMetadataTypeTag";
8
+ import { MetadataAlias } from "./MetadataAlias";
9
+ import { MetadataArray } from "./MetadataArray";
10
+ import { MetadataAtomic } from "./MetadataAtomic";
11
+ import { MetadataConstant } from "./MetadataConstant";
12
+ import { MetadataEscaped } from "./MetadataEscaped";
13
+ import { MetadataFunction } from "./MetadataFunction";
14
+ import { MetadataObject } from "./MetadataObject";
15
+ import { MetadataTemplate } from "./MetadataTemplate";
16
+ import { MetadataTuple } from "./MetadataTuple";
17
+
18
+ export class Metadata {
19
+ public any: boolean;
20
+ public required: boolean;
21
+ public optional: boolean;
22
+ public nullable: boolean;
23
+
24
+ public escaped: MetadataEscaped | null;
25
+ public atomics: MetadataAtomic[];
26
+ public constants: MetadataConstant[];
27
+ public templates: MetadataTemplate[];
28
+
29
+ public rest: Metadata | null;
30
+ public aliases: MetadataAlias[];
31
+ public arrays: MetadataArray[];
32
+ public tuples: MetadataTuple[];
33
+ public objects: MetadataObject[];
34
+ public functions: MetadataFunction[];
35
+
36
+ public natives: string[];
37
+ public sets: Metadata[];
38
+ public maps: Metadata.Entry[];
39
+
40
+ /** @internal */ private name_?: string;
41
+ /** @internal */ private parent_resolved_: boolean = false;
42
+ /** @internal */ public union_index?: number;
43
+ /** @internal */ public fixed_?: number | null;
44
+ /** @internal */ public boolean_literal_intersected_?: boolean;
45
+
46
+ /* -----------------------------------------------------------
47
+ CONSTRUCTORS
48
+ ----------------------------------------------------------- */
49
+ /**
50
+ * @hidden
51
+ */
52
+ private constructor(props: ClassProperties<Metadata>) {
53
+ this.any = props.any;
54
+ this.required = props.required;
55
+ this.optional = props.optional;
56
+ this.nullable = props.nullable;
57
+ this.functions = props.functions;
58
+
59
+ this.escaped = props.escaped;
60
+ this.atomics = props.atomics;
61
+ this.constants = props.constants;
62
+ this.templates = props.templates;
63
+
64
+ this.rest = props.rest;
65
+ this.arrays = props.arrays;
66
+ this.tuples = props.tuples;
67
+ this.objects = props.objects;
68
+ this.aliases = props.aliases;
69
+
70
+ this.natives = props.natives;
71
+ this.sets = props.sets;
72
+ this.maps = props.maps;
73
+ }
74
+
75
+ /**
76
+ * @internal
77
+ */
78
+ public static create(props: ClassProperties<Metadata>): Metadata {
79
+ return new Metadata(props);
80
+ }
81
+
82
+ /**
83
+ * @internal
84
+ */
85
+ public static initialize(parentResolved: boolean = false): Metadata {
86
+ const meta: Metadata = Metadata.create({
87
+ any: false,
88
+ nullable: false,
89
+ required: true,
90
+ optional: false,
91
+
92
+ escaped: null,
93
+ constants: [],
94
+ atomics: [],
95
+ templates: [],
96
+ arrays: [],
97
+ tuples: [],
98
+ objects: [],
99
+ aliases: [],
100
+ functions: [],
101
+
102
+ rest: null,
103
+ natives: [],
104
+ sets: [],
105
+ maps: [],
106
+ });
107
+ meta.parent_resolved_ = parentResolved;
108
+ return meta;
109
+ }
110
+
111
+ public toJSON(): IMetadata {
112
+ return {
113
+ any: this.any,
114
+ required: this.required,
115
+ optional: this.optional,
116
+ nullable: this.nullable,
117
+ functions: this.functions.map((f) => f.toJSON()),
118
+
119
+ atomics: this.atomics.map((a) => a.toJSON()),
120
+ constants: this.constants.map((c) => c.toJSON()),
121
+ templates: this.templates.map((tpl) => tpl.toJSON()),
122
+ escaped: this.escaped ? this.escaped.toJSON() : null,
123
+
124
+ rest: this.rest ? this.rest.toJSON() : null,
125
+ arrays: this.arrays.map((array) => ({
126
+ name: array.type.name,
127
+ tags: array.tags.map((r) => r.slice()),
128
+ })),
129
+ tuples: this.tuples.map((tuple) => ({
130
+ name: tuple.type.name,
131
+ tags: tuple.tags.map((r) => r.slice()),
132
+ })),
133
+ objects: this.objects.map((obj) => obj.name),
134
+ aliases: this.aliases.map((alias) => alias.name),
135
+
136
+ natives: this.natives.slice(),
137
+ sets: this.sets.map((meta) => meta.toJSON()),
138
+ maps: this.maps.map((entry) => ({
139
+ key: entry.key.toJSON(),
140
+ value: entry.value.toJSON(),
141
+ })),
142
+ };
143
+ }
144
+
145
+ public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
146
+ return Metadata.create({
147
+ any: meta.any,
148
+ required: meta.required,
149
+ optional: meta.optional,
150
+ nullable: meta.nullable,
151
+ functions: meta.functions.map((f) => MetadataFunction.from(f, dict)),
152
+
153
+ constants: meta.constants.map(MetadataConstant.from),
154
+ atomics: meta.atomics.map(MetadataAtomic.from),
155
+ templates: meta.templates.map((tpl) => MetadataTemplate.from(tpl, dict)),
156
+ escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
157
+
158
+ rest: meta.rest ? this.from(meta.rest, dict) : null,
159
+ arrays: meta.arrays.map((ref) => {
160
+ const type = dict.arrays.get(ref.name);
161
+ if (type === undefined)
162
+ throw new RangeError(
163
+ `Error on Metadata.from(): failed to find array "${ref.name}".`,
164
+ );
165
+ return MetadataArray.create({
166
+ type,
167
+ tags: ref.tags.map((row) => row.slice()),
168
+ });
169
+ }),
170
+ tuples: meta.tuples.map((t) => {
171
+ const type = dict.tuples.get(t.name);
172
+ if (type === undefined)
173
+ throw new RangeError(
174
+ `Error on Metadata.from(): failed to find tuple "${t.name}".`,
175
+ );
176
+ return MetadataTuple.create({
177
+ type,
178
+ tags: t.tags.map((r) => r.slice()),
179
+ });
180
+ }),
181
+ objects: meta.objects.map((name) => {
182
+ const found = dict.objects.get(name);
183
+ if (found === undefined)
184
+ throw new RangeError(
185
+ `Error on Metadata.from(): failed to find object "${name}".`,
186
+ );
187
+ return found;
188
+ }),
189
+ aliases: meta.aliases.map((alias) => {
190
+ const found = dict.aliases.get(alias);
191
+ if (found === undefined)
192
+ throw new RangeError(
193
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
194
+ );
195
+ return found;
196
+ }),
197
+
198
+ natives: meta.natives.slice(),
199
+ sets: meta.sets.map((meta) => this.from(meta, dict)),
200
+ maps: meta.maps.map((entry) => ({
201
+ key: this.from(entry.key, dict),
202
+ value: this.from(entry.value, dict),
203
+ })),
204
+ });
205
+ }
206
+
207
+ /* -----------------------------------------------------------
208
+ ACCESSORS
209
+ ----------------------------------------------------------- */
210
+ public getName(): string {
211
+ return (this.name_ ??= getName(this));
212
+ }
213
+
214
+ public empty(): boolean {
215
+ return this.bucket() === 0 || this.size() === 0;
216
+ }
217
+
218
+ public size(): number {
219
+ return (
220
+ (this.any ? 1 : 0) +
221
+ (this.escaped ? 1 : 0) +
222
+ (this.rest ? this.rest.size() : 0) +
223
+ this.templates.length +
224
+ this.atomics.length +
225
+ this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
226
+ this.arrays.length +
227
+ this.tuples.length +
228
+ this.natives.length +
229
+ this.maps.length +
230
+ this.sets.length +
231
+ this.objects.length +
232
+ this.functions.length +
233
+ this.aliases.length
234
+ );
235
+ }
236
+
237
+ public bucket(): number {
238
+ return (
239
+ (this.any ? 1 : 0) +
240
+ (this.escaped ? 1 : 0) +
241
+ (this.templates.length ? 1 : 0) +
242
+ (this.atomics.length ? 1 : 0) +
243
+ (this.constants.length ? 1 : 0) +
244
+ (this.rest ? this.rest.size() : 0) +
245
+ (this.arrays.length ? 1 : 0) +
246
+ (this.tuples.length ? 1 : 0) +
247
+ (this.natives.length ? 1 : 0) +
248
+ (this.sets.length ? 1 : 0) +
249
+ (this.maps.length ? 1 : 0) +
250
+ (this.objects.length ? 1 : 0) +
251
+ (this.functions.length ? 1 : 0) +
252
+ (this.aliases.length ? 1 : 0)
253
+ );
254
+ }
255
+
256
+ public isConstant(): boolean {
257
+ return this.bucket() === (this.constants.length ? 1 : 0);
258
+ }
259
+
260
+ public isRequired(): boolean {
261
+ return this.required === true && this.optional === false;
262
+ }
263
+
264
+ /**
265
+ * @internal
266
+ */
267
+ public isUnionBucket(): boolean {
268
+ const size: number = this.bucket();
269
+ const emended: number =
270
+ !!this.atomics.length && !!this.constants.length ? size - 1 : size;
271
+ return emended > 1;
272
+ }
273
+
274
+ /**
275
+ * @internal
276
+ */
277
+ public getSoleLiteral(): string | null {
278
+ if (
279
+ this.size() === 1 &&
280
+ this.constants.length === 1 &&
281
+ this.constants[0]!.type === "string" &&
282
+ this.constants[0]!.values.length === 1
283
+ )
284
+ return this.constants[0]!.values[0]!.value as string;
285
+ else return null;
286
+ }
287
+
288
+ public isSoleLiteral(): boolean {
289
+ return this.getSoleLiteral() !== null;
290
+ }
291
+
292
+ /**
293
+ * @internal
294
+ */
295
+ public isParentResolved(): boolean {
296
+ return this.parent_resolved_;
297
+ }
298
+ }
299
+ export namespace Metadata {
300
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
301
+ // CHECK ANY & OPTIONAL
302
+ if (x.any || y.any) return true;
303
+ if (x.isRequired() === false && false === y.isRequired()) return true;
304
+ if (x.nullable === true && true === y.nullable) return true;
305
+ if (!!x.functions.length && !!y.functions.length === true) return true;
306
+
307
+ //----
308
+ // INSTANCES
309
+ //----
310
+ // ARRAYS
311
+ if (x.arrays.length && y.arrays.length) return true;
312
+ if (x.tuples.length && y.tuples.length) return true;
313
+ if (x.objects.length && y.objects.length) return true;
314
+ if (x.aliases.length && y.aliases.length) return true;
315
+
316
+ // NATIVES
317
+ if (x.natives.length && y.natives.length)
318
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
319
+ return true;
320
+
321
+ // ESCAPED
322
+ if (x.escaped && y.escaped)
323
+ return (
324
+ intersects(x.escaped.original, y.escaped.original) ||
325
+ intersects(x.escaped.returns, y.escaped.returns)
326
+ );
327
+
328
+ //----
329
+ // VALUES
330
+ //----
331
+ // ATOMICS
332
+ for (const atomic of x.atomics) {
333
+ if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
334
+ if (y.constants.some((yc) => atomic.type === yc.type)) return true;
335
+ }
336
+
337
+ // CONSTANTS
338
+ for (const constant of x.constants) {
339
+ const atomic: MetadataAtomic | undefined = y.atomics.find(
340
+ (elem) => elem.type === constant.type,
341
+ );
342
+ if (atomic !== undefined) return true;
343
+
344
+ const opposite: MetadataConstant | undefined = y.constants.find(
345
+ (elem) => elem.type === constant.type,
346
+ );
347
+ if (opposite === undefined) continue;
348
+
349
+ const values: Set<any> = new Set([
350
+ ...constant.values.map((e) => e.value),
351
+ ...opposite.values.map((e) => e.value),
352
+ ]);
353
+ if (values.size !== constant.values.length + opposite.values.length)
354
+ return true;
355
+ }
356
+
357
+ // TEMPLATES
358
+ if (!!x.templates.length && y.atomics.some((ya) => ya.type === "string"))
359
+ return true;
360
+ else if (
361
+ !!y.templates.length &&
362
+ x.atomics.some((xa) => xa.type === "string")
363
+ )
364
+ return true;
365
+ return false;
366
+ };
367
+
368
+ export const covers = (
369
+ x: Metadata,
370
+ y: Metadata,
371
+ level: number = 0,
372
+ escaped: boolean = false,
373
+ ): boolean => {
374
+ // CHECK ANY
375
+ if (x === y) return false;
376
+ else if (x.any) return true;
377
+ else if (y.any) return false;
378
+
379
+ if (escaped === false) {
380
+ if (x.escaped === null && y.escaped !== null) return false;
381
+ else if (
382
+ x.escaped !== null &&
383
+ y.escaped !== null &&
384
+ (!covers(x.escaped.original, y.escaped.original, level, true) ||
385
+ !covers(x.escaped.returns, y.escaped.returns, level, true))
386
+ )
387
+ return false;
388
+ }
389
+
390
+ //----
391
+ // INSTANCES
392
+ //----
393
+ if (level === 0) {
394
+ // ARRAYS
395
+ for (const ya of y.arrays)
396
+ if (
397
+ !x.arrays.some((xa) =>
398
+ covers(xa.type.value, ya.type.value, level + 1),
399
+ )
400
+ ) {
401
+ return false;
402
+ }
403
+
404
+ // TUPLES
405
+ for (const yt of y.tuples)
406
+ if (
407
+ yt.type.elements.length !== 0 &&
408
+ x.tuples.some(
409
+ (xt) =>
410
+ xt.type.elements.length >= yt.type.elements.length &&
411
+ xt.type.elements
412
+ .slice(yt.type.elements.length)
413
+ .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
414
+ ) === false
415
+ )
416
+ return false;
417
+ }
418
+
419
+ // OBJECTS
420
+ for (const yo of y.objects)
421
+ if (x.objects.some((xo) => MetadataObject.covers(xo, yo)) === false)
422
+ return false;
423
+
424
+ // ALIASES
425
+ for (const yd of y.aliases)
426
+ if (x.aliases.some((xd) => xd.name === yd.name) === false) return false;
427
+
428
+ // NATIVES
429
+ for (const yn of y.natives)
430
+ if (x.natives.some((xn) => xn === yn) === false) return false;
431
+
432
+ // SETS
433
+ for (const ys of y.sets)
434
+ if (x.sets.some((xs) => covers(xs, ys)) === false) return false;
435
+
436
+ //----
437
+ // VALUES
438
+ //----
439
+ // ATOMICS
440
+ if (
441
+ y.atomics.some(
442
+ (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
443
+ )
444
+ )
445
+ return false;
446
+
447
+ // CONSTANTS
448
+ for (const yc of y.constants) {
449
+ if (x.atomics.some((atom) => yc.type === atom.type)) continue;
450
+ const xc: MetadataConstant | undefined = x.constants.find(
451
+ (elem) => elem.type === yc.type,
452
+ );
453
+ if (xc === undefined) return false;
454
+ else if (
455
+ (yc.values.map((e) => e.value) as number[]).some(
456
+ (yv) => xc.values.includes(yv as never) === false,
457
+ )
458
+ )
459
+ return false;
460
+ }
461
+
462
+ // FUNCTIONAL
463
+ if (!!x.functions.length === false && !!y.functions.length) return false;
464
+
465
+ // SUCCESS
466
+ return true;
467
+ };
468
+
469
+ /**
470
+ * @internal
471
+ */
472
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
473
+ const output: Metadata = Metadata.create({
474
+ any: x.any || y.any,
475
+ nullable: x.nullable || y.nullable,
476
+ required: x.required && y.required,
477
+ optional: x.optional || y.optional,
478
+ functions: x.functions.length ? x.functions : y.functions, // @todo
479
+
480
+ escaped:
481
+ x.escaped !== null && y.escaped !== null
482
+ ? MetadataEscaped.create({
483
+ original: merge(x.escaped.original, y.escaped.original),
484
+ returns: merge(x.escaped.returns, y.escaped.returns),
485
+ })
486
+ : (x.escaped ?? y.escaped),
487
+ atomics: mergeTaggedTypes({
488
+ container: x.atomics,
489
+ equals: (x, y) => x.type === y.type,
490
+ getter: (x) => x.tags,
491
+ })(y.atomics),
492
+ constants: [...x.constants],
493
+ templates: x.templates.slice(),
494
+
495
+ rest:
496
+ x.rest !== null && y.rest !== null
497
+ ? merge(x.rest, y.rest)
498
+ : (x.rest ?? y.rest),
499
+ // arrays: x.arrays.slice(),
500
+ arrays: mergeTaggedTypes({
501
+ container: x.arrays,
502
+ equals: (x, y) => x.type.name === y.type.name,
503
+ getter: (x) => x.tags,
504
+ })(y.arrays),
505
+ tuples: mergeTaggedTypes({
506
+ container: x.tuples,
507
+ equals: (x, y) => x.type.name === y.type.name,
508
+ getter: (x) => x.tags,
509
+ })(y.tuples),
510
+ objects: x.objects.slice(),
511
+ aliases: x.aliases.slice(),
512
+
513
+ natives: [...new Set([...x.natives, ...y.natives])],
514
+ sets: x.sets.slice(),
515
+ maps: x.maps.slice(),
516
+ });
517
+ for (const constant of y.constants) {
518
+ const target: MetadataConstant = ArrayUtil.take(
519
+ output.constants,
520
+ (elem) => elem.type === constant.type,
521
+ () =>
522
+ MetadataConstant.create({
523
+ type: constant.type,
524
+ values: [],
525
+ }),
526
+ );
527
+ for (const value of constant.values)
528
+ ArrayUtil.add(target.values, value, (a, b) => a.value === b.value);
529
+ }
530
+ for (const obj of y.objects)
531
+ ArrayUtil.set(output.objects, obj, (elem) => elem.name);
532
+ for (const alias of y.aliases)
533
+ ArrayUtil.set(output.aliases, alias, (elem) => elem.name);
534
+
535
+ return output;
536
+ };
537
+ }
538
+
539
+ const getName = (metadata: Metadata): string => {
540
+ if (metadata.any === true) return "any";
541
+
542
+ const elements: string[] = [];
543
+
544
+ // OPTIONAL
545
+ if (metadata.nullable === true) elements.push("null");
546
+ if (metadata.isRequired() === false) elements.push("undefined");
547
+
548
+ // ATOMIC
549
+ for (const atom of metadata.atomics) {
550
+ elements.push(atom.getName());
551
+ }
552
+ for (const constant of metadata.constants)
553
+ for (const value of constant.values) elements.push(value.getName());
554
+ for (const template of metadata.templates) elements.push(template.getName());
555
+
556
+ // NATIVES
557
+ for (const native of metadata.natives) elements.push(native);
558
+ for (const set of metadata.sets) elements.push(`Set<${set.getName()}>`);
559
+ for (const map of metadata.maps)
560
+ elements.push(`Map<${map.key.getName()}, ${map.value.getName()}>`);
561
+
562
+ // INSTANCES
563
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
564
+ for (const tuple of metadata.tuples) elements.push(tuple.type.name);
565
+ for (const array of metadata.arrays) elements.push(array.getName());
566
+ for (const object of metadata.objects) elements.push(object.name);
567
+ for (const alias of metadata.aliases) elements.push(alias.name);
568
+ if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
569
+
570
+ // RETURNS
571
+ if (elements.length === 0) return "unknown";
572
+ else if (elements.length === 1) return elements[0]!;
573
+
574
+ elements.sort();
575
+ return `(${elements.join(" | ")})`;
576
+ };
577
+ export namespace Metadata {
578
+ export interface Entry {
579
+ key: Metadata;
580
+ value: Metadata;
581
+ }
582
+ }
583
+
584
+ const mergeTaggedTypes =
585
+ <T>(props: {
586
+ container: T[];
587
+ equals: (x: T, y: T) => boolean;
588
+ getter: (x: T) => IMetadataTypeTag[][];
589
+ }) =>
590
+ (opposite: T[]) => {
591
+ const output: T[] = [...props.container];
592
+ for (const elem of opposite) {
593
+ const equal = props.container.find((x) => props.equals(x, elem));
594
+ if (equal === undefined) {
595
+ output.push(elem);
596
+ continue;
597
+ }
598
+
599
+ const matrix: string[][] = props
600
+ .getter(equal)
601
+ .map((tags) => tags.map((t) => t.name))
602
+ .sort();
603
+ for (const tags of props.getter(elem)) {
604
+ const names: string[] = tags.map((t) => t.name).sort();
605
+ if (
606
+ matrix.some(
607
+ (m) =>
608
+ m.length === names.length && m.every((s, i) => s === names[i]),
609
+ )
610
+ )
611
+ continue;
612
+ props.getter(equal).push(tags);
613
+ }
614
+ }
615
+ return output;
616
+ };