typia 7.0.2 → 7.1.0-dev.20241209

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 (476) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +123 -123
  3. package/lib/executable/typia.js +0 -0
  4. package/lib/factories/LiteralFactory.js +4 -0
  5. package/lib/factories/LiteralFactory.js.map +1 -1
  6. package/lib/factories/internal/metadata/iterate_metadata_function.js +1 -0
  7. package/lib/factories/internal/metadata/iterate_metadata_function.js.map +1 -1
  8. package/lib/index.mjs +18 -1
  9. package/lib/index.mjs.map +1 -1
  10. package/lib/llm.d.ts +121 -2
  11. package/lib/llm.js +7 -0
  12. package/lib/llm.js.map +1 -1
  13. package/lib/module.d.ts +2 -0
  14. package/lib/module.js +2 -0
  15. package/lib/module.js.map +1 -1
  16. package/lib/programmers/llm/LlmApplicationOfValidateProgrammer.d.ts +15 -0
  17. package/lib/programmers/llm/LlmApplicationOfValidateProgrammer.js +37 -0
  18. package/lib/programmers/llm/LlmApplicationOfValidateProgrammer.js.map +1 -0
  19. package/lib/schemas/llm/ILlmApplicationOfValidate.d.ts +52 -0
  20. package/lib/schemas/llm/ILlmApplicationOfValidate.js +7 -0
  21. package/lib/schemas/llm/ILlmApplicationOfValidate.js.map +1 -0
  22. package/lib/schemas/llm/ILlmFunctionOfValidate.d.ts +36 -0
  23. package/lib/schemas/llm/ILlmFunctionOfValidate.js +7 -0
  24. package/lib/schemas/llm/ILlmFunctionOfValidate.js.map +1 -0
  25. package/lib/schemas/metadata/MetadataParameter.d.ts +2 -0
  26. package/lib/schemas/metadata/MetadataParameter.js +1 -0
  27. package/lib/schemas/metadata/MetadataParameter.js.map +1 -1
  28. package/lib/transformers/CallExpressionTransformer.js +2 -0
  29. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  30. package/lib/transformers/features/llm/LlmApplicationOfValidateTransformer.d.ts +5 -0
  31. package/lib/transformers/features/llm/LlmApplicationOfValidateTransformer.js +94 -0
  32. package/lib/transformers/features/llm/LlmApplicationOfValidateTransformer.js.map +1 -0
  33. package/lib/transformers/features/llm/LlmApplicationTransformer.js +3 -3
  34. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/IRandomGenerator.ts +49 -49
  37. package/src/IReadableURLSearchParams.ts +9 -9
  38. package/src/IValidation.ts +20 -20
  39. package/src/executable/TypiaGenerateWizard.ts +83 -83
  40. package/src/executable/TypiaPatchWizard.ts +45 -45
  41. package/src/executable/TypiaSetupWizard.ts +179 -179
  42. package/src/executable/setup/ArgumentParser.ts +42 -42
  43. package/src/executable/setup/FileRetriever.ts +19 -19
  44. package/src/executable/setup/PackageManager.ts +87 -87
  45. package/src/factories/ExpressionFactory.ts +216 -216
  46. package/src/factories/IdentifierFactory.ts +89 -89
  47. package/src/factories/JsonMetadataFactory.ts +76 -76
  48. package/src/factories/LiteralFactory.ts +52 -50
  49. package/src/factories/MetadataCollection.ts +278 -278
  50. package/src/factories/MetadataCommentTagFactory.ts +650 -650
  51. package/src/factories/MetadataFactory.ts +404 -404
  52. package/src/factories/MetadataTypeTagFactory.ts +411 -411
  53. package/src/factories/MetadataTypeTagSchemaFactory.ts +82 -82
  54. package/src/factories/NumericRangeFactory.ts +72 -72
  55. package/src/factories/ProtobufFactory.ts +875 -875
  56. package/src/factories/StatementFactory.ts +90 -90
  57. package/src/factories/TemplateFactory.ts +64 -64
  58. package/src/factories/TypeFactory.ts +140 -140
  59. package/src/factories/internal/metadata/IMetadataIteratorProps.ts +17 -17
  60. package/src/factories/internal/metadata/MetadataHelper.ts +21 -21
  61. package/src/factories/internal/metadata/emplace_metadata_alias.ts +33 -33
  62. package/src/factories/internal/metadata/emplace_metadata_array_type.ts +39 -39
  63. package/src/factories/internal/metadata/emplace_metadata_object.ts +208 -208
  64. package/src/factories/internal/metadata/emplace_metadata_tuple.ts +57 -57
  65. package/src/factories/internal/metadata/explore_metadata.ts +31 -31
  66. package/src/factories/internal/metadata/iterate_metadata.ts +54 -54
  67. package/src/factories/internal/metadata/iterate_metadata_alias.ts +33 -33
  68. package/src/factories/internal/metadata/iterate_metadata_array.ts +63 -63
  69. package/src/factories/internal/metadata/iterate_metadata_atomic.ts +62 -62
  70. package/src/factories/internal/metadata/iterate_metadata_coalesce.ts +28 -28
  71. package/src/factories/internal/metadata/iterate_metadata_collection.ts +146 -146
  72. package/src/factories/internal/metadata/iterate_metadata_comment_tags.ts +32 -32
  73. package/src/factories/internal/metadata/iterate_metadata_constant.ts +76 -76
  74. package/src/factories/internal/metadata/iterate_metadata_escape.ts +49 -49
  75. package/src/factories/internal/metadata/iterate_metadata_function.ts +91 -90
  76. package/src/factories/internal/metadata/iterate_metadata_intersection.ts +213 -213
  77. package/src/factories/internal/metadata/iterate_metadata_map.ts +57 -57
  78. package/src/factories/internal/metadata/iterate_metadata_native.ts +255 -255
  79. package/src/factories/internal/metadata/iterate_metadata_object.ts +35 -35
  80. package/src/factories/internal/metadata/iterate_metadata_set.ts +57 -57
  81. package/src/factories/internal/metadata/iterate_metadata_sort.ts +87 -87
  82. package/src/factories/internal/metadata/iterate_metadata_template.ts +41 -41
  83. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +26 -26
  84. package/src/factories/internal/metadata/iterate_metadata_union.ts +19 -19
  85. package/src/functional.ts +750 -750
  86. package/src/http.ts +1047 -1047
  87. package/src/internal/_IProtobufWriter.ts +18 -18
  88. package/src/internal/_ProtobufReader.ts +194 -194
  89. package/src/internal/_ProtobufSizer.ts +145 -145
  90. package/src/internal/_ProtobufWriter.ts +145 -145
  91. package/src/internal/_accessExpressionAsString.ts +46 -46
  92. package/src/internal/_assertGuard.ts +13 -13
  93. package/src/internal/_functionalTypeGuardErrorFactory.ts +4 -4
  94. package/src/internal/_httpFormDataReadArray.ts +4 -4
  95. package/src/internal/_httpFormDataReadBigint.ts +18 -18
  96. package/src/internal/_httpFormDataReadBlob.ts +10 -10
  97. package/src/internal/_httpFormDataReadBoolean.ts +16 -16
  98. package/src/internal/_httpFormDataReadFile.ts +10 -10
  99. package/src/internal/_httpFormDataReadNumber.ts +15 -15
  100. package/src/internal/_httpFormDataReadString.ts +10 -10
  101. package/src/internal/_httpHeaderReadBigint.ts +10 -10
  102. package/src/internal/_httpHeaderReadBoolean.ts +8 -8
  103. package/src/internal/_httpHeaderReadNumber.ts +7 -7
  104. package/src/internal/_httpParameterReadBigint.ts +10 -10
  105. package/src/internal/_httpParameterReadBoolean.ts +8 -8
  106. package/src/internal/_httpParameterReadNumber.ts +7 -7
  107. package/src/internal/_httpParameterReadString.ts +2 -2
  108. package/src/internal/_httpQueryParseURLSearchParams.ts +12 -12
  109. package/src/internal/_httpQueryReadArray.ts +4 -4
  110. package/src/internal/_httpQueryReadBigint.ts +12 -12
  111. package/src/internal/_httpQueryReadBoolean.ts +14 -14
  112. package/src/internal/_httpQueryReadNumber.ts +9 -9
  113. package/src/internal/_httpQueryReadString.ts +4 -4
  114. package/src/internal/_isBetween.ts +2 -2
  115. package/src/internal/_isBigintString.ts +8 -8
  116. package/src/internal/_isFormatByte.ts +7 -7
  117. package/src/internal/_isFormatDate.ts +3 -3
  118. package/src/internal/_isFormatDateTime.ts +4 -4
  119. package/src/internal/_isFormatDuration.ts +4 -4
  120. package/src/internal/_isFormatEmail.ts +4 -4
  121. package/src/internal/_isFormatHostname.ts +4 -4
  122. package/src/internal/_isFormatIdnEmail.ts +4 -4
  123. package/src/internal/_isFormatIdnHostname.ts +4 -4
  124. package/src/internal/_isFormatIpv4.ts +4 -4
  125. package/src/internal/_isFormatIpv6.ts +4 -4
  126. package/src/internal/_isFormatIri.ts +3 -3
  127. package/src/internal/_isFormatIriReference.ts +4 -4
  128. package/src/internal/_isFormatJsonPointer.ts +3 -3
  129. package/src/internal/_isFormatPassword.ts +1 -1
  130. package/src/internal/_isFormatRegex.ts +8 -8
  131. package/src/internal/_isFormatRelativeJsonPointer.ts +4 -4
  132. package/src/internal/_isFormatTime.ts +4 -4
  133. package/src/internal/_isFormatUri.ts +6 -6
  134. package/src/internal/_isFormatUriReference.ts +5 -5
  135. package/src/internal/_isFormatUriTemplate.ts +4 -4
  136. package/src/internal/_isFormatUrl.ts +4 -4
  137. package/src/internal/_isFormatUuid.ts +3 -3
  138. package/src/internal/_isTypeFloat.ts +5 -5
  139. package/src/internal/_isTypeInt32.ts +5 -5
  140. package/src/internal/_isTypeInt64.ts +5 -5
  141. package/src/internal/_isTypeUint32.ts +5 -5
  142. package/src/internal/_isTypeUint64.ts +5 -5
  143. package/src/internal/_isUniqueItems.ts +159 -159
  144. package/src/internal/_jsonStringifyNumber.ts +12 -12
  145. package/src/internal/_jsonStringifyRest.ts +3 -3
  146. package/src/internal/_jsonStringifyString.ts +42 -42
  147. package/src/internal/_jsonStringifyTail.ts +2 -2
  148. package/src/internal/_llmApplicationFinalize.ts +20 -20
  149. package/src/internal/_miscCloneAny.ts +46 -46
  150. package/src/internal/_notationAny.ts +37 -37
  151. package/src/internal/_notationCamel.ts +13 -13
  152. package/src/internal/_notationPascal.ts +8 -8
  153. package/src/internal/_notationSnake.ts +43 -43
  154. package/src/internal/_randomArray.ts +21 -21
  155. package/src/internal/_randomBigint.ts +6 -6
  156. package/src/internal/_randomBoolean.ts +1 -1
  157. package/src/internal/_randomFormatByte.ts +3 -3
  158. package/src/internal/_randomFormatDate.ts +18 -18
  159. package/src/internal/_randomFormatDatetime.ts +16 -16
  160. package/src/internal/_randomFormatDuration.ts +27 -27
  161. package/src/internal/_randomFormatEmail.ts +11 -11
  162. package/src/internal/_randomFormatHostname.ts +6 -6
  163. package/src/internal/_randomFormatIdnEmail.ts +3 -3
  164. package/src/internal/_randomFormatIdnHostname.ts +3 -3
  165. package/src/internal/_randomFormatIpv4.ts +11 -11
  166. package/src/internal/_randomFormatIpv6.ts +11 -11
  167. package/src/internal/_randomFormatIri.ts +3 -3
  168. package/src/internal/_randomFormatIriReference.ts +3 -3
  169. package/src/internal/_randomFormatJsonPointer.ts +7 -7
  170. package/src/internal/_randomFormatPassword.ts +8 -8
  171. package/src/internal/_randomFormatRegex.ts +4 -4
  172. package/src/internal/_randomFormatRelativeJsonPointer.ts +8 -8
  173. package/src/internal/_randomFormatTime.ts +14 -14
  174. package/src/internal/_randomFormatUri.ts +3 -3
  175. package/src/internal/_randomFormatUriReference.ts +3 -3
  176. package/src/internal/_randomFormatUriTemplate.ts +3 -3
  177. package/src/internal/_randomFormatUrl.ts +11 -11
  178. package/src/internal/_randomFormatUuid.ts +6 -6
  179. package/src/internal/_randomInteger.ts +47 -47
  180. package/src/internal/_randomNumber.ts +74 -74
  181. package/src/internal/_randomPattern.ts +10 -10
  182. package/src/internal/_randomPick.ts +9 -9
  183. package/src/internal/_randomString.ts +24 -24
  184. package/src/internal/_throwTypeGuardError.ts +5 -5
  185. package/src/internal/_validateReport.ts +13 -13
  186. package/src/internal/private/__notationCapitalize.ts +2 -2
  187. package/src/internal/private/__notationUnsnake.ts +24 -24
  188. package/src/json.ts +752 -752
  189. package/src/llm.ts +481 -342
  190. package/src/misc.ts +658 -658
  191. package/src/module.ts +937 -935
  192. package/src/notations.ts +827 -827
  193. package/src/programmers/AssertProgrammer.ts +454 -454
  194. package/src/programmers/CheckerProgrammer.ts +1617 -1617
  195. package/src/programmers/FeatureProgrammer.ts +622 -622
  196. package/src/programmers/ImportProgrammer.ts +185 -185
  197. package/src/programmers/IsProgrammer.ts +273 -273
  198. package/src/programmers/RandomProgrammer.ts +1190 -1190
  199. package/src/programmers/TypiaProgrammer.ts +174 -174
  200. package/src/programmers/ValidateProgrammer.ts +434 -434
  201. package/src/programmers/functional/FunctionalAssertFunctionProgrammer.ts +153 -153
  202. package/src/programmers/functional/FunctionalAssertParametersProgrammer.ts +125 -125
  203. package/src/programmers/functional/FunctionalAssertReturnProgrammer.ts +115 -115
  204. package/src/programmers/functional/FunctionalIsFunctionProgrammer.ts +72 -72
  205. package/src/programmers/functional/FunctionalIsParametersProgrammer.ts +113 -113
  206. package/src/programmers/functional/FunctionalIsReturnProgrammer.ts +116 -116
  207. package/src/programmers/functional/FunctionalValidateFunctionProgrammer.ts +119 -119
  208. package/src/programmers/functional/FunctionalValidateParametersProgrammer.ts +274 -274
  209. package/src/programmers/functional/FunctionalValidateReturnProgrammer.ts +135 -135
  210. package/src/programmers/functional/internal/FunctionalGeneralProgrammer.ts +34 -34
  211. package/src/programmers/helpers/AtomicPredicator.ts +35 -35
  212. package/src/programmers/helpers/CloneJoiner.ts +143 -143
  213. package/src/programmers/helpers/FunctionProgrammer.ts +67 -67
  214. package/src/programmers/helpers/HttpMetadataUtil.ts +21 -21
  215. package/src/programmers/helpers/NotationJoiner.ts +144 -144
  216. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  217. package/src/programmers/helpers/ProtobufUtil.ts +228 -228
  218. package/src/programmers/helpers/PruneJoiner.ts +148 -148
  219. package/src/programmers/helpers/RandomJoiner.ts +168 -168
  220. package/src/programmers/helpers/StringifyJoinder.ts +115 -115
  221. package/src/programmers/helpers/StringifyPredicator.ts +13 -13
  222. package/src/programmers/helpers/UnionExplorer.ts +372 -372
  223. package/src/programmers/helpers/UnionPredicator.ts +79 -79
  224. package/src/programmers/helpers/disable_function_programmer_declare.ts +32 -32
  225. package/src/programmers/http/HttpAssertFormDataProgrammer.ts +99 -99
  226. package/src/programmers/http/HttpAssertHeadersProgrammer.ts +99 -99
  227. package/src/programmers/http/HttpAssertQueryProgrammer.ts +105 -105
  228. package/src/programmers/http/HttpFormDataProgrammer.ts +308 -308
  229. package/src/programmers/http/HttpHeadersProgrammer.ts +400 -400
  230. package/src/programmers/http/HttpIsFormDataProgrammer.ts +108 -108
  231. package/src/programmers/http/HttpIsHeadersProgrammer.ts +108 -108
  232. package/src/programmers/http/HttpIsQueryProgrammer.ts +114 -114
  233. package/src/programmers/http/HttpParameterProgrammer.ts +115 -115
  234. package/src/programmers/http/HttpQueryProgrammer.ts +336 -336
  235. package/src/programmers/http/HttpValidateFormDataProgrammer.ts +92 -92
  236. package/src/programmers/http/HttpValidateHeadersProgrammer.ts +92 -92
  237. package/src/programmers/http/HttpValidateQueryProgrammer.ts +98 -98
  238. package/src/programmers/internal/check_array_length.ts +47 -47
  239. package/src/programmers/internal/check_bigint.ts +50 -50
  240. package/src/programmers/internal/check_dynamic_key.ts +201 -201
  241. package/src/programmers/internal/check_dynamic_properties.ts +208 -208
  242. package/src/programmers/internal/check_everything.ts +23 -23
  243. package/src/programmers/internal/check_native.ts +27 -27
  244. package/src/programmers/internal/check_number.ts +112 -112
  245. package/src/programmers/internal/check_object.ts +75 -75
  246. package/src/programmers/internal/check_string.ts +50 -50
  247. package/src/programmers/internal/check_template.ts +48 -48
  248. package/src/programmers/internal/check_union_array_like.ts +335 -335
  249. package/src/programmers/internal/decode_union_object.ts +116 -116
  250. package/src/programmers/internal/feature_object_entries.ts +61 -61
  251. package/src/programmers/internal/json_schema_alias.ts +47 -47
  252. package/src/programmers/internal/json_schema_array.ts +45 -45
  253. package/src/programmers/internal/json_schema_bigint.ts +15 -15
  254. package/src/programmers/internal/json_schema_boolean.ts +15 -15
  255. package/src/programmers/internal/json_schema_constant.ts +26 -26
  256. package/src/programmers/internal/json_schema_description.ts +12 -12
  257. package/src/programmers/internal/json_schema_discriminator.ts +35 -35
  258. package/src/programmers/internal/json_schema_escaped.ts +82 -82
  259. package/src/programmers/internal/json_schema_native.ts +33 -33
  260. package/src/programmers/internal/json_schema_number.ts +15 -15
  261. package/src/programmers/internal/json_schema_object.ts +158 -158
  262. package/src/programmers/internal/json_schema_plugin.ts +18 -18
  263. package/src/programmers/internal/json_schema_station.ts +182 -182
  264. package/src/programmers/internal/json_schema_string.ts +15 -15
  265. package/src/programmers/internal/json_schema_template.ts +55 -55
  266. package/src/programmers/internal/json_schema_title.ts +20 -20
  267. package/src/programmers/internal/json_schema_tuple.ts +35 -35
  268. package/src/programmers/internal/metadata_to_pattern.ts +42 -42
  269. package/src/programmers/internal/postfix_of_tuple.ts +5 -5
  270. package/src/programmers/internal/prune_object_properties.ts +71 -71
  271. package/src/programmers/internal/stringify_dynamic_properties.ts +162 -162
  272. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  273. package/src/programmers/internal/template_to_pattern.ts +23 -23
  274. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +23 -23
  275. package/src/programmers/json/JsonApplicationProgrammer.ts +276 -276
  276. package/src/programmers/json/JsonAssertParseProgrammer.ts +113 -113
  277. package/src/programmers/json/JsonAssertStringifyProgrammer.ts +115 -115
  278. package/src/programmers/json/JsonIsParseProgrammer.ts +114 -114
  279. package/src/programmers/json/JsonIsStringifyProgrammer.ts +108 -108
  280. package/src/programmers/json/JsonSchemasProgrammer.ts +91 -91
  281. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  282. package/src/programmers/json/JsonValidateParseProgrammer.ts +105 -105
  283. package/src/programmers/json/JsonValidateStringifyProgrammer.ts +124 -124
  284. package/src/programmers/llm/LlmApplicationOfValidateProgrammer.ts +81 -0
  285. package/src/programmers/llm/LlmApplicationProgrammer.ts +276 -276
  286. package/src/programmers/llm/LlmModelPredicator.ts +127 -127
  287. package/src/programmers/llm/LlmParametersProgrammer.ts +90 -90
  288. package/src/programmers/llm/LlmSchemaProgrammer.ts +143 -143
  289. package/src/programmers/misc/MiscAssertCloneProgrammer.ts +95 -95
  290. package/src/programmers/misc/MiscAssertPruneProgrammer.ts +116 -116
  291. package/src/programmers/misc/MiscCloneProgrammer.ts +1032 -1032
  292. package/src/programmers/misc/MiscIsCloneProgrammer.ts +99 -99
  293. package/src/programmers/misc/MiscIsPruneProgrammer.ts +97 -97
  294. package/src/programmers/misc/MiscLiteralsProgrammer.ts +80 -80
  295. package/src/programmers/misc/MiscPruneProgrammer.ts +728 -728
  296. package/src/programmers/misc/MiscValidateCloneProgrammer.ts +111 -111
  297. package/src/programmers/misc/MiscValidatePruneProgrammer.ts +113 -113
  298. package/src/programmers/notations/NotationAssertGeneralProgrammer.ts +101 -101
  299. package/src/programmers/notations/NotationGeneralProgrammer.ts +984 -984
  300. package/src/programmers/notations/NotationIsGeneralProgrammer.ts +105 -105
  301. package/src/programmers/notations/NotationValidateGeneralProgrammer.ts +119 -119
  302. package/src/programmers/protobuf/ProtobufAssertDecodeProgrammer.ts +98 -98
  303. package/src/programmers/protobuf/ProtobufAssertEncodeProgrammer.ts +102 -102
  304. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +654 -654
  305. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +945 -945
  306. package/src/programmers/protobuf/ProtobufIsDecodeProgrammer.ts +109 -109
  307. package/src/programmers/protobuf/ProtobufIsEncodeProgrammer.ts +98 -98
  308. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +179 -179
  309. package/src/programmers/protobuf/ProtobufValidateDecodeProgrammer.ts +92 -92
  310. package/src/programmers/protobuf/ProtobufValidateEncodeProgrammer.ts +119 -119
  311. package/src/protobuf.ts +868 -868
  312. package/src/reflect.ts +57 -57
  313. package/src/schemas/json/IJsonApplication.ts +73 -73
  314. package/src/schemas/json/IJsonSchemaCollection.ts +29 -29
  315. package/src/schemas/json/__IJsonApplication.ts +63 -63
  316. package/src/schemas/llm/ILlmApplicationOfValidate.ts +55 -0
  317. package/src/schemas/llm/ILlmFunctionOfValidate.ts +39 -0
  318. package/src/schemas/metadata/IMetadata.ts +35 -35
  319. package/src/schemas/metadata/IMetadataAlias.ts +6 -6
  320. package/src/schemas/metadata/IMetadataAliasType.ts +12 -12
  321. package/src/schemas/metadata/IMetadataApplication.ts +7 -7
  322. package/src/schemas/metadata/IMetadataArray.ts +6 -6
  323. package/src/schemas/metadata/IMetadataComponents.ts +11 -11
  324. package/src/schemas/metadata/IMetadataConstantValue.ts +11 -11
  325. package/src/schemas/metadata/IMetadataDictionary.ts +11 -11
  326. package/src/schemas/metadata/IMetadataMap.ts +8 -8
  327. package/src/schemas/metadata/IMetadataNative.ts +6 -6
  328. package/src/schemas/metadata/IMetadataObject.ts +6 -6
  329. package/src/schemas/metadata/IMetadataObjectType.ts +13 -13
  330. package/src/schemas/metadata/IMetadataSet.ts +7 -7
  331. package/src/schemas/metadata/IMetadataTemplate.ts +7 -7
  332. package/src/schemas/metadata/IMetadataTuple.ts +6 -6
  333. package/src/schemas/metadata/IMetadataTypeTag.ts +16 -16
  334. package/src/schemas/metadata/Metadata.ts +669 -669
  335. package/src/schemas/metadata/MetadataAlias.ts +46 -46
  336. package/src/schemas/metadata/MetadataAliasType.ts +63 -63
  337. package/src/schemas/metadata/MetadataApplication.ts +44 -44
  338. package/src/schemas/metadata/MetadataArray.ts +49 -49
  339. package/src/schemas/metadata/MetadataAtomic.ts +87 -87
  340. package/src/schemas/metadata/MetadataComponents.ts +98 -98
  341. package/src/schemas/metadata/MetadataConstantValue.ts +62 -62
  342. package/src/schemas/metadata/MetadataMap.ts +48 -48
  343. package/src/schemas/metadata/MetadataNative.ts +44 -44
  344. package/src/schemas/metadata/MetadataObject.ts +48 -48
  345. package/src/schemas/metadata/MetadataObjectType.ts +149 -149
  346. package/src/schemas/metadata/MetadataParameter.ts +4 -0
  347. package/src/schemas/metadata/MetadataProperty.ts +59 -59
  348. package/src/schemas/metadata/MetadataSet.ts +45 -45
  349. package/src/schemas/metadata/MetadataTemplate.ts +80 -80
  350. package/src/schemas/metadata/MetadataTuple.ts +32 -32
  351. package/src/schemas/protobuf/IProtobufProperty.ts +6 -6
  352. package/src/schemas/protobuf/IProtobufPropertyType.ts +37 -37
  353. package/src/schemas/protobuf/IProtobufSchema.ts +50 -50
  354. package/src/tags/Example.ts +24 -24
  355. package/src/tags/Examples.ts +16 -16
  356. package/src/tags/Format.ts +50 -50
  357. package/src/tags/JsonSchemaPlugin.ts +8 -8
  358. package/src/tags/Sequence.ts +10 -10
  359. package/src/tags/TagBase.ts +82 -82
  360. package/src/tags/Type.ts +32 -32
  361. package/src/tags/UniqueItems.ts +14 -14
  362. package/src/tags/index.ts +21 -21
  363. package/src/transform.ts +35 -35
  364. package/src/transformers/CallExpressionTransformer.ts +547 -545
  365. package/src/transformers/FileTransformer.ts +136 -136
  366. package/src/transformers/IProgrammerProps.ts +11 -11
  367. package/src/transformers/ITransformOptions.ts +62 -62
  368. package/src/transformers/ITransformProps.ts +9 -9
  369. package/src/transformers/ITypiaContext.ts +18 -18
  370. package/src/transformers/ImportTransformer.ts +81 -81
  371. package/src/transformers/NodeTransformer.ts +17 -17
  372. package/src/transformers/TransformerError.ts +60 -60
  373. package/src/transformers/features/AssertTransformer.ts +24 -24
  374. package/src/transformers/features/CreateAssertTransformer.ts +24 -24
  375. package/src/transformers/features/CreateIsTransformer.ts +18 -18
  376. package/src/transformers/features/CreateRandomTransformer.ts +43 -43
  377. package/src/transformers/features/CreateValidateTransformer.ts +18 -18
  378. package/src/transformers/features/IsTransformer.ts +18 -18
  379. package/src/transformers/features/RandomTransformer.ts +41 -41
  380. package/src/transformers/features/ValidateTransformer.ts +18 -18
  381. package/src/transformers/features/functional/FunctionalGenericTransformer.ts +57 -57
  382. package/src/transformers/features/http/CreateHttpAssertFormDataTransformer.ts +13 -13
  383. package/src/transformers/features/http/CreateHttpAssertHeadersTransformer.ts +13 -13
  384. package/src/transformers/features/http/CreateHttpAssertQueryTransformer.ts +13 -13
  385. package/src/transformers/features/http/CreateHttpFormDataTransformer.ts +13 -13
  386. package/src/transformers/features/http/CreateHttpHeadersTransformer.ts +13 -13
  387. package/src/transformers/features/http/CreateHttpIsFormDataTransformer.ts +13 -13
  388. package/src/transformers/features/http/CreateHttpIsHeadersTransformer.ts +13 -13
  389. package/src/transformers/features/http/CreateHttpIsQueryTransformer.ts +13 -13
  390. package/src/transformers/features/http/CreateHttpParameterTransformer.ts +13 -13
  391. package/src/transformers/features/http/CreateHttpQueryTransformer.ts +13 -13
  392. package/src/transformers/features/http/CreateHttpValidateFormDataTransformer.ts +13 -13
  393. package/src/transformers/features/http/CreateHttpValidateHeadersTransformer.ts +13 -13
  394. package/src/transformers/features/http/CreateHttpValidateQueryTransformer.ts +13 -13
  395. package/src/transformers/features/http/HttpAssertFormDataTransformer.ts +13 -13
  396. package/src/transformers/features/http/HttpAssertHeadersTransformer.ts +13 -13
  397. package/src/transformers/features/http/HttpAssertQueryTransformer.ts +13 -13
  398. package/src/transformers/features/http/HttpFormDataTransformer.ts +13 -13
  399. package/src/transformers/features/http/HttpHeadersTransformer.ts +13 -13
  400. package/src/transformers/features/http/HttpIsFormDataTransformer.ts +13 -13
  401. package/src/transformers/features/http/HttpIsHeadersTransformer.ts +13 -13
  402. package/src/transformers/features/http/HttpIsQueryTransformer.ts +13 -13
  403. package/src/transformers/features/http/HttpParameterTransformer.ts +13 -13
  404. package/src/transformers/features/http/HttpQueryTransformer.ts +13 -13
  405. package/src/transformers/features/http/HttpValidateFormDataTransformer.ts +13 -13
  406. package/src/transformers/features/http/HttpValidateHeadersTransformer.ts +13 -13
  407. package/src/transformers/features/http/HttpValidateQueryTransformer.ts +13 -13
  408. package/src/transformers/features/json/JsonApplicationTransformer.ts +105 -105
  409. package/src/transformers/features/json/JsonAssertParseTransformer.ts +13 -13
  410. package/src/transformers/features/json/JsonAssertStringifyTransformer.ts +13 -13
  411. package/src/transformers/features/json/JsonCreateAssertParseTransformer.ts +13 -13
  412. package/src/transformers/features/json/JsonCreateAssertStringifyTransformer.ts +13 -13
  413. package/src/transformers/features/json/JsonCreateIsParseTransformer.ts +13 -13
  414. package/src/transformers/features/json/JsonCreateIsStringifyTransformer.ts +13 -13
  415. package/src/transformers/features/json/JsonCreateStringifyTransformer.ts +13 -13
  416. package/src/transformers/features/json/JsonCreateValidateParseTransformer.ts +13 -13
  417. package/src/transformers/features/json/JsonCreateValidateStringifyProgrammer.ts +13 -13
  418. package/src/transformers/features/json/JsonIsParseTransformer.ts +13 -13
  419. package/src/transformers/features/json/JsonIsStringifyTransformer.ts +13 -13
  420. package/src/transformers/features/json/JsonSchemasTransformer.ts +143 -143
  421. package/src/transformers/features/json/JsonStringifyTransformer.ts +13 -13
  422. package/src/transformers/features/json/JsonValidateParseTransformer.ts +13 -13
  423. package/src/transformers/features/json/JsonValidateStringifyTransformer.ts +13 -13
  424. package/src/transformers/features/llm/LlmApplicationOfValidateTransformer.ts +115 -0
  425. package/src/transformers/features/llm/LlmApplicationTransformer.ts +113 -113
  426. package/src/transformers/features/llm/LlmParametersTransformer.ts +89 -89
  427. package/src/transformers/features/llm/LlmSchemaTransformer.ts +130 -130
  428. package/src/transformers/features/misc/MiscAssertCloneTransformer.ts +13 -13
  429. package/src/transformers/features/misc/MiscAssertPruneTransformer.ts +13 -13
  430. package/src/transformers/features/misc/MiscCloneTransformer.ts +13 -13
  431. package/src/transformers/features/misc/MiscCreateAssertCloneTransformer.ts +13 -13
  432. package/src/transformers/features/misc/MiscCreateAssertPruneTransformer.ts +13 -13
  433. package/src/transformers/features/misc/MiscCreateCloneTransformer.ts +13 -13
  434. package/src/transformers/features/misc/MiscCreateIsCloneTransformer.ts +13 -13
  435. package/src/transformers/features/misc/MiscCreateIsPruneTransformer.ts +13 -13
  436. package/src/transformers/features/misc/MiscCreatePruneTransformer.ts +13 -13
  437. package/src/transformers/features/misc/MiscCreateValidateCloneTransformer.ts +13 -13
  438. package/src/transformers/features/misc/MiscCreateValidatePruneTransformer.ts +13 -13
  439. package/src/transformers/features/misc/MiscIsCloneTransformer.ts +13 -13
  440. package/src/transformers/features/misc/MiscIsPruneTransformer.ts +13 -13
  441. package/src/transformers/features/misc/MiscLiteralsTransformer.ts +35 -35
  442. package/src/transformers/features/misc/MiscPruneTransformer.ts +13 -13
  443. package/src/transformers/features/misc/MiscValidateCloneTransformer.ts +13 -13
  444. package/src/transformers/features/misc/MiscValidatePruneTransformer.ts +13 -13
  445. package/src/transformers/features/notations/NotationAssertGeneralTransformer.ts +20 -20
  446. package/src/transformers/features/notations/NotationCreateAssertGeneralTransformer.ts +20 -20
  447. package/src/transformers/features/notations/NotationCreateGeneralTransformer.ts +20 -20
  448. package/src/transformers/features/notations/NotationCreateIsGeneralTransformer.ts +20 -20
  449. package/src/transformers/features/notations/NotationCreateValidateGeneralTransformer.ts +20 -20
  450. package/src/transformers/features/notations/NotationGeneralTransformer.ts +18 -18
  451. package/src/transformers/features/notations/NotationIsGeneralTransformer.ts +20 -20
  452. package/src/transformers/features/notations/NotationValidateGeneralTransformer.ts +20 -20
  453. package/src/transformers/features/protobuf/ProtobufAssertDecodeTransformer.ts +13 -13
  454. package/src/transformers/features/protobuf/ProtobufAssertEncodeTransformer.ts +13 -13
  455. package/src/transformers/features/protobuf/ProtobufCreateAssertDecodeTransformer.ts +13 -13
  456. package/src/transformers/features/protobuf/ProtobufCreateAssertEncodeTransformer.ts +13 -13
  457. package/src/transformers/features/protobuf/ProtobufCreateDecodeTransformer.ts +13 -13
  458. package/src/transformers/features/protobuf/ProtobufCreateEncodeTransformer.ts +13 -13
  459. package/src/transformers/features/protobuf/ProtobufCreateIsDecodeTransformer.ts +13 -13
  460. package/src/transformers/features/protobuf/ProtobufCreateIsEncodeTransformer.ts +13 -13
  461. package/src/transformers/features/protobuf/ProtobufCreateValidateDecodeTransformer.ts +13 -13
  462. package/src/transformers/features/protobuf/ProtobufCreateValidateEncodeTransformer.ts +13 -13
  463. package/src/transformers/features/protobuf/ProtobufDecodeTransformer.ts +13 -13
  464. package/src/transformers/features/protobuf/ProtobufEncodeTransformer.ts +13 -13
  465. package/src/transformers/features/protobuf/ProtobufIsDecodeTransformer.ts +13 -13
  466. package/src/transformers/features/protobuf/ProtobufIsEncodeTransformer.ts +13 -13
  467. package/src/transformers/features/protobuf/ProtobufMessageTransformer.ts +35 -35
  468. package/src/transformers/features/protobuf/ProtobufValidateDecodeTransformer.ts +13 -13
  469. package/src/transformers/features/protobuf/ProtobufValidateEncodeTransformer.ts +13 -13
  470. package/src/transformers/features/reflect/ReflectMetadataTransformer.ts +69 -69
  471. package/src/transformers/features/reflect/ReflectNameTransformer.ts +82 -82
  472. package/src/transformers/internal/GenericTransformer.ts +101 -101
  473. package/src/utils/MapUtil.ts +14 -14
  474. package/src/utils/NamingConvention.ts +94 -94
  475. package/src/utils/ProtobufNameEncoder.ts +32 -32
  476. 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
+ };