typia 9.7.1 → 10.0.0-dev.20251107

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 (424) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +153 -153
  3. package/lib/AssertionGuard.d.mts +27 -25
  4. package/lib/AssertionGuard.d.ts +27 -25
  5. package/lib/CamelCase.d.mts +1 -1
  6. package/lib/CamelCase.d.ts +1 -1
  7. package/lib/IRandomGenerator.d.mts +44 -42
  8. package/lib/IRandomGenerator.d.ts +44 -42
  9. package/lib/IReadableURLSearchParams.d.mts +2 -2
  10. package/lib/IReadableURLSearchParams.d.ts +2 -2
  11. package/lib/PascalCase.d.mts +1 -1
  12. package/lib/PascalCase.d.ts +1 -1
  13. package/lib/Primitive.d.mts +20 -22
  14. package/lib/Primitive.d.ts +20 -22
  15. package/lib/Resolved.d.mts +16 -18
  16. package/lib/Resolved.d.ts +16 -18
  17. package/lib/SnakeCase.d.mts +3 -2
  18. package/lib/SnakeCase.d.ts +3 -2
  19. package/lib/TypeGuardError.d.mts +88 -61
  20. package/lib/TypeGuardError.d.ts +88 -61
  21. package/lib/TypeGuardError.js +40 -29
  22. package/lib/TypeGuardError.js.map +1 -1
  23. package/lib/TypeGuardError.mjs +70 -48
  24. package/lib/factories/MetadataCollection.js +4 -12
  25. package/lib/factories/MetadataCollection.js.map +1 -1
  26. package/lib/factories/MetadataCollection.mjs +4 -12
  27. package/lib/factories/MetadataCommentTagFactory.js +5 -15
  28. package/lib/factories/MetadataCommentTagFactory.js.map +1 -1
  29. package/lib/factories/MetadataCommentTagFactory.mjs +5 -15
  30. package/lib/factories/MetadataFactory.js +1 -3
  31. package/lib/factories/MetadataFactory.js.map +1 -1
  32. package/lib/factories/MetadataFactory.mjs +1 -3
  33. package/lib/factories/ProtobufFactory.js +2 -4
  34. package/lib/factories/ProtobufFactory.js.map +1 -1
  35. package/lib/factories/ProtobufFactory.mjs +2 -4
  36. package/lib/functional.d.mts +196 -195
  37. package/lib/functional.d.ts +196 -195
  38. package/lib/functional.js +18 -54
  39. package/lib/functional.js.map +1 -1
  40. package/lib/functional.mjs +18 -54
  41. package/lib/http.d.mts +303 -319
  42. package/lib/http.d.ts +303 -319
  43. package/lib/http.js +26 -78
  44. package/lib/http.js.map +1 -1
  45. package/lib/http.mjs +26 -78
  46. package/lib/internal/_ProtobufReader.d.mts +3 -9
  47. package/lib/internal/_ProtobufReader.d.ts +3 -9
  48. package/lib/internal/_ProtobufReader.js.map +1 -1
  49. package/lib/internal/_ProtobufReader.mjs +3 -9
  50. package/lib/internal/_ProtobufSizer.d.mts +4 -12
  51. package/lib/internal/_ProtobufSizer.d.ts +4 -12
  52. package/lib/internal/_ProtobufSizer.js.map +1 -1
  53. package/lib/internal/_ProtobufSizer.mjs +4 -12
  54. package/lib/internal/_ProtobufWriter.d.mts +5 -15
  55. package/lib/internal/_ProtobufWriter.d.ts +5 -15
  56. package/lib/internal/_ProtobufWriter.js.map +1 -1
  57. package/lib/internal/_ProtobufWriter.mjs +5 -15
  58. package/lib/internal/_jsonStringifyString.d.mts +4 -4
  59. package/lib/internal/_jsonStringifyString.d.ts +4 -4
  60. package/lib/internal/_jsonStringifyString.js +4 -4
  61. package/lib/internal/_jsonStringifyString.mjs +4 -4
  62. package/lib/json.d.mts +174 -195
  63. package/lib/json.d.ts +174 -195
  64. package/lib/json.js +16 -48
  65. package/lib/json.js.map +1 -1
  66. package/lib/json.mjs +16 -48
  67. package/lib/llm.d.mts +275 -192
  68. package/lib/llm.d.ts +275 -192
  69. package/lib/llm.js +4 -12
  70. package/lib/llm.js.map +1 -1
  71. package/lib/llm.mjs +4 -12
  72. package/lib/misc.d.mts +149 -172
  73. package/lib/misc.d.ts +149 -172
  74. package/lib/misc.js +17 -51
  75. package/lib/misc.js.map +1 -1
  76. package/lib/misc.mjs +17 -51
  77. package/lib/module.d.mts +263 -275
  78. package/lib/module.d.ts +263 -275
  79. package/lib/module.js +18 -54
  80. package/lib/module.js.map +1 -1
  81. package/lib/module.mjs +18 -54
  82. package/lib/notations.d.mts +153 -174
  83. package/lib/notations.d.ts +153 -174
  84. package/lib/notations.js +24 -72
  85. package/lib/notations.js.map +1 -1
  86. package/lib/notations.mjs +24 -72
  87. package/lib/programmers/FeatureProgrammer.d.mts +19 -41
  88. package/lib/programmers/FeatureProgrammer.d.ts +19 -41
  89. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  90. package/lib/programmers/ImportProgrammer.js +3 -9
  91. package/lib/programmers/ImportProgrammer.js.map +1 -1
  92. package/lib/programmers/ImportProgrammer.mjs +3 -9
  93. package/lib/programmers/RandomProgrammer.js +6 -0
  94. package/lib/programmers/RandomProgrammer.js.map +1 -1
  95. package/lib/programmers/RandomProgrammer.mjs +6 -0
  96. package/lib/programmers/helpers/ProtobufWire.d.mts +13 -13
  97. package/lib/programmers/helpers/ProtobufWire.d.ts +13 -13
  98. package/lib/programmers/internal/check_array_length.js +2 -6
  99. package/lib/programmers/internal/check_array_length.js.map +1 -1
  100. package/lib/programmers/internal/check_array_length.mjs +2 -6
  101. package/lib/programmers/internal/check_bigint.js +2 -6
  102. package/lib/programmers/internal/check_bigint.js.map +1 -1
  103. package/lib/programmers/internal/check_bigint.mjs +2 -6
  104. package/lib/programmers/internal/check_dynamic_key.js +2 -6
  105. package/lib/programmers/internal/check_dynamic_key.js.map +1 -1
  106. package/lib/programmers/internal/check_dynamic_key.mjs +2 -6
  107. package/lib/programmers/internal/check_dynamic_properties.js +3 -9
  108. package/lib/programmers/internal/check_dynamic_properties.js.map +1 -1
  109. package/lib/programmers/internal/check_dynamic_properties.mjs +3 -9
  110. package/lib/programmers/internal/check_everything.js +1 -3
  111. package/lib/programmers/internal/check_everything.js.map +1 -1
  112. package/lib/programmers/internal/check_everything.mjs +1 -3
  113. package/lib/programmers/internal/check_native.js +2 -6
  114. package/lib/programmers/internal/check_native.js.map +1 -1
  115. package/lib/programmers/internal/check_native.mjs +2 -6
  116. package/lib/programmers/internal/check_number.js +2 -6
  117. package/lib/programmers/internal/check_number.js.map +1 -1
  118. package/lib/programmers/internal/check_number.mjs +2 -6
  119. package/lib/programmers/internal/check_object.js +2 -6
  120. package/lib/programmers/internal/check_object.js.map +1 -1
  121. package/lib/programmers/internal/check_object.mjs +2 -6
  122. package/lib/programmers/internal/check_string.js +2 -6
  123. package/lib/programmers/internal/check_string.js.map +1 -1
  124. package/lib/programmers/internal/check_string.mjs +2 -6
  125. package/lib/programmers/internal/check_template.js +1 -3
  126. package/lib/programmers/internal/check_template.js.map +1 -1
  127. package/lib/programmers/internal/check_template.mjs +1 -3
  128. package/lib/programmers/internal/check_union_array_like.js +1 -3
  129. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  130. package/lib/programmers/internal/check_union_array_like.mjs +1 -3
  131. package/lib/programmers/internal/decode_union_object.js +2 -6
  132. package/lib/programmers/internal/decode_union_object.js.map +1 -1
  133. package/lib/programmers/internal/decode_union_object.mjs +2 -6
  134. package/lib/programmers/internal/feature_object_entries.js +1 -3
  135. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  136. package/lib/programmers/internal/feature_object_entries.mjs +1 -3
  137. package/lib/programmers/internal/json_schema_escaped.js +2 -6
  138. package/lib/programmers/internal/json_schema_escaped.js.map +1 -1
  139. package/lib/programmers/internal/json_schema_escaped.mjs +2 -6
  140. package/lib/programmers/internal/json_schema_object.js +3 -9
  141. package/lib/programmers/internal/json_schema_object.js.map +1 -1
  142. package/lib/programmers/internal/json_schema_object.mjs +3 -9
  143. package/lib/programmers/internal/json_schema_station.d.mts +2 -2
  144. package/lib/programmers/internal/json_schema_station.d.ts +2 -2
  145. package/lib/programmers/internal/metadata_to_pattern.js +1 -3
  146. package/lib/programmers/internal/metadata_to_pattern.js.map +1 -1
  147. package/lib/programmers/internal/metadata_to_pattern.mjs +1 -3
  148. package/lib/programmers/internal/postfix_of_tuple.js +1 -3
  149. package/lib/programmers/internal/postfix_of_tuple.js.map +1 -1
  150. package/lib/programmers/internal/postfix_of_tuple.mjs +1 -3
  151. package/lib/programmers/internal/prune_object_properties.js +1 -3
  152. package/lib/programmers/internal/prune_object_properties.js.map +1 -1
  153. package/lib/programmers/internal/prune_object_properties.mjs +1 -3
  154. package/lib/programmers/internal/stringify_dynamic_properties.js +2 -6
  155. package/lib/programmers/internal/stringify_dynamic_properties.js.map +1 -1
  156. package/lib/programmers/internal/stringify_dynamic_properties.mjs +2 -6
  157. package/lib/programmers/internal/stringify_native.js +1 -3
  158. package/lib/programmers/internal/stringify_native.js.map +1 -1
  159. package/lib/programmers/internal/stringify_native.mjs +1 -3
  160. package/lib/programmers/internal/stringify_regular_properties.js +2 -6
  161. package/lib/programmers/internal/stringify_regular_properties.js.map +1 -1
  162. package/lib/programmers/internal/stringify_regular_properties.mjs +2 -6
  163. package/lib/programmers/internal/template_to_pattern.js +1 -3
  164. package/lib/programmers/internal/template_to_pattern.js.map +1 -1
  165. package/lib/programmers/internal/template_to_pattern.mjs +1 -3
  166. package/lib/programmers/internal/wrap_metadata_rest_tuple.js +1 -3
  167. package/lib/programmers/internal/wrap_metadata_rest_tuple.js.map +1 -1
  168. package/lib/programmers/internal/wrap_metadata_rest_tuple.mjs +1 -3
  169. package/lib/programmers/json/JsonStringifyProgrammer.js +2 -2
  170. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  171. package/lib/programmers/json/JsonStringifyProgrammer.mjs +2 -2
  172. package/lib/programmers/llm/LlmApplicationProgrammer.js +5 -1
  173. package/lib/programmers/llm/LlmApplicationProgrammer.js.map +1 -1
  174. package/lib/programmers/llm/LlmApplicationProgrammer.mjs +5 -1
  175. package/lib/programmers/llm/LlmSchemaProgrammer.js +1 -4
  176. package/lib/programmers/llm/LlmSchemaProgrammer.js.map +1 -1
  177. package/lib/programmers/llm/LlmSchemaProgrammer.mjs +1 -35
  178. package/lib/protobuf.d.mts +290 -297
  179. package/lib/protobuf.d.ts +290 -297
  180. package/lib/protobuf.js +17 -51
  181. package/lib/protobuf.js.map +1 -1
  182. package/lib/protobuf.mjs +17 -51
  183. package/lib/reflect.d.mts +2 -4
  184. package/lib/reflect.d.ts +2 -4
  185. package/lib/reflect.js +1 -3
  186. package/lib/reflect.js.map +1 -1
  187. package/lib/reflect.mjs +1 -3
  188. package/lib/schemas/json/IJsonApplication.d.mts +4 -4
  189. package/lib/schemas/json/IJsonApplication.d.ts +4 -4
  190. package/lib/schemas/json/IJsonSchemaCollection.d.mts +73 -56
  191. package/lib/schemas/json/IJsonSchemaCollection.d.ts +73 -56
  192. package/lib/schemas/json/IJsonSchemaUnit.d.mts +83 -70
  193. package/lib/schemas/json/IJsonSchemaUnit.d.ts +83 -70
  194. package/lib/schemas/metadata/Metadata.d.mts +1 -3
  195. package/lib/schemas/metadata/Metadata.d.ts +1 -3
  196. package/lib/schemas/metadata/Metadata.js +9 -27
  197. package/lib/schemas/metadata/Metadata.js.map +1 -1
  198. package/lib/schemas/metadata/Metadata.mjs +9 -27
  199. package/lib/schemas/metadata/MetadataAliasType.d.mts +1 -3
  200. package/lib/schemas/metadata/MetadataAliasType.d.ts +1 -3
  201. package/lib/schemas/metadata/MetadataAliasType.js +3 -9
  202. package/lib/schemas/metadata/MetadataAliasType.js.map +1 -1
  203. package/lib/schemas/metadata/MetadataAliasType.mjs +3 -9
  204. package/lib/schemas/metadata/MetadataApplication.d.mts +1 -3
  205. package/lib/schemas/metadata/MetadataApplication.d.ts +1 -3
  206. package/lib/schemas/metadata/MetadataApplication.js +2 -6
  207. package/lib/schemas/metadata/MetadataApplication.js.map +1 -1
  208. package/lib/schemas/metadata/MetadataApplication.mjs +2 -6
  209. package/lib/schemas/metadata/MetadataArray.d.mts +1 -3
  210. package/lib/schemas/metadata/MetadataArray.d.ts +1 -3
  211. package/lib/schemas/metadata/MetadataArray.js +1 -3
  212. package/lib/schemas/metadata/MetadataArray.js.map +1 -1
  213. package/lib/schemas/metadata/MetadataArray.mjs +1 -3
  214. package/lib/schemas/metadata/MetadataArrayType.d.mts +1 -3
  215. package/lib/schemas/metadata/MetadataArrayType.d.ts +1 -3
  216. package/lib/schemas/metadata/MetadataArrayType.js +3 -9
  217. package/lib/schemas/metadata/MetadataArrayType.js.map +1 -1
  218. package/lib/schemas/metadata/MetadataArrayType.mjs +3 -9
  219. package/lib/schemas/metadata/MetadataAtomic.js +1 -3
  220. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  221. package/lib/schemas/metadata/MetadataAtomic.mjs +1 -3
  222. package/lib/schemas/metadata/MetadataEscaped.d.mts +1 -3
  223. package/lib/schemas/metadata/MetadataEscaped.d.ts +1 -3
  224. package/lib/schemas/metadata/MetadataEscaped.js +3 -9
  225. package/lib/schemas/metadata/MetadataEscaped.js.map +1 -1
  226. package/lib/schemas/metadata/MetadataEscaped.mjs +3 -9
  227. package/lib/schemas/metadata/MetadataFunction.d.mts +1 -3
  228. package/lib/schemas/metadata/MetadataFunction.d.ts +1 -3
  229. package/lib/schemas/metadata/MetadataFunction.js +2 -6
  230. package/lib/schemas/metadata/MetadataFunction.js.map +1 -1
  231. package/lib/schemas/metadata/MetadataFunction.mjs +2 -6
  232. package/lib/schemas/metadata/MetadataObject.d.mts +1 -3
  233. package/lib/schemas/metadata/MetadataObject.d.ts +1 -3
  234. package/lib/schemas/metadata/MetadataObject.js +1 -3
  235. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  236. package/lib/schemas/metadata/MetadataObject.mjs +1 -3
  237. package/lib/schemas/metadata/MetadataObjectType.d.mts +1 -3
  238. package/lib/schemas/metadata/MetadataObjectType.d.ts +1 -3
  239. package/lib/schemas/metadata/MetadataObjectType.js +5 -15
  240. package/lib/schemas/metadata/MetadataObjectType.js.map +1 -1
  241. package/lib/schemas/metadata/MetadataObjectType.mjs +6 -18
  242. package/lib/schemas/metadata/MetadataParameter.js +1 -3
  243. package/lib/schemas/metadata/MetadataParameter.js.map +1 -1
  244. package/lib/schemas/metadata/MetadataParameter.mjs +1 -3
  245. package/lib/schemas/metadata/MetadataProperty.d.mts +1 -3
  246. package/lib/schemas/metadata/MetadataProperty.d.ts +1 -3
  247. package/lib/schemas/metadata/MetadataProperty.js +3 -9
  248. package/lib/schemas/metadata/MetadataProperty.js.map +1 -1
  249. package/lib/schemas/metadata/MetadataProperty.mjs +3 -9
  250. package/lib/schemas/metadata/MetadataTemplate.js +1 -3
  251. package/lib/schemas/metadata/MetadataTemplate.js.map +1 -1
  252. package/lib/schemas/metadata/MetadataTemplate.mjs +1 -3
  253. package/lib/schemas/metadata/MetadataTuple.d.mts +1 -3
  254. package/lib/schemas/metadata/MetadataTuple.d.ts +1 -3
  255. package/lib/schemas/metadata/MetadataTuple.js +2 -6
  256. package/lib/schemas/metadata/MetadataTuple.js.map +1 -1
  257. package/lib/schemas/metadata/MetadataTuple.mjs +2 -6
  258. package/lib/schemas/metadata/MetadataTupleType.js +2 -6
  259. package/lib/schemas/metadata/MetadataTupleType.js.map +1 -1
  260. package/lib/schemas/metadata/MetadataTupleType.mjs +3 -9
  261. package/lib/tags/Constant.d.mts +16 -16
  262. package/lib/tags/Constant.d.ts +16 -16
  263. package/lib/tags/ContentMediaType.d.mts +7 -7
  264. package/lib/tags/ContentMediaType.d.ts +7 -7
  265. package/lib/tags/Default.d.mts +19 -19
  266. package/lib/tags/Default.d.ts +19 -19
  267. package/lib/tags/Example.d.mts +18 -18
  268. package/lib/tags/Example.d.ts +18 -18
  269. package/lib/tags/Examples.d.mts +23 -23
  270. package/lib/tags/Examples.d.ts +23 -23
  271. package/lib/tags/ExclusiveMaximum.d.mts +8 -5
  272. package/lib/tags/ExclusiveMaximum.d.ts +8 -5
  273. package/lib/tags/ExclusiveMinimum.d.mts +8 -5
  274. package/lib/tags/ExclusiveMinimum.d.ts +8 -5
  275. package/lib/tags/Format.d.mts +12 -8
  276. package/lib/tags/Format.d.ts +12 -8
  277. package/lib/tags/JsonSchemaPlugin.d.mts +20 -18
  278. package/lib/tags/JsonSchemaPlugin.d.ts +20 -18
  279. package/lib/tags/MaxItems.d.mts +9 -9
  280. package/lib/tags/MaxItems.d.ts +9 -9
  281. package/lib/tags/MaxLength.d.mts +6 -5
  282. package/lib/tags/MaxLength.d.ts +6 -5
  283. package/lib/tags/Maximum.d.mts +9 -7
  284. package/lib/tags/Maximum.d.ts +9 -7
  285. package/lib/tags/MinItems.d.mts +9 -9
  286. package/lib/tags/MinItems.d.ts +9 -9
  287. package/lib/tags/MinLength.d.mts +6 -5
  288. package/lib/tags/MinLength.d.ts +6 -5
  289. package/lib/tags/Minimum.d.mts +9 -7
  290. package/lib/tags/Minimum.d.ts +9 -7
  291. package/lib/tags/MultipleOf.d.mts +10 -7
  292. package/lib/tags/MultipleOf.d.ts +10 -7
  293. package/lib/tags/Pattern.d.mts +7 -4
  294. package/lib/tags/Pattern.d.ts +7 -4
  295. package/lib/tags/Sequence.d.mts +19 -17
  296. package/lib/tags/Sequence.d.ts +19 -17
  297. package/lib/tags/TagBase.d.mts +21 -28
  298. package/lib/tags/TagBase.d.ts +21 -28
  299. package/lib/tags/Type.d.mts +12 -11
  300. package/lib/tags/Type.d.ts +12 -11
  301. package/lib/tags/UniqueItems.d.mts +10 -9
  302. package/lib/tags/UniqueItems.d.ts +10 -9
  303. package/lib/tags/internal/FormatCheatSheet.d.mts +1 -3
  304. package/lib/tags/internal/FormatCheatSheet.d.ts +1 -3
  305. package/lib/tags/internal/FormatCheatSheet.js +1 -3
  306. package/lib/tags/internal/FormatCheatSheet.js.map +1 -1
  307. package/lib/tags/internal/FormatCheatSheet.mjs +1 -3
  308. package/lib/transformers/ITransformOptions.d.mts +27 -19
  309. package/lib/transformers/ITransformOptions.d.ts +27 -19
  310. package/lib/transformers/ImportTransformer.js +5 -10
  311. package/lib/transformers/ImportTransformer.js.map +1 -1
  312. package/lib/transformers/ImportTransformer.mjs +5 -10
  313. package/lib/transformers/NoTransformConfigurationError.js +1 -3
  314. package/lib/transformers/NoTransformConfigurationError.js.map +1 -1
  315. package/lib/transformers/NoTransformConfigurationError.mjs +1 -3
  316. package/lib/transformers/features/llm/LlmApplicationTransformer.js +1 -3
  317. package/lib/transformers/features/llm/LlmApplicationTransformer.js.map +1 -1
  318. package/lib/transformers/features/llm/LlmApplicationTransformer.mjs +1 -3
  319. package/lib/typings/Equal.d.mts +6 -6
  320. package/lib/typings/Equal.d.ts +6 -6
  321. package/package.json +121 -120
  322. package/src/AssertionGuard.ts +41 -39
  323. package/src/CamelCase.ts +75 -75
  324. package/src/IRandomGenerator.ts +337 -335
  325. package/src/IReadableURLSearchParams.ts +9 -9
  326. package/src/PascalCase.ts +71 -71
  327. package/src/Primitive.ts +90 -92
  328. package/src/Resolved.ts +72 -74
  329. package/src/SnakeCase.ts +127 -126
  330. package/src/TypeGuardError.ts +216 -179
  331. package/src/factories/MetadataCollection.ts +270 -278
  332. package/src/factories/MetadataCommentTagFactory.ts +632 -648
  333. package/src/factories/MetadataFactory.ts +402 -404
  334. package/src/factories/ProtobufFactory.ts +873 -875
  335. package/src/functional.ts +705 -740
  336. package/src/http.ts +972 -1040
  337. package/src/internal/_ProtobufReader.ts +188 -194
  338. package/src/internal/_ProtobufSizer.ts +137 -145
  339. package/src/internal/_ProtobufWriter.ts +135 -145
  340. package/src/internal/_jsonStringifyString.ts +42 -42
  341. package/src/json.ts +643 -696
  342. package/src/llm.ts +615 -540
  343. package/src/misc.ts +594 -651
  344. package/src/module.ts +889 -937
  345. package/src/notations.ts +751 -820
  346. package/src/programmers/FeatureProgrammer.ts +605 -627
  347. package/src/programmers/ImportProgrammer.ts +179 -185
  348. package/src/programmers/RandomProgrammer.ts +1195 -1190
  349. package/src/programmers/helpers/ProtobufWire.ts +34 -34
  350. package/src/programmers/internal/check_array_length.ts +43 -47
  351. package/src/programmers/internal/check_bigint.ts +46 -50
  352. package/src/programmers/internal/check_dynamic_key.ts +197 -201
  353. package/src/programmers/internal/check_dynamic_properties.ts +231 -237
  354. package/src/programmers/internal/check_everything.ts +21 -23
  355. package/src/programmers/internal/check_native.ts +23 -27
  356. package/src/programmers/internal/check_number.ts +108 -112
  357. package/src/programmers/internal/check_object.ts +72 -78
  358. package/src/programmers/internal/check_string.ts +46 -50
  359. package/src/programmers/internal/check_template.ts +46 -48
  360. package/src/programmers/internal/check_union_array_like.ts +331 -335
  361. package/src/programmers/internal/decode_union_object.ts +110 -116
  362. package/src/programmers/internal/feature_object_entries.ts +59 -61
  363. package/src/programmers/internal/json_schema_escaped.ts +78 -82
  364. package/src/programmers/internal/json_schema_object.ts +150 -158
  365. package/src/programmers/internal/json_schema_station.ts +2 -2
  366. package/src/programmers/internal/metadata_to_pattern.ts +40 -42
  367. package/src/programmers/internal/postfix_of_tuple.ts +3 -5
  368. package/src/programmers/internal/prune_object_properties.ts +69 -71
  369. package/src/programmers/internal/stringify_dynamic_properties.ts +158 -162
  370. package/src/programmers/internal/stringify_native.ts +5 -7
  371. package/src/programmers/internal/stringify_regular_properties.ts +77 -81
  372. package/src/programmers/internal/template_to_pattern.ts +21 -23
  373. package/src/programmers/internal/wrap_metadata_rest_tuple.ts +21 -23
  374. package/src/programmers/json/JsonStringifyProgrammer.ts +1124 -1124
  375. package/src/programmers/llm/LlmApplicationProgrammer.ts +10 -1
  376. package/src/programmers/llm/LlmSchemaProgrammer.ts +2 -7
  377. package/src/protobuf.ts +820 -861
  378. package/src/reflect.ts +46 -50
  379. package/src/schemas/json/IJsonApplication.ts +77 -77
  380. package/src/schemas/json/IJsonSchemaCollection.ts +212 -195
  381. package/src/schemas/json/IJsonSchemaUnit.ts +263 -250
  382. package/src/schemas/metadata/IMetadataTypeTag.ts +14 -16
  383. package/src/schemas/metadata/Metadata.ts +669 -687
  384. package/src/schemas/metadata/MetadataAliasType.ts +57 -63
  385. package/src/schemas/metadata/MetadataApplication.ts +40 -44
  386. package/src/schemas/metadata/MetadataArray.ts +47 -49
  387. package/src/schemas/metadata/MetadataArrayType.ts +51 -57
  388. package/src/schemas/metadata/MetadataAtomic.ts +85 -87
  389. package/src/schemas/metadata/MetadataEscaped.ts +45 -51
  390. package/src/schemas/metadata/MetadataFunction.ts +45 -49
  391. package/src/schemas/metadata/MetadataObject.ts +46 -48
  392. package/src/schemas/metadata/MetadataObjectType.ts +137 -149
  393. package/src/schemas/metadata/MetadataParameter.ts +52 -54
  394. package/src/schemas/metadata/MetadataProperty.ts +53 -59
  395. package/src/schemas/metadata/MetadataTemplate.ts +78 -80
  396. package/src/schemas/metadata/MetadataTuple.ts +28 -32
  397. package/src/schemas/metadata/MetadataTupleType.ts +61 -67
  398. package/src/tags/Constant.ts +47 -47
  399. package/src/tags/ContentMediaType.ts +27 -27
  400. package/src/tags/Default.ts +52 -52
  401. package/src/tags/Example.ts +56 -56
  402. package/src/tags/Examples.ts +56 -56
  403. package/src/tags/ExclusiveMaximum.ts +44 -41
  404. package/src/tags/ExclusiveMinimum.ts +44 -41
  405. package/src/tags/Format.ts +78 -74
  406. package/src/tags/JsonSchemaPlugin.ts +36 -34
  407. package/src/tags/MaxItems.ts +31 -31
  408. package/src/tags/MaxLength.ts +25 -24
  409. package/src/tags/Maximum.ts +39 -37
  410. package/src/tags/MinItems.ts +31 -31
  411. package/src/tags/MinLength.ts +25 -24
  412. package/src/tags/Minimum.ts +39 -37
  413. package/src/tags/MultipleOf.ts +42 -39
  414. package/src/tags/Pattern.ts +49 -46
  415. package/src/tags/Sequence.ts +37 -35
  416. package/src/tags/TagBase.ts +102 -109
  417. package/src/tags/Type.ts +64 -63
  418. package/src/tags/UniqueItems.ts +34 -33
  419. package/src/tags/internal/FormatCheatSheet.ts +71 -73
  420. package/src/transformers/ITransformOptions.ts +70 -62
  421. package/src/transformers/ImportTransformer.ts +253 -258
  422. package/src/transformers/NoTransformConfigurationError.ts +16 -18
  423. package/src/transformers/features/llm/LlmApplicationTransformer.ts +224 -226
  424. package/src/typings/Equal.ts +18 -18
