typia 7.0.1 → 7.0.2-dev.20241205

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 (451) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +123 -122
  3. package/lib/executable/TypiaPatchWizard.js +10 -6
  4. package/lib/executable/TypiaPatchWizard.js.map +1 -1
  5. package/lib/executable/typia.js +17 -7
  6. package/lib/executable/typia.js.map +1 -1
  7. package/lib/factories/internal/metadata/iterate_metadata_native.js +9 -6
  8. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -1
  9. package/lib/index.js +17 -7
  10. package/lib/index.js.map +1 -1
  11. package/lib/module.js +17 -7
  12. package/lib/module.js.map +1 -1
  13. package/lib/programmers/json/JsonAssertParseProgrammer.js +7 -0
  14. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  15. package/package.json +5 -5
  16. package/src/IRandomGenerator.ts +49 -49
  17. package/src/IReadableURLSearchParams.ts +9 -9
  18. package/src/IValidation.ts +20 -20
  19. package/src/executable/TypiaGenerateWizard.ts +83 -83
  20. package/src/executable/TypiaPatchWizard.ts +45 -42
  21. package/src/executable/TypiaSetupWizard.ts +179 -179
  22. package/src/executable/setup/ArgumentParser.ts +42 -42
  23. package/src/executable/setup/FileRetriever.ts +19 -19
  24. package/src/executable/setup/PackageManager.ts +87 -87
  25. package/src/factories/ExpressionFactory.ts +216 -216
  26. package/src/factories/IdentifierFactory.ts +89 -89
  27. package/src/factories/JsonMetadataFactory.ts +76 -76
  28. package/src/factories/LiteralFactory.ts +50 -50
  29. package/src/factories/MetadataCollection.ts +278 -278
  30. package/src/factories/MetadataCommentTagFactory.ts +650 -650
  31. package/src/factories/MetadataFactory.ts +404 -404
  32. package/src/factories/MetadataTypeTagFactory.ts +411 -411
  33. package/src/factories/MetadataTypeTagSchemaFactory.ts +82 -82
  34. package/src/factories/NumericRangeFactory.ts +72 -72
  35. package/src/factories/ProtobufFactory.ts +875 -875
  36. package/src/factories/StatementFactory.ts +90 -90
  37. package/src/factories/TemplateFactory.ts +64 -64
  38. package/src/factories/TypeFactory.ts +140 -140
  39. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +17 -17
  40. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  41. package/src/factories/internal/metadata/emplace_metadata_alias.ts +33 -33
  42. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +39 -39
  43. package/src/factories/internal/metadata/emplace_metadata_object.ts +208 -208
  44. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  45. package/src/factories/internal/metadata/explore_metadata.ts +31 -31
  46. package/src/factories/internal/metadata/iterate_metadata.ts +54 -54
  47. package/src/factories/internal/metadata/iterate_metadata_alias.ts +33 -33
  48. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  49. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  50. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  51. package/src/factories/internal/metadata/iterate_metadata_collection.ts +146 -146
  52. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +32 -32
  53. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  54. package/src/factories/internal/metadata/iterate_metadata_escape.ts +49 -49
  55. package/src/factories/internal/metadata/iterate_metadata_function.ts +90 -90
  56. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  57. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  58. package/src/factories/internal/metadata/iterate_metadata_native.ts +255 -254
  59. package/src/factories/internal/metadata/iterate_metadata_object.ts +35 -35
  60. package/src/factories/internal/metadata/iterate_metadata_set.ts +57 -57
  61. package/src/factories/internal/metadata/iterate_metadata_sort.ts +87 -87
  62. package/src/factories/internal/metadata/iterate_metadata_template.ts +41 -41
  63. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +26 -26
  64. package/src/factories/internal/metadata/iterate_metadata_union.ts +19 -19
  65. package/src/functional.ts +750 -750
  66. package/src/http.ts +1047 -1047
  67. package/src/internal/_IProtobufWriter.ts +18 -18
  68. package/src/internal/_ProtobufReader.ts +194 -194
  69. package/src/internal/_ProtobufSizer.ts +145 -145
  70. package/src/internal/_ProtobufWriter.ts +145 -145
  71. package/src/internal/_accessExpressionAsString.ts +46 -46
  72. package/src/internal/_assertGuard.ts +13 -13
  73. package/src/internal/_functionalTypeGuardErrorFactory.ts +4 -4
  74. package/src/internal/_httpFormDataReadArray.ts +4 -4
  75. package/src/internal/_httpFormDataReadBigint.ts +18 -18
  76. package/src/internal/_httpFormDataReadBlob.ts +10 -10
  77. package/src/internal/_httpFormDataReadBoolean.ts +16 -16
  78. package/src/internal/_httpFormDataReadFile.ts +10 -10
  79. package/src/internal/_httpFormDataReadNumber.ts +15 -15
  80. package/src/internal/_httpFormDataReadString.ts +10 -10
  81. package/src/internal/_httpHeaderReadBigint.ts +10 -10
  82. package/src/internal/_httpHeaderReadBoolean.ts +8 -8
  83. package/src/internal/_httpHeaderReadNumber.ts +7 -7
  84. package/src/internal/_httpParameterReadBigint.ts +10 -10
  85. package/src/internal/_httpParameterReadBoolean.ts +8 -8
  86. package/src/internal/_httpParameterReadNumber.ts +7 -7
  87. package/src/internal/_httpParameterReadString.ts +2 -2
  88. package/src/internal/_httpQueryParseURLSearchParams.ts +12 -12
  89. package/src/internal/_httpQueryReadArray.ts +4 -4
  90. package/src/internal/_httpQueryReadBigint.ts +12 -12
  91. package/src/internal/_httpQueryReadBoolean.ts +14 -14
  92. package/src/internal/_httpQueryReadNumber.ts +9 -9
  93. package/src/internal/_httpQueryReadString.ts +4 -4
  94. package/src/internal/_isBetween.ts +2 -2
  95. package/src/internal/_isBigintString.ts +8 -8
  96. package/src/internal/_isFormatByte.ts +7 -7
  97. package/src/internal/_isFormatDate.ts +3 -3
  98. package/src/internal/_isFormatDateTime.ts +4 -4
  99. package/src/internal/_isFormatDuration.ts +4 -4
  100. package/src/internal/_isFormatEmail.ts +4 -4
  101. package/src/internal/_isFormatHostname.ts +4 -4
  102. package/src/internal/_isFormatIdnEmail.ts +4 -4
  103. package/src/internal/_isFormatIdnHostname.ts +4 -4
  104. package/src/internal/_isFormatIpv4.ts +4 -4
  105. package/src/internal/_isFormatIpv6.ts +4 -4
  106. package/src/internal/_isFormatIri.ts +3 -3
  107. package/src/internal/_isFormatIriReference.ts +4 -4
  108. package/src/internal/_isFormatJsonPointer.ts +3 -3
  109. package/src/internal/_isFormatPassword.ts +1 -1
  110. package/src/internal/_isFormatRegex.ts +8 -8
  111. package/src/internal/_isFormatRelativeJsonPointer.ts +4 -4
  112. package/src/internal/_isFormatTime.ts +4 -4
  113. package/src/internal/_isFormatUri.ts +6 -6
  114. package/src/internal/_isFormatUriReference.ts +5 -5
  115. package/src/internal/_isFormatUriTemplate.ts +4 -4
  116. package/src/internal/_isFormatUrl.ts +4 -4
  117. package/src/internal/_isFormatUuid.ts +3 -3
  118. package/src/internal/_isTypeFloat.ts +5 -5
  119. package/src/internal/_isTypeInt32.ts +5 -5
  120. package/src/internal/_isTypeInt64.ts +5 -5
  121. package/src/internal/_isTypeUint32.ts +5 -5
  122. package/src/internal/_isTypeUint64.ts +5 -5
  123. package/src/internal/_isUniqueItems.ts +159 -159
  124. package/src/internal/_jsonStringifyNumber.ts +12 -12
  125. package/src/internal/_jsonStringifyRest.ts +3 -3
  126. package/src/internal/_jsonStringifyString.ts +42 -42
  127. package/src/internal/_jsonStringifyTail.ts +2 -2
  128. package/src/internal/_llmApplicationFinalize.ts +20 -20
  129. package/src/internal/_miscCloneAny.ts +46 -46
  130. package/src/internal/_notationAny.ts +37 -37
  131. package/src/internal/_notationCamel.ts +13 -13
  132. package/src/internal/_notationPascal.ts +8 -8
  133. package/src/internal/_notationSnake.ts +43 -43
  134. package/src/internal/_randomArray.ts +21 -21
  135. package/src/internal/_randomBigint.ts +6 -6
  136. package/src/internal/_randomBoolean.ts +1 -1
  137. package/src/internal/_randomFormatByte.ts +3 -3
  138. package/src/internal/_randomFormatDate.ts +18 -18
  139. package/src/internal/_randomFormatDatetime.ts +16 -16
  140. package/src/internal/_randomFormatDuration.ts +27 -27
  141. package/src/internal/_randomFormatEmail.ts +11 -11
  142. package/src/internal/_randomFormatHostname.ts +6 -6
  143. package/src/internal/_randomFormatIdnEmail.ts +3 -3
  144. package/src/internal/_randomFormatIdnHostname.ts +3 -3
  145. package/src/internal/_randomFormatIpv4.ts +11 -11
  146. package/src/internal/_randomFormatIpv6.ts +11 -11
  147. package/src/internal/_randomFormatIri.ts +3 -3
  148. package/src/internal/_randomFormatIriReference.ts +3 -3
  149. package/src/internal/_randomFormatJsonPointer.ts +7 -7
  150. package/src/internal/_randomFormatPassword.ts +8 -8
  151. package/src/internal/_randomFormatRegex.ts +4 -4
  152. package/src/internal/_randomFormatRelativeJsonPointer.ts +8 -8
  153. package/src/internal/_randomFormatTime.ts +14 -14
  154. package/src/internal/_randomFormatUri.ts +3 -3
  155. package/src/internal/_randomFormatUriReference.ts +3 -3
  156. package/src/internal/_randomFormatUriTemplate.ts +3 -3
  157. package/src/internal/_randomFormatUrl.ts +11 -11
  158. package/src/internal/_randomFormatUuid.ts +6 -6
  159. package/src/internal/_randomInteger.ts +47 -47
  160. package/src/internal/_randomNumber.ts +74 -74
  161. package/src/internal/_randomPattern.ts +10 -10
  162. package/src/internal/_randomPick.ts +9 -9
  163. package/src/internal/_randomString.ts +24 -24
  164. package/src/internal/_throwTypeGuardError.ts +5 -5
  165. package/src/internal/_validateReport.ts +13 -13
  166. package/src/internal/private/__notationCapitalize.ts +2 -2
  167. package/src/internal/private/__notationUnsnake.ts +24 -24
  168. package/src/json.ts +752 -752
  169. package/src/llm.ts +342 -342
  170. package/src/misc.ts +658 -658
  171. package/src/module.ts +935 -935
  172. package/src/notations.ts +827 -827
  173. package/src/programmers/AssertProgrammer.ts +454 -454
  174. package/src/programmers/CheckerProgrammer.ts +1617 -1617
  175. package/src/programmers/FeatureProgrammer.ts +622 -622
  176. package/src/programmers/ImportProgrammer.ts +185 -185
  177. package/src/programmers/IsProgrammer.ts +273 -273
  178. package/src/programmers/RandomProgrammer.ts +1190 -1190
  179. package/src/programmers/TypiaProgrammer.ts +174 -174
  180. package/src/programmers/ValidateProgrammer.ts +434 -434
  181. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +153 -153
  182. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +125 -125
  183. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +115 -115
  184. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  185. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +113 -113
  186. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +116 -116
  187. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +119 -119
  188. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +274 -274
  189. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +135 -135
  190. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  191. package/src/programmers/helpers/AtomicPredicator.ts +35 -35
  192. package/src/programmers/helpers/CloneJoiner.ts +143 -143
  193. package/src/programmers/helpers/FunctionProgrammer.ts +67 -67
  194. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  195. package/src/programmers/helpers/NotationJoiner.ts +144 -144
  196. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  197. package/src/programmers/helpers/ProtobufUtil.ts +228 -228
  198. package/src/programmers/helpers/PruneJoiner.ts +148 -148
  199. package/src/programmers/helpers/RandomJoiner.ts +168 -168
  200. package/src/programmers/helpers/StringifyJoinder.ts +115 -115
  201. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  202. package/src/programmers/helpers/UnionExplorer.ts +372 -372
  203. package/src/programmers/helpers/UnionPredicator.ts +79 -79
  204. package/src/programmers/helpers/disable_function_programmer_declare.ts +32 -32
  205. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -99
  206. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -99
  207. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -105
  208. package/src/programmers/http/HttpFormDataProgrammer.ts +308 -308
  209. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -400
  210. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  211. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  212. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  213. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  214. package/src/programmers/http/HttpQueryProgrammer.ts +336 -336
  215. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -92
  216. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -92
  217. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -98
  218. package/src/programmers/internal/check_array_length.ts +47 -47
  219. package/src/programmers/internal/check_bigint.ts +50 -50
  220. package/src/programmers/internal/check_dynamic_key.ts +201 -201
  221. package/src/programmers/internal/check_dynamic_properties.ts +208 -208
  222. package/src/programmers/internal/check_everything.ts +23 -23
  223. package/src/programmers/internal/check_native.ts +27 -27
  224. package/src/programmers/internal/check_number.ts +112 -112
  225. package/src/programmers/internal/check_object.ts +75 -75
  226. package/src/programmers/internal/check_string.ts +50 -50
  227. package/src/programmers/internal/check_template.ts +48 -48
  228. package/src/programmers/internal/check_union_array_like.ts +335 -335
  229. package/src/programmers/internal/decode_union_object.ts +116 -116
  230. package/src/programmers/internal/feature_object_entries.ts +61 -61
  231. package/src/programmers/internal/json_schema_alias.ts +47 -47
  232. package/src/programmers/internal/json_schema_array.ts +45 -45
  233. package/src/programmers/internal/json_schema_bigint.ts +15 -15
  234. package/src/programmers/internal/json_schema_boolean.ts +15 -15
  235. package/src/programmers/internal/json_schema_constant.ts +26 -26
  236. package/src/programmers/internal/json_schema_description.ts +12 -12
  237. package/src/programmers/internal/json_schema_discriminator.ts +35 -35
  238. package/src/programmers/internal/json_schema_escaped.ts +82 -82
  239. package/src/programmers/internal/json_schema_native.ts +33 -33
  240. package/src/programmers/internal/json_schema_number.ts +15 -15
  241. package/src/programmers/internal/json_schema_object.ts +158 -158
  242. package/src/programmers/internal/json_schema_plugin.ts +18 -18
  243. package/src/programmers/internal/json_schema_station.ts +182 -182
  244. package/src/programmers/internal/json_schema_string.ts +15 -15
  245. package/src/programmers/internal/json_schema_template.ts +55 -55
  246. package/src/programmers/internal/json_schema_title.ts +20 -20
  247. package/src/programmers/internal/json_schema_tuple.ts +35 -35
  248. package/src/programmers/internal/metadata_to_pattern.ts +42 -42
  249. package/src/programmers/internal/postfix_of_tuple.ts +5 -5
  250. package/src/programmers/internal/prune_object_properties.ts +71 -71
  251. package/src/programmers/internal/stringify_dynamic_properties.ts +162 -162
  252. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  253. package/src/programmers/internal/template_to_pattern.ts +23 -23
  254. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +23 -23
  255. package/src/programmers/json/JsonApplicationProgrammer.ts +276 -276
  256. package/src/programmers/json/JsonAssertParseProgrammer.ts +113 -106
  257. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -115
  258. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -114
  259. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  260. package/src/programmers/json/JsonSchemasProgrammer.ts +91 -91
  261. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  262. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -105
  263. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -124
  264. package/src/programmers/llm/LlmApplicationProgrammer.ts +276 -276
  265. package/src/programmers/llm/LlmModelPredicator.ts +127 -127
  266. package/src/programmers/llm/LlmParametersProgrammer.ts +90 -90
  267. package/src/programmers/llm/LlmSchemaProgrammer.ts +143 -143
  268. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -95
  269. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -116
  270. package/src/programmers/misc/MiscCloneProgrammer.ts +1032 -1032
  271. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  272. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  273. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  274. package/src/programmers/misc/MiscPruneProgrammer.ts +728 -728
  275. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -111
  276. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -113
  277. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -101
  278. package/src/programmers/notations/NotationGeneralProgrammer.ts +984 -984
  279. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  280. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -119
  281. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -98
  282. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -102
  283. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +654 -654
  284. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +945 -945
  285. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  286. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  287. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +179 -179
  288. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -92
  289. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -119
  290. package/src/protobuf.ts +868 -868
  291. package/src/reflect.ts +57 -57
  292. package/src/schemas/json/IJsonApplication.ts +73 -73
  293. package/src/schemas/json/IJsonSchemaCollection.ts +29 -29
  294. package/src/schemas/json/__IJsonApplication.ts +63 -63
  295. package/src/schemas/metadata/IMetadata.ts +35 -35
  296. package/src/schemas/metadata/IMetadataAlias.ts +6 -6
  297. package/src/schemas/metadata/IMetadataAliasType.ts +12 -12
  298. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  299. package/src/schemas/metadata/IMetadataArray.ts +6 -6
  300. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  301. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  302. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  303. package/src/schemas/metadata/IMetadataMap.ts +8 -8
  304. package/src/schemas/metadata/IMetadataNative.ts +6 -6
  305. package/src/schemas/metadata/IMetadataObject.ts +6 -6
  306. package/src/schemas/metadata/IMetadataObjectType.ts +13 -13
  307. package/src/schemas/metadata/IMetadataSet.ts +7 -7
  308. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  309. package/src/schemas/metadata/IMetadataTuple.ts +6 -6
  310. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  311. package/src/schemas/metadata/Metadata.ts +669 -669
  312. package/src/schemas/metadata/MetadataAlias.ts +46 -46
  313. package/src/schemas/metadata/MetadataAliasType.ts +63 -63
  314. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  315. package/src/schemas/metadata/MetadataArray.ts +49 -49
  316. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  317. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  318. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  319. package/src/schemas/metadata/MetadataMap.ts +48 -48
  320. package/src/schemas/metadata/MetadataNative.ts +44 -44
  321. package/src/schemas/metadata/MetadataObject.ts +48 -48
  322. package/src/schemas/metadata/MetadataObjectType.ts +149 -149
  323. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  324. package/src/schemas/metadata/MetadataSet.ts +45 -45
  325. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  326. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  327. package/src/schemas/protobuf/IProtobufProperty.ts +6 -6
  328. package/src/schemas/protobuf/IProtobufPropertyType.ts +37 -37
  329. package/src/schemas/protobuf/IProtobufSchema.ts +50 -50
  330. package/src/tags/Example.ts +24 -24
  331. package/src/tags/Examples.ts +16 -16
  332. package/src/tags/Format.ts +50 -50
  333. package/src/tags/JsonSchemaPlugin.ts +8 -8
  334. package/src/tags/Sequence.ts +10 -10
  335. package/src/tags/TagBase.ts +82 -82
  336. package/src/tags/Type.ts +32 -32
  337. package/src/tags/UniqueItems.ts +14 -14
  338. package/src/tags/index.ts +21 -21
  339. package/src/transform.ts +35 -35
  340. package/src/transformers/CallExpressionTransformer.ts +545 -545
  341. package/src/transformers/FileTransformer.ts +136 -136
  342. package/src/transformers/IProgrammerProps.ts +11 -11
  343. package/src/transformers/ITransformOptions.ts +62 -62
  344. package/src/transformers/ITransformProps.ts +9 -9
  345. package/src/transformers/ITypiaContext.ts +18 -18
  346. package/src/transformers/ImportTransformer.ts +81 -81
  347. package/src/transformers/NodeTransformer.ts +17 -17
  348. package/src/transformers/TransformerError.ts +60 -60
  349. package/src/transformers/features/AssertTransformer.ts +24 -24
  350. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  351. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  352. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  353. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  354. package/src/transformers/features/IsTransformer.ts +18 -18
  355. package/src/transformers/features/RandomTransformer.ts +41 -41
  356. package/src/transformers/features/ValidateTransformer.ts +18 -18
  357. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  358. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  359. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  360. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  361. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  362. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  363. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  364. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  365. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  366. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  367. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  368. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  369. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  370. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  371. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  372. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  373. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  374. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  375. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  376. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  377. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  378. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  379. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  380. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  381. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  382. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  383. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  384. package/src/transformers/features/json/JsonApplicationTransformer.ts +105 -105
  385. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  386. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  387. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  388. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  389. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  390. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  391. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  392. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  393. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  394. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  395. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  396. package/src/transformers/features/json/JsonSchemasTransformer.ts +143 -143
  397. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  398. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  399. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  400. package/src/transformers/features/llm/LlmApplicationTransformer.ts +113 -113
  401. package/src/transformers/features/llm/LlmParametersTransformer.ts +89 -89
  402. package/src/transformers/features/llm/LlmSchemaTransformer.ts +130 -130
  403. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  404. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  405. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  406. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  407. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  408. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  409. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  410. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  411. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  412. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  413. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  414. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  415. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  416. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  417. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  418. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  419. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  420. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  421. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  422. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  423. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  424. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  425. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  426. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  427. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  428. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  429. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  430. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  431. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  432. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  433. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  434. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  435. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  436. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  437. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  438. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  439. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  440. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  441. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  442. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  443. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  444. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  445. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  446. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  447. package/src/transformers/internal/GenericTransformer.ts +101 -101
  448. package/src/utils/MapUtil.ts +14 -14
  449. package/src/utils/NamingConvention.ts +94 -94
  450. package/src/utils/ProtobufNameEncoder.ts +32 -32
  451. package/src/utils/StringUtil.ts +16 -16
