typia 9.4.0 → 9.5.0-dev.20250710

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