typia 5.5.5 → 5.5.6-dev.20240319

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