@@ -1,687 +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
- * @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
+ /** @ignore */
55
+ private constructor(props: ClassProperties<Metadata>) {
56
+ this.any = props.any;
57
+ this.required = props.required;
58
+ this.optional = props.optional;
59
+ this.nullable = props.nullable;
60
+ this.functions = props.functions;
61
+
62
+ this.escaped = props.escaped;
63
+ this.atomics = props.atomics;
64
+ this.constants = props.constants;
65
+ this.templates = props.templates;
66
+
67
+ this.rest = props.rest;
68
+ this.arrays = props.arrays;
69
+ this.tuples = props.tuples;
70
+ this.objects = props.objects;
71
+ this.aliases = props.aliases;
72
+
73
+ this.natives = props.natives;
74
+ this.sets = props.sets;
75
+ this.maps = props.maps;
76
+ }
77
+
78
+ /** @internal */
79
+ public static create(props: ClassProperties<Metadata>): Metadata {
80
+ return new Metadata(props);
81
+ }
82
+
83
+ /** @internal */
84
+ public static initialize(parentResolved: boolean = false): Metadata {
85
+ const meta: Metadata = Metadata.create({
86
+ any: false,
87
+ nullable: false,
88
+ required: true,
89
+ optional: false,
90
+
91
+ escaped: null,
92
+ constants: [],
93
+ atomics: [],
94
+ templates: [],
95
+ arrays: [],
96
+ tuples: [],
97
+ objects: [],
98
+ aliases: [],
99
+ functions: [],
100
+
101
+ rest: null,
102
+ natives: [],
103
+ sets: [],
104
+ maps: [],
105
+ });
106
+ meta.parent_resolved_ = parentResolved;
107
+ return meta;
108
+ }
109
+
110
+ public toJSON(): IMetadata {
111
+ return {
112
+ any: this.any,
113
+ required: this.required,
114
+ optional: this.optional,
115
+ nullable: this.nullable,
116
+ functions: this.functions.map((f) => f.toJSON()),
117
+
118
+ atomics: this.atomics.map((a) => a.toJSON()),
119
+ constants: this.constants.map((c) => c.toJSON()),
120
+ templates: this.templates.map((tpl) => tpl.toJSON()),
121
+ escaped: this.escaped ? this.escaped.toJSON() : null,
122
+
123
+ rest: this.rest ? this.rest.toJSON() : null,
124
+ arrays: this.arrays.map((array) => array.toJSON()),
125
+ tuples: this.tuples.map((tuple) => tuple.toJSON()),
126
+ objects: this.objects.map((obj) => obj.toJSON()),
127
+ aliases: this.aliases.map((alias) => alias.toJSON()),
128
+
129
+ natives: this.natives.map((native) => native.toJSON()),
130
+ sets: this.sets.map((set) => set.toJSON()),
131
+ maps: this.maps.map((map) => map.toJSON()),
132
+ };
133
+ }
134
+
135
+ public static from(meta: IMetadata, dict: IMetadataDictionary): Metadata {
136
+ return Metadata.create({
137
+ any: meta.any,
138
+ required: meta.required,
139
+ optional: meta.optional,
140
+ nullable: meta.nullable,
141
+ functions: meta.functions.map((f) => MetadataFunction.from(f, dict)),
142
+
143
+ constants: meta.constants.map(MetadataConstant.from),
144
+ atomics: meta.atomics.map(MetadataAtomic.from),
145
+ templates: meta.templates.map((tpl) => MetadataTemplate.from(tpl, dict)),
146
+ escaped: meta.escaped ? MetadataEscaped.from(meta.escaped, dict) : null,
147
+
148
+ rest: meta.rest ? this.from(meta.rest, dict) : null,
149
+ arrays: meta.arrays.map((ref) => {
150
+ const type = dict.arrays.get(ref.name);
151
+ if (type === undefined)
152
+ throw new RangeError(
153
+ `Error on Metadata.from(): failed to find array "${ref.name}".`,
154
+ );
155
+ return MetadataArray.create({
156
+ type,
157
+ tags: ref.tags.map((row) => row.slice()),
158
+ });
159
+ }),
160
+ tuples: meta.tuples.map((t) => {
161
+ const type = dict.tuples.get(t.name);
162
+ if (type === undefined)
163
+ throw new RangeError(
164
+ `Error on Metadata.from(): failed to find tuple "${t.name}".`,
165
+ );
166
+ return MetadataTuple.create({
167
+ type,
168
+ tags: t.tags.map((r) => r.slice()),
169
+ });
170
+ }),
171
+ objects: meta.objects.map((obj) => {
172
+ const found = dict.objects.get(obj.name);
173
+ if (found === undefined)
174
+ throw new RangeError(
175
+ `Error on Metadata.from(): failed to find object "${name}".`,
176
+ );
177
+ return MetadataObject.create({
178
+ type: found,
179
+ tags: obj.tags.map((r) => r.slice()),
180
+ });
181
+ }),
182
+ aliases: meta.aliases.map((alias) => {
183
+ const type = dict.aliases.get(alias.name);
184
+ if (type === undefined)
185
+ throw new RangeError(
186
+ `Error on Metadata.from(): failed to find alias "${alias}".`,
187
+ );
188
+ return MetadataAlias.create({
189
+ type,
190
+ tags: alias.tags.map((r) => r.slice()),
191
+ });
192
+ }),
193
+ natives: meta.natives.map((native) => MetadataNative.create(native)),
194
+ sets: meta.sets.map((set) =>
195
+ MetadataSet.create({
196
+ value: Metadata.from(set.value, dict),
197
+ tags: set.tags.map((r) => r.slice()),
198
+ }),
199
+ ),
200
+ maps: meta.maps.map((map) =>
201
+ MetadataMap.create({
202
+ key: this.from(map.key, dict),
203
+ value: this.from(map.value, dict),
204
+ tags: map.tags.map((r) => r.slice()),
205
+ }),
206
+ ),
207
+ });
208
+ }
209
+
210
+ /* -----------------------------------------------------------
211
+ ACCESSORS
212
+ ----------------------------------------------------------- */
213
+ public getName(): string {
214
+ return (this.name_ ??= getName(this));
215
+ }
216
+
217
+ public empty(): boolean {
218
+ return this.bucket() === 0 || this.size() === 0;
219
+ }
220
+
221
+ public size(): number {
222
+ return (
223
+ (this.any ? 1 : 0) +
224
+ (this.escaped ? 1 : 0) +
225
+ (this.rest ? this.rest.size() : 0) +
226
+ this.templates.length +
227
+ this.atomics.length +
228
+ this.constants.map((c) => c.values.length).reduce((x, y) => x + y, 0) +
229
+ this.arrays.length +
230
+ this.tuples.length +
231
+ this.natives.length +
232
+ this.maps.length +
233
+ this.sets.length +
234
+ this.objects.length +
235
+ this.functions.length +
236
+ this.aliases.length
237
+ );
238
+ }
239
+
240
+ public bucket(): number {
241
+ return (
242
+ (this.any ? 1 : 0) +
243
+ (this.escaped ? 1 : 0) +
244
+ (this.templates.length ? 1 : 0) +
245
+ (this.atomics.length ? 1 : 0) +
246
+ (this.constants.length ? 1 : 0) +
247
+ (this.rest ? this.rest.size() : 0) +
248
+ (this.arrays.length ? 1 : 0) +
249
+ (this.tuples.length ? 1 : 0) +
250
+ (this.natives.length ? 1 : 0) +
251
+ (this.sets.length ? 1 : 0) +
252
+ (this.maps.length ? 1 : 0) +
253
+ (this.objects.length ? 1 : 0) +
254
+ (this.functions.length ? 1 : 0) +
255
+ (this.aliases.length ? 1 : 0)
256
+ );
257
+ }
258
+
259
+ /** @internal */
260
+ public isSequence(): boolean {
261
+ return (this.is_sequence_ ??= (() => {
262
+ const exists = (tags: IMetadataTypeTag[][]): boolean =>
263
+ tags.some((row) => {
264
+ const sequence = row.find(
265
+ (t) =>
266
+ t.kind === "sequence" &&
267
+ typeof (t.schema as any)?.["x-protobuf-sequence"] === "number",
268
+ );
269
+ if (sequence === undefined) return false;
270
+ const value: number = Number(
271
+ (sequence.schema as any)["x-protobuf-sequence"],
272
+ );
273
+ return !Number.isNaN(value);
274
+ });
275
+ return (
276
+ this.atomics.some((atomic) => exists(atomic.tags)) &&
277
+ this.constants.some((c) =>
278
+ c.values.some((v) => exists(v.tags ?? [])),
279
+ ) &&
280
+ this.templates.some((tpl) => exists(tpl.tags)) &&
281
+ this.arrays.some((array) => exists(array.tags)) &&
282
+ this.objects.some((object) => exists(object.tags)) &&
283
+ this.natives.some(
284
+ (native) => native.name === "Uint8Array" && exists(native.tags),
285
+ )
286
+ );
287
+ })());
288
+ }
289
+
290
+ public isConstant(): boolean {
291
+ return this.bucket() === (this.constants.length ? 1 : 0);
292
+ }
293
+
294
+ public isRequired(): boolean {
295
+ return this.required === true && this.optional === false;
296
+ }
297
+
298
+ /** @internal */
299
+ public isUnionBucket(): boolean {
300
+ const size: number = this.bucket();
301
+ const emended: number =
302
+ !!this.atomics.length && !!this.constants.length ? size - 1 : size;
303
+ return emended > 1;
304
+ }
305
+
306
+ /** @internal */
307
+ public getSoleLiteral(): string | null {
308
+ if (
309
+ this.size() === 1 &&
310
+ this.constants.length === 1 &&
311
+ this.constants[0]!.type === "string" &&
312
+ this.constants[0]!.values.length === 1
313
+ )
314
+ return this.constants[0]!.values[0]!.value as string;
315
+ else return null;
316
+ }
317
+
318
+ public isSoleLiteral(): boolean {
319
+ return this.getSoleLiteral() !== null;
320
+ }
321
+
322
+ /** @internal */
323
+ public isParentResolved(): boolean {
324
+ return this.parent_resolved_;
325
+ }
326
+ }
327
+ export namespace Metadata {
328
+ export const intersects = (x: Metadata, y: Metadata): boolean => {
329
+ // CHECK ANY & OPTIONAL
330
+ if (x.any || y.any) return true;
331
+ if (x.isRequired() === false && false === y.isRequired()) return true;
332
+ if (x.nullable === true && true === y.nullable) return true;
333
+ if (!!x.functions.length && !!y.functions.length === true) return true;
334
+
335
+ //----
336
+ // INSTANCES
337
+ //----
338
+ // ARRAYS
339
+ if (x.arrays.length && y.arrays.length) return true;
340
+ if (x.tuples.length && y.tuples.length) return true;
341
+ if (x.objects.length && y.objects.length) return true;
342
+ if (x.aliases.length && y.aliases.length) return true;
343
+
344
+ // NATIVES
345
+ if (x.natives.length && y.natives.length)
346
+ if (x.natives.some((xn) => y.natives.some((yn) => xn === yn)))
347
+ return true;
348
+
349
+ // ESCAPED
350
+ if (x.escaped && y.escaped)
351
+ return (
352
+ intersects(x.escaped.original, y.escaped.original) ||
353
+ intersects(x.escaped.returns, y.escaped.returns)
354
+ );
355
+
356
+ //----
357
+ // VALUES
358
+ //----
359
+ // ATOMICS
360
+ for (const atomic of x.atomics) {
361
+ if (y.atomics.some((ya) => atomic.type === ya.type)) return true;
362
+ if (y.constants.some((yc) => atomic.type === yc.type)) return true;
363
+ }
364
+
365
+ // CONSTANTS
366
+ for (const constant of x.constants) {
367
+ const atomic: MetadataAtomic | undefined = y.atomics.find(
368
+ (elem) => elem.type === constant.type,
369
+ );
370
+ if (atomic !== undefined) return true;
371
+
372
+ const opposite: MetadataConstant | undefined = y.constants.find(
373
+ (elem) => elem.type === constant.type,
374
+ );
375
+ if (opposite === undefined) continue;
376
+
377
+ const values: Set<any> = new Set([
378
+ ...constant.values.map((e) => e.value),
379
+ ...opposite.values.map((e) => e.value),
380
+ ]);
381
+ if (values.size !== constant.values.length + opposite.values.length)
382
+ return true;
383
+ }
384
+
385
+ // TEMPLATES
386
+ if (!!x.templates.length && y.atomics.some((ya) => ya.type === "string"))
387
+ return true;
388
+ else if (
389
+ !!y.templates.length &&
390
+ x.atomics.some((xa) => xa.type === "string")
391
+ )
392
+ return true;
393
+ return false;
394
+ };
395
+
396
+ export const covers = (
397
+ x: Metadata,
398
+ y: Metadata,
399
+ level: number = 0,
400
+ escaped: boolean = false,
401
+ ): boolean => {
402
+ // CHECK ANY
403
+ if (x === y) return false;
404
+ else if (x.any) return true;
405
+ else if (y.any) return false;
406
+
407
+ if (escaped === false) {
408
+ if (x.escaped === null && y.escaped !== null) return false;
409
+ else if (
410
+ x.escaped !== null &&
411
+ y.escaped !== null &&
412
+ (!covers(x.escaped.original, y.escaped.original, level, true) ||
413
+ !covers(x.escaped.returns, y.escaped.returns, level, true))
414
+ )
415
+ return false;
416
+ }
417
+
418
+ //----
419
+ // INSTANCES
420
+ //----
421
+ if (level === 0) {
422
+ // ARRAYS
423
+ for (const ya of y.arrays)
424
+ if (
425
+ !x.arrays.some((xa) =>
426
+ covers(xa.type.value, ya.type.value, level + 1),
427
+ )
428
+ ) {
429
+ return false;
430
+ }
431
+
432
+ // TUPLES
433
+ for (const yt of y.tuples)
434
+ if (
435
+ yt.type.elements.length !== 0 &&
436
+ x.tuples.some(
437
+ (xt) =>
438
+ xt.type.elements.length >= yt.type.elements.length &&
439
+ xt.type.elements
440
+ .slice(yt.type.elements.length)
441
+ .every((xv, i) => covers(xv, yt.type.elements[i]!, level + 1)),
442
+ ) === false
443
+ )
444
+ return false;
445
+ }
446
+
447
+ // OBJECTS
448
+ for (const yo of y.objects)
449
+ if (
450
+ x.objects.some((xo) => MetadataObjectType.covers(xo.type, yo.type)) ===
451
+ false
452
+ )
453
+ return false;
454
+
455
+ // ALIASES
456
+ for (const yd of y.aliases)
457
+ if (x.aliases.some((xd) => xd.type.name === yd.type.name) === false)
458
+ return false;
459
+
460
+ // NATIVES
461
+ for (const yn of y.natives)
462
+ if (x.natives.some((xn) => xn === yn) === false) return false;
463
+
464
+ // SETS
465
+ for (const ys of y.sets)
466
+ if (x.sets.some((xs) => covers(xs.value, ys.value)) === false)
467
+ return false;
468
+
469
+ //----
470
+ // VALUES
471
+ //----
472
+ // ATOMICS
473
+ if (
474
+ y.atomics.some(
475
+ (ya) => x.atomics.some((xa) => xa.type === ya.type) === false,
476
+ )
477
+ )
478
+ return false;
479
+
480
+ // CONSTANTS
481
+ for (const yc of y.constants) {
482
+ if (x.atomics.some((atom) => yc.type === atom.type)) continue;
483
+ const xc: MetadataConstant | undefined = x.constants.find(
484
+ (elem) => elem.type === yc.type,
485
+ );
486
+ if (xc === undefined) return false;
487
+ else if (
488
+ (yc.values.map((e) => e.value) as number[]).some(
489
+ (yv) => xc.values.includes(yv as never) === false,
490
+ )
491
+ )
492
+ return false;
493
+ }
494
+
495
+ // FUNCTIONAL
496
+ if (!!x.functions.length === false && !!y.functions.length) return false;
497
+
498
+ // SUCCESS
499
+ return true;
500
+ };
501
+
502
+ /** @internal */
503
+ export const merge = (x: Metadata, y: Metadata): Metadata => {
504
+ const output: Metadata = Metadata.create({
505
+ any: x.any || y.any,
506
+ nullable: x.nullable || y.nullable,
507
+ required: x.required && y.required,
508
+ optional: x.optional || y.optional,
509
+ functions: x.functions.length ? x.functions : y.functions, // @todo
510
+ escaped:
511
+ x.escaped !== null && y.escaped !== null
512
+ ? MetadataEscaped.create({
513
+ original: merge(x.escaped.original, y.escaped.original),
514
+ returns: merge(x.escaped.returns, y.escaped.returns),
515
+ })
516
+ : (x.escaped ?? y.escaped),
517
+ atomics: mergeTaggedTypes({
518
+ container: x.atomics,
519
+ equals: (x, y) => x.type === y.type,
520
+ getter: (x) => x.tags,
521
+ })(y.atomics),
522
+ constants: [...x.constants],
523
+ templates: x.templates.slice(),
524
+ rest:
525
+ x.rest !== null && y.rest !== null
526
+ ? merge(x.rest, y.rest)
527
+ : (x.rest ?? y.rest),
528
+ arrays: mergeTaggedTypes({
529
+ container: x.arrays,
530
+ equals: (x, y) => x.type.name === y.type.name,
531
+ getter: (x) => x.tags,
532
+ })(y.arrays),
533
+ tuples: mergeTaggedTypes({
534
+ container: x.tuples,
535
+ equals: (x, y) => x.type.name === y.type.name,
536
+ getter: (x) => x.tags,
537
+ })(y.tuples),
538
+ objects: mergeTaggedTypes({
539
+ container: x.objects,
540
+ equals: (x, y) => x.type.name === y.type.name,
541
+ getter: (x) => x.tags,
542
+ })(y.objects),
543
+ aliases: mergeTaggedTypes({
544
+ container: x.aliases,
545
+ equals: (x, y) => x.type.name === y.type.name,
546
+ getter: (x) => x.tags,
547
+ })(y.aliases),
548
+ natives: mergeTaggedTypes({
549
+ container: x.natives,
550
+ equals: (x, y) => x.name === y.name,
551
+ getter: (x) => x.tags,
552
+ })(y.natives),
553
+ sets: mergeTaggedTypes({
554
+ container: x.sets,
555
+ equals: (x, y) => x.value.getName() === y.value.getName(),
556
+ getter: (x) => x.tags,
557
+ })(y.sets),
558
+ maps: mergeTaggedTypes({
559
+ container: x.maps,
560
+ equals: (x, y) =>
561
+ x.key.getName() === y.key.getName() &&
562
+ x.value.getName() === y.value.getName(),
563
+ getter: (x) => x.tags,
564
+ })(y.maps),
565
+ });
566
+ for (const constant of y.constants) {
567
+ const target: MetadataConstant = ArrayUtil.take(
568
+ output.constants,
569
+ (elem) => elem.type === constant.type,
570
+ () =>
571
+ MetadataConstant.create({
572
+ type: constant.type,
573
+ values: [],
574
+ }),
575
+ );
576
+ for (const value of constant.values)
577
+ ArrayUtil.add(target.values, value, (a, b) => a.value === b.value);
578
+ }
579
+ return output;
580
+ };
581
+
582
+ /** @internal */
583
+ export const unalias = (w: Metadata) => {
584
+ const visited: Set<Metadata> = new Set();
585
+ while (
586
+ w.size() === 1 &&
587
+ w.nullable === false &&
588
+ w.isRequired() === true &&
589
+ w.aliases.length === 1
590
+ ) {
591
+ if (visited.has(w)) break;
592
+ w = w.aliases[0]!.type.value;
593
+ visited.add(w);
594
+ }
595
+ return w;
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
+ };