@typia/utils 12.1.0-dev.20260325 → 13.0.0-dev.20260426

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 (619) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +85 -85
  3. package/lib/_virtual/ArrayUtil.mjs +4 -0
  4. package/lib/_virtual/ArrayUtil.mjs.map +1 -0
  5. package/lib/_virtual/EndpointUtil.mjs +4 -0
  6. package/lib/_virtual/EndpointUtil.mjs.map +1 -0
  7. package/lib/_virtual/HttpError.mjs +4 -0
  8. package/lib/_virtual/HttpError.mjs.map +1 -0
  9. package/lib/_virtual/HttpLlm.mjs +4 -0
  10. package/lib/_virtual/HttpLlm.mjs.map +1 -0
  11. package/lib/_virtual/HttpLlmApplicationComposer.mjs +4 -0
  12. package/lib/_virtual/HttpLlmApplicationComposer.mjs.map +1 -0
  13. package/lib/_virtual/HttpLlmFunctionFetcher.mjs +4 -0
  14. package/lib/_virtual/HttpLlmFunctionFetcher.mjs.map +1 -0
  15. package/lib/_virtual/HttpMigrateApplicationComposer.mjs +4 -0
  16. package/lib/_virtual/HttpMigrateApplicationComposer.mjs.map +1 -0
  17. package/lib/_virtual/HttpMigrateRouteAccessor.mjs +4 -0
  18. package/lib/_virtual/HttpMigrateRouteAccessor.mjs.map +1 -0
  19. package/lib/_virtual/HttpMigrateRouteComposer.mjs +4 -0
  20. package/lib/_virtual/HttpMigrateRouteComposer.mjs.map +1 -0
  21. package/lib/_virtual/HttpMigrateRouteFetcher.mjs +4 -0
  22. package/lib/_virtual/HttpMigrateRouteFetcher.mjs.map +1 -0
  23. package/lib/_virtual/HttpMigration.mjs +4 -0
  24. package/lib/_virtual/HttpMigration.mjs.map +1 -0
  25. package/lib/_virtual/IOpenApiValidatorContext.mjs +4 -0
  26. package/lib/_virtual/IOpenApiValidatorContext.mjs.map +1 -0
  27. package/lib/_virtual/JsonDescriptor.mjs +4 -0
  28. package/lib/_virtual/JsonDescriptor.mjs.map +1 -0
  29. package/lib/_virtual/LlmDescriptionInverter.mjs +4 -0
  30. package/lib/_virtual/LlmDescriptionInverter.mjs.map +1 -0
  31. package/lib/_virtual/LlmJson.mjs +4 -0
  32. package/lib/_virtual/LlmJson.mjs.map +1 -0
  33. package/lib/_virtual/LlmParametersComposer.mjs +4 -0
  34. package/lib/_virtual/LlmParametersComposer.mjs.map +1 -0
  35. package/lib/_virtual/LlmSchemaConverter.mjs +4 -0
  36. package/lib/_virtual/LlmSchemaConverter.mjs.map +1 -0
  37. package/lib/_virtual/LlmTypeChecker.mjs +4 -0
  38. package/lib/_virtual/LlmTypeChecker.mjs.map +1 -0
  39. package/lib/_virtual/MapUtil.mjs +4 -0
  40. package/lib/_virtual/MapUtil.mjs.map +1 -0
  41. package/lib/_virtual/NamingConvention.mjs +4 -0
  42. package/lib/_virtual/NamingConvention.mjs.map +1 -0
  43. package/lib/_virtual/OpenApiArrayValidator.mjs +4 -0
  44. package/lib/_virtual/OpenApiArrayValidator.mjs.map +1 -0
  45. package/lib/_virtual/OpenApiBooleanValidator.mjs +4 -0
  46. package/lib/_virtual/OpenApiBooleanValidator.mjs.map +1 -0
  47. package/lib/_virtual/OpenApiConstantValidator.mjs +4 -0
  48. package/lib/_virtual/OpenApiConstantValidator.mjs.map +1 -0
  49. package/lib/_virtual/OpenApiConstraintShifter.mjs +4 -0
  50. package/lib/_virtual/OpenApiConstraintShifter.mjs.map +1 -0
  51. package/lib/_virtual/OpenApiConverter.mjs +4 -0
  52. package/lib/_virtual/OpenApiConverter.mjs.map +1 -0
  53. package/lib/_virtual/OpenApiExclusiveEmender.mjs +4 -0
  54. package/lib/_virtual/OpenApiExclusiveEmender.mjs.map +1 -0
  55. package/lib/_virtual/OpenApiIntegerValidator.mjs +4 -0
  56. package/lib/_virtual/OpenApiIntegerValidator.mjs.map +1 -0
  57. package/lib/_virtual/OpenApiNumberValidator.mjs +4 -0
  58. package/lib/_virtual/OpenApiNumberValidator.mjs.map +1 -0
  59. package/lib/_virtual/OpenApiObjectValidator.mjs +4 -0
  60. package/lib/_virtual/OpenApiObjectValidator.mjs.map +1 -0
  61. package/lib/_virtual/OpenApiOneOfValidator.mjs +4 -0
  62. package/lib/_virtual/OpenApiOneOfValidator.mjs.map +1 -0
  63. package/lib/_virtual/OpenApiSchemaNamingRule.mjs +4 -0
  64. package/lib/_virtual/OpenApiSchemaNamingRule.mjs.map +1 -0
  65. package/lib/_virtual/OpenApiStationValidator.mjs +4 -0
  66. package/lib/_virtual/OpenApiStationValidator.mjs.map +1 -0
  67. package/lib/_virtual/OpenApiStringValidator.mjs +4 -0
  68. package/lib/_virtual/OpenApiStringValidator.mjs.map +1 -0
  69. package/lib/_virtual/OpenApiTupleValidator.mjs +4 -0
  70. package/lib/_virtual/OpenApiTupleValidator.mjs.map +1 -0
  71. package/lib/_virtual/OpenApiTypeChecker.mjs +4 -0
  72. package/lib/_virtual/OpenApiTypeChecker.mjs.map +1 -0
  73. package/lib/_virtual/OpenApiTypeCheckerBase.mjs +4 -0
  74. package/lib/_virtual/OpenApiTypeCheckerBase.mjs.map +1 -0
  75. package/lib/_virtual/OpenApiV3Downgrader.mjs +4 -0
  76. package/lib/_virtual/OpenApiV3Downgrader.mjs.map +1 -0
  77. package/lib/_virtual/OpenApiV3TypeChecker.mjs +4 -0
  78. package/lib/_virtual/OpenApiV3TypeChecker.mjs.map +1 -0
  79. package/lib/_virtual/OpenApiV3Upgrader.mjs +4 -0
  80. package/lib/_virtual/OpenApiV3Upgrader.mjs.map +1 -0
  81. package/lib/_virtual/OpenApiV3_1Downgrader.mjs +4 -0
  82. package/lib/_virtual/OpenApiV3_1Downgrader.mjs.map +1 -0
  83. package/lib/_virtual/OpenApiV3_1TypeChecker.mjs +4 -0
  84. package/lib/_virtual/OpenApiV3_1TypeChecker.mjs.map +1 -0
  85. package/lib/_virtual/OpenApiV3_1Upgrader.mjs +4 -0
  86. package/lib/_virtual/OpenApiV3_1Upgrader.mjs.map +1 -0
  87. package/lib/_virtual/OpenApiV3_2Upgrader.mjs +4 -0
  88. package/lib/_virtual/OpenApiV3_2Upgrader.mjs.map +1 -0
  89. package/lib/_virtual/OpenApiValidator.mjs +4 -0
  90. package/lib/_virtual/OpenApiValidator.mjs.map +1 -0
  91. package/lib/_virtual/Singleton.mjs +4 -0
  92. package/lib/_virtual/Singleton.mjs.map +1 -0
  93. package/lib/_virtual/StringUtil.mjs +4 -0
  94. package/lib/_virtual/StringUtil.mjs.map +1 -0
  95. package/lib/_virtual/SwaggerV2Downgrader.mjs +4 -0
  96. package/lib/_virtual/SwaggerV2Downgrader.mjs.map +1 -0
  97. package/lib/_virtual/SwaggerV2TypeChecker.mjs +4 -0
  98. package/lib/_virtual/SwaggerV2TypeChecker.mjs.map +1 -0
  99. package/lib/_virtual/SwaggerV2Upgrader.mjs +4 -0
  100. package/lib/_virtual/SwaggerV2Upgrader.mjs.map +1 -0
  101. package/lib/_virtual/_commonjsHelpers.mjs +6 -0
  102. package/lib/_virtual/_commonjsHelpers.mjs.map +1 -0
  103. package/lib/_virtual/_isBigintString.mjs +4 -0
  104. package/lib/_virtual/_isBigintString.mjs.map +1 -0
  105. package/lib/_virtual/_isFormatByte.mjs +4 -0
  106. package/lib/_virtual/_isFormatByte.mjs.map +1 -0
  107. package/lib/_virtual/_isFormatDate.mjs +4 -0
  108. package/lib/_virtual/_isFormatDate.mjs.map +1 -0
  109. package/lib/_virtual/_isFormatDateTime.mjs +4 -0
  110. package/lib/_virtual/_isFormatDateTime.mjs.map +1 -0
  111. package/lib/_virtual/_isFormatDuration.mjs +4 -0
  112. package/lib/_virtual/_isFormatDuration.mjs.map +1 -0
  113. package/lib/_virtual/_isFormatEmail.mjs +4 -0
  114. package/lib/_virtual/_isFormatEmail.mjs.map +1 -0
  115. package/lib/_virtual/_isFormatHostname.mjs +4 -0
  116. package/lib/_virtual/_isFormatHostname.mjs.map +1 -0
  117. package/lib/_virtual/_isFormatIdnEmail.mjs +4 -0
  118. package/lib/_virtual/_isFormatIdnEmail.mjs.map +1 -0
  119. package/lib/_virtual/_isFormatIdnHostname.mjs +4 -0
  120. package/lib/_virtual/_isFormatIdnHostname.mjs.map +1 -0
  121. package/lib/_virtual/_isFormatIpv4.mjs +4 -0
  122. package/lib/_virtual/_isFormatIpv4.mjs.map +1 -0
  123. package/lib/_virtual/_isFormatIpv6.mjs +4 -0
  124. package/lib/_virtual/_isFormatIpv6.mjs.map +1 -0
  125. package/lib/_virtual/_isFormatIri.mjs +4 -0
  126. package/lib/_virtual/_isFormatIri.mjs.map +1 -0
  127. package/lib/_virtual/_isFormatIriReference.mjs +4 -0
  128. package/lib/_virtual/_isFormatIriReference.mjs.map +1 -0
  129. package/lib/_virtual/_isFormatJsonPointer.mjs +4 -0
  130. package/lib/_virtual/_isFormatJsonPointer.mjs.map +1 -0
  131. package/lib/_virtual/_isFormatPassword.mjs +4 -0
  132. package/lib/_virtual/_isFormatPassword.mjs.map +1 -0
  133. package/lib/_virtual/_isFormatRegex.mjs +4 -0
  134. package/lib/_virtual/_isFormatRegex.mjs.map +1 -0
  135. package/lib/_virtual/_isFormatRelativeJsonPointer.mjs +4 -0
  136. package/lib/_virtual/_isFormatRelativeJsonPointer.mjs.map +1 -0
  137. package/lib/_virtual/_isFormatTime.mjs +4 -0
  138. package/lib/_virtual/_isFormatTime.mjs.map +1 -0
  139. package/lib/_virtual/_isFormatUri.mjs +4 -0
  140. package/lib/_virtual/_isFormatUri.mjs.map +1 -0
  141. package/lib/_virtual/_isFormatUriReference.mjs +4 -0
  142. package/lib/_virtual/_isFormatUriReference.mjs.map +1 -0
  143. package/lib/_virtual/_isFormatUriTemplate.mjs +4 -0
  144. package/lib/_virtual/_isFormatUriTemplate.mjs.map +1 -0
  145. package/lib/_virtual/_isFormatUrl.mjs +4 -0
  146. package/lib/_virtual/_isFormatUrl.mjs.map +1 -0
  147. package/lib/_virtual/_isFormatUuid.mjs +4 -0
  148. package/lib/_virtual/_isFormatUuid.mjs.map +1 -0
  149. package/lib/_virtual/_isUniqueItems.mjs +4 -0
  150. package/lib/_virtual/_isUniqueItems.mjs.map +1 -0
  151. package/lib/_virtual/coerceLlmArguments.mjs +4 -0
  152. package/lib/_virtual/coerceLlmArguments.mjs.map +1 -0
  153. package/lib/_virtual/dedent.mjs +4 -0
  154. package/lib/_virtual/dedent.mjs.map +1 -0
  155. package/lib/_virtual/index.mjs +4 -0
  156. package/lib/_virtual/index.mjs.map +1 -0
  157. package/lib/_virtual/index2.mjs +4 -0
  158. package/lib/_virtual/index2.mjs.map +1 -0
  159. package/lib/_virtual/index3.mjs +4 -0
  160. package/lib/_virtual/index3.mjs.map +1 -0
  161. package/lib/_virtual/index4.mjs +4 -0
  162. package/lib/_virtual/index4.mjs.map +1 -0
  163. package/lib/_virtual/index5.mjs +4 -0
  164. package/lib/_virtual/index5.mjs.map +1 -0
  165. package/lib/_virtual/parseLenientJson.mjs +4 -0
  166. package/lib/_virtual/parseLenientJson.mjs.map +1 -0
  167. package/lib/_virtual/stringifyValidationFailure.mjs +4 -0
  168. package/lib/_virtual/stringifyValidationFailure.mjs.map +1 -0
  169. package/lib/converters/LlmSchemaConverter.js +149 -51
  170. package/lib/converters/LlmSchemaConverter.js.map +1 -1
  171. package/lib/converters/LlmSchemaConverter.mjs +5 -511
  172. package/lib/converters/LlmSchemaConverter.mjs.map +1 -1
  173. package/lib/converters/LlmSchemaConverter2.mjs +551 -0
  174. package/lib/converters/LlmSchemaConverter2.mjs.map +1 -0
  175. package/lib/converters/OpenApiConverter.js.map +1 -1
  176. package/lib/converters/OpenApiConverter.mjs +5 -146
  177. package/lib/converters/OpenApiConverter.mjs.map +1 -1
  178. package/lib/converters/OpenApiConverter2.mjs +167 -0
  179. package/lib/converters/OpenApiConverter2.mjs.map +1 -0
  180. package/lib/converters/index.mjs +7 -3
  181. package/lib/converters/index.mjs.map +1 -1
  182. package/lib/converters/index2.mjs +37 -0
  183. package/lib/converters/index2.mjs.map +1 -0
  184. package/lib/converters/internal/LlmDescriptionInverter.js.map +1 -1
  185. package/lib/converters/internal/LlmDescriptionInverter.mjs +5 -138
  186. package/lib/converters/internal/LlmDescriptionInverter.mjs.map +1 -1
  187. package/lib/converters/internal/LlmDescriptionInverter2.mjs +153 -0
  188. package/lib/converters/internal/LlmDescriptionInverter2.mjs.map +1 -0
  189. package/lib/converters/internal/LlmParametersComposer.js +14 -17
  190. package/lib/converters/internal/LlmParametersComposer.js.map +1 -1
  191. package/lib/converters/internal/LlmParametersComposer.mjs +5 -39
  192. package/lib/converters/internal/LlmParametersComposer.mjs.map +1 -1
  193. package/lib/converters/internal/LlmParametersComposer2.mjs +48 -0
  194. package/lib/converters/internal/LlmParametersComposer2.mjs.map +1 -0
  195. package/lib/converters/internal/OpenApiConstraintShifter.js.map +1 -1
  196. package/lib/converters/internal/OpenApiConstraintShifter.mjs +5 -99
  197. package/lib/converters/internal/OpenApiConstraintShifter.mjs.map +1 -1
  198. package/lib/converters/internal/OpenApiConstraintShifter2.mjs +115 -0
  199. package/lib/converters/internal/OpenApiConstraintShifter2.mjs.map +1 -0
  200. package/lib/converters/internal/OpenApiExclusiveEmender.js.map +1 -1
  201. package/lib/converters/internal/OpenApiExclusiveEmender.mjs +6 -33
  202. package/lib/converters/internal/OpenApiExclusiveEmender.mjs.map +1 -1
  203. package/lib/converters/internal/OpenApiExclusiveEmender2.mjs +43 -0
  204. package/lib/converters/internal/OpenApiExclusiveEmender2.mjs.map +1 -0
  205. package/lib/converters/internal/OpenApiV3Downgrader.js +2 -1
  206. package/lib/converters/internal/OpenApiV3Downgrader.js.map +1 -1
  207. package/lib/converters/internal/OpenApiV3Downgrader.mjs +5 -299
  208. package/lib/converters/internal/OpenApiV3Downgrader.mjs.map +1 -1
  209. package/lib/converters/internal/OpenApiV3Downgrader2.mjs +247 -0
  210. package/lib/converters/internal/OpenApiV3Downgrader2.mjs.map +1 -0
  211. package/lib/converters/internal/OpenApiV3Upgrader.js +58 -67
  212. package/lib/converters/internal/OpenApiV3Upgrader.js.map +1 -1
  213. package/lib/converters/internal/OpenApiV3Upgrader.mjs +5 -367
  214. package/lib/converters/internal/OpenApiV3Upgrader.mjs.map +1 -1
  215. package/lib/converters/internal/OpenApiV3Upgrader2.mjs +308 -0
  216. package/lib/converters/internal/OpenApiV3Upgrader2.mjs.map +1 -0
  217. package/lib/converters/internal/OpenApiV3_1Downgrader.js.map +1 -1
  218. package/lib/converters/internal/OpenApiV3_1Downgrader.mjs +5 -236
  219. package/lib/converters/internal/OpenApiV3_1Downgrader.mjs.map +1 -1
  220. package/lib/converters/internal/OpenApiV3_1Downgrader2.mjs +203 -0
  221. package/lib/converters/internal/OpenApiV3_1Downgrader2.mjs.map +1 -0
  222. package/lib/converters/internal/OpenApiV3_1Upgrader.js +68 -70
  223. package/lib/converters/internal/OpenApiV3_1Upgrader.js.map +1 -1
  224. package/lib/converters/internal/OpenApiV3_1Upgrader.mjs +5 -564
  225. package/lib/converters/internal/OpenApiV3_1Upgrader.mjs.map +1 -1
  226. package/lib/converters/internal/OpenApiV3_1Upgrader2.mjs +435 -0
  227. package/lib/converters/internal/OpenApiV3_1Upgrader2.mjs.map +1 -0
  228. package/lib/converters/internal/OpenApiV3_2Upgrader.js +57 -63
  229. package/lib/converters/internal/OpenApiV3_2Upgrader.js.map +1 -1
  230. package/lib/converters/internal/OpenApiV3_2Upgrader.mjs +5 -240
  231. package/lib/converters/internal/OpenApiV3_2Upgrader.mjs.map +1 -1
  232. package/lib/converters/internal/OpenApiV3_2Upgrader2.mjs +211 -0
  233. package/lib/converters/internal/OpenApiV3_2Upgrader2.mjs.map +1 -0
  234. package/lib/converters/internal/SwaggerV2Downgrader.js +44 -56
  235. package/lib/converters/internal/SwaggerV2Downgrader.js.map +1 -1
  236. package/lib/converters/internal/SwaggerV2Downgrader.mjs +5 -352
  237. package/lib/converters/internal/SwaggerV2Downgrader.mjs.map +1 -1
  238. package/lib/converters/internal/SwaggerV2Downgrader2.mjs +297 -0
  239. package/lib/converters/internal/SwaggerV2Downgrader2.mjs.map +1 -0
  240. package/lib/converters/internal/SwaggerV2Upgrader.js +52 -63
  241. package/lib/converters/internal/SwaggerV2Upgrader.js.map +1 -1
  242. package/lib/converters/internal/SwaggerV2Upgrader.mjs +5 -421
  243. package/lib/converters/internal/SwaggerV2Upgrader.mjs.map +1 -1
  244. package/lib/converters/internal/SwaggerV2Upgrader2.mjs +378 -0
  245. package/lib/converters/internal/SwaggerV2Upgrader2.mjs.map +1 -0
  246. package/lib/http/HttpError.js.map +1 -1
  247. package/lib/http/HttpError.mjs +6 -74
  248. package/lib/http/HttpError.mjs.map +1 -1
  249. package/lib/http/HttpError2.mjs +81 -0
  250. package/lib/http/HttpError2.mjs.map +1 -0
  251. package/lib/http/HttpLlm.js +5 -4
  252. package/lib/http/HttpLlm.js.map +1 -1
  253. package/lib/http/HttpLlm.mjs +5 -96
  254. package/lib/http/HttpLlm.mjs.map +1 -1
  255. package/lib/http/HttpLlm2.mjs +115 -0
  256. package/lib/http/HttpLlm2.mjs.map +1 -0
  257. package/lib/http/HttpMigration.js.map +1 -1
  258. package/lib/http/HttpMigration.mjs +5 -49
  259. package/lib/http/HttpMigration.mjs.map +1 -1
  260. package/lib/http/HttpMigration2.mjs +66 -0
  261. package/lib/http/HttpMigration2.mjs.map +1 -0
  262. package/lib/http/index.mjs +7 -3
  263. package/lib/http/index.mjs.map +1 -1
  264. package/lib/http/index2.mjs +36 -0
  265. package/lib/http/index2.mjs.map +1 -0
  266. package/lib/http/internal/HttpLlmApplicationComposer.js +12 -13
  267. package/lib/http/internal/HttpLlmApplicationComposer.js.map +1 -1
  268. package/lib/http/internal/HttpLlmApplicationComposer.mjs +5 -297
  269. package/lib/http/internal/HttpLlmApplicationComposer.mjs.map +1 -1
  270. package/lib/http/internal/HttpLlmApplicationComposer2.mjs +309 -0
  271. package/lib/http/internal/HttpLlmApplicationComposer2.mjs.map +1 -0
  272. package/lib/http/internal/HttpLlmFunctionFetcher.js.map +1 -1
  273. package/lib/http/internal/HttpLlmFunctionFetcher.mjs +5 -21
  274. package/lib/http/internal/HttpLlmFunctionFetcher.mjs.map +1 -1
  275. package/lib/http/internal/HttpLlmFunctionFetcher2.mjs +36 -0
  276. package/lib/http/internal/HttpLlmFunctionFetcher2.mjs.map +1 -0
  277. package/lib/http/internal/HttpMigrateApplicationComposer.js.map +1 -1
  278. package/lib/http/internal/HttpMigrateApplicationComposer.mjs +5 -44
  279. package/lib/http/internal/HttpMigrateApplicationComposer.mjs.map +1 -1
  280. package/lib/http/internal/HttpMigrateApplicationComposer2.mjs +59 -0
  281. package/lib/http/internal/HttpMigrateApplicationComposer2.mjs.map +1 -0
  282. package/lib/http/internal/HttpMigrateRouteAccessor.js.map +1 -1
  283. package/lib/http/internal/HttpMigrateRouteAccessor.mjs +5 -103
  284. package/lib/http/internal/HttpMigrateRouteAccessor.mjs.map +1 -1
  285. package/lib/http/internal/HttpMigrateRouteAccessor2.mjs +121 -0
  286. package/lib/http/internal/HttpMigrateRouteAccessor2.mjs.map +1 -0
  287. package/lib/http/internal/HttpMigrateRouteComposer.js +35 -54
  288. package/lib/http/internal/HttpMigrateRouteComposer.js.map +1 -1
  289. package/lib/http/internal/HttpMigrateRouteComposer.mjs +5 -381
  290. package/lib/http/internal/HttpMigrateRouteComposer.mjs.map +1 -1
  291. package/lib/http/internal/HttpMigrateRouteComposer2.mjs +384 -0
  292. package/lib/http/internal/HttpMigrateRouteComposer2.mjs.map +1 -0
  293. package/lib/http/internal/HttpMigrateRouteFetcher.js +7 -6
  294. package/lib/http/internal/HttpMigrateRouteFetcher.js.map +1 -1
  295. package/lib/http/internal/HttpMigrateRouteFetcher.mjs +5 -171
  296. package/lib/http/internal/HttpMigrateRouteFetcher.mjs.map +1 -1
  297. package/lib/http/internal/HttpMigrateRouteFetcher2.mjs +192 -0
  298. package/lib/http/internal/HttpMigrateRouteFetcher2.mjs.map +1 -0
  299. package/lib/index.mjs +7 -19
  300. package/lib/index.mjs.map +1 -1
  301. package/lib/index2.mjs +38 -0
  302. package/lib/index2.mjs.map +1 -0
  303. package/lib/utils/ArrayUtil.js.map +1 -1
  304. package/lib/utils/ArrayUtil.mjs +6 -26
  305. package/lib/utils/ArrayUtil.mjs.map +1 -1
  306. package/lib/utils/ArrayUtil2.mjs +40 -0
  307. package/lib/utils/ArrayUtil2.mjs.map +1 -0
  308. package/lib/utils/LlmJson.d.ts +1 -1
  309. package/lib/utils/LlmJson.js.map +1 -1
  310. package/lib/utils/LlmJson.mjs +5 -153
  311. package/lib/utils/LlmJson.mjs.map +1 -1
  312. package/lib/utils/LlmJson2.mjs +172 -0
  313. package/lib/utils/LlmJson2.mjs.map +1 -0
  314. package/lib/utils/MapUtil.js.map +1 -1
  315. package/lib/utils/MapUtil.mjs +6 -13
  316. package/lib/utils/MapUtil.mjs.map +1 -1
  317. package/lib/utils/MapUtil2.mjs +27 -0
  318. package/lib/utils/MapUtil2.mjs.map +1 -0
  319. package/lib/utils/NamingConvention.js.map +1 -1
  320. package/lib/utils/NamingConvention.mjs +6 -196
  321. package/lib/utils/NamingConvention.mjs.map +1 -1
  322. package/lib/utils/NamingConvention2.mjs +210 -0
  323. package/lib/utils/NamingConvention2.mjs.map +1 -0
  324. package/lib/utils/Singleton.d.ts +6 -1
  325. package/lib/utils/Singleton.js +0 -1
  326. package/lib/utils/Singleton.js.map +1 -1
  327. package/lib/utils/Singleton.mjs +6 -16
  328. package/lib/utils/Singleton.mjs.map +1 -1
  329. package/lib/utils/Singleton2.mjs +28 -0
  330. package/lib/utils/Singleton2.mjs.map +1 -0
  331. package/lib/utils/StringUtil.js +6 -9
  332. package/lib/utils/StringUtil.js.map +1 -1
  333. package/lib/utils/StringUtil.mjs +6 -11
  334. package/lib/utils/StringUtil.mjs.map +1 -1
  335. package/lib/utils/StringUtil2.mjs +25 -0
  336. package/lib/utils/StringUtil2.mjs.map +1 -0
  337. package/lib/utils/dedent.js.map +1 -1
  338. package/lib/utils/dedent.mjs +6 -48
  339. package/lib/utils/dedent.mjs.map +1 -1
  340. package/lib/utils/dedent2.mjs +62 -0
  341. package/lib/utils/dedent2.mjs.map +1 -0
  342. package/lib/utils/index.mjs +7 -7
  343. package/lib/utils/index.mjs.map +1 -1
  344. package/lib/utils/index2.mjs +44 -0
  345. package/lib/utils/index2.mjs.map +1 -0
  346. package/lib/utils/internal/EndpointUtil.js.map +1 -1
  347. package/lib/utils/internal/EndpointUtil.mjs +5 -34
  348. package/lib/utils/internal/EndpointUtil.mjs.map +1 -1
  349. package/lib/utils/internal/EndpointUtil2.mjs +49 -0
  350. package/lib/utils/internal/EndpointUtil2.mjs.map +1 -0
  351. package/lib/utils/internal/JsonDescriptor.js +18 -25
  352. package/lib/utils/internal/JsonDescriptor.js.map +1 -1
  353. package/lib/utils/internal/JsonDescriptor.mjs +5 -45
  354. package/lib/utils/internal/JsonDescriptor.mjs.map +1 -1
  355. package/lib/utils/internal/JsonDescriptor2.mjs +64 -0
  356. package/lib/utils/internal/JsonDescriptor2.mjs.map +1 -0
  357. package/lib/utils/internal/OpenApiTypeCheckerBase.js +15 -9
  358. package/lib/utils/internal/OpenApiTypeCheckerBase.js.map +1 -1
  359. package/lib/utils/internal/OpenApiTypeCheckerBase.mjs +5 -581
  360. package/lib/utils/internal/OpenApiTypeCheckerBase.mjs.map +1 -1
  361. package/lib/utils/internal/OpenApiTypeCheckerBase2.mjs +539 -0
  362. package/lib/utils/internal/OpenApiTypeCheckerBase2.mjs.map +1 -0
  363. package/lib/utils/internal/coerceLlmArguments.js +18 -4
  364. package/lib/utils/internal/coerceLlmArguments.js.map +1 -1
  365. package/lib/utils/internal/coerceLlmArguments.mjs +5 -245
  366. package/lib/utils/internal/coerceLlmArguments.mjs.map +1 -1
  367. package/lib/utils/internal/coerceLlmArguments2.mjs +276 -0
  368. package/lib/utils/internal/coerceLlmArguments2.mjs.map +1 -0
  369. package/lib/utils/internal/parseLenientJson.js.map +1 -1
  370. package/lib/utils/internal/parseLenientJson.mjs +6 -803
  371. package/lib/utils/internal/parseLenientJson.mjs.map +1 -1
  372. package/lib/utils/internal/parseLenientJson2.mjs +815 -0
  373. package/lib/utils/internal/parseLenientJson2.mjs.map +1 -0
  374. package/lib/utils/internal/stringifyValidationFailure.js.map +1 -1
  375. package/lib/utils/internal/stringifyValidationFailure.mjs +5 -315
  376. package/lib/utils/internal/stringifyValidationFailure.mjs.map +1 -1
  377. package/lib/utils/internal/stringifyValidationFailure2.mjs +333 -0
  378. package/lib/utils/internal/stringifyValidationFailure2.mjs.map +1 -0
  379. package/lib/validators/LlmTypeChecker.js +4 -3
  380. package/lib/validators/LlmTypeChecker.js.map +1 -1
  381. package/lib/validators/LlmTypeChecker.mjs +5 -297
  382. package/lib/validators/LlmTypeChecker.mjs.map +1 -1
  383. package/lib/validators/LlmTypeChecker2.mjs +323 -0
  384. package/lib/validators/LlmTypeChecker2.mjs.map +1 -0
  385. package/lib/validators/OpenApiTypeChecker.js.map +1 -1
  386. package/lib/validators/OpenApiTypeChecker.mjs +5 -215
  387. package/lib/validators/OpenApiTypeChecker.mjs.map +1 -1
  388. package/lib/validators/OpenApiTypeChecker2.mjs +219 -0
  389. package/lib/validators/OpenApiTypeChecker2.mjs.map +1 -0
  390. package/lib/validators/OpenApiV3TypeChecker.js.map +1 -1
  391. package/lib/validators/OpenApiV3TypeChecker.mjs +6 -27
  392. package/lib/validators/OpenApiV3TypeChecker.mjs.map +1 -1
  393. package/lib/validators/OpenApiV3TypeChecker2.mjs +41 -0
  394. package/lib/validators/OpenApiV3TypeChecker2.mjs.map +1 -0
  395. package/lib/validators/OpenApiV3_1TypeChecker.js.map +1 -1
  396. package/lib/validators/OpenApiV3_1TypeChecker.mjs +6 -31
  397. package/lib/validators/OpenApiV3_1TypeChecker.mjs.map +1 -1
  398. package/lib/validators/OpenApiV3_1TypeChecker2.mjs +45 -0
  399. package/lib/validators/OpenApiV3_1TypeChecker2.mjs.map +1 -0
  400. package/lib/validators/OpenApiValidator.js.map +1 -1
  401. package/lib/validators/OpenApiValidator.mjs +5 -72
  402. package/lib/validators/OpenApiValidator.mjs.map +1 -1
  403. package/lib/validators/OpenApiValidator2.mjs +83 -0
  404. package/lib/validators/OpenApiValidator2.mjs.map +1 -0
  405. package/lib/validators/SwaggerV2TypeChecker.js.map +1 -1
  406. package/lib/validators/SwaggerV2TypeChecker.mjs +6 -28
  407. package/lib/validators/SwaggerV2TypeChecker.mjs.map +1 -1
  408. package/lib/validators/SwaggerV2TypeChecker2.mjs +42 -0
  409. package/lib/validators/SwaggerV2TypeChecker2.mjs.map +1 -0
  410. package/lib/validators/functional/_isBigintString.js.map +1 -1
  411. package/lib/validators/functional/_isBigintString.mjs +6 -10
  412. package/lib/validators/functional/_isBigintString.mjs.map +1 -1
  413. package/lib/validators/functional/_isBigintString2.mjs +25 -0
  414. package/lib/validators/functional/_isBigintString2.mjs.map +1 -0
  415. package/lib/validators/functional/_isFormatByte.js.map +1 -1
  416. package/lib/validators/functional/_isFormatByte.mjs +6 -6
  417. package/lib/validators/functional/_isFormatByte.mjs.map +1 -1
  418. package/lib/validators/functional/_isFormatByte2.mjs +21 -0
  419. package/lib/validators/functional/_isFormatByte2.mjs.map +1 -0
  420. package/lib/validators/functional/_isFormatDate.js.map +1 -1
  421. package/lib/validators/functional/_isFormatDate.mjs +6 -3
  422. package/lib/validators/functional/_isFormatDate.mjs.map +1 -1
  423. package/lib/validators/functional/_isFormatDate2.mjs +18 -0
  424. package/lib/validators/functional/_isFormatDate2.mjs.map +1 -0
  425. package/lib/validators/functional/_isFormatDateTime.js.map +1 -1
  426. package/lib/validators/functional/_isFormatDateTime.mjs +6 -3
  427. package/lib/validators/functional/_isFormatDateTime.mjs.map +1 -1
  428. package/lib/validators/functional/_isFormatDateTime2.mjs +18 -0
  429. package/lib/validators/functional/_isFormatDateTime2.mjs.map +1 -0
  430. package/lib/validators/functional/_isFormatDuration.js.map +1 -1
  431. package/lib/validators/functional/_isFormatDuration.mjs +6 -3
  432. package/lib/validators/functional/_isFormatDuration.mjs.map +1 -1
  433. package/lib/validators/functional/_isFormatDuration2.mjs +18 -0
  434. package/lib/validators/functional/_isFormatDuration2.mjs.map +1 -0
  435. package/lib/validators/functional/_isFormatEmail.js.map +1 -1
  436. package/lib/validators/functional/_isFormatEmail.mjs +6 -3
  437. package/lib/validators/functional/_isFormatEmail.mjs.map +1 -1
  438. package/lib/validators/functional/_isFormatEmail2.mjs +18 -0
  439. package/lib/validators/functional/_isFormatEmail2.mjs.map +1 -0
  440. package/lib/validators/functional/_isFormatHostname.js.map +1 -1
  441. package/lib/validators/functional/_isFormatHostname.mjs +6 -3
  442. package/lib/validators/functional/_isFormatHostname.mjs.map +1 -1
  443. package/lib/validators/functional/_isFormatHostname2.mjs +18 -0
  444. package/lib/validators/functional/_isFormatHostname2.mjs.map +1 -0
  445. package/lib/validators/functional/_isFormatIdnEmail.js.map +1 -1
  446. package/lib/validators/functional/_isFormatIdnEmail.mjs +6 -3
  447. package/lib/validators/functional/_isFormatIdnEmail.mjs.map +1 -1
  448. package/lib/validators/functional/_isFormatIdnEmail2.mjs +18 -0
  449. package/lib/validators/functional/_isFormatIdnEmail2.mjs.map +1 -0
  450. package/lib/validators/functional/_isFormatIdnHostname.js.map +1 -1
  451. package/lib/validators/functional/_isFormatIdnHostname.mjs +6 -3
  452. package/lib/validators/functional/_isFormatIdnHostname.mjs.map +1 -1
  453. package/lib/validators/functional/_isFormatIdnHostname2.mjs +18 -0
  454. package/lib/validators/functional/_isFormatIdnHostname2.mjs.map +1 -0
  455. package/lib/validators/functional/_isFormatIpv4.js.map +1 -1
  456. package/lib/validators/functional/_isFormatIpv4.mjs +6 -3
  457. package/lib/validators/functional/_isFormatIpv4.mjs.map +1 -1
  458. package/lib/validators/functional/_isFormatIpv42.mjs +18 -0
  459. package/lib/validators/functional/_isFormatIpv42.mjs.map +1 -0
  460. package/lib/validators/functional/_isFormatIpv6.js.map +1 -1
  461. package/lib/validators/functional/_isFormatIpv6.mjs +6 -3
  462. package/lib/validators/functional/_isFormatIpv6.mjs.map +1 -1
  463. package/lib/validators/functional/_isFormatIpv62.mjs +18 -0
  464. package/lib/validators/functional/_isFormatIpv62.mjs.map +1 -0
  465. package/lib/validators/functional/_isFormatIri.js.map +1 -1
  466. package/lib/validators/functional/_isFormatIri.mjs +6 -3
  467. package/lib/validators/functional/_isFormatIri.mjs.map +1 -1
  468. package/lib/validators/functional/_isFormatIri2.mjs +18 -0
  469. package/lib/validators/functional/_isFormatIri2.mjs.map +1 -0
  470. package/lib/validators/functional/_isFormatIriReference.js.map +1 -1
  471. package/lib/validators/functional/_isFormatIriReference.mjs +6 -3
  472. package/lib/validators/functional/_isFormatIriReference.mjs.map +1 -1
  473. package/lib/validators/functional/_isFormatIriReference2.mjs +18 -0
  474. package/lib/validators/functional/_isFormatIriReference2.mjs.map +1 -0
  475. package/lib/validators/functional/_isFormatJsonPointer.js.map +1 -1
  476. package/lib/validators/functional/_isFormatJsonPointer.mjs +6 -3
  477. package/lib/validators/functional/_isFormatJsonPointer.mjs.map +1 -1
  478. package/lib/validators/functional/_isFormatJsonPointer2.mjs +18 -0
  479. package/lib/validators/functional/_isFormatJsonPointer2.mjs.map +1 -0
  480. package/lib/validators/functional/_isFormatPassword.js.map +1 -1
  481. package/lib/validators/functional/_isFormatPassword.mjs +6 -2
  482. package/lib/validators/functional/_isFormatPassword.mjs.map +1 -1
  483. package/lib/validators/functional/_isFormatPassword2.mjs +17 -0
  484. package/lib/validators/functional/_isFormatPassword2.mjs.map +1 -0
  485. package/lib/validators/functional/_isFormatRegex.js.map +1 -1
  486. package/lib/validators/functional/_isFormatRegex.mjs +6 -10
  487. package/lib/validators/functional/_isFormatRegex.mjs.map +1 -1
  488. package/lib/validators/functional/_isFormatRegex2.mjs +25 -0
  489. package/lib/validators/functional/_isFormatRegex2.mjs.map +1 -0
  490. package/lib/validators/functional/_isFormatRelativeJsonPointer.js.map +1 -1
  491. package/lib/validators/functional/_isFormatRelativeJsonPointer.mjs +6 -3
  492. package/lib/validators/functional/_isFormatRelativeJsonPointer.mjs.map +1 -1
  493. package/lib/validators/functional/_isFormatRelativeJsonPointer2.mjs +18 -0
  494. package/lib/validators/functional/_isFormatRelativeJsonPointer2.mjs.map +1 -0
  495. package/lib/validators/functional/_isFormatTime.js.map +1 -1
  496. package/lib/validators/functional/_isFormatTime.mjs +6 -3
  497. package/lib/validators/functional/_isFormatTime.mjs.map +1 -1
  498. package/lib/validators/functional/_isFormatTime2.mjs +18 -0
  499. package/lib/validators/functional/_isFormatTime2.mjs.map +1 -0
  500. package/lib/validators/functional/_isFormatUri.js.map +1 -1
  501. package/lib/validators/functional/_isFormatUri.mjs +6 -4
  502. package/lib/validators/functional/_isFormatUri.mjs.map +1 -1
  503. package/lib/validators/functional/_isFormatUri2.mjs +19 -0
  504. package/lib/validators/functional/_isFormatUri2.mjs.map +1 -0
  505. package/lib/validators/functional/_isFormatUriReference.js.map +1 -1
  506. package/lib/validators/functional/_isFormatUriReference.mjs +6 -3
  507. package/lib/validators/functional/_isFormatUriReference.mjs.map +1 -1
  508. package/lib/validators/functional/_isFormatUriReference2.mjs +18 -0
  509. package/lib/validators/functional/_isFormatUriReference2.mjs.map +1 -0
  510. package/lib/validators/functional/_isFormatUriTemplate.js.map +1 -1
  511. package/lib/validators/functional/_isFormatUriTemplate.mjs +6 -3
  512. package/lib/validators/functional/_isFormatUriTemplate.mjs.map +1 -1
  513. package/lib/validators/functional/_isFormatUriTemplate2.mjs +18 -0
  514. package/lib/validators/functional/_isFormatUriTemplate2.mjs.map +1 -0
  515. package/lib/validators/functional/_isFormatUrl.js.map +1 -1
  516. package/lib/validators/functional/_isFormatUrl.mjs +6 -3
  517. package/lib/validators/functional/_isFormatUrl.mjs.map +1 -1
  518. package/lib/validators/functional/_isFormatUrl2.mjs +18 -0
  519. package/lib/validators/functional/_isFormatUrl2.mjs.map +1 -0
  520. package/lib/validators/functional/_isFormatUuid.js.map +1 -1
  521. package/lib/validators/functional/_isFormatUuid.mjs +6 -3
  522. package/lib/validators/functional/_isFormatUuid.mjs.map +1 -1
  523. package/lib/validators/functional/_isFormatUuid2.mjs +18 -0
  524. package/lib/validators/functional/_isFormatUuid2.mjs.map +1 -0
  525. package/lib/validators/functional/_isUniqueItems.js.map +1 -1
  526. package/lib/validators/functional/_isUniqueItems.mjs +6 -136
  527. package/lib/validators/functional/_isUniqueItems.mjs.map +1 -1
  528. package/lib/validators/functional/_isUniqueItems2.mjs +151 -0
  529. package/lib/validators/functional/_isUniqueItems2.mjs.map +1 -0
  530. package/lib/validators/index.d.ts +1 -0
  531. package/lib/validators/index.js +0 -1
  532. package/lib/validators/index.js.map +1 -1
  533. package/lib/validators/index.mjs +7 -6
  534. package/lib/validators/index.mjs.map +1 -1
  535. package/lib/validators/index2.mjs +45 -0
  536. package/lib/validators/index2.mjs.map +1 -0
  537. package/lib/validators/internal/IOpenApiValidatorContext.mjs +6 -0
  538. package/lib/validators/internal/IOpenApiValidatorContext.mjs.map +1 -1
  539. package/lib/validators/internal/IOpenApiValidatorContext2.mjs +14 -0
  540. package/lib/validators/internal/IOpenApiValidatorContext2.mjs.map +1 -0
  541. package/lib/validators/internal/OpenApiArrayValidator.js.map +1 -1
  542. package/lib/validators/internal/OpenApiArrayValidator.mjs +5 -44
  543. package/lib/validators/internal/OpenApiArrayValidator.mjs.map +1 -1
  544. package/lib/validators/internal/OpenApiArrayValidator2.mjs +45 -0
  545. package/lib/validators/internal/OpenApiArrayValidator2.mjs.map +1 -0
  546. package/lib/validators/internal/OpenApiBooleanValidator.js.map +1 -1
  547. package/lib/validators/internal/OpenApiBooleanValidator.mjs +6 -7
  548. package/lib/validators/internal/OpenApiBooleanValidator.mjs.map +1 -1
  549. package/lib/validators/internal/OpenApiBooleanValidator2.mjs +21 -0
  550. package/lib/validators/internal/OpenApiBooleanValidator2.mjs.map +1 -0
  551. package/lib/validators/internal/OpenApiConstantValidator.js.map +1 -1
  552. package/lib/validators/internal/OpenApiConstantValidator.mjs +6 -7
  553. package/lib/validators/internal/OpenApiConstantValidator.mjs.map +1 -1
  554. package/lib/validators/internal/OpenApiConstantValidator2.mjs +21 -0
  555. package/lib/validators/internal/OpenApiConstantValidator2.mjs.map +1 -0
  556. package/lib/validators/internal/OpenApiIntegerValidator.js.map +1 -1
  557. package/lib/validators/internal/OpenApiIntegerValidator.mjs +6 -45
  558. package/lib/validators/internal/OpenApiIntegerValidator.mjs.map +1 -1
  559. package/lib/validators/internal/OpenApiIntegerValidator2.mjs +44 -0
  560. package/lib/validators/internal/OpenApiIntegerValidator2.mjs.map +1 -0
  561. package/lib/validators/internal/OpenApiNumberValidator.js.map +1 -1
  562. package/lib/validators/internal/OpenApiNumberValidator.mjs +6 -45
  563. package/lib/validators/internal/OpenApiNumberValidator.mjs.map +1 -1
  564. package/lib/validators/internal/OpenApiNumberValidator2.mjs +44 -0
  565. package/lib/validators/internal/OpenApiNumberValidator2.mjs.map +1 -0
  566. package/lib/validators/internal/OpenApiObjectValidator.js +6 -12
  567. package/lib/validators/internal/OpenApiObjectValidator.js.map +1 -1
  568. package/lib/validators/internal/OpenApiObjectValidator.mjs +5 -65
  569. package/lib/validators/internal/OpenApiObjectValidator.mjs.map +1 -1
  570. package/lib/validators/internal/OpenApiObjectValidator2.mjs +65 -0
  571. package/lib/validators/internal/OpenApiObjectValidator2.mjs.map +1 -0
  572. package/lib/validators/internal/OpenApiOneOfValidator.js +20 -20
  573. package/lib/validators/internal/OpenApiOneOfValidator.js.map +1 -1
  574. package/lib/validators/internal/OpenApiOneOfValidator.mjs +5 -203
  575. package/lib/validators/internal/OpenApiOneOfValidator.mjs.map +1 -1
  576. package/lib/validators/internal/OpenApiOneOfValidator2.mjs +196 -0
  577. package/lib/validators/internal/OpenApiOneOfValidator2.mjs.map +1 -0
  578. package/lib/validators/internal/OpenApiSchemaNamingRule.js.map +1 -1
  579. package/lib/validators/internal/OpenApiSchemaNamingRule.mjs +5 -118
  580. package/lib/validators/internal/OpenApiSchemaNamingRule.mjs.map +1 -1
  581. package/lib/validators/internal/OpenApiSchemaNamingRule2.mjs +134 -0
  582. package/lib/validators/internal/OpenApiSchemaNamingRule2.mjs.map +1 -0
  583. package/lib/validators/internal/OpenApiStationValidator.js +2 -1
  584. package/lib/validators/internal/OpenApiStationValidator.js.map +1 -1
  585. package/lib/validators/internal/OpenApiStationValidator.mjs +5 -104
  586. package/lib/validators/internal/OpenApiStationValidator.mjs.map +1 -1
  587. package/lib/validators/internal/OpenApiStationValidator2.mjs +86 -0
  588. package/lib/validators/internal/OpenApiStationValidator2.mjs.map +1 -0
  589. package/lib/validators/internal/OpenApiStringValidator.js.map +1 -1
  590. package/lib/validators/internal/OpenApiStringValidator.mjs +5 -82
  591. package/lib/validators/internal/OpenApiStringValidator.mjs.map +1 -1
  592. package/lib/validators/internal/OpenApiStringValidator2.mjs +105 -0
  593. package/lib/validators/internal/OpenApiStringValidator2.mjs.map +1 -0
  594. package/lib/validators/internal/OpenApiTupleValidator.js.map +1 -1
  595. package/lib/validators/internal/OpenApiTupleValidator.mjs +5 -43
  596. package/lib/validators/internal/OpenApiTupleValidator.mjs.map +1 -1
  597. package/lib/validators/internal/OpenApiTupleValidator2.mjs +43 -0
  598. package/lib/validators/internal/OpenApiTupleValidator2.mjs.map +1 -0
  599. package/package.json +8 -9
  600. package/src/converters/LlmSchemaConverter.ts +152 -33
  601. package/src/converters/OpenApiConverter.ts +375 -375
  602. package/src/converters/internal/OpenApiV3Downgrader.ts +381 -381
  603. package/src/converters/internal/OpenApiV3Upgrader.ts +494 -494
  604. package/src/converters/internal/OpenApiV3_1Downgrader.ts +318 -318
  605. package/src/converters/internal/OpenApiV3_1Upgrader.ts +713 -710
  606. package/src/converters/internal/OpenApiV3_2Upgrader.ts +342 -342
  607. package/src/converters/internal/SwaggerV2Downgrader.ts +450 -450
  608. package/src/converters/internal/SwaggerV2Upgrader.ts +547 -547
  609. package/src/http/HttpError.ts +114 -114
  610. package/src/http/HttpLlm.ts +169 -169
  611. package/src/http/HttpMigration.ts +94 -94
  612. package/src/http/internal/HttpMigrateApplicationComposer.ts +56 -56
  613. package/src/http/internal/HttpMigrateRouteComposer.ts +505 -505
  614. package/src/utils/LlmJson.ts +173 -173
  615. package/src/utils/Singleton.ts +0 -1
  616. package/src/utils/internal/OpenApiTypeCheckerBase.ts +2 -0
  617. package/src/utils/internal/coerceLlmArguments.ts +21 -3
  618. package/src/utils/internal/parseLenientJson.ts +919 -919
  619. package/src/validators/index.ts +0 -1
