typia 7.6.2-dev.20250205 → 7.6.2

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