@@ -1,669 +1,669 @@
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 { MetadataMap } from "./MetadataMap";
15
- import { MetadataNative } from "./MetadataNative";
16
- import { MetadataObject } from "./MetadataObject";
17
- import { MetadataObjectType } from "./MetadataObjectType";
18
- import { MetadataSet } from "./MetadataSet";
19
- import { MetadataTemplate } from "./MetadataTemplate";
20
- import { MetadataTuple } from "./MetadataTuple";
21
-
22
- export class Metadata {
23
- public any: boolean;
24
- public required: boolean;
25
- public optional: boolean;
26
- public nullable: boolean;
27
-
28
- public escaped: MetadataEscaped | null;
29
- public atomics: MetadataAtomic[];
30
- public constants: MetadataConstant[];
31
- public templates: MetadataTemplate[];
32
-
33
- public rest: Metadata | null;
34
- public aliases: MetadataAlias[];
35
- public arrays: MetadataArray[];
36
- public tuples: MetadataTuple[];
37
- public objects: MetadataObject[];
38
- public functions: MetadataFunction[];
39
-
40
- public natives: MetadataNative[];
41
- public sets: MetadataSet[];
42
- public maps: MetadataMap[];
43
-
44
- /** @internal */ private name_?: string;
45
- /** @internal */ private parent_resolved_: boolean = false;
46
- /** @internal */ public union_index?: number;
47
- /** @internal */ public fixed_?: number | null;
48
- /** @internal */ public boolean_literal_intersected_?: boolean;
49
- /** @internal */ private is_sequence_?: boolean;
50
-
51
- /* -----------------------------------------------------------
52
- CONSTRUCTORS
53
- ----------------------------------------------------------- */
54
- /**
55
- * @hidden
56
- */
57
- private constructor(props: ClassProperties<Metadata>) {
58
- this.any = props.any;
59
- this.required = props.required;
60
- this.optional = props.optional;
61
- this.nullable = props.nullable;
62
- this.functions = props.functions;
63
-
64
- this.escaped = props.escaped;
65
- this.atomics = props.atomics;
66
- this.constants = props.constants;
67
- this.templates = props.templates;
68
-
69
- this.rest = props.rest;
70
- this.arrays = props.arrays;
71
- this.tuples = props.tuples;
72
- this.objects = props.objects;
73
- this.aliases = props.aliases;
74
-
75
- this.natives = props.natives;
76
- this.sets = props.sets;
77
- this.maps = props.maps;
78
- }
79
-
80
- /**
81
- * @internal
82
- */
83
- public static create(props: ClassProperties<Metadata>): Metadata {
84
- return new Metadata(props);
85
- }
86
-
87
- /**
88
- * @internal
89
- */
90
- public static initialize(parentResolved: boolean = false): Metadata {
91
- const meta: Metadata = Metadata.create({
92
- any: false,
93
- nullable: false,
94
- required: true,
95
- optional: false,
96
-
97
- escaped: null,
98
- constants: [],
99
- atomics: [],
100
- templates: [],
101
- arrays: [],
102
- tuples: [],
103
- objects: [],
104
- aliases: [],
105
- functions: [],
106
-
107
- rest: null,
108
- natives: [],
109
- sets: [],
110
- maps: [],
111
- });
112
- meta.parent_resolved_ = parentResolved;
113
- return meta;
114
- }
115
-
116
- public toJSON(): IMetadata {
117
- return {
118
- any: this.any,
119
- required: this.required,
120
- optional: this.optional,
121
- nullable: this.nullable,
122
- functions: this.functions.map((f) => f.toJSON()),
123
-
124
- atomics: this.atomics.map((a) => a.toJSON()),
125
- constants: this.constants.map((c) => c.toJSON()),
126
- templates: this.templates.map((tpl) => tpl.toJSON()),
127
- escaped: this.escaped ? this.escaped.toJSON() : null,
128
-
129
- rest: this.rest ? this.rest.toJSON() : null,
130
- arrays: this.arrays.map((array) => array.toJSON()),
131
- tuples: this.tuples.map((tuple) => tuple.toJSON()),
132
- objects: this.objects.map((obj) => obj.toJSON()),
133
- aliases: this.aliases.map((alias) => alias.toJSON()),
134
-
135
- natives: this.natives.map((native) => native.toJSON()),
136
- sets: this.sets.map((set) => set.toJSON()),
137
- maps: this.maps.map((map) => map.toJSON()),
138
- };
139
- }
140
-
141
- public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
142
- return Metadata.create({
143
- any: meta.any,
144
- required: meta.required,
145
- optional: meta.optional,
146
- nullable: meta.nullable,
147
- functions: meta.functions.map((f) => MetadataFunction.from(f, dict)),
148
-
149
- constants: meta.constants.map(MetadataConstant.from),
150
- atomics: meta.atomics.map(MetadataAtomic.from),
151
- templates: meta.templates.map((tpl) => MetadataTemplate.from(tpl, dict)),
152
- escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
153
-
154
- rest: meta.rest ? this.from(meta.rest, dict) : null,
155
- arrays: meta.arrays.map((ref) => {
156
- const type = dict.arrays.get(ref.name);
157
- if (type === undefined)
158
- throw new RangeError(
159
- `Error on Metadata.from(): failed to find array "${ref.name}".`,
160
- );
161
- return MetadataArray.create({
162
- type,
163
- tags: ref.tags.map((row) => row.slice()),
164
- });
165
- }),
166
- tuples: meta.tuples.map((t) => {
167
- const type = dict.tuples.get(t.name);
168
- if (type === undefined)
169
- throw new RangeError(
170
- `Error on Metadata.from(): failed to find tuple "${t.name}".`,
171
- );
172
- return MetadataTuple.create({
173
- type,
174
- tags: t.tags.map((r) => r.slice()),
175
- });
176
- }),
177
- objects: meta.objects.map((obj) => {
178
- const found = dict.objects.get(obj.name);
179
- if (found === undefined)
180
- throw new RangeError(
181
- `Error on Metadata.from(): failed to find object "${name}".`,
182
- );
183
- return MetadataObject.create({
184
- type: found,
185
- tags: obj.tags.map((r) => r.slice()),
186
- });
187
- }),
188
- aliases: meta.aliases.map((alias) => {
189
- const type = dict.aliases.get(alias.name);
190
- if (type === undefined)
191
- throw new RangeError(
192
- `Error on Metadata.from(): failed to find alias "${alias}".`,
193
- );
194
- return MetadataAlias.create({
195
- type,
196
- tags: alias.tags.map((r) => r.slice()),
197
- });
198
- }),
199
- natives: meta.natives.map((native) => MetadataNative.create(native)),
200
- sets: meta.sets.map((set) =>
201
- MetadataSet.create({
202
- value: Metadata.from(set.value, dict),
203
- tags: set.tags.map((r) => r.slice()),
204
- }),
205
- ),
206
- maps: meta.maps.map((map) =>
207
- MetadataMap.create({
208
- key: this.from(map.key, dict),
209
- value: this.from(map.value, dict),
210
- tags: map.tags.map((r) => r.slice()),
211
- }),
212
- ),
213
- });
214
- }
215
-
216
- /* -----------------------------------------------------------
217
- ACCESSORS
218
- ----------------------------------------------------------- */
219
- public getName(): string {
220
- return (this.name_ ??= getName(this));
221
- }
222
-
223
- public empty(): boolean {
224
- return this.bucket() === 0 || this.size() === 0;
225
- }
226
-
227
- public size(): number {
228
- return (
229
- (this.any ? 1 : 0) +
230
- (this.escaped ? 1 : 0) +
231
- (this.rest ? this.rest.size() : 0) +
232
- this.templates.length +
233
- this.atomics.length +
234
- this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
235
- this.arrays.length +
236
- this.tuples.length +
237
- this.natives.length +
238
- this.maps.length +
239
- this.sets.length +
240
- this.objects.length +
241
- this.functions.length +
242
- this.aliases.length
243
- );
244
- }
245
-
246
- public bucket(): number {
247
- return (
248
- (this.any ? 1 : 0) +
249
- (this.escaped ? 1 : 0) +
250
- (this.templates.length ? 1 : 0) +
251
- (this.atomics.length ? 1 : 0) +
252
- (this.constants.length ? 1 : 0) +
253
- (this.rest ? this.rest.size() : 0) +
254
- (this.arrays.length ? 1 : 0) +
255
- (this.tuples.length ? 1 : 0) +
256
- (this.natives.length ? 1 : 0) +
257
- (this.sets.length ? 1 : 0) +
258
- (this.maps.length ? 1 : 0) +
259
- (this.objects.length ? 1 : 0) +
260
- (this.functions.length ? 1 : 0) +
261
- (this.aliases.length ? 1 : 0)
262
- );
263
- }
264
-
265
- /**
266
- * @internal
267
- */
268
- public isSequence(): boolean {
269
- return (this.is_sequence_ ??= (() => {
270
- const exists = (tags: IMetadataTypeTag[][]): boolean =>
271
- tags.some((row) => {
272
- const sequence = row.find(
273
- (t) =>
274
- t.kind === "sequence" &&
275
- typeof (t.schema as any)?.["x-protobuf-sequence"] === "number",
276
- );
277
- if (sequence === undefined) return false;
278
- const value: number = Number(
279
- (sequence.schema as any)["x-protobuf-sequence"],
280
- );
281
- return !Number.isNaN(value);
282
- });
283
- return (
284
- this.atomics.some((atomic) => exists(atomic.tags)) &&
285
- this.constants.some((c) =>
286
- c.values.some((v) => exists(v.tags ?? [])),
287
- ) &&
288
- this.templates.some((tpl) => exists(tpl.tags)) &&
289
- this.arrays.some((array) => exists(array.tags)) &&
290
- this.objects.some((object) => exists(object.tags)) &&
291
- this.natives.some(
292
- (native) => native.name === "Uint8Array" && exists(native.tags),
293
- )
294
- );
295
- })());
296
- }
297
-
298
- public isConstant(): boolean {
299
- return this.bucket() === (this.constants.length ? 1 : 0);
300
- }
301
-
302
- public isRequired(): boolean {
303
- return this.required === true && this.optional === false;
304
- }
305
-
306
- /**
307
- * @internal
308
- */
309
- public isUnionBucket(): boolean {
310
- const size: number = this.bucket();
311
- const emended: number =
312
- !!this.atomics.length && !!this.constants.length ? size - 1 : size;
313
- return emended > 1;
314
- }
315
-
316
- /**
317
- * @internal
318
- */
319
- public getSoleLiteral(): string | null {
320
- if (
321
- this.size() === 1 &&
322
- this.constants.length === 1 &&
323
- this.constants[0]!.type === "string" &&
324
- this.constants[0]!.values.length === 1
325
- )
326
- return this.constants[0]!.values[0]!.value as string;
327
- else return null;
328
- }
329
-
330
- public isSoleLiteral(): boolean {
331
- return this.getSoleLiteral() !== null;
332
- }
333
-
334
- /**
335
- * @internal
336
- */
337
- public isParentResolved(): boolean {
338
- return this.parent_resolved_;
339
- }
340
- }
341
- export namespace Metadata {
342
- export const intersects = (x: Metadata, y: Metadata): boolean => {
343
- // CHECK ANY & OPTIONAL
344
- if (x.any || y.any) return true;
345
- if (x.isRequired() === false && false === y.isRequired()) return true;
346
- if (x.nullable === true && true === y.nullable) return true;
347
- if (!!x.functions.length && !!y.functions.length === true) return true;
348
-
349
- //----
350
- // INSTANCES
351
- //----
352
- // ARRAYS
353
- if (x.arrays.length && y.arrays.length) return true;
354
- if (x.tuples.length && y.tuples.length) return true;
355
- if (x.objects.length && y.objects.length) return true;
356
- if (x.aliases.length && y.aliases.length) return true;
357
-
358
- // NATIVES
359
- if (x.natives.length && y.natives.length)
360
- if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
361
- return true;
362
-
363
- // ESCAPED
364
- if (x.escaped && y.escaped)
365
- return (
366
- intersects(x.escaped.original, y.escaped.original) ||
367
- intersects(x.escaped.returns, y.escaped.returns)
368
- );
369
-
370
- //----
371
- // VALUES
372
- //----
373
- // ATOMICS
374
- for (const atomic of x.atomics) {
375
- if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
376
- if (y.constants.some((yc) => atomic.type === yc.type)) return true;
377
- }
378
-
379
- // CONSTANTS
380
- for (const constant of x.constants) {
381
- const atomic: MetadataAtomic | undefined = y.atomics.find(
382
- (elem) => elem.type === constant.type,
383
- );
384
- if (atomic !== undefined) return true;
385
-
386
- const opposite: MetadataConstant | undefined = y.constants.find(
387
- (elem) => elem.type === constant.type,
388
- );
389
- if (opposite === undefined) continue;
390
-
391
- const values: Set<any> = new Set([
392
- ...constant.values.map((e) => e.value),
393
- ...opposite.values.map((e) => e.value),
394
- ]);
395
- if (values.size !== constant.values.length + opposite.values.length)
396
- return true;
397
- }
398
-
399
- // TEMPLATES
400
- if (!!x.templates.length && y.atomics.some((ya) => ya.type === "string"))
401
- return true;
402
- else if (
403
- !!y.templates.length &&
404
- x.atomics.some((xa) => xa.type === "string")
405
- )
406
- return true;
407
- return false;
408
- };
409
-
410
- export const covers = (
411
- x: Metadata,
412
- y: Metadata,
413
- level: number = 0,
414
- escaped: boolean = false,
415
- ): boolean => {
416
- // CHECK ANY
417
- if (x === y) return false;
418
- else if (x.any) return true;
419
- else if (y.any) return false;
420
-
421
- if (escaped === false) {
422
- if (x.escaped === null && y.escaped !== null) return false;
423
- else if (
424
- x.escaped !== null &&
425
- y.escaped !== null &&
426
- (!covers(x.escaped.original, y.escaped.original, level, true) ||
427
- !covers(x.escaped.returns, y.escaped.returns, level, true))
428
- )
429
- return false;
430
- }
431
-
432
- //----
433
- // INSTANCES
434
- //----
435
- if (level === 0) {
436
- // ARRAYS
437
- for (const ya of y.arrays)
438
- if (
439
- !x.arrays.some((xa) =>
440
- covers(xa.type.value, ya.type.value, level + 1),
441
- )
442
- ) {
443
- return false;
444
- }
445
-
446
- // TUPLES
447
- for (const yt of y.tuples)
448
- if (
449
- yt.type.elements.length !== 0 &&
450
- x.tuples.some(
451
- (xt) =>
452
- xt.type.elements.length >= yt.type.elements.length &&
453
- xt.type.elements
454
- .slice(yt.type.elements.length)
455
- .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
456
- ) === false
457
- )
458
- return false;
459
- }
460
-
461
- // OBJECTS
462
- for (const yo of y.objects)
463
- if (
464
- x.objects.some((xo) => MetadataObjectType.covers(xo.type, yo.type)) ===
465
- false
466
- )
467
- return false;
468
-
469
- // ALIASES
470
- for (const yd of y.aliases)
471
- if (x.aliases.some((xd) => xd.type.name === yd.type.name) === false)
472
- return false;
473
-
474
- // NATIVES
475
- for (const yn of y.natives)
476
- if (x.natives.some((xn) => xn === yn) === false) return false;
477
-
478
- // SETS
479
- for (const ys of y.sets)
480
- if (x.sets.some((xs) => covers(xs.value, ys.value)) === false)
481
- return false;
482
-
483
- //----
484
- // VALUES
485
- //----
486
- // ATOMICS
487
- if (
488
- y.atomics.some(
489
- (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
490
- )
491
- )
492
- return false;
493
-
494
- // CONSTANTS
495
- for (const yc of y.constants) {
496
- if (x.atomics.some((atom) => yc.type === atom.type)) continue;
497
- const xc: MetadataConstant | undefined = x.constants.find(
498
- (elem) => elem.type === yc.type,
499
- );
500
- if (xc === undefined) return false;
501
- else if (
502
- (yc.values.map((e) => e.value) as number[]).some(
503
- (yv) => xc.values.includes(yv as never) === false,
504
- )
505
- )
506
- return false;
507
- }
508
-
509
- // FUNCTIONAL
510
- if (!!x.functions.length === false && !!y.functions.length) return false;
511
-
512
- // SUCCESS
513
- return true;
514
- };
515
-
516
- /**
517
- * @internal
518
- */
519
- export const merge = (x: Metadata, y: Metadata): Metadata => {
520
- const output: Metadata = Metadata.create({
521
- any: x.any || y.any,
522
- nullable: x.nullable || y.nullable,
523
- required: x.required && y.required,
524
- optional: x.optional || y.optional,
525
- functions: x.functions.length ? x.functions : y.functions, // @todo
526
- escaped:
527
- x.escaped !== null && y.escaped !== null
528
- ? MetadataEscaped.create({
529
- original: merge(x.escaped.original, y.escaped.original),
530
- returns: merge(x.escaped.returns, y.escaped.returns),
531
- })
532
- : (x.escaped ?? y.escaped),
533
- atomics: mergeTaggedTypes({
534
- container: x.atomics,
535
- equals: (x, y) => x.type === y.type,
536
- getter: (x) => x.tags,
537
- })(y.atomics),
538
- constants: [...x.constants],
539
- templates: x.templates.slice(),
540
- rest:
541
- x.rest !== null && y.rest !== null
542
- ? merge(x.rest, y.rest)
543
- : (x.rest ?? y.rest),
544
- arrays: mergeTaggedTypes({
545
- container: x.arrays,
546
- equals: (x, y) => x.type.name === y.type.name,
547
- getter: (x) => x.tags,
548
- })(y.arrays),
549
- tuples: mergeTaggedTypes({
550
- container: x.tuples,
551
- equals: (x, y) => x.type.name === y.type.name,
552
- getter: (x) => x.tags,
553
- })(y.tuples),
554
- objects: mergeTaggedTypes({
555
- container: x.objects,
556
- equals: (x, y) => x.type.name === y.type.name,
557
- getter: (x) => x.tags,
558
- })(y.objects),
559
- aliases: mergeTaggedTypes({
560
- container: x.aliases,
561
- equals: (x, y) => x.type.name === y.type.name,
562
- getter: (x) => x.tags,
563
- })(y.aliases),
564
- natives: mergeTaggedTypes({
565
- container: x.natives,
566
- equals: (x, y) => x.name === y.name,
567
- getter: (x) => x.tags,
568
- })(y.natives),
569
- sets: mergeTaggedTypes({
570
- container: x.sets,
571
- equals: (x, y) => x.value.getName() === y.value.getName(),
572
- getter: (x) => x.tags,
573
- })(y.sets),
574
- maps: mergeTaggedTypes({
575
- container: x.maps,
576
- equals: (x, y) =>
577
- x.key.getName() === y.key.getName() &&
578
- x.value.getName() === y.value.getName(),
579
- getter: (x) => x.tags,
580
- })(y.maps),
581
- });
582
- for (const constant of y.constants) {
583
- const target: MetadataConstant = ArrayUtil.take(
584
- output.constants,
585
- (elem) => elem.type === constant.type,
586
- () =>
587
- MetadataConstant.create({
588
- type: constant.type,
589
- values: [],
590
- }),
591
- );
592
- for (const value of constant.values)
593
- ArrayUtil.add(target.values, value, (a, b) => a.value === b.value);
594
- }
595
- return output;
596
- };
597
- }
598
-
599
- const getName = (metadata: Metadata): string => {
600
- if (metadata.any === true) return "any";
601
-
602
- const elements: string[] = [];
603
-
604
- // OPTIONAL
605
- if (metadata.nullable === true) elements.push("null");
606
- if (metadata.isRequired() === false) elements.push("undefined");
607
-
608
- // ATOMIC
609
- for (const atom of metadata.atomics) {
610
- elements.push(atom.getName());
611
- }
612
- for (const constant of metadata.constants)
613
- for (const value of constant.values) elements.push(value.getName());
614
- for (const template of metadata.templates) elements.push(template.getName());
615
-
616
- // NATIVES
617
- for (const native of metadata.natives) elements.push(native.getName());
618
- for (const set of metadata.sets) elements.push(set.getName());
619
- for (const map of metadata.maps) elements.push(map.getName());
620
-
621
- // INSTANCES
622
- if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
623
- for (const tuple of metadata.tuples) elements.push(tuple.type.name);
624
- for (const array of metadata.arrays) elements.push(array.getName());
625
- for (const object of metadata.objects) elements.push(object.getName());
626
- for (const alias of metadata.aliases) elements.push(alias.getName());
627
- if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
628
-
629
- // RETURNS
630
- if (elements.length === 0) return "unknown";
631
- else if (elements.length === 1) return elements[0]!;
632
-
633
- elements.sort();
634
- return `(${elements.join(" | ")})`;
635
- };
636
-
637
- const mergeTaggedTypes =
638
- <T>(props: {
639
- container: T[];
640
- equals: (x: T, y: T) => boolean;
641
- getter: (x: T) => IMetadataTypeTag[][];
642
- }) =>
643
- (opposite: T[]) => {
644
- const output: T[] = [...props.container];
645
- for (const elem of opposite) {
646
- const equal = props.container.find((x) => props.equals(x, elem));
647
- if (equal === undefined) {
648
- output.push(elem);
649
- continue;
650
- }
651
-
652
- const matrix: string[][] = props
653
- .getter(equal)
654
- .map((tags) => tags.map((t) => t.name))
655
- .sort();
656
- for (const tags of props.getter(elem)) {
657
- const names: string[] = tags.map((t) => t.name).sort();
658
- if (
659
- matrix.some(
660
- (m) =>
661
- m.length === names.length && m.every((s, i) => s === names[i]),
662
- )
663
- )
664
- continue;
665
- props.getter(equal).push(tags);
666
- }
667
- }
668
- return output;
669
- };
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 { MetadataMap } from "./MetadataMap";
15
+ import { MetadataNative } from "./MetadataNative";
16
+ import { MetadataObject } from "./MetadataObject";
17
+ import { MetadataObjectType } from "./MetadataObjectType";
18
+ import { MetadataSet } from "./MetadataSet";
19
+ import { MetadataTemplate } from "./MetadataTemplate";
20
+ import { MetadataTuple } from "./MetadataTuple";
21
+
22
+ export class Metadata {
23
+ public any: boolean;
24
+ public required: boolean;
25
+ public optional: boolean;
26
+ public nullable: boolean;
27
+
28
+ public escaped: MetadataEscaped | null;
29
+ public atomics: MetadataAtomic[];
30
+ public constants: MetadataConstant[];
31
+ public templates: MetadataTemplate[];
32
+
33
+ public rest: Metadata | null;
34
+ public aliases: MetadataAlias[];
35
+ public arrays: MetadataArray[];
36
+ public tuples: MetadataTuple[];
37
+ public objects: MetadataObject[];
38
+ public functions: MetadataFunction[];
39
+
40
+ public natives: MetadataNative[];
41
+ public sets: MetadataSet[];
42
+ public maps: MetadataMap[];
43
+
44
+ /** @internal */ private name_?: string;
45
+ /** @internal */ private parent_resolved_: boolean = false;
46
+ /** @internal */ public union_index?: number;
47
+ /** @internal */ public fixed_?: number | null;
48
+ /** @internal */ public boolean_literal_intersected_?: boolean;
49
+ /** @internal */ private is_sequence_?: boolean;
50
+
51
+ /* -----------------------------------------------------------
52
+ CONSTRUCTORS
53
+ ----------------------------------------------------------- */
54
+ /**
55
+ * @hidden
56
+ */
57
+ private constructor(props: ClassProperties<Metadata>) {
58
+ this.any = props.any;
59
+ this.required = props.required;
60
+ this.optional = props.optional;
61
+ this.nullable = props.nullable;
62
+ this.functions = props.functions;
63
+
64
+ this.escaped = props.escaped;
65
+ this.atomics = props.atomics;
66
+ this.constants = props.constants;
67
+ this.templates = props.templates;
68
+
69
+ this.rest = props.rest;
70
+ this.arrays = props.arrays;
71
+ this.tuples = props.tuples;
72
+ this.objects = props.objects;
73
+ this.aliases = props.aliases;
74
+
75
+ this.natives = props.natives;
76
+ this.sets = props.sets;
77
+ this.maps = props.maps;
78
+ }
79
+
80
+ /**
81
+ * @internal
82
+ */
83
+ public static create(props: ClassProperties<Metadata>): Metadata {
84
+ return new Metadata(props);
85
+ }
86
+
87
+ /**
88
+ * @internal
89
+ */
90
+ public static initialize(parentResolved: boolean = false): Metadata {
91
+ const meta: Metadata = Metadata.create({
92
+ any: false,
93
+ nullable: false,
94
+ required: true,
95
+ optional: false,
96
+
97
+ escaped: null,
98
+ constants: [],
99
+ atomics: [],
100
+ templates: [],
101
+ arrays: [],
102
+ tuples: [],
103
+ objects: [],
104
+ aliases: [],
105
+ functions: [],
106
+
107
+ rest: null,
108
+ natives: [],
109
+ sets: [],
110
+ maps: [],
111
+ });
112
+ meta.parent_resolved_ = parentResolved;
113
+ return meta;
114
+ }
115
+
116
+ public toJSON(): IMetadata {
117
+ return {
118
+ any: this.any,
119
+ required: this.required,
120
+ optional: this.optional,
121
+ nullable: this.nullable,
122
+ functions: this.functions.map((f) => f.toJSON()),
123
+
124
+ atomics: this.atomics.map((a) => a.toJSON()),
125
+ constants: this.constants.map((c) => c.toJSON()),
126
+ templates: this.templates.map((tpl) => tpl.toJSON()),
127
+ escaped: this.escaped ? this.escaped.toJSON() : null,
128
+
129
+ rest: this.rest ? this.rest.toJSON() : null,
130
+ arrays: this.arrays.map((array) => array.toJSON()),
131
+ tuples: this.tuples.map((tuple) => tuple.toJSON()),
132
+ objects: this.objects.map((obj) => obj.toJSON()),
133
+ aliases: this.aliases.map((alias) => alias.toJSON()),
134
+
135
+ natives: this.natives.map((native) => native.toJSON()),
136
+ sets: this.sets.map((set) => set.toJSON()),
137
+ maps: this.maps.map((map) => map.toJSON()),
138
+ };
139
+ }
140
+
141
+ public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
142
+ return Metadata.create({
143
+ any: meta.any,
144
+ required: meta.required,
145
+ optional: meta.optional,
146
+ nullable: meta.nullable,
147
+ functions: meta.functions.map((f) => MetadataFunction.from(f, dict)),
148
+
149
+ constants: meta.constants.map(MetadataConstant.from),
150
+ atomics: meta.atomics.map(MetadataAtomic.from),
151
+ templates: meta.templates.map((tpl) => MetadataTemplate.from(tpl, dict)),
152
+ escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
153
+
154
+ rest: meta.rest ? this.from(meta.rest, dict) : null,
155
+ arrays: meta.arrays.map((ref) => {
156
+ const type = dict.arrays.get(ref.name);
157
+ if (type === undefined)
158
+ throw new RangeError(
159
+ `Error on Metadata.from(): failed to find array "${ref.name}".`,
160
+ );
161
+ return MetadataArray.create({
162
+ type,
163
+ tags: ref.tags.map((row) => row.slice()),
164
+ });
165
+ }),
166
+ tuples: meta.tuples.map((t) => {
167
+ const type = dict.tuples.get(t.name);
168
+ if (type === undefined)
169
+ throw new RangeError(
170
+ `Error on Metadata.from(): failed to find tuple "${t.name}".`,
171
+ );
172
+ return MetadataTuple.create({
173
+ type,
174
+ tags: t.tags.map((r) => r.slice()),
175
+ });
176
+ }),
177
+ objects: meta.objects.map((obj) => {
178
+ const found = dict.objects.get(obj.name);
179
+ if (found === undefined)
180
+ throw new RangeError(
181
+ `Error on Metadata.from(): failed to find object "${name}".`,
182
+ );
183
+ return MetadataObject.create({
184
+ type: found,
185
+ tags: obj.tags.map((r) => r.slice()),
186
+ });
187
+ }),
188
+ aliases: meta.aliases.map((alias) => {
189
+ const type = dict.aliases.get(alias.name);
190
+ if (type === undefined)
191
+ throw new RangeError(
192
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
193
+ );
194
+ return MetadataAlias.create({
195
+ type,
196
+ tags: alias.tags.map((r) => r.slice()),
197
+ });
198
+ }),
199
+ natives: meta.natives.map((native) => MetadataNative.create(native)),
200
+ sets: meta.sets.map((set) =>
201
+ MetadataSet.create({
202
+ value: Metadata.from(set.value, dict),
203
+ tags: set.tags.map((r) => r.slice()),
204
+ }),
205
+ ),
206
+ maps: meta.maps.map((map) =>
207
+ MetadataMap.create({
208
+ key: this.from(map.key, dict),
209
+ value: this.from(map.value, dict),
210
+ tags: map.tags.map((r) => r.slice()),
211
+ }),
212
+ ),
213
+ });
214
+ }
215
+
216
+ /* -----------------------------------------------------------
217
+ ACCESSORS
218
+ ----------------------------------------------------------- */
219
+ public getName(): string {
220
+ return (this.name_ ??= getName(this));
221
+ }
222
+
223
+ public empty(): boolean {
224
+ return this.bucket() === 0 || this.size() === 0;
225
+ }
226
+
227
+ public size(): number {
228
+ return (
229
+ (this.any ? 1 : 0) +
230
+ (this.escaped ? 1 : 0) +
231
+ (this.rest ? this.rest.size() : 0) +
232
+ this.templates.length +
233
+ this.atomics.length +
234
+ this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
235
+ this.arrays.length +
236
+ this.tuples.length +
237
+ this.natives.length +
238
+ this.maps.length +
239
+ this.sets.length +
240
+ this.objects.length +
241
+ this.functions.length +
242
+ this.aliases.length
243
+ );
244
+ }
245
+
246
+ public bucket(): number {
247
+ return (
248
+ (this.any ? 1 : 0) +
249
+ (this.escaped ? 1 : 0) +
250
+ (this.templates.length ? 1 : 0) +
251
+ (this.atomics.length ? 1 : 0) +
252
+ (this.constants.length ? 1 : 0) +
253
+ (this.rest ? this.rest.size() : 0) +
254
+ (this.arrays.length ? 1 : 0) +
255
+ (this.tuples.length ? 1 : 0) +
256
+ (this.natives.length ? 1 : 0) +
257
+ (this.sets.length ? 1 : 0) +
258
+ (this.maps.length ? 1 : 0) +
259
+ (this.objects.length ? 1 : 0) +
260
+ (this.functions.length ? 1 : 0) +
261
+ (this.aliases.length ? 1 : 0)
262
+ );
263
+ }
264
+
265
+ /**
266
+ * @internal
267
+ */
268
+ public isSequence(): boolean {
269
+ return (this.is_sequence_ ??= (() => {
270
+ const exists = (tags: IMetadataTypeTag[][]): boolean =>
271
+ tags.some((row) => {
272
+ const sequence = row.find(
273
+ (t) =>
274
+ t.kind === "sequence" &&
275
+ typeof (t.schema as any)?.["x-protobuf-sequence"] === "number",
276
+ );
277
+ if (sequence === undefined) return false;
278
+ const value: number = Number(
279
+ (sequence.schema as any)["x-protobuf-sequence"],
280
+ );
281
+ return !Number.isNaN(value);
282
+ });
283
+ return (
284
+ this.atomics.some((atomic) => exists(atomic.tags)) &&
285
+ this.constants.some((c) =>
286
+ c.values.some((v) => exists(v.tags ?? [])),
287
+ ) &&
288
+ this.templates.some((tpl) => exists(tpl.tags)) &&
289
+ this.arrays.some((array) => exists(array.tags)) &&
290
+ this.objects.some((object) => exists(object.tags)) &&
291
+ this.natives.some(
292
+ (native) => native.name === "Uint8Array" && exists(native.tags),
293
+ )
294
+ );
295
+ })());
296
+ }
297
+
298
+ public isConstant(): boolean {
299
+ return this.bucket() === (this.constants.length ? 1 : 0);
300
+ }
301
+
302
+ public isRequired(): boolean {
303
+ return this.required === true && this.optional === false;
304
+ }
305
+
306
+ /**
307
+ * @internal
308
+ */
309
+ public isUnionBucket(): boolean {
310
+ const size: number = this.bucket();
311
+ const emended: number =
312
+ !!this.atomics.length && !!this.constants.length ? size - 1 : size;
313
+ return emended > 1;
314
+ }
315
+
316
+ /**
317
+ * @internal
318
+ */
319
+ public getSoleLiteral(): string | null {
320
+ if (
321
+ this.size() === 1 &&
322
+ this.constants.length === 1 &&
323
+ this.constants[0]!.type === "string" &&
324
+ this.constants[0]!.values.length === 1
325
+ )
326
+ return this.constants[0]!.values[0]!.value as string;
327
+ else return null;
328
+ }
329
+
330
+ public isSoleLiteral(): boolean {
331
+ return this.getSoleLiteral() !== null;
332
+ }
333
+
334
+ /**
335
+ * @internal
336
+ */
337
+ public isParentResolved(): boolean {
338
+ return this.parent_resolved_;
339
+ }
340
+ }
341
+ export namespace Metadata {
342
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
343
+ // CHECK ANY & OPTIONAL
344
+ if (x.any || y.any) return true;
345
+ if (x.isRequired() === false && false === y.isRequired()) return true;
346
+ if (x.nullable === true && true === y.nullable) return true;
347
+ if (!!x.functions.length && !!y.functions.length === true) return true;
348
+
349
+ //----
350
+ // INSTANCES
351
+ //----
352
+ // ARRAYS
353
+ if (x.arrays.length && y.arrays.length) return true;
354
+ if (x.tuples.length && y.tuples.length) return true;
355
+ if (x.objects.length && y.objects.length) return true;
356
+ if (x.aliases.length && y.aliases.length) return true;
357
+
358
+ // NATIVES
359
+ if (x.natives.length && y.natives.length)
360
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
361
+ return true;
362
+
363
+ // ESCAPED
364
+ if (x.escaped && y.escaped)
365
+ return (
366
+ intersects(x.escaped.original, y.escaped.original) ||
367
+ intersects(x.escaped.returns, y.escaped.returns)
368
+ );
369
+
370
+ //----
371
+ // VALUES
372
+ //----
373
+ // ATOMICS
374
+ for (const atomic of x.atomics) {
375
+ if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
376
+ if (y.constants.some((yc) => atomic.type === yc.type)) return true;
377
+ }
378
+
379
+ // CONSTANTS
380
+ for (const constant of x.constants) {
381
+ const atomic: MetadataAtomic | undefined = y.atomics.find(
382
+ (elem) => elem.type === constant.type,
383
+ );
384
+ if (atomic !== undefined) return true;
385
+
386
+ const opposite: MetadataConstant | undefined = y.constants.find(
387
+ (elem) => elem.type === constant.type,
388
+ );
389
+ if (opposite === undefined) continue;
390
+
391
+ const values: Set<any> = new Set([
392
+ ...constant.values.map((e) => e.value),
393
+ ...opposite.values.map((e) => e.value),
394
+ ]);
395
+ if (values.size !== constant.values.length + opposite.values.length)
396
+ return true;
397
+ }
398
+
399
+ // TEMPLATES
400
+ if (!!x.templates.length && y.atomics.some((ya) => ya.type === "string"))
401
+ return true;
402
+ else if (
403
+ !!y.templates.length &&
404
+ x.atomics.some((xa) => xa.type === "string")
405
+ )
406
+ return true;
407
+ return false;
408
+ };
409
+
410
+ export const covers = (
411
+ x: Metadata,
412
+ y: Metadata,
413
+ level: number = 0,
414
+ escaped: boolean = false,
415
+ ): boolean => {
416
+ // CHECK ANY
417
+ if (x === y) return false;
418
+ else if (x.any) return true;
419
+ else if (y.any) return false;
420
+
421
+ if (escaped === false) {
422
+ if (x.escaped === null && y.escaped !== null) return false;
423
+ else if (
424
+ x.escaped !== null &&
425
+ y.escaped !== null &&
426
+ (!covers(x.escaped.original, y.escaped.original, level, true) ||
427
+ !covers(x.escaped.returns, y.escaped.returns, level, true))
428
+ )
429
+ return false;
430
+ }
431
+
432
+ //----
433
+ // INSTANCES
434
+ //----
435
+ if (level === 0) {
436
+ // ARRAYS
437
+ for (const ya of y.arrays)
438
+ if (
439
+ !x.arrays.some((xa) =>
440
+ covers(xa.type.value, ya.type.value, level + 1),
441
+ )
442
+ ) {
443
+ return false;
444
+ }
445
+
446
+ // TUPLES
447
+ for (const yt of y.tuples)
448
+ if (
449
+ yt.type.elements.length !== 0 &&
450
+ x.tuples.some(
451
+ (xt) =>
452
+ xt.type.elements.length >= yt.type.elements.length &&
453
+ xt.type.elements
454
+ .slice(yt.type.elements.length)
455
+ .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
456
+ ) === false
457
+ )
458
+ return false;
459
+ }
460
+
461
+ // OBJECTS
462
+ for (const yo of y.objects)
463
+ if (
464
+ x.objects.some((xo) => MetadataObjectType.covers(xo.type, yo.type)) ===
465
+ false
466
+ )
467
+ return false;
468
+
469
+ // ALIASES
470
+ for (const yd of y.aliases)
471
+ if (x.aliases.some((xd) => xd.type.name === yd.type.name) === false)
472
+ return false;
473
+
474
+ // NATIVES
475
+ for (const yn of y.natives)
476
+ if (x.natives.some((xn) => xn === yn) === false) return false;
477
+
478
+ // SETS
479
+ for (const ys of y.sets)
480
+ if (x.sets.some((xs) => covers(xs.value, ys.value)) === false)
481
+ return false;
482
+
483
+ //----
484
+ // VALUES
485
+ //----
486
+ // ATOMICS
487
+ if (
488
+ y.atomics.some(
489
+ (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
490
+ )
491
+ )
492
+ return false;
493
+
494
+ // CONSTANTS
495
+ for (const yc of y.constants) {
496
+ if (x.atomics.some((atom) => yc.type === atom.type)) continue;
497
+ const xc: MetadataConstant | undefined = x.constants.find(
498
+ (elem) => elem.type === yc.type,
499
+ );
500
+ if (xc === undefined) return false;
501
+ else if (
502
+ (yc.values.map((e) => e.value) as number[]).some(
503
+ (yv) => xc.values.includes(yv as never) === false,
504
+ )
505
+ )
506
+ return false;
507
+ }
508
+
509
+ // FUNCTIONAL
510
+ if (!!x.functions.length === false && !!y.functions.length) return false;
511
+
512
+ // SUCCESS
513
+ return true;
514
+ };
515
+
516
+ /**
517
+ * @internal
518
+ */
519
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
520
+ const output: Metadata = Metadata.create({
521
+ any: x.any || y.any,
522
+ nullable: x.nullable || y.nullable,
523
+ required: x.required && y.required,
524
+ optional: x.optional || y.optional,
525
+ functions: x.functions.length ? x.functions : y.functions, // @todo
526
+ escaped:
527
+ x.escaped !== null && y.escaped !== null
528
+ ? MetadataEscaped.create({
529
+ original: merge(x.escaped.original, y.escaped.original),
530
+ returns: merge(x.escaped.returns, y.escaped.returns),
531
+ })
532
+ : (x.escaped ?? y.escaped),
533
+ atomics: mergeTaggedTypes({
534
+ container: x.atomics,
535
+ equals: (x, y) => x.type === y.type,
536
+ getter: (x) => x.tags,
537
+ })(y.atomics),
538
+ constants: [...x.constants],
539
+ templates: x.templates.slice(),
540
+ rest:
541
+ x.rest !== null && y.rest !== null
542
+ ? merge(x.rest, y.rest)
543
+ : (x.rest ?? y.rest),
544
+ arrays: mergeTaggedTypes({
545
+ container: x.arrays,
546
+ equals: (x, y) => x.type.name === y.type.name,
547
+ getter: (x) => x.tags,
548
+ })(y.arrays),
549
+ tuples: mergeTaggedTypes({
550
+ container: x.tuples,
551
+ equals: (x, y) => x.type.name === y.type.name,
552
+ getter: (x) => x.tags,
553
+ })(y.tuples),
554
+ objects: mergeTaggedTypes({
555
+ container: x.objects,
556
+ equals: (x, y) => x.type.name === y.type.name,
557
+ getter: (x) => x.tags,
558
+ })(y.objects),
559
+ aliases: mergeTaggedTypes({
560
+ container: x.aliases,
561
+ equals: (x, y) => x.type.name === y.type.name,
562
+ getter: (x) => x.tags,
563
+ })(y.aliases),
564
+ natives: mergeTaggedTypes({
565
+ container: x.natives,
566
+ equals: (x, y) => x.name === y.name,
567
+ getter: (x) => x.tags,
568
+ })(y.natives),
569
+ sets: mergeTaggedTypes({
570
+ container: x.sets,
571
+ equals: (x, y) => x.value.getName() === y.value.getName(),
572
+ getter: (x) => x.tags,
573
+ })(y.sets),
574
+ maps: mergeTaggedTypes({
575
+ container: x.maps,
576
+ equals: (x, y) =>
577
+ x.key.getName() === y.key.getName() &&
578
+ x.value.getName() === y.value.getName(),
579
+ getter: (x) => x.tags,
580
+ })(y.maps),
581
+ });
582
+ for (const constant of y.constants) {
583
+ const target: MetadataConstant = ArrayUtil.take(
584
+ output.constants,
585
+ (elem) => elem.type === constant.type,
586
+ () =>
587
+ MetadataConstant.create({
588
+ type: constant.type,
589
+ values: [],
590
+ }),
591
+ );
592
+ for (const value of constant.values)
593
+ ArrayUtil.add(target.values, value, (a, b) => a.value === b.value);
594
+ }
595
+ return output;
596
+ };
597
+ }
598
+
599
+ const getName = (metadata: Metadata): string => {
600
+ if (metadata.any === true) return "any";
601
+
602
+ const elements: string[] = [];
603
+
604
+ // OPTIONAL
605
+ if (metadata.nullable === true) elements.push("null");
606
+ if (metadata.isRequired() === false) elements.push("undefined");
607
+
608
+ // ATOMIC
609
+ for (const atom of metadata.atomics) {
610
+ elements.push(atom.getName());
611
+ }
612
+ for (const constant of metadata.constants)
613
+ for (const value of constant.values) elements.push(value.getName());
614
+ for (const template of metadata.templates) elements.push(template.getName());
615
+
616
+ // NATIVES
617
+ for (const native of metadata.natives) elements.push(native.getName());
618
+ for (const set of metadata.sets) elements.push(set.getName());
619
+ for (const map of metadata.maps) elements.push(map.getName());
620
+
621
+ // INSTANCES
622
+ if (metadata.rest !== null) elements.push(`...${metadata.rest.getName()}`);
623
+ for (const tuple of metadata.tuples) elements.push(tuple.type.name);
624
+ for (const array of metadata.arrays) elements.push(array.getName());
625
+ for (const object of metadata.objects) elements.push(object.getName());
626
+ for (const alias of metadata.aliases) elements.push(alias.getName());
627
+ if (metadata.escaped !== null) elements.push(metadata.escaped.getName());
628
+
629
+ // RETURNS
630
+ if (elements.length === 0) return "unknown";
631
+ else if (elements.length === 1) return elements[0]!;
632
+
633
+ elements.sort();
634
+ return `(${elements.join(" | ")})`;
635
+ };
636
+
637
+ const mergeTaggedTypes =
638
+ <T>(props: {
639
+ container: T[];
640
+ equals: (x: T, y: T) => boolean;
641
+ getter: (x: T) => IMetadataTypeTag[][];
642
+ }) =>
643
+ (opposite: T[]) => {
644
+ const output: T[] = [...props.container];
645
+ for (const elem of opposite) {
646
+ const equal = props.container.find((x) => props.equals(x, elem));
647
+ if (equal === undefined) {
648
+ output.push(elem);
649
+ continue;
650
+ }
651
+
652
+ const matrix: string[][] = props
653
+ .getter(equal)
654
+ .map((tags) => tags.map((t) => t.name))
655
+ .sort();
656
+ for (const tags of props.getter(elem)) {
657
+ const names: string[] = tags.map((t) => t.name).sort();
658
+ if (
659
+ matrix.some(
660
+ (m) =>
661
+ m.length === names.length && m.every((s, i) => s === names[i]),
662
+ )
663
+ )
664
+ continue;
665
+ props.getter(equal).push(tags);
666
+ }
667
+ }
668
+ return output;
669
+ };