@@ -1,710 +1,713 @@
1
- import { IJsonSchemaAttribute, OpenApi, OpenApiV3_1 } from "@typia/interface";
2
-
3
- import { OpenApiTypeChecker } from "../../validators/OpenApiTypeChecker";
4
- import { OpenApiV3_1TypeChecker } from "../../validators/OpenApiV3_1TypeChecker";
5
- import { OpenApiExclusiveEmender } from "./OpenApiExclusiveEmender";
6
-
7
- export namespace OpenApiV3_1Upgrader {
8
- export const convert = (input: OpenApiV3_1.IDocument): OpenApi.IDocument => {
9
- if ((input as unknown as OpenApi.IDocument)["x-typia-emended-v12"] === true)
10
- return input as unknown as OpenApi.IDocument;
11
- return {
12
- ...input,
13
- openapi: "3.2.0",
14
- components: convertComponents(input.components ?? {}),
15
- paths: input.paths
16
- ? Object.fromEntries(
17
- Object.entries(input.paths)
18
- .filter(([_, v]) => v !== undefined)
19
- .map(
20
- ([key, value]) => [key, convertPathItem(input)(value)] as const,
21
- ),
22
- )
23
- : undefined,
24
- webhooks: input.webhooks
25
- ? Object.fromEntries(
26
- Object.entries(input.webhooks)
27
- .filter(([_, v]) => v !== undefined)
28
- .map(
29
- ([key, value]) =>
30
- [key, convertWebhooks(input)(value)!] as const,
31
- )
32
- .filter(([_, value]) => value !== undefined),
33
- )
34
- : undefined,
35
- "x-typia-emended-v12": true,
36
- };
37
- };
38
-
39
- /* -----------------------------------------------------------
40
- OPERATORS
41
- ----------------------------------------------------------- */
42
- const convertWebhooks =
43
- (doc: OpenApiV3_1.IDocument) =>
44
- (
45
- webhook:
46
- | OpenApiV3_1.IPath
47
- | OpenApiV3_1.IJsonSchema.IReference<`#/components/pathItems/${string}`>,
48
- ): OpenApi.IPath | undefined => {
49
- if (!OpenApiV3_1TypeChecker.isReference(webhook))
50
- return convertPathItem(doc)(webhook);
51
- const found: OpenApiV3_1.IPath | undefined =
52
- doc.components?.pathItems?.[webhook.$ref.split("/").pop() ?? ""];
53
- return found ? convertPathItem(doc)(found) : undefined;
54
- };
55
-
56
- const convertPathItem =
57
- (doc: OpenApiV3_1.IDocument) =>
58
- (pathItem: OpenApiV3_1.IPath): OpenApi.IPath => {
59
- // Convert x-additionalOperations to additionalOperations
60
- // Promote "query" to standard method (it's a v3.2 standard method)
61
- const xAdditional = pathItem["x-additionalOperations"];
62
- const queryOp = xAdditional?.["query"];
63
- const additionalOperations = xAdditional
64
- ? Object.fromEntries(
65
- Object.entries(xAdditional)
66
- .filter(([key, v]) => key !== "query" && v !== undefined)
67
- .map(([key, value]) => [
68
- key,
69
- convertOperation(doc)(pathItem)(value),
70
- ]),
71
- )
72
- : undefined;
73
-
74
- return {
75
- ...(pathItem as any),
76
- ...(pathItem.get
77
- ? { get: convertOperation(doc)(pathItem)(pathItem.get) }
78
- : undefined),
79
- ...(pathItem.put
80
- ? { put: convertOperation(doc)(pathItem)(pathItem.put) }
81
- : undefined),
82
- ...(pathItem.post
83
- ? { post: convertOperation(doc)(pathItem)(pathItem.post) }
84
- : undefined),
85
- ...(pathItem.delete
86
- ? { delete: convertOperation(doc)(pathItem)(pathItem.delete) }
87
- : undefined),
88
- ...(pathItem.options
89
- ? { options: convertOperation(doc)(pathItem)(pathItem.options) }
90
- : undefined),
91
- ...(pathItem.head
92
- ? { head: convertOperation(doc)(pathItem)(pathItem.head) }
93
- : undefined),
94
- ...(pathItem.patch
95
- ? { patch: convertOperation(doc)(pathItem)(pathItem.patch) }
96
- : undefined),
97
- ...(pathItem.trace
98
- ? { trace: convertOperation(doc)(pathItem)(pathItem.trace) }
99
- : undefined),
100
- ...(queryOp
101
- ? { query: convertOperation(doc)(pathItem)(queryOp) }
102
- : undefined),
103
- ...(additionalOperations && Object.keys(additionalOperations).length > 0
104
- ? { additionalOperations }
105
- : undefined),
106
- "x-additionalOperations": undefined,
107
- };
108
- };
109
-
110
- const convertOperation =
111
- (doc: OpenApiV3_1.IDocument) =>
112
- (pathItem: OpenApiV3_1.IPath) =>
113
- (input: OpenApiV3_1.IOperation): OpenApi.IOperation => ({
114
- ...input,
115
- parameters:
116
- pathItem.parameters !== undefined || input.parameters !== undefined
117
- ? [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]
118
- .map((p) => {
119
- if (!OpenApiV3_1TypeChecker.isReference(p))
120
- return convertParameter(doc.components ?? {})(p);
121
- const found:
122
- | Omit<OpenApiV3_1.IOperation.IParameter, "in">
123
- | undefined = p.$ref.startsWith("#/components/headers/")
124
- ? doc.components?.headers?.[p.$ref.split("/").pop() ?? ""]
125
- : doc.components?.parameters?.[p.$ref.split("/").pop() ?? ""];
126
- return found !== undefined
127
- ? convertParameter(doc.components ?? {})({
128
- ...found,
129
- in: "header",
130
- })
131
- : undefined!;
132
- })
133
- .filter((_, v) => v !== undefined)
134
- : undefined,
135
- requestBody: input.requestBody
136
- ? convertRequestBody(doc)(input.requestBody)
137
- : undefined,
138
- responses: input.responses
139
- ? Object.fromEntries(
140
- Object.entries(input.responses)
141
- .filter(([_, v]) => v !== undefined)
142
- .map(
143
- ([key, value]) => [key, convertResponse(doc)(value)!] as const,
144
- )
145
- .filter(([_, value]) => value !== undefined),
146
- )
147
- : undefined,
148
- });
149
-
150
- const convertParameter =
151
- (components: OpenApiV3_1.IComponents) =>
152
- (
153
- input: OpenApiV3_1.IOperation.IParameter,
154
- ): OpenApi.IOperation.IParameter => ({
155
- ...input,
156
- schema: convertSchema(components)(input.schema),
157
- examples: input.examples
158
- ? Object.fromEntries(
159
- Object.entries(input.examples)
160
- .map(([key, value]) => [
161
- key,
162
- OpenApiV3_1TypeChecker.isReference(value)
163
- ? components.examples?.[value.$ref.split("/").pop() ?? ""]
164
- : value,
165
- ])
166
- .filter(([_, v]) => v !== undefined),
167
- )
168
- : undefined,
169
- });
170
-
171
- const convertRequestBody =
172
- (doc: OpenApiV3_1.IDocument) =>
173
- (
174
- input:
175
- | OpenApiV3_1.IOperation.IRequestBody
176
- | OpenApiV3_1.IJsonSchema.IReference<`#/components/requestBodies/${string}`>,
177
- ): OpenApi.IOperation.IRequestBody | undefined => {
178
- if (OpenApiV3_1TypeChecker.isReference(input)) {
179
- const found: OpenApiV3_1.IOperation.IRequestBody | undefined =
180
- doc.components?.requestBodies?.[input.$ref.split("/").pop() ?? ""];
181
- if (found === undefined) return undefined;
182
- input = found;
183
- }
184
- return {
185
- ...input,
186
- content: input.content
187
- ? convertContent(doc.components ?? {})(input.content)
188
- : undefined,
189
- };
190
- };
191
-
192
- const convertResponse =
193
- (doc: OpenApiV3_1.IDocument) =>
194
- (
195
- input:
196
- | OpenApiV3_1.IOperation.IResponse
197
- | OpenApiV3_1.IJsonSchema.IReference<`#/components/responses/${string}`>,
198
- ): OpenApi.IOperation.IResponse | undefined => {
199
- if (OpenApiV3_1TypeChecker.isReference(input)) {
200
- const found: OpenApiV3_1.IOperation.IResponse | undefined =
201
- doc.components?.responses?.[input.$ref.split("/").pop() ?? ""];
202
- if (found === undefined) return undefined;
203
- input = found;
204
- }
205
- return {
206
- ...input,
207
- content: input.content
208
- ? convertContent(doc.components ?? {})(input.content)
209
- : undefined,
210
- headers: input.headers
211
- ? Object.fromEntries(
212
- Object.entries(input.headers)
213
- .filter(([_, v]) => v !== undefined)
214
- .map(
215
- ([key, value]) =>
216
- [
217
- key,
218
- (() => {
219
- if (OpenApiV3_1TypeChecker.isReference(value) === false)
220
- return convertParameter(doc.components ?? {})({
221
- ...value,
222
- in: "header",
223
- });
224
- const found:
225
- | Omit<OpenApiV3_1.IOperation.IParameter, "in">
226
- | undefined = value.$ref.startsWith(
227
- "#/components/headers/",
228
- )
229
- ? doc.components?.headers?.[
230
- value.$ref.split("/").pop() ?? ""
231
- ]
232
- : undefined;
233
- return found !== undefined
234
- ? convertParameter(doc.components ?? {})({
235
- ...found,
236
- in: "header",
237
- })
238
- : undefined!;
239
- })(),
240
- ] as const,
241
- )
242
- .filter(([_, v]) => v !== undefined),
243
- )
244
- : undefined,
245
- };
246
- };
247
-
248
- const convertContent =
249
- (components: OpenApiV3_1.IComponents) =>
250
- (
251
- record: Record<string, OpenApiV3_1.IOperation.IMediaType>,
252
- ): Record<string, OpenApi.IOperation.IMediaType> =>
253
- Object.fromEntries(
254
- Object.entries(record)
255
- .filter(([_, v]) => v !== undefined)
256
- .map(
257
- ([key, value]) =>
258
- [
259
- key,
260
- {
261
- ...value,
262
- schema: value.schema
263
- ? convertSchema(components)(value.schema)
264
- : undefined,
265
- examples: value.examples
266
- ? Object.fromEntries(
267
- Object.entries(value.examples)
268
- .map(([key, value]) => [
269
- key,
270
- OpenApiV3_1TypeChecker.isReference(value)
271
- ? components.examples?.[
272
- value.$ref.split("/").pop() ?? ""
273
- ]
274
- : value,
275
- ])
276
- .filter(([_, v]) => v !== undefined),
277
- )
278
- : undefined,
279
- },
280
- ] as const,
281
- ),
282
- );
283
-
284
- /* -----------------------------------------------------------
285
- DEFINITIONS
286
- ----------------------------------------------------------- */
287
- export const convertComponents = (
288
- input: OpenApiV3_1.IComponents,
289
- ): OpenApi.IComponents => ({
290
- schemas: Object.fromEntries(
291
- Object.entries(input.schemas ?? {})
292
- .filter(([_, v]) => v !== undefined)
293
- .map(([key, value]) => [key, convertSchema(input)(value)] as const),
294
- ),
295
- securitySchemes: input.securitySchemes,
296
- });
297
-
298
- export const convertSchema =
299
- (components: OpenApiV3_1.IComponents) =>
300
- (input: OpenApiV3_1.IJsonSchema): OpenApi.IJsonSchema => {
301
- const union: OpenApi.IJsonSchema[] = [];
302
- const attribute: IJsonSchemaAttribute = {
303
- title: input.title,
304
- description: input.description,
305
- deprecated: input.deprecated,
306
- readOnly: input.readOnly,
307
- writeOnly: input.writeOnly,
308
- example: input.example,
309
- examples: Array.isArray(input.examples)
310
- ? Object.fromEntries(input.examples.map((v, i) => [`v${i}`, v]))
311
- : input.examples,
312
- ...Object.fromEntries(
313
- Object.entries(input).filter(
314
- ([key, value]) => key.startsWith("x-") && value !== undefined,
315
- ),
316
- ),
317
- };
318
- const nullable: { value: boolean; default?: null } = {
319
- value: false,
320
- default: undefined,
321
- };
322
-
323
- const visit = (schema: OpenApiV3_1.IJsonSchema): void => {
324
- // NULLABLE PROPERTY
325
- if ((schema as OpenApiV3_1.IJsonSchema.INumber).nullable === true) {
326
- nullable.value ||= true;
327
- if ((schema as OpenApiV3_1.IJsonSchema.INumber).default === null)
328
- nullable.default = null;
329
- }
330
- if (
331
- Array.isArray((schema as OpenApiV3_1.IJsonSchema.INumber).enum) &&
332
- (schema as OpenApiV3_1.IJsonSchema.INumber).enum?.length &&
333
- (schema as OpenApiV3_1.IJsonSchema.INumber).enum?.some(
334
- (e) => e === null,
335
- )
336
- )
337
- nullable.value ||= true;
338
-
339
- // MIXED TYPE CASE
340
- if (OpenApiV3_1TypeChecker.isMixed(schema)) {
341
- if (schema.const !== undefined)
342
- visit({
343
- ...schema,
344
- ...{
345
- type: undefined,
346
- oneOf: undefined,
347
- anyOf: undefined,
348
- allOf: undefined,
349
- $ref: undefined,
350
- },
351
- });
352
- if (schema.oneOf !== undefined)
353
- visit({
354
- ...schema,
355
- ...{
356
- type: undefined,
357
- anyOf: undefined,
358
- allOf: undefined,
359
- $ref: undefined,
360
- },
361
- });
362
- if (schema.anyOf !== undefined)
363
- visit({
364
- ...schema,
365
- ...{
366
- type: undefined,
367
- oneOf: undefined,
368
- allOf: undefined,
369
- $ref: undefined,
370
- },
371
- });
372
- if (schema.allOf !== undefined)
373
- visit({
374
- ...schema,
375
- ...{
376
- type: undefined,
377
- oneOf: undefined,
378
- anyOf: undefined,
379
- $ref: undefined,
380
- },
381
- });
382
- for (const type of schema.type)
383
- if (type === "boolean" || type === "number" || type === "string")
384
- visit({
385
- ...schema,
386
- ...{
387
- enum:
388
- schema.enum?.length && schema.enum.filter((e) => e !== null)
389
- ? schema.enum.filter((x) => typeof x === type)
390
- : undefined,
391
- },
392
- type: type as any,
393
- });
394
- else if (type === "integer")
395
- visit({
396
- ...schema,
397
- ...{
398
- enum:
399
- schema.enum?.length && schema.enum.filter((e) => e !== null)
400
- ? schema.enum.filter(
401
- (x) =>
402
- x !== null &&
403
- typeof x === "number" &&
404
- Number.isInteger(x),
405
- )
406
- : undefined,
407
- },
408
- type: type as any,
409
- });
410
- else visit({ ...schema, type: type as any });
411
- }
412
- // UNION TYPE CASE
413
- else if (OpenApiV3_1TypeChecker.isOneOf(schema))
414
- schema.oneOf.forEach(visit);
415
- else if (OpenApiV3_1TypeChecker.isAnyOf(schema))
416
- schema.anyOf.forEach(visit);
417
- else if (OpenApiV3_1TypeChecker.isAllOf(schema))
418
- if (schema.allOf.length === 1) visit(schema.allOf[0]!);
419
- else union.push(convertAllOfSchema(components)(schema));
420
- // ATOMIC TYPE CASE (CONSIDER ENUM VALUES)
421
- else if (OpenApiV3_1TypeChecker.isBoolean(schema))
422
- if (
423
- schema.enum?.length &&
424
- schema.enum.filter((e) => e !== null).length
425
- )
426
- for (const value of schema.enum.filter((e) => e !== null))
427
- union.push({
428
- const: value,
429
- ...({
430
- ...schema,
431
- type: undefined as any,
432
- enum: undefined,
433
- default: undefined,
434
- } satisfies OpenApiV3_1.IJsonSchema.IBoolean as any),
435
- } satisfies OpenApi.IJsonSchema.IConstant);
436
- else
437
- union.push({
438
- ...schema,
439
- default: schema.default ?? undefined,
440
- ...{
441
- enum: undefined,
442
- },
443
- });
444
- else if (
445
- OpenApiV3_1TypeChecker.isInteger(schema) ||
446
- OpenApiV3_1TypeChecker.isNumber(schema)
447
- )
448
- if (schema.enum?.length && schema.enum.filter((e) => e !== null))
449
- for (const value of schema.enum.filter((e) => e !== null))
450
- union.push({
451
- const: value,
452
- ...({
453
- ...schema,
454
- type: undefined as any,
455
- enum: undefined,
456
- default: undefined,
457
- minimum: undefined,
458
- maximum: undefined,
459
- exclusiveMinimum: undefined,
460
- exclusiveMaximum: undefined,
461
- multipleOf: undefined,
462
- } satisfies OpenApiV3_1.IJsonSchema.IInteger as any),
463
- } satisfies OpenApi.IJsonSchema.IConstant);
464
- else
465
- union.push(
466
- OpenApiExclusiveEmender.emend({
467
- ...schema,
468
- default: schema.default ?? undefined,
469
- ...{
470
- enum: undefined,
471
- },
472
- exclusiveMinimum:
473
- typeof schema.exclusiveMinimum === "boolean"
474
- ? schema.exclusiveMinimum === true
475
- ? schema.minimum
476
- : undefined
477
- : schema.exclusiveMinimum,
478
- exclusiveMaximum:
479
- typeof schema.exclusiveMaximum === "boolean"
480
- ? schema.exclusiveMaximum === true
481
- ? schema.maximum
482
- : undefined
483
- : schema.exclusiveMaximum,
484
- minimum:
485
- schema.exclusiveMinimum === true ? undefined : schema.minimum,
486
- maximum:
487
- schema.exclusiveMaximum === true ? undefined : schema.maximum,
488
- }),
489
- );
490
- else if (OpenApiV3_1TypeChecker.isString(schema))
491
- if (
492
- schema.enum?.length &&
493
- schema.enum.filter((e) => e !== null).length
494
- )
495
- for (const value of schema.enum.filter((e) => e !== null))
496
- union.push({
497
- const: value,
498
- ...({
499
- ...schema,
500
- type: undefined as any,
501
- enum: undefined,
502
- default: undefined,
503
- } satisfies OpenApiV3_1.IJsonSchema.IString as any),
504
- } satisfies OpenApi.IJsonSchema.IConstant);
505
- else
506
- union.push({
507
- ...schema,
508
- default: schema.default ?? undefined,
509
- ...{
510
- enum: undefined,
511
- },
512
- });
513
- // ARRAY TYPE CASE (CONSIDER TUPLE)
514
- else if (OpenApiV3_1TypeChecker.isArray(schema)) {
515
- if (Array.isArray(schema.items))
516
- union.push({
517
- ...schema,
518
- ...{
519
- items: undefined!,
520
- prefixItems: schema.items.map(convertSchema(components)),
521
- additionalItems:
522
- typeof schema.additionalItems === "object" &&
523
- schema.additionalItems !== null
524
- ? convertSchema(components)(schema.additionalItems)
525
- : schema.additionalItems,
526
- },
527
- } satisfies OpenApi.IJsonSchema.ITuple);
528
- else if (Array.isArray(schema.prefixItems))
529
- union.push({
530
- ...schema,
531
- ...{
532
- items: undefined!,
533
- prefixItems: schema.prefixItems.map(convertSchema(components)),
534
- additionalItems:
535
- typeof schema.additionalItems === "object" &&
536
- schema.additionalItems !== null
537
- ? convertSchema(components)(schema.additionalItems)
538
- : schema.additionalItems,
539
- },
540
- });
541
- else if (schema.items === undefined)
542
- union.push({
543
- ...schema,
544
- ...{
545
- items: undefined!,
546
- prefixItems: [],
547
- },
548
- });
549
- else
550
- union.push({
551
- ...schema,
552
- ...{
553
- items: convertSchema(components)(schema.items),
554
- prefixItems: undefined,
555
- additionalItems: undefined,
556
- },
557
- });
558
- }
559
- // OBJECT TYPE CASE
560
- else if (OpenApiV3_1TypeChecker.isObject(schema))
561
- union.push({
562
- ...schema,
563
- ...{
564
- properties: schema.properties
565
- ? Object.fromEntries(
566
- Object.entries(schema.properties)
567
- .filter(([_, v]) => v !== undefined)
568
- .map(
569
- ([key, value]) =>
570
- [key, convertSchema(components)(value)] as const,
571
- ),
572
- )
573
- : {},
574
- additionalProperties: schema.additionalProperties
575
- ? typeof schema.additionalProperties === "object" &&
576
- schema.additionalProperties !== null
577
- ? convertSchema(components)(schema.additionalProperties)
578
- : schema.additionalProperties
579
- : undefined,
580
- required: schema.required ?? [],
581
- },
582
- });
583
- else if (OpenApiV3_1TypeChecker.isReference(schema))
584
- union.push({
585
- ...schema,
586
- ...{
587
- $ref: `#/components/schemas/${schema.$ref.split("/").pop()}`,
588
- },
589
- });
590
- else if (OpenApiV3_1TypeChecker.isRecursiveReference(schema))
591
- union.push({
592
- ...schema,
593
- ...{
594
- $ref: `#/components/schemas/${schema.$recursiveRef.split("/").pop()}`,
595
- $recursiveRef: undefined,
596
- },
597
- });
598
- // THE OTHERS
599
- else union.push(schema);
600
- };
601
-
602
- visit(input);
603
- if (
604
- nullable.value === true &&
605
- !union.some((e) => (e as OpenApi.IJsonSchema.INull).type === "null")
606
- )
607
- union.push({
608
- type: "null",
609
- default: nullable.default,
610
- });
611
- if (
612
- union.length === 2 &&
613
- union.filter((x) => OpenApiTypeChecker.isNull(x)).length === 1
614
- ) {
615
- const type: OpenApi.IJsonSchema = union.filter(
616
- (x) => OpenApiTypeChecker.isNull(x) === false,
617
- )[0]!;
618
- for (const key of [
619
- "title",
620
- "description",
621
- "deprecated",
622
- "readOnly",
623
- "writeOnly",
624
- "example",
625
- "examples",
626
- ] as const)
627
- if (type[key] !== undefined) delete type[key];
628
- }
629
- return {
630
- ...(union.length === 0
631
- ? {
632
- type: undefined,
633
- }
634
- : union.length === 1
635
- ? {
636
- ...union[0],
637
- }
638
- : {
639
- oneOf: union.map((u) => ({
640
- ...u,
641
- nullable: undefined,
642
- $defs: undefined,
643
- })),
644
- }),
645
- ...attribute,
646
- ...{
647
- nullable: undefined,
648
- $defs: undefined,
649
- },
650
- };
651
- };
652
-
653
- const convertAllOfSchema =
654
- (components: OpenApiV3_1.IComponents) =>
655
- (input: OpenApiV3_1.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {
656
- const objects: Array<OpenApiV3_1.IJsonSchema.IObject | null> =
657
- input.allOf.map((schema) => retrieveObject(components)(schema));
658
- if (objects.some((obj) => obj === null))
659
- return {
660
- type: undefined,
661
- ...{
662
- allOf: undefined,
663
- },
664
- };
665
- return {
666
- ...input,
667
- type: "object",
668
- properties: Object.fromEntries(
669
- objects
670
- .map((o) => Object.entries(o?.properties ?? {}))
671
- .flat()
672
- .map(
673
- ([key, value]) =>
674
- [key, convertSchema(components)(value)] as const,
675
- ),
676
- ),
677
- ...{
678
- allOf: undefined,
679
- required: [...new Set(objects.map((o) => o?.required ?? []).flat())],
680
- },
681
- };
682
- };
683
-
684
- const retrieveObject =
685
- (components: OpenApiV3_1.IComponents) =>
686
- (
687
- input: OpenApiV3_1.IJsonSchema,
688
- visited: Set<OpenApiV3_1.IJsonSchema> = new Set(),
689
- ): OpenApiV3_1.IJsonSchema.IObject | null => {
690
- if (OpenApiV3_1TypeChecker.isObject(input))
691
- return input.properties !== undefined && !input.additionalProperties
692
- ? input
693
- : null;
694
- else if (visited.has(input)) return null;
695
- else visited.add(input);
696
-
697
- if (OpenApiV3_1TypeChecker.isReference(input))
698
- return retrieveObject(components)(
699
- components.schemas?.[input.$ref.split("/").pop() ?? ""] ?? {},
700
- visited,
701
- );
702
- else if (OpenApiV3_1TypeChecker.isRecursiveReference(input))
703
- return retrieveObject(components)(
704
- components.schemas?.[input.$recursiveRef.split("/").pop() ?? ""] ??
705
- {},
706
- visited,
707
- );
708
- return null;
709
- };
710
- }
1
+ import { IJsonSchemaAttribute, OpenApi, OpenApiV3_1 } from "@typia/interface";
2
+
3
+ import { OpenApiTypeChecker } from "../../validators/OpenApiTypeChecker";
4
+ import { OpenApiV3_1TypeChecker } from "../../validators/OpenApiV3_1TypeChecker";
5
+ import { OpenApiExclusiveEmender } from "./OpenApiExclusiveEmender";
6
+
7
+ export namespace OpenApiV3_1Upgrader {
8
+ export const convert = (input: OpenApiV3_1.IDocument): OpenApi.IDocument => {
9
+ if ((input as unknown as OpenApi.IDocument)["x-typia-emended-v12"] === true)
10
+ return input as unknown as OpenApi.IDocument;
11
+ return {
12
+ ...input,
13
+ openapi: "3.2.0",
14
+ components: convertComponents(input.components ?? {}),
15
+ paths: input.paths
16
+ ? Object.fromEntries(
17
+ Object.entries(input.paths)
18
+ .filter(([_, v]) => v !== undefined)
19
+ .map(
20
+ ([key, value]) => [key, convertPathItem(input)(value)] as const,
21
+ ),
22
+ )
23
+ : undefined,
24
+ webhooks: input.webhooks
25
+ ? Object.fromEntries(
26
+ Object.entries(input.webhooks)
27
+ .filter(([_, v]) => v !== undefined)
28
+ .map(
29
+ ([key, value]) =>
30
+ [key, convertWebhooks(input)(value)!] as const,
31
+ )
32
+ .filter(([_, value]) => value !== undefined),
33
+ )
34
+ : undefined,
35
+ "x-typia-emended-v12": true,
36
+ };
37
+ };
38
+
39
+ /* -----------------------------------------------------------
40
+ OPERATORS
41
+ ----------------------------------------------------------- */
42
+ const convertWebhooks =
43
+ (doc: OpenApiV3_1.IDocument) =>
44
+ (
45
+ webhook:
46
+ | OpenApiV3_1.IPath
47
+ | OpenApiV3_1.IJsonSchema.IReference<`#/components/pathItems/${string}`>,
48
+ ): OpenApi.IPath | undefined => {
49
+ if (!OpenApiV3_1TypeChecker.isReference(webhook))
50
+ return convertPathItem(doc)(webhook);
51
+ const found: OpenApiV3_1.IPath | undefined =
52
+ doc.components?.pathItems?.[webhook.$ref.split("/").pop() ?? ""];
53
+ return found ? convertPathItem(doc)(found) : undefined;
54
+ };
55
+
56
+ const convertPathItem =
57
+ (doc: OpenApiV3_1.IDocument) =>
58
+ (pathItem: OpenApiV3_1.IPath): OpenApi.IPath => {
59
+ // Convert x-additionalOperations to additionalOperations
60
+ // Promote "query" to standard method (it's a v3.2 standard method)
61
+ const xAdditional = pathItem["x-additionalOperations"];
62
+ const queryOp = xAdditional?.["query"];
63
+ const additionalOperations = xAdditional
64
+ ? Object.fromEntries(
65
+ Object.entries(xAdditional)
66
+ .filter(([key, v]) => key !== "query" && v !== undefined)
67
+ .map(([key, value]) => [
68
+ key,
69
+ convertOperation(doc)(pathItem)(value),
70
+ ]),
71
+ )
72
+ : undefined;
73
+
74
+ return {
75
+ ...(pathItem as any),
76
+ ...(pathItem.get
77
+ ? { get: convertOperation(doc)(pathItem)(pathItem.get) }
78
+ : undefined),
79
+ ...(pathItem.put
80
+ ? { put: convertOperation(doc)(pathItem)(pathItem.put) }
81
+ : undefined),
82
+ ...(pathItem.post
83
+ ? { post: convertOperation(doc)(pathItem)(pathItem.post) }
84
+ : undefined),
85
+ ...(pathItem.delete
86
+ ? { delete: convertOperation(doc)(pathItem)(pathItem.delete) }
87
+ : undefined),
88
+ ...(pathItem.options
89
+ ? { options: convertOperation(doc)(pathItem)(pathItem.options) }
90
+ : undefined),
91
+ ...(pathItem.head
92
+ ? { head: convertOperation(doc)(pathItem)(pathItem.head) }
93
+ : undefined),
94
+ ...(pathItem.patch
95
+ ? { patch: convertOperation(doc)(pathItem)(pathItem.patch) }
96
+ : undefined),
97
+ ...(pathItem.trace
98
+ ? { trace: convertOperation(doc)(pathItem)(pathItem.trace) }
99
+ : undefined),
100
+ ...(queryOp
101
+ ? { query: convertOperation(doc)(pathItem)(queryOp) }
102
+ : undefined),
103
+ ...(additionalOperations && Object.keys(additionalOperations).length > 0
104
+ ? { additionalOperations }
105
+ : undefined),
106
+ "x-additionalOperations": undefined,
107
+ };
108
+ };
109
+
110
+ const convertOperation =
111
+ (doc: OpenApiV3_1.IDocument) =>
112
+ (pathItem: OpenApiV3_1.IPath) =>
113
+ (input: OpenApiV3_1.IOperation): OpenApi.IOperation => ({
114
+ ...input,
115
+ parameters:
116
+ pathItem.parameters !== undefined || input.parameters !== undefined
117
+ ? [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]
118
+ .map((p) => {
119
+ if (!OpenApiV3_1TypeChecker.isReference(p))
120
+ return convertParameter(doc.components ?? {})(p);
121
+ const found:
122
+ | Omit<OpenApiV3_1.IOperation.IParameter, "in">
123
+ | undefined = p.$ref.startsWith("#/components/headers/")
124
+ ? doc.components?.headers?.[p.$ref.split("/").pop() ?? ""]
125
+ : doc.components?.parameters?.[p.$ref.split("/").pop() ?? ""];
126
+ return found !== undefined
127
+ ? convertParameter(doc.components ?? {})({
128
+ ...found,
129
+ in: "header",
130
+ })
131
+ : undefined!;
132
+ })
133
+ .filter((_, v) => v !== undefined)
134
+ : undefined,
135
+ requestBody: input.requestBody
136
+ ? convertRequestBody(doc)(input.requestBody)
137
+ : undefined,
138
+ responses: input.responses
139
+ ? Object.fromEntries(
140
+ Object.entries(input.responses)
141
+ .filter(([_, v]) => v !== undefined)
142
+ .map(
143
+ ([key, value]) => [key, convertResponse(doc)(value)!] as const,
144
+ )
145
+ .filter(([_, value]) => value !== undefined),
146
+ )
147
+ : undefined,
148
+ });
149
+
150
+ const convertParameter =
151
+ (components: OpenApiV3_1.IComponents) =>
152
+ (
153
+ input: OpenApiV3_1.IOperation.IParameter,
154
+ ): OpenApi.IOperation.IParameter => ({
155
+ ...input,
156
+ schema: convertSchema(components)(input.schema),
157
+ examples: input.examples
158
+ ? Object.fromEntries(
159
+ Object.entries(input.examples)
160
+ .map(([key, value]) => [
161
+ key,
162
+ OpenApiV3_1TypeChecker.isReference(value)
163
+ ? components.examples?.[value.$ref.split("/").pop() ?? ""]
164
+ : value,
165
+ ])
166
+ .filter(([_, v]) => v !== undefined),
167
+ )
168
+ : undefined,
169
+ });
170
+
171
+ const convertRequestBody =
172
+ (doc: OpenApiV3_1.IDocument) =>
173
+ (
174
+ input:
175
+ | OpenApiV3_1.IOperation.IRequestBody
176
+ | OpenApiV3_1.IJsonSchema.IReference<`#/components/requestBodies/${string}`>,
177
+ ): OpenApi.IOperation.IRequestBody | undefined => {
178
+ if (OpenApiV3_1TypeChecker.isReference(input)) {
179
+ const found: OpenApiV3_1.IOperation.IRequestBody | undefined =
180
+ doc.components?.requestBodies?.[input.$ref.split("/").pop() ?? ""];
181
+ if (found === undefined) return undefined;
182
+ input = found;
183
+ }
184
+ return {
185
+ ...input,
186
+ content: input.content
187
+ ? convertContent(doc.components ?? {})(input.content)
188
+ : undefined,
189
+ };
190
+ };
191
+
192
+ const convertResponse =
193
+ (doc: OpenApiV3_1.IDocument) =>
194
+ (
195
+ input:
196
+ | OpenApiV3_1.IOperation.IResponse
197
+ | OpenApiV3_1.IJsonSchema.IReference<`#/components/responses/${string}`>,
198
+ ): OpenApi.IOperation.IResponse | undefined => {
199
+ if (OpenApiV3_1TypeChecker.isReference(input)) {
200
+ const found: OpenApiV3_1.IOperation.IResponse | undefined =
201
+ doc.components?.responses?.[input.$ref.split("/").pop() ?? ""];
202
+ if (found === undefined) return undefined;
203
+ input = found;
204
+ }
205
+ return {
206
+ ...input,
207
+ content: input.content
208
+ ? convertContent(doc.components ?? {})(input.content)
209
+ : undefined,
210
+ headers: input.headers
211
+ ? Object.fromEntries(
212
+ Object.entries(input.headers)
213
+ .filter(([_, v]) => v !== undefined)
214
+ .map(
215
+ ([key, value]) =>
216
+ [
217
+ key,
218
+ (() => {
219
+ if (OpenApiV3_1TypeChecker.isReference(value) === false)
220
+ return convertParameter(doc.components ?? {})({
221
+ ...value,
222
+ in: "header",
223
+ });
224
+ const found:
225
+ | Omit<OpenApiV3_1.IOperation.IParameter, "in">
226
+ | undefined = value.$ref.startsWith(
227
+ "#/components/headers/",
228
+ )
229
+ ? doc.components?.headers?.[
230
+ value.$ref.split("/").pop() ?? ""
231
+ ]
232
+ : undefined;
233
+ return found !== undefined
234
+ ? convertParameter(doc.components ?? {})({
235
+ ...found,
236
+ in: "header",
237
+ })
238
+ : undefined!;
239
+ })(),
240
+ ] as const,
241
+ )
242
+ .filter(([_, v]) => v !== undefined),
243
+ )
244
+ : undefined,
245
+ };
246
+ };
247
+
248
+ const convertContent =
249
+ (components: OpenApiV3_1.IComponents) =>
250
+ (
251
+ record: Record<string, OpenApiV3_1.IOperation.IMediaType>,
252
+ ): Record<string, OpenApi.IOperation.IMediaType> =>
253
+ Object.fromEntries(
254
+ Object.entries(record)
255
+ .filter(([_, v]) => v !== undefined)
256
+ .map(
257
+ ([key, value]) =>
258
+ [
259
+ key,
260
+ {
261
+ ...value,
262
+ schema: value.schema
263
+ ? convertSchema(components)(value.schema)
264
+ : undefined,
265
+ examples: value.examples
266
+ ? Object.fromEntries(
267
+ Object.entries(value.examples)
268
+ .map(([key, value]) => [
269
+ key,
270
+ OpenApiV3_1TypeChecker.isReference(value)
271
+ ? components.examples?.[
272
+ value.$ref.split("/").pop() ?? ""
273
+ ]
274
+ : value,
275
+ ])
276
+ .filter(([_, v]) => v !== undefined),
277
+ )
278
+ : undefined,
279
+ },
280
+ ] as const,
281
+ ),
282
+ );
283
+
284
+ /* -----------------------------------------------------------
285
+ DEFINITIONS
286
+ ----------------------------------------------------------- */
287
+ export const convertComponents = (
288
+ input: OpenApiV3_1.IComponents,
289
+ ): OpenApi.IComponents => ({
290
+ schemas: Object.fromEntries(
291
+ Object.entries(input.schemas ?? {})
292
+ .filter(([_, v]) => v !== undefined)
293
+ .map(([key, value]) => [key, convertSchema(input)(value)] as const),
294
+ ),
295
+ securitySchemes: input.securitySchemes,
296
+ });
297
+
298
+ export const convertSchema =
299
+ (components: OpenApiV3_1.IComponents) =>
300
+ (input: OpenApiV3_1.IJsonSchema): OpenApi.IJsonSchema => {
301
+ const union: OpenApi.IJsonSchema[] = [];
302
+ const attribute: IJsonSchemaAttribute = {
303
+ title: input.title,
304
+ description: input.description,
305
+ deprecated: input.deprecated,
306
+ readOnly: input.readOnly,
307
+ writeOnly: input.writeOnly,
308
+ example: input.example,
309
+ examples: Array.isArray(input.examples)
310
+ ? Object.fromEntries(input.examples.map((v, i) => [`v${i}`, v]))
311
+ : input.examples,
312
+ ...Object.fromEntries(
313
+ Object.entries(input).filter(
314
+ ([key, value]) => key.startsWith("x-") && value !== undefined,
315
+ ),
316
+ ),
317
+ };
318
+ const nullable: { value: boolean; default?: null } = {
319
+ value: false,
320
+ default: undefined,
321
+ };
322
+
323
+ const visit = (schema: OpenApiV3_1.IJsonSchema): void => {
324
+ // NULLABLE PROPERTY
325
+ if ((schema as OpenApiV3_1.IJsonSchema.INumber).nullable === true) {
326
+ nullable.value ||= true;
327
+ if ((schema as OpenApiV3_1.IJsonSchema.INumber).default === null)
328
+ nullable.default = null;
329
+ }
330
+ if (
331
+ Array.isArray((schema as OpenApiV3_1.IJsonSchema.INumber).enum) &&
332
+ (schema as OpenApiV3_1.IJsonSchema.INumber).enum?.length &&
333
+ (schema as OpenApiV3_1.IJsonSchema.INumber).enum?.some(
334
+ (e) => e === null,
335
+ )
336
+ )
337
+ nullable.value ||= true;
338
+
339
+ // MIXED TYPE CASE
340
+ if (OpenApiV3_1TypeChecker.isMixed(schema)) {
341
+ if (schema.const !== undefined)
342
+ visit({
343
+ ...schema,
344
+ ...{
345
+ type: undefined,
346
+ oneOf: undefined,
347
+ anyOf: undefined,
348
+ allOf: undefined,
349
+ $ref: undefined,
350
+ },
351
+ });
352
+ if (schema.oneOf !== undefined)
353
+ visit({
354
+ ...schema,
355
+ ...{
356
+ type: undefined,
357
+ anyOf: undefined,
358
+ allOf: undefined,
359
+ $ref: undefined,
360
+ },
361
+ });
362
+ if (schema.anyOf !== undefined)
363
+ visit({
364
+ ...schema,
365
+ ...{
366
+ type: undefined,
367
+ oneOf: undefined,
368
+ allOf: undefined,
369
+ $ref: undefined,
370
+ },
371
+ });
372
+ if (schema.allOf !== undefined)
373
+ visit({
374
+ ...schema,
375
+ ...{
376
+ type: undefined,
377
+ oneOf: undefined,
378
+ anyOf: undefined,
379
+ $ref: undefined,
380
+ },
381
+ });
382
+ for (const type of schema.type)
383
+ if (type === "boolean" || type === "number" || type === "string")
384
+ visit({
385
+ ...schema,
386
+ ...{
387
+ enum:
388
+ schema.enum?.length && schema.enum.filter((e) => e !== null)
389
+ ? schema.enum.filter((x) => typeof x === type)
390
+ : undefined,
391
+ },
392
+ type: type as any,
393
+ });
394
+ else if (type === "integer")
395
+ visit({
396
+ ...schema,
397
+ ...{
398
+ enum:
399
+ schema.enum?.length && schema.enum.filter((e) => e !== null)
400
+ ? schema.enum.filter(
401
+ (x) =>
402
+ x !== null &&
403
+ typeof x === "number" &&
404
+ Number.isInteger(x),
405
+ )
406
+ : undefined,
407
+ },
408
+ type: type as any,
409
+ });
410
+ else visit({ ...schema, type: type as any });
411
+ }
412
+ // UNION TYPE CASE
413
+ else if (OpenApiV3_1TypeChecker.isOneOf(schema))
414
+ schema.oneOf.forEach(visit);
415
+ else if (OpenApiV3_1TypeChecker.isAnyOf(schema))
416
+ schema.anyOf.forEach(visit);
417
+ else if (OpenApiV3_1TypeChecker.isAllOf(schema))
418
+ if (schema.allOf.length === 1) visit(schema.allOf[0]!);
419
+ else union.push(convertAllOfSchema(components)(schema));
420
+ // ATOMIC TYPE CASE (CONSIDER ENUM VALUES)
421
+ else if (OpenApiV3_1TypeChecker.isBoolean(schema))
422
+ if (
423
+ schema.enum?.length &&
424
+ schema.enum.filter((e) => e !== null).length
425
+ )
426
+ for (const value of schema.enum.filter((e) => e !== null))
427
+ union.push({
428
+ const: value,
429
+ ...({
430
+ ...schema,
431
+ type: undefined as any,
432
+ enum: undefined,
433
+ default: undefined,
434
+ } satisfies OpenApiV3_1.IJsonSchema.IBoolean as any),
435
+ } satisfies OpenApi.IJsonSchema.IConstant);
436
+ else
437
+ union.push({
438
+ ...schema,
439
+ default: schema.default ?? undefined,
440
+ ...{
441
+ enum: undefined,
442
+ },
443
+ });
444
+ else if (
445
+ OpenApiV3_1TypeChecker.isInteger(schema) ||
446
+ OpenApiV3_1TypeChecker.isNumber(schema)
447
+ )
448
+ if (schema.enum?.length && schema.enum.filter((e) => e !== null))
449
+ for (const value of schema.enum.filter((e) => e !== null))
450
+ union.push({
451
+ const: value,
452
+ ...({
453
+ ...schema,
454
+ type: undefined as any,
455
+ enum: undefined,
456
+ default: undefined,
457
+ minimum: undefined,
458
+ maximum: undefined,
459
+ exclusiveMinimum: undefined,
460
+ exclusiveMaximum: undefined,
461
+ multipleOf: undefined,
462
+ } satisfies OpenApiV3_1.IJsonSchema.IInteger as any),
463
+ } satisfies OpenApi.IJsonSchema.IConstant);
464
+ else
465
+ union.push(
466
+ OpenApiExclusiveEmender.emend({
467
+ ...schema,
468
+ default: schema.default ?? undefined,
469
+ ...{
470
+ enum: undefined,
471
+ },
472
+ exclusiveMinimum:
473
+ typeof schema.exclusiveMinimum === "boolean"
474
+ ? schema.exclusiveMinimum === true
475
+ ? schema.minimum
476
+ : undefined
477
+ : schema.exclusiveMinimum,
478
+ exclusiveMaximum:
479
+ typeof schema.exclusiveMaximum === "boolean"
480
+ ? schema.exclusiveMaximum === true
481
+ ? schema.maximum
482
+ : undefined
483
+ : schema.exclusiveMaximum,
484
+ minimum:
485
+ schema.exclusiveMinimum === true ? undefined : schema.minimum,
486
+ maximum:
487
+ schema.exclusiveMaximum === true ? undefined : schema.maximum,
488
+ }),
489
+ );
490
+ else if (OpenApiV3_1TypeChecker.isString(schema))
491
+ if (
492
+ schema.enum?.length &&
493
+ schema.enum.filter((e) => e !== null).length
494
+ )
495
+ for (const value of schema.enum.filter((e) => e !== null))
496
+ union.push({
497
+ const: value,
498
+ ...({
499
+ ...schema,
500
+ type: undefined as any,
501
+ enum: undefined,
502
+ default: undefined,
503
+ } satisfies OpenApiV3_1.IJsonSchema.IString as any),
504
+ } satisfies OpenApi.IJsonSchema.IConstant);
505
+ else
506
+ union.push({
507
+ ...schema,
508
+ default: schema.default ?? undefined,
509
+ ...{
510
+ enum: undefined,
511
+ },
512
+ });
513
+ // ARRAY TYPE CASE (CONSIDER TUPLE)
514
+ else if (OpenApiV3_1TypeChecker.isArray(schema)) {
515
+ if (Array.isArray(schema.items))
516
+ union.push({
517
+ ...schema,
518
+ ...{
519
+ items: undefined!,
520
+ prefixItems: schema.items.map(convertSchema(components)),
521
+ additionalItems:
522
+ typeof schema.additionalItems === "object" &&
523
+ schema.additionalItems !== null
524
+ ? convertSchema(components)(schema.additionalItems)
525
+ : schema.additionalItems,
526
+ },
527
+ } satisfies OpenApi.IJsonSchema.ITuple);
528
+ else if (Array.isArray(schema.prefixItems))
529
+ union.push({
530
+ ...schema,
531
+ ...{
532
+ items: undefined!,
533
+ prefixItems: schema.prefixItems.map(convertSchema(components)),
534
+ additionalItems:
535
+ schema.items !== undefined &&
536
+ Array.isArray(schema.items) === false
537
+ ? convertSchema(components)(schema.items)
538
+ : typeof schema.additionalItems === "object" &&
539
+ schema.additionalItems !== null
540
+ ? convertSchema(components)(schema.additionalItems)
541
+ : schema.additionalItems,
542
+ },
543
+ });
544
+ else if (schema.items === undefined)
545
+ union.push({
546
+ ...schema,
547
+ ...{
548
+ items: undefined!,
549
+ prefixItems: [],
550
+ },
551
+ });
552
+ else
553
+ union.push({
554
+ ...schema,
555
+ ...{
556
+ items: convertSchema(components)(schema.items),
557
+ prefixItems: undefined,
558
+ additionalItems: undefined,
559
+ },
560
+ });
561
+ }
562
+ // OBJECT TYPE CASE
563
+ else if (OpenApiV3_1TypeChecker.isObject(schema))
564
+ union.push({
565
+ ...schema,
566
+ ...{
567
+ properties: schema.properties
568
+ ? Object.fromEntries(
569
+ Object.entries(schema.properties)
570
+ .filter(([_, v]) => v !== undefined)
571
+ .map(
572
+ ([key, value]) =>
573
+ [key, convertSchema(components)(value)] as const,
574
+ ),
575
+ )
576
+ : {},
577
+ additionalProperties: schema.additionalProperties
578
+ ? typeof schema.additionalProperties === "object" &&
579
+ schema.additionalProperties !== null
580
+ ? convertSchema(components)(schema.additionalProperties)
581
+ : schema.additionalProperties
582
+ : undefined,
583
+ required: schema.required ?? [],
584
+ },
585
+ });
586
+ else if (OpenApiV3_1TypeChecker.isReference(schema))
587
+ union.push({
588
+ ...schema,
589
+ ...{
590
+ $ref: `#/components/schemas/${schema.$ref.split("/").pop()}`,
591
+ },
592
+ });
593
+ else if (OpenApiV3_1TypeChecker.isRecursiveReference(schema))
594
+ union.push({
595
+ ...schema,
596
+ ...{
597
+ $ref: `#/components/schemas/${schema.$recursiveRef.split("/").pop()}`,
598
+ $recursiveRef: undefined,
599
+ },
600
+ });
601
+ // THE OTHERS
602
+ else union.push(schema);
603
+ };
604
+
605
+ visit(input);
606
+ if (
607
+ nullable.value === true &&
608
+ !union.some((e) => (e as OpenApi.IJsonSchema.INull).type === "null")
609
+ )
610
+ union.push({
611
+ type: "null",
612
+ default: nullable.default,
613
+ });
614
+ if (
615
+ union.length === 2 &&
616
+ union.filter((x) => OpenApiTypeChecker.isNull(x)).length === 1
617
+ ) {
618
+ const type: OpenApi.IJsonSchema = union.filter(
619
+ (x) => OpenApiTypeChecker.isNull(x) === false,
620
+ )[0]!;
621
+ for (const key of [
622
+ "title",
623
+ "description",
624
+ "deprecated",
625
+ "readOnly",
626
+ "writeOnly",
627
+ "example",
628
+ "examples",
629
+ ] as const)
630
+ if (type[key] !== undefined) delete type[key];
631
+ }
632
+ return {
633
+ ...(union.length === 0
634
+ ? {
635
+ type: undefined,
636
+ }
637
+ : union.length === 1
638
+ ? {
639
+ ...union[0],
640
+ }
641
+ : {
642
+ oneOf: union.map((u) => ({
643
+ ...u,
644
+ nullable: undefined,
645
+ $defs: undefined,
646
+ })),
647
+ }),
648
+ ...attribute,
649
+ ...{
650
+ nullable: undefined,
651
+ $defs: undefined,
652
+ },
653
+ };
654
+ };
655
+
656
+ const convertAllOfSchema =
657
+ (components: OpenApiV3_1.IComponents) =>
658
+ (input: OpenApiV3_1.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {
659
+ const objects: Array<OpenApiV3_1.IJsonSchema.IObject | null> =
660
+ input.allOf.map((schema) => retrieveObject(components)(schema));
661
+ if (objects.some((obj) => obj === null))
662
+ return {
663
+ type: undefined,
664
+ ...{
665
+ allOf: undefined,
666
+ },
667
+ };
668
+ return {
669
+ ...input,
670
+ type: "object",
671
+ properties: Object.fromEntries(
672
+ objects
673
+ .map((o) => Object.entries(o?.properties ?? {}))
674
+ .flat()
675
+ .map(
676
+ ([key, value]) =>
677
+ [key, convertSchema(components)(value)] as const,
678
+ ),
679
+ ),
680
+ ...{
681
+ allOf: undefined,
682
+ required: [...new Set(objects.map((o) => o?.required ?? []).flat())],
683
+ },
684
+ };
685
+ };
686
+
687
+ const retrieveObject =
688
+ (components: OpenApiV3_1.IComponents) =>
689
+ (
690
+ input: OpenApiV3_1.IJsonSchema,
691
+ visited: Set<OpenApiV3_1.IJsonSchema> = new Set(),
692
+ ): OpenApiV3_1.IJsonSchema.IObject | null => {
693
+ if (OpenApiV3_1TypeChecker.isObject(input))
694
+ return input.properties !== undefined && !input.additionalProperties
695
+ ? input
696
+ : null;
697
+ else if (visited.has(input)) return null;
698
+ else visited.add(input);
699
+
700
+ if (OpenApiV3_1TypeChecker.isReference(input))
701
+ return retrieveObject(components)(
702
+ components.schemas?.[input.$ref.split("/").pop() ?? ""] ?? {},
703
+ visited,
704
+ );
705
+ else if (OpenApiV3_1TypeChecker.isRecursiveReference(input))
706
+ return retrieveObject(components)(
707
+ components.schemas?.[input.$recursiveRef.split("/").pop() ?? ""] ??
708
+ {},
709
+ visited,
710
+ );
711
+ return null;
712
+ };
713
+ }