openapi-typesafe 0.0.0 → 1.0.0-rc.0

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 (678) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +71 -1
  3. package/bin/cli.js +4 -0
  4. package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
  5. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
  6. package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
  7. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
  8. package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
  9. package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
  10. package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
  11. package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
  12. package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
  13. package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
  14. package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
  15. package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
  16. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
  17. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
  19. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
  20. package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
  21. package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
  22. package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
  23. package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
  24. package/dist/adapters/redocly-loader/redocly-config-source.cjs +42 -0
  25. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
  27. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -0
  31. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
  32. package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
  33. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
  34. package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
  35. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
  36. package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
  37. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
  38. package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
  39. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
  40. package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
  41. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
  42. package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
  43. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
  44. package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
  45. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
  46. package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
  47. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
  48. package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
  49. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
  50. package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
  51. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
  52. package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
  53. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
  54. package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
  55. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
  56. package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
  57. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
  58. package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
  59. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
  60. package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
  61. package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
  62. package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
  63. package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
  64. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
  65. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
  66. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
  67. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
  68. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +145 -0
  69. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
  70. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -0
  71. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
  72. package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
  73. package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
  74. package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
  75. package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
  76. package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
  77. package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
  78. package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
  79. package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
  80. package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
  81. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
  82. package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
  83. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
  84. package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
  85. package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
  86. package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
  87. package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
  88. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +204 -0
  89. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
  90. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -0
  91. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
  92. package/dist/api/ast-to-string.cjs +39 -0
  93. package/dist/api/ast-to-string.cjs.map +1 -0
  94. package/dist/api/ast-to-string.mjs +37 -0
  95. package/dist/api/ast-to-string.mjs.map +1 -0
  96. package/dist/api/comment-header.cjs +11 -0
  97. package/dist/api/comment-header.cjs.map +1 -0
  98. package/dist/api/comment-header.mjs +9 -0
  99. package/dist/api/comment-header.mjs.map +1 -0
  100. package/dist/api/default-ports.cjs +38 -0
  101. package/dist/api/default-ports.cjs.map +1 -0
  102. package/dist/api/default-ports.mjs +28 -0
  103. package/dist/api/default-ports.mjs.map +1 -0
  104. package/dist/api/discriminator-enum.cjs +44 -0
  105. package/dist/api/discriminator-enum.cjs.map +1 -0
  106. package/dist/api/discriminator-enum.mjs +42 -0
  107. package/dist/api/discriminator-enum.mjs.map +1 -0
  108. package/dist/api/discriminator-scan.cjs +168 -0
  109. package/dist/api/discriminator-scan.cjs.map +1 -0
  110. package/dist/api/discriminator-scan.mjs +165 -0
  111. package/dist/api/discriminator-scan.mjs.map +1 -0
  112. package/dist/api/document-declarations.cjs +28 -0
  113. package/dist/api/document-declarations.cjs.map +1 -0
  114. package/dist/api/document-declarations.mjs +26 -0
  115. package/dist/api/document-declarations.mjs.map +1 -0
  116. package/dist/api/document-refs.cjs +53 -0
  117. package/dist/api/document-refs.cjs.map +1 -0
  118. package/dist/api/document-refs.mjs +50 -0
  119. package/dist/api/document-refs.mjs.map +1 -0
  120. package/dist/api/document-run.cjs +107 -0
  121. package/dist/api/document-run.cjs.map +1 -0
  122. package/dist/api/document-run.mjs +101 -0
  123. package/dist/api/document-run.mjs.map +1 -0
  124. package/dist/api/footer-entry.cjs +18 -0
  125. package/dist/api/footer-entry.cjs.map +1 -0
  126. package/dist/api/footer-entry.mjs +15 -0
  127. package/dist/api/footer-entry.mjs.map +1 -0
  128. package/dist/api/footer-sink.cjs +53 -0
  129. package/dist/api/footer-sink.cjs.map +1 -0
  130. package/dist/api/footer-sink.mjs +51 -0
  131. package/dist/api/footer-sink.mjs.map +1 -0
  132. package/dist/api/legacy-callback-warning.cjs +25 -0
  133. package/dist/api/legacy-callback-warning.cjs.map +1 -0
  134. package/dist/api/legacy-callback-warning.mjs +22 -0
  135. package/dist/api/legacy-callback-warning.mjs.map +1 -0
  136. package/dist/api/legacy-ts-helpers.cjs +203 -0
  137. package/dist/api/legacy-ts-helpers.cjs.map +1 -0
  138. package/dist/api/legacy-ts-helpers.mjs +187 -0
  139. package/dist/api/legacy-ts-helpers.mjs.map +1 -0
  140. package/dist/api/legacy-utils.cjs +65 -0
  141. package/dist/api/legacy-utils.cjs.map +1 -0
  142. package/dist/api/legacy-utils.mjs +50 -0
  143. package/dist/api/legacy-utils.mjs.map +1 -0
  144. package/dist/api/openapi-ts.cjs +40 -0
  145. package/dist/api/openapi-ts.cjs.map +1 -0
  146. package/dist/api/openapi-ts.mjs +34 -0
  147. package/dist/api/openapi-ts.mjs.map +1 -0
  148. package/dist/api/schema-callbacks.cjs +140 -0
  149. package/dist/api/schema-callbacks.cjs.map +1 -0
  150. package/dist/api/schema-callbacks.mjs +136 -0
  151. package/dist/api/schema-callbacks.mjs.map +1 -0
  152. package/dist/api/string-to-ast.cjs +21 -0
  153. package/dist/api/string-to-ast.cjs.map +1 -0
  154. package/dist/api/string-to-ast.mjs +18 -0
  155. package/dist/api/string-to-ast.mjs.map +1 -0
  156. package/dist/api/transform-context.cjs +82 -0
  157. package/dist/api/transform-context.cjs.map +1 -0
  158. package/dist/api/transform-context.mjs +65 -0
  159. package/dist/api/transform-context.mjs.map +1 -0
  160. package/dist/api/transform-schema.cjs +31 -0
  161. package/dist/api/transform-schema.cjs.map +1 -0
  162. package/dist/api/transform-schema.mjs +26 -0
  163. package/dist/api/transform-schema.mjs.map +1 -0
  164. package/dist/api/type-helpers.cjs +85 -0
  165. package/dist/api/type-helpers.cjs.map +1 -0
  166. package/dist/api/type-helpers.mjs +66 -0
  167. package/dist/api/type-helpers.mjs.map +1 -0
  168. package/dist/api/unsupported-feature-warnings.cjs +17 -0
  169. package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
  170. package/dist/api/unsupported-feature-warnings.mjs +15 -0
  171. package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
  172. package/dist/application/print/comment-writer.cjs +95 -0
  173. package/dist/application/print/comment-writer.cjs.map +1 -0
  174. package/dist/application/print/comment-writer.mjs +93 -0
  175. package/dist/application/print/comment-writer.mjs.map +1 -0
  176. package/dist/application/print/declaration-printer.cjs +83 -0
  177. package/dist/application/print/declaration-printer.cjs.map +1 -0
  178. package/dist/application/print/declaration-printer.mjs +81 -0
  179. package/dist/application/print/declaration-printer.mjs.map +1 -0
  180. package/dist/application/print/literal-text.cjs +52 -0
  181. package/dist/application/print/literal-text.cjs.map +1 -0
  182. package/dist/application/print/literal-text.mjs +48 -0
  183. package/dist/application/print/literal-text.mjs.map +1 -0
  184. package/dist/application/print/print-nodes.cjs +38 -0
  185. package/dist/application/print/print-nodes.cjs.map +1 -0
  186. package/dist/application/print/print-nodes.mjs +36 -0
  187. package/dist/application/print/print-nodes.mjs.map +1 -0
  188. package/dist/application/print/print-options.cjs +6 -0
  189. package/dist/application/print/print-options.cjs.map +1 -0
  190. package/dist/application/print/print-options.mjs +4 -0
  191. package/dist/application/print/print-options.mjs.map +1 -0
  192. package/dist/application/print/text-writer.cjs +63 -0
  193. package/dist/application/print/text-writer.cjs.map +1 -0
  194. package/dist/application/print/text-writer.mjs +60 -0
  195. package/dist/application/print/text-writer.mjs.map +1 -0
  196. package/dist/application/print/type-printer.cjs +214 -0
  197. package/dist/application/print/type-printer.cjs.map +1 -0
  198. package/dist/application/print/type-printer.mjs +210 -0
  199. package/dist/application/print/type-printer.mjs.map +1 -0
  200. package/dist/application/stack-overflow.cjs +36 -0
  201. package/dist/application/stack-overflow.cjs.map +1 -0
  202. package/dist/application/stack-overflow.mjs +31 -0
  203. package/dist/application/stack-overflow.mjs.map +1 -0
  204. package/dist/application/transform/document/components.cjs +104 -0
  205. package/dist/application/transform/document/components.cjs.map +1 -0
  206. package/dist/application/transform/document/components.mjs +102 -0
  207. package/dist/application/transform/document/components.mjs.map +1 -0
  208. package/dist/application/transform/document/defs-root.cjs +18 -0
  209. package/dist/application/transform/document/defs-root.cjs.map +1 -0
  210. package/dist/application/transform/document/defs-root.mjs +16 -0
  211. package/dist/application/transform/document/defs-root.mjs.map +1 -0
  212. package/dist/application/transform/document/document-member.cjs +13 -0
  213. package/dist/application/transform/document/document-member.cjs.map +1 -0
  214. package/dist/application/transform/document/document-member.mjs +11 -0
  215. package/dist/application/transform/document/document-member.mjs.map +1 -0
  216. package/dist/application/transform/document/document.cjs +86 -0
  217. package/dist/application/transform/document/document.cjs.map +1 -0
  218. package/dist/application/transform/document/document.mjs +83 -0
  219. package/dist/application/transform/document/document.mjs.map +1 -0
  220. package/dist/application/transform/document/header.cjs +27 -0
  221. package/dist/application/transform/document/header.cjs.map +1 -0
  222. package/dist/application/transform/document/header.mjs +25 -0
  223. package/dist/application/transform/document/header.mjs.map +1 -0
  224. package/dist/application/transform/document/kept-deprecated.cjs +96 -0
  225. package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
  226. package/dist/application/transform/document/kept-deprecated.mjs +94 -0
  227. package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
  228. package/dist/application/transform/document/media-type.cjs +42 -0
  229. package/dist/application/transform/document/media-type.cjs.map +1 -0
  230. package/dist/application/transform/document/media-type.mjs +38 -0
  231. package/dist/application/transform/document/media-type.mjs.map +1 -0
  232. package/dist/application/transform/document/operation.cjs +45 -0
  233. package/dist/application/transform/document/operation.cjs.map +1 -0
  234. package/dist/application/transform/document/operation.mjs +43 -0
  235. package/dist/application/transform/document/operation.mjs.map +1 -0
  236. package/dist/application/transform/document/parameter.cjs +25 -0
  237. package/dist/application/transform/document/parameter.cjs.map +1 -0
  238. package/dist/application/transform/document/parameter.mjs +23 -0
  239. package/dist/application/transform/document/parameter.mjs.map +1 -0
  240. package/dist/application/transform/document/parameters.cjs +114 -0
  241. package/dist/application/transform/document/parameters.cjs.map +1 -0
  242. package/dist/application/transform/document/parameters.mjs +112 -0
  243. package/dist/application/transform/document/parameters.mjs.map +1 -0
  244. package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
  245. package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
  246. package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
  247. package/dist/application/transform/document/path-item-conflicts.mjs.map +1 -0
  248. package/dist/application/transform/document/path-item.cjs +82 -0
  249. package/dist/application/transform/document/path-item.cjs.map +1 -0
  250. package/dist/application/transform/document/path-item.mjs +80 -0
  251. package/dist/application/transform/document/path-item.mjs.map +1 -0
  252. package/dist/application/transform/document/path-key-overlaps.cjs +57 -0
  253. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
  254. package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
  255. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
  256. package/dist/application/transform/document/paths-enum.cjs +75 -0
  257. package/dist/application/transform/document/paths-enum.cjs.map +1 -0
  258. package/dist/application/transform/document/paths-enum.mjs +72 -0
  259. package/dist/application/transform/document/paths-enum.mjs.map +1 -0
  260. package/dist/application/transform/document/paths.cjs +127 -0
  261. package/dist/application/transform/document/paths.cjs.map +1 -0
  262. package/dist/application/transform/document/paths.mjs +125 -0
  263. package/dist/application/transform/document/paths.mjs.map +1 -0
  264. package/dist/application/transform/document/request-body.cjs +36 -0
  265. package/dist/application/transform/document/request-body.cjs.map +1 -0
  266. package/dist/application/transform/document/request-body.mjs +34 -0
  267. package/dist/application/transform/document/request-body.mjs.map +1 -0
  268. package/dist/application/transform/document/response.cjs +59 -0
  269. package/dist/application/transform/document/response.cjs.map +1 -0
  270. package/dist/application/transform/document/response.mjs +57 -0
  271. package/dist/application/transform/document/response.mjs.map +1 -0
  272. package/dist/application/transform/document/responses.cjs +23 -0
  273. package/dist/application/transform/document/responses.cjs.map +1 -0
  274. package/dist/application/transform/document/responses.mjs +21 -0
  275. package/dist/application/transform/document/responses.mjs.map +1 -0
  276. package/dist/application/transform/document/root-type-aliases.cjs +69 -0
  277. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
  278. package/dist/application/transform/document/root-type-aliases.mjs +65 -0
  279. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
  280. package/dist/application/transform/document/webhooks.cjs +19 -0
  281. package/dist/application/transform/document/webhooks.cjs.map +1 -0
  282. package/dist/application/transform/document/webhooks.mjs +17 -0
  283. package/dist/application/transform/document/webhooks.mjs.map +1 -0
  284. package/dist/application/transform/document-entries.cjs +17 -0
  285. package/dist/application/transform/document-entries.cjs.map +1 -0
  286. package/dist/application/transform/document-entries.mjs +14 -0
  287. package/dist/application/transform/document-entries.mjs.map +1 -0
  288. package/dist/application/transform/footer/document-footer.cjs +88 -0
  289. package/dist/application/transform/footer/document-footer.cjs.map +1 -0
  290. package/dist/application/transform/footer/document-footer.mjs +86 -0
  291. package/dist/application/transform/footer/document-footer.mjs.map +1 -0
  292. package/dist/application/transform/footer/enum-naming.cjs +121 -0
  293. package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
  294. package/dist/application/transform/footer/enum-naming.mjs +115 -0
  295. package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
  296. package/dist/application/transform/helper-types.cjs +68 -0
  297. package/dist/application/transform/helper-types.cjs.map +1 -0
  298. package/dist/application/transform/helper-types.mjs +65 -0
  299. package/dist/application/transform/helper-types.mjs.map +1 -0
  300. package/dist/application/transform/literal-type.cjs +36 -0
  301. package/dist/application/transform/literal-type.cjs.map +1 -0
  302. package/dist/application/transform/literal-type.mjs +34 -0
  303. package/dist/application/transform/literal-type.mjs.map +1 -0
  304. package/dist/application/transform/numbered-names.cjs +18 -0
  305. package/dist/application/transform/numbered-names.cjs.map +1 -0
  306. package/dist/application/transform/numbered-names.mjs +16 -0
  307. package/dist/application/transform/numbered-names.mjs.map +1 -0
  308. package/dist/application/transform/ref-type.cjs +57 -0
  309. package/dist/application/transform/ref-type.cjs.map +1 -0
  310. package/dist/application/transform/ref-type.mjs +54 -0
  311. package/dist/application/transform/ref-type.mjs.map +1 -0
  312. package/dist/application/transform/schema/array-type.cjs +105 -0
  313. package/dist/application/transform/schema/array-type.cjs.map +1 -0
  314. package/dist/application/transform/schema/array-type.mjs +103 -0
  315. package/dist/application/transform/schema/array-type.mjs.map +1 -0
  316. package/dist/application/transform/schema/composition-type.cjs +107 -0
  317. package/dist/application/transform/schema/composition-type.cjs.map +1 -0
  318. package/dist/application/transform/schema/composition-type.mjs +105 -0
  319. package/dist/application/transform/schema/composition-type.mjs.map +1 -0
  320. package/dist/application/transform/schema/core-type.cjs +84 -0
  321. package/dist/application/transform/schema/core-type.cjs.map +1 -0
  322. package/dist/application/transform/schema/core-type.mjs +82 -0
  323. package/dist/application/transform/schema/core-type.mjs.map +1 -0
  324. package/dist/application/transform/schema/discriminator-property.cjs +21 -0
  325. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
  326. package/dist/application/transform/schema/discriminator-property.mjs +19 -0
  327. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
  328. package/dist/application/transform/schema/enum-rule.cjs +107 -0
  329. package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
  330. package/dist/application/transform/schema/enum-rule.mjs +105 -0
  331. package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
  332. package/dist/application/transform/schema/object-type.cjs +173 -0
  333. package/dist/application/transform/schema/object-type.cjs.map +1 -0
  334. package/dist/application/transform/schema/object-type.mjs +170 -0
  335. package/dist/application/transform/schema/object-type.mjs.map +1 -0
  336. package/dist/application/transform/schema/presence-members.cjs +59 -0
  337. package/dist/application/transform/schema/presence-members.cjs.map +1 -0
  338. package/dist/application/transform/schema/presence-members.mjs +57 -0
  339. package/dist/application/transform/schema/presence-members.mjs.map +1 -0
  340. package/dist/application/transform/schema/schema-transform.cjs +72 -0
  341. package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
  342. package/dist/application/transform/schema/schema-transform.mjs +68 -0
  343. package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
  344. package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
  345. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
  346. package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
  347. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
  348. package/dist/application/transform/schema-comment.cjs +84 -0
  349. package/dist/application/transform/schema-comment.cjs.map +1 -0
  350. package/dist/application/transform/schema-comment.mjs +81 -0
  351. package/dist/application/transform/schema-comment.mjs.map +1 -0
  352. package/dist/application/transform/shared-types.cjs +8 -0
  353. package/dist/application/transform/shared-types.cjs.map +1 -0
  354. package/dist/application/transform/shared-types.mjs +6 -0
  355. package/dist/application/transform/shared-types.mjs.map +1 -0
  356. package/dist/application/transform/type-combinators.cjs +49 -0
  357. package/dist/application/transform/type-combinators.cjs.map +1 -0
  358. package/dist/application/transform/type-combinators.mjs +42 -0
  359. package/dist/application/transform/type-combinators.mjs.map +1 -0
  360. package/dist/cli/cli-arguments.cjs +137 -0
  361. package/dist/cli/cli-arguments.cjs.map +1 -0
  362. package/dist/cli/cli-arguments.mjs +129 -0
  363. package/dist/cli/cli-arguments.mjs.map +1 -0
  364. package/dist/cli/cli-errors.cjs +80 -0
  365. package/dist/cli/cli-errors.cjs.map +1 -0
  366. package/dist/cli/cli-errors.mjs +76 -0
  367. package/dist/cli/cli-errors.mjs.map +1 -0
  368. package/dist/cli/cli-output.cjs +37 -0
  369. package/dist/cli/cli-output.cjs.map +1 -0
  370. package/dist/cli/cli-output.mjs +30 -0
  371. package/dist/cli/cli-output.mjs.map +1 -0
  372. package/dist/cli/docs-links.cjs +6 -0
  373. package/dist/cli/docs-links.cjs.map +1 -0
  374. package/dist/cli/docs-links.mjs +4 -0
  375. package/dist/cli/docs-links.mjs.map +1 -0
  376. package/dist/cli/fix-option.cjs +19 -0
  377. package/dist/cli/fix-option.cjs.map +1 -0
  378. package/dist/cli/fix-option.mjs +16 -0
  379. package/dist/cli/fix-option.mjs.map +1 -0
  380. package/dist/cli/help-text.cjs +44 -0
  381. package/dist/cli/help-text.cjs.map +1 -0
  382. package/dist/cli/help-text.mjs +42 -0
  383. package/dist/cli/help-text.mjs.map +1 -0
  384. package/dist/cli/main.cjs +62 -0
  385. package/dist/cli/main.cjs.map +1 -0
  386. package/dist/cli/main.d.cts +2 -0
  387. package/dist/cli/main.d.mts +2 -0
  388. package/dist/cli/main.d.ts +2 -0
  389. package/dist/cli/main.mjs +54 -0
  390. package/dist/cli/main.mjs.map +1 -0
  391. package/dist/cli/redocly-apis.cjs +65 -0
  392. package/dist/cli/redocly-apis.cjs.map +1 -0
  393. package/dist/cli/redocly-apis.mjs +62 -0
  394. package/dist/cli/redocly-apis.mjs.map +1 -0
  395. package/dist/cli/ref-limits.cjs +14 -0
  396. package/dist/cli/ref-limits.cjs.map +1 -0
  397. package/dist/cli/ref-limits.mjs +12 -0
  398. package/dist/cli/ref-limits.mjs.map +1 -0
  399. package/dist/cli/run-cli.cjs +100 -0
  400. package/dist/cli/run-cli.cjs.map +1 -0
  401. package/dist/cli/run-cli.mjs +98 -0
  402. package/dist/cli/run-cli.mjs.map +1 -0
  403. package/dist/domain/assert-never.cjs +8 -0
  404. package/dist/domain/assert-never.cjs.map +1 -0
  405. package/dist/domain/assert-never.mjs +6 -0
  406. package/dist/domain/assert-never.mjs.map +1 -0
  407. package/dist/domain/errors.cjs +50 -0
  408. package/dist/domain/errors.cjs.map +1 -0
  409. package/dist/domain/errors.mjs +46 -0
  410. package/dist/domain/errors.mjs.map +1 -0
  411. package/dist/domain/ir/constructors.cjs +89 -0
  412. package/dist/domain/ir/constructors.cjs.map +1 -0
  413. package/dist/domain/ir/constructors.mjs +71 -0
  414. package/dist/domain/ir/constructors.mjs.map +1 -0
  415. package/dist/domain/ir/identifier-text.cjs +29 -0
  416. package/dist/domain/ir/identifier-text.cjs.map +1 -0
  417. package/dist/domain/ir/identifier-text.mjs +25 -0
  418. package/dist/domain/ir/identifier-text.mjs.map +1 -0
  419. package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
  420. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
  421. package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
  422. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
  423. package/dist/domain/ir/normalize.cjs +32 -0
  424. package/dist/domain/ir/normalize.cjs.map +1 -0
  425. package/dist/domain/ir/normalize.mjs +29 -0
  426. package/dist/domain/ir/normalize.mjs.map +1 -0
  427. package/dist/domain/ir/property-name.cjs +19 -0
  428. package/dist/domain/ir/property-name.cjs.map +1 -0
  429. package/dist/domain/ir/property-name.mjs +16 -0
  430. package/dist/domain/ir/property-name.mjs.map +1 -0
  431. package/dist/domain/ir/raw-text-escapes.cjs +25 -0
  432. package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
  433. package/dist/domain/ir/raw-text-escapes.mjs +22 -0
  434. package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
  435. package/dist/domain/openapi/alias-expansion.cjs +50 -0
  436. package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
  437. package/dist/domain/openapi/alias-expansion.mjs +45 -0
  438. package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
  439. package/dist/domain/openapi/binary-content.cjs +48 -0
  440. package/dist/domain/openapi/binary-content.cjs.map +1 -0
  441. package/dist/domain/openapi/binary-content.mjs +45 -0
  442. package/dist/domain/openapi/binary-content.mjs.map +1 -0
  443. package/dist/domain/openapi/components-object.cjs +29 -0
  444. package/dist/domain/openapi/components-object.cjs.map +1 -0
  445. package/dist/domain/openapi/components-object.mjs +24 -0
  446. package/dist/domain/openapi/components-object.mjs.map +1 -0
  447. package/dist/domain/openapi/json-pointer.cjs +31 -0
  448. package/dist/domain/openapi/json-pointer.cjs.map +1 -0
  449. package/dist/domain/openapi/json-pointer.mjs +27 -0
  450. package/dist/domain/openapi/json-pointer.mjs.map +1 -0
  451. package/dist/domain/openapi/media-type-object.cjs +14 -0
  452. package/dist/domain/openapi/media-type-object.cjs.map +1 -0
  453. package/dist/domain/openapi/media-type-object.mjs +11 -0
  454. package/dist/domain/openapi/media-type-object.mjs.map +1 -0
  455. package/dist/domain/openapi/parameter-object.cjs +13 -0
  456. package/dist/domain/openapi/parameter-object.cjs.map +1 -0
  457. package/dist/domain/openapi/parameter-object.mjs +10 -0
  458. package/dist/domain/openapi/parameter-object.mjs.map +1 -0
  459. package/dist/domain/openapi/path-item-object.cjs +35 -0
  460. package/dist/domain/openapi/path-item-object.cjs.map +1 -0
  461. package/dist/domain/openapi/path-item-object.mjs +30 -0
  462. package/dist/domain/openapi/path-item-object.mjs.map +1 -0
  463. package/dist/domain/openapi/unsupported-features.cjs +87 -0
  464. package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
  465. package/dist/domain/openapi/unsupported-features.mjs +84 -0
  466. package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
  467. package/dist/domain/output-fixes.cjs +66 -0
  468. package/dist/domain/output-fixes.cjs.map +1 -0
  469. package/dist/domain/output-fixes.mjs +59 -0
  470. package/dist/domain/output-fixes.mjs.map +1 -0
  471. package/dist/index.cjs +98 -0
  472. package/dist/index.cjs.map +1 -0
  473. package/dist/index.d.cts +812 -0
  474. package/dist/index.d.mts +812 -0
  475. package/dist/index.d.ts +812 -0
  476. package/dist/index.mjs +27 -0
  477. package/dist/index.mjs.map +1 -0
  478. package/dist/transform/components-object.cjs +14 -0
  479. package/dist/transform/components-object.cjs.map +1 -0
  480. package/dist/transform/components-object.mjs +10 -0
  481. package/dist/transform/components-object.mjs.map +1 -0
  482. package/dist/transform/header-object.cjs +12 -0
  483. package/dist/transform/header-object.cjs.map +1 -0
  484. package/dist/transform/header-object.mjs +10 -0
  485. package/dist/transform/header-object.mjs.map +1 -0
  486. package/dist/transform/media-type-object.cjs +12 -0
  487. package/dist/transform/media-type-object.cjs.map +1 -0
  488. package/dist/transform/media-type-object.mjs +10 -0
  489. package/dist/transform/media-type-object.mjs.map +1 -0
  490. package/dist/transform/operation-object.cjs +26 -0
  491. package/dist/transform/operation-object.cjs.map +1 -0
  492. package/dist/transform/operation-object.mjs +21 -0
  493. package/dist/transform/operation-object.mjs.map +1 -0
  494. package/dist/transform/parameter-object.cjs +12 -0
  495. package/dist/transform/parameter-object.cjs.map +1 -0
  496. package/dist/transform/parameter-object.mjs +10 -0
  497. package/dist/transform/parameter-object.mjs.map +1 -0
  498. package/dist/transform/path-item-object.cjs +12 -0
  499. package/dist/transform/path-item-object.cjs.map +1 -0
  500. package/dist/transform/path-item-object.mjs +10 -0
  501. package/dist/transform/path-item-object.mjs.map +1 -0
  502. package/dist/transform/paths-object.cjs +11 -0
  503. package/dist/transform/paths-object.cjs.map +1 -0
  504. package/dist/transform/paths-object.mjs +9 -0
  505. package/dist/transform/paths-object.mjs.map +1 -0
  506. package/dist/transform/request-body-object.cjs +12 -0
  507. package/dist/transform/request-body-object.cjs.map +1 -0
  508. package/dist/transform/request-body-object.mjs +10 -0
  509. package/dist/transform/request-body-object.mjs.map +1 -0
  510. package/dist/transform/response-object.cjs +12 -0
  511. package/dist/transform/response-object.cjs.map +1 -0
  512. package/dist/transform/response-object.mjs +10 -0
  513. package/dist/transform/response-object.mjs.map +1 -0
  514. package/dist/transform/responses-object.cjs +12 -0
  515. package/dist/transform/responses-object.cjs.map +1 -0
  516. package/dist/transform/responses-object.mjs +10 -0
  517. package/dist/transform/responses-object.mjs.map +1 -0
  518. package/dist/transform/schema-object.cjs +21 -0
  519. package/dist/transform/schema-object.cjs.map +1 -0
  520. package/dist/transform/schema-object.mjs +16 -0
  521. package/dist/transform/schema-object.mjs.map +1 -0
  522. package/package.json +115 -4
  523. package/src/adapters/node-file-system/node-file-system.ts +44 -0
  524. package/src/adapters/redocly-loader/alias-limit.ts +20 -0
  525. package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
  526. package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
  527. package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
  528. package/src/adapters/redocly-loader/redocly-config-source.ts +43 -0
  529. package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -0
  530. package/src/adapters/redocly-loader/ref-access.ts +146 -0
  531. package/src/adapters/redocly-loader/ref-holders.ts +43 -0
  532. package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
  533. package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
  534. package/src/adapters/redocly-loader/schema-source.ts +151 -0
  535. package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
  536. package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
  537. package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
  538. package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
  539. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +220 -0
  540. package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
  541. package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
  542. package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
  543. package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
  544. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +280 -0
  545. package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
  546. package/src/api/ast-to-string.ts +59 -0
  547. package/src/api/comment-header.ts +7 -0
  548. package/src/api/default-ports.ts +44 -0
  549. package/src/api/discriminator-enum.ts +76 -0
  550. package/src/api/discriminator-scan.ts +272 -0
  551. package/src/api/document-declarations.ts +41 -0
  552. package/src/api/document-refs.ts +71 -0
  553. package/src/api/document-run.ts +159 -0
  554. package/src/api/footer-entry.ts +23 -0
  555. package/src/api/footer-sink.ts +67 -0
  556. package/src/api/legacy-callback-warning.ts +29 -0
  557. package/src/api/legacy-ts-helpers.ts +311 -0
  558. package/src/api/legacy-utils.ts +118 -0
  559. package/src/api/openapi-ts.ts +62 -0
  560. package/src/api/schema-callbacks.ts +211 -0
  561. package/src/api/string-to-ast.ts +27 -0
  562. package/src/api/transform-context.ts +87 -0
  563. package/src/api/transform-schema.ts +39 -0
  564. package/src/api/type-helpers.ts +130 -0
  565. package/src/api/unsupported-feature-warnings.ts +26 -0
  566. package/src/application/ports/file-system.ts +12 -0
  567. package/src/application/ports/logger.ts +16 -0
  568. package/src/application/ports/redocly-config-source.ts +16 -0
  569. package/src/application/ports/schema-loader.ts +32 -0
  570. package/src/application/print/comment-writer.ts +91 -0
  571. package/src/application/print/declaration-printer.ts +100 -0
  572. package/src/application/print/literal-text.ts +62 -0
  573. package/src/application/print/print-nodes.ts +62 -0
  574. package/src/application/print/print-options.ts +11 -0
  575. package/src/application/print/text-writer.ts +83 -0
  576. package/src/application/print/type-printer.ts +281 -0
  577. package/src/application/stack-overflow.ts +54 -0
  578. package/src/application/transform/document/components.ts +189 -0
  579. package/src/application/transform/document/defs-root.ts +25 -0
  580. package/src/application/transform/document/document-member.ts +20 -0
  581. package/src/application/transform/document/document.ts +157 -0
  582. package/src/application/transform/document/header.ts +34 -0
  583. package/src/application/transform/document/kept-deprecated.ts +135 -0
  584. package/src/application/transform/document/media-type.ts +78 -0
  585. package/src/application/transform/document/operation.ts +64 -0
  586. package/src/application/transform/document/parameter.ts +45 -0
  587. package/src/application/transform/document/parameters.ts +200 -0
  588. package/src/application/transform/document/path-item-conflicts.ts +79 -0
  589. package/src/application/transform/document/path-item.ts +168 -0
  590. package/src/application/transform/document/path-key-overlaps.ts +112 -0
  591. package/src/application/transform/document/paths-enum.ts +127 -0
  592. package/src/application/transform/document/paths.ts +211 -0
  593. package/src/application/transform/document/request-body.ts +50 -0
  594. package/src/application/transform/document/response.ts +109 -0
  595. package/src/application/transform/document/responses.ts +29 -0
  596. package/src/application/transform/document/root-type-aliases.ts +106 -0
  597. package/src/application/transform/document/webhooks.ts +22 -0
  598. package/src/application/transform/document-entries.ts +28 -0
  599. package/src/application/transform/footer/document-footer.ts +127 -0
  600. package/src/application/transform/footer/enum-naming.ts +181 -0
  601. package/src/application/transform/helper-types.ts +92 -0
  602. package/src/application/transform/literal-type.ts +54 -0
  603. package/src/application/transform/numbered-names.ts +20 -0
  604. package/src/application/transform/ref-type.ts +97 -0
  605. package/src/application/transform/schema/array-type.ts +152 -0
  606. package/src/application/transform/schema/composition-type.ts +183 -0
  607. package/src/application/transform/schema/core-type.ts +115 -0
  608. package/src/application/transform/schema/discriminator-property.ts +28 -0
  609. package/src/application/transform/schema/enum-rule.ts +157 -0
  610. package/src/application/transform/schema/object-type.ts +271 -0
  611. package/src/application/transform/schema/presence-members.ts +96 -0
  612. package/src/application/transform/schema/schema-context.ts +110 -0
  613. package/src/application/transform/schema/schema-rule.ts +29 -0
  614. package/src/application/transform/schema/schema-transform.ts +99 -0
  615. package/src/application/transform/schema/unevaluated-properties.ts +105 -0
  616. package/src/application/transform/schema-comment.ts +116 -0
  617. package/src/application/transform/shared-types.ts +9 -0
  618. package/src/application/transform/transform-context.ts +51 -0
  619. package/src/application/transform/type-combinators.ts +57 -0
  620. package/src/cli/cli-arguments.ts +198 -0
  621. package/src/cli/cli-dependencies.ts +42 -0
  622. package/src/cli/cli-errors.ts +125 -0
  623. package/src/cli/cli-output.ts +53 -0
  624. package/src/cli/docs-links.ts +6 -0
  625. package/src/cli/fix-option.ts +29 -0
  626. package/src/cli/help-text.ts +52 -0
  627. package/src/cli/main.ts +67 -0
  628. package/src/cli/redocly-apis.ts +91 -0
  629. package/src/cli/ref-limits.ts +16 -0
  630. package/src/cli/run-cli.ts +114 -0
  631. package/src/domain/assert-never.ts +8 -0
  632. package/src/domain/errors.ts +74 -0
  633. package/src/domain/ir/constructors.ts +137 -0
  634. package/src/domain/ir/identifier-text.ts +49 -0
  635. package/src/domain/ir/newer-identifier-ranges.ts +109 -0
  636. package/src/domain/ir/nodes.ts +224 -0
  637. package/src/domain/ir/normalize.ts +51 -0
  638. package/src/domain/ir/property-name.ts +28 -0
  639. package/src/domain/ir/raw-text-escapes.ts +37 -0
  640. package/src/domain/openapi/alias-expansion.ts +72 -0
  641. package/src/domain/openapi/binary-content.ts +74 -0
  642. package/src/domain/openapi/components-object.ts +52 -0
  643. package/src/domain/openapi/document-object.ts +12 -0
  644. package/src/domain/openapi/header-object.ts +9 -0
  645. package/src/domain/openapi/json-pointer.ts +46 -0
  646. package/src/domain/openapi/media-type-object.ts +26 -0
  647. package/src/domain/openapi/operation-object.ts +13 -0
  648. package/src/domain/openapi/parameter-object.ts +30 -0
  649. package/src/domain/openapi/path-item-object.ts +70 -0
  650. package/src/domain/openapi/request-body-object.ts +7 -0
  651. package/src/domain/openapi/response-object.ts +14 -0
  652. package/src/domain/openapi/schema-object.ts +59 -0
  653. package/src/domain/openapi/unsupported-features.ts +139 -0
  654. package/src/domain/output-fixes.ts +95 -0
  655. package/src/index.ts +67 -0
  656. package/src/transform/components-object.ts +25 -0
  657. package/src/transform/header-object.ts +19 -0
  658. package/src/transform/media-type-object.ts +19 -0
  659. package/src/transform/operation-object.ts +36 -0
  660. package/src/transform/parameter-object.ts +19 -0
  661. package/src/transform/parameters-array.ts +19 -0
  662. package/src/transform/path-item-object.ts +22 -0
  663. package/src/transform/paths-enum.ts +8 -0
  664. package/src/transform/paths-object.ts +15 -0
  665. package/src/transform/request-body-object.ts +19 -0
  666. package/src/transform/response-object.ts +19 -0
  667. package/src/transform/responses-object.ts +19 -0
  668. package/src/transform/schema-object.ts +36 -0
  669. package/src/transform/webhooks-object.ts +15 -0
  670. package/src/types/generator-options.ts +267 -0
  671. package/src/types/openapi-common.ts +100 -0
  672. package/src/types/openapi-document.ts +196 -0
  673. package/src/types/openapi-path-item.ts +130 -0
  674. package/src/types/openapi-request.ts +209 -0
  675. package/src/types/openapi-response.ts +81 -0
  676. package/src/types/openapi-schema.ts +169 -0
  677. package/src/types/openapi-security.ts +116 -0
  678. package/src/types.ts +12 -0
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
5
+ const outputFixes = require('../../../domain/output-fixes.cjs');
6
+ const sharedTypes = require('../shared-types.cjs');
7
+ const typeCombinators = require('../type-combinators.cjs');
8
+ const coreType = require('./core-type.cjs');
9
+ const presenceMembers = require('./presence-members.cjs');
10
+ const unevaluatedProperties = require('./unevaluated-properties.cjs');
11
+
12
+ function variantTypes(variants, keyword, request) {
13
+ return variants.map(
14
+ (variant, index) => request.transformNested(variant, {
15
+ ...request.location,
16
+ path: jsonPointer.createRef([request.location.path, keyword, String(index)])
17
+ })
18
+ );
19
+ }
20
+ function isRefItem(item) {
21
+ return "$ref" in item;
22
+ }
23
+ function refItemType(item, required, request) {
24
+ const type = request.transformNested(item, request.location);
25
+ const { refs, discriminators, footer } = request.context;
26
+ const resolved = refs.resolve(item.$ref);
27
+ const isEligible = resolved && typeof resolved === "object" && "properties" in resolved && !discriminators.isHandled(item.$ref);
28
+ if (!isEligible) {
29
+ return type;
30
+ }
31
+ const keys = required.filter((key) => Boolean(resolved.properties?.[key]));
32
+ if (keys.length > 0) {
33
+ footer.requireWithRequired();
34
+ }
35
+ return typeCombinators.withRequiredKeys(type, keys);
36
+ }
37
+ function inlineItemType(item, required, request) {
38
+ const own = typeof item === "object" && Array.isArray(item.required) ? item.required ?? [] : [];
39
+ return request.transformNested(
40
+ { ...item, required: [...required, ...own] },
41
+ request.location
42
+ );
43
+ }
44
+ function allOfTypes(items, required, request) {
45
+ return items.map((item) => {
46
+ const isRef = isRefItem(item);
47
+ const type = isRef ? refItemType(item, required, request) : inlineItemType(item, required, request);
48
+ const discriminator = isRef && request.context.discriminators.objectAt(item.$ref) || item.discriminator;
49
+ return discriminator?.propertyName ? typeCombinators.omitKeys(type, [discriminator.propertyName]) : type;
50
+ });
51
+ }
52
+ function oneOfType(previous, variants) {
53
+ const before = previous === null ? [] : [previous];
54
+ return variants.every(typeCombinators.isPrimitiveType) ? typeCombinators.unionOf([...before, ...variants]) : typeCombinators.intersectionOf([...before, typeCombinators.unionOf(variants)]);
55
+ }
56
+ function anyOfType(previous, schema, request) {
57
+ const variants = variantTypes(schema.anyOf ?? [], "anyOf", request);
58
+ if (variants.length === 0 || previous === null) {
59
+ return variants.length === 0 ? previous : typeCombinators.unionOf(variants);
60
+ }
61
+ if (!request.context.options.fixes.has(outputFixes.OutputFix.ANYOF_PROPERTIES)) {
62
+ return typeCombinators.unionOf([previous, ...variants]);
63
+ }
64
+ return Array.isArray(schema.type) ? previous : typeCombinators.intersectionOf([previous, typeCombinators.unionOf(variants)]);
65
+ }
66
+ function oneOfVariants(schema) {
67
+ const objectEnum = "type" in schema && schema.type === "object" && schema.enum;
68
+ return schema.oneOf || objectEnum || [];
69
+ }
70
+ function requiredKeys(schema, presenceKeys) {
71
+ const own = schema.required ?? [];
72
+ return presenceKeys.length === 0 ? own : [.../* @__PURE__ */ new Set([...own, ...presenceKeys])];
73
+ }
74
+ function composedType(schema, request) {
75
+ let type = null;
76
+ const core = coreType.coreType(schema, request);
77
+ const { members, required } = presenceMembers.allOfMembers(schema.allOf ?? [], request);
78
+ const allOf = allOfTypes(members, requiredKeys(schema, required), request);
79
+ if (core !== null || allOf.length > 0) {
80
+ const allOfType = allOf.length > 0 ? [typeCombinators.intersectionOf(allOf)] : [];
81
+ type = typeCombinators.intersectionOf([...core === null ? [] : [core], ...allOfType]);
82
+ }
83
+ type = anyOfType(type, schema, request);
84
+ const oneOf = variantTypes(oneOfVariants(schema), "oneOf", request);
85
+ return oneOf.length > 0 ? oneOfType(type, oneOf) : type;
86
+ }
87
+ function combinedType(schema, request) {
88
+ const type = composedType(schema, request);
89
+ const unevaluated = unevaluatedProperties.unevaluatedPropertiesType(schema, type, request);
90
+ if (unevaluated === null) {
91
+ return type;
92
+ }
93
+ if (type === null) {
94
+ return unevaluated;
95
+ }
96
+ const parts = type.kind === "intersection" ? type.types : [type];
97
+ return typeCombinators.intersectionOf([...parts, unevaluated]);
98
+ }
99
+ function compositionType(schema, request) {
100
+ const { emptyObjectsUnknown } = request.context.options;
101
+ const empty = "type" in schema ? constructors.irRecord(constructors.irKeyword("string"), emptyObjectsUnknown ? sharedTypes.UNKNOWN_TYPE : constructors.irKeyword("never")) : sharedTypes.UNKNOWN_TYPE;
102
+ const type = combinedType(schema, request) ?? empty;
103
+ return type !== sharedTypes.UNKNOWN_TYPE && schema.nullable ? typeCombinators.nullableOf([type]) : type;
104
+ }
105
+
106
+ exports.compositionType = compositionType;
107
+ //# sourceMappingURL=composition-type.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-type.cjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: createRef([request.location.path, keyword, String(index)]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const { refs, discriminators, footer } = request.context;\n const resolved = refs.resolve(item.$ref) as SchemaObject | undefined;\n const isEligible =\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n !discriminators.isHandled(item.$ref);\n if (!isEligible) {\n return type;\n }\n const keys = required.filter((key) => Boolean(resolved.properties?.[key]));\n if (keys.length > 0) {\n footer.requireWithRequired();\n }\n return withRequiredKeys(type, keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/** `allOf` items; an item with a discriminator omits that property (the parent redefines it). */\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.map((item) => {\n const isRef = isRefItem(item);\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n return discriminator?.propertyName ? omitKeys(type, [discriminator.propertyName]) : type;\n });\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(OutputFix.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n type = anyOfType(type, schema, request);\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":["createRef","withRequiredKeys","omitKeys","isPrimitiveType","unionOf","intersectionOf","OutputFix","coreType","allOfMembers","unevaluatedPropertiesType","irRecord","irKeyword","UNKNOWN_TYPE","nullableOf"],"mappings":";;;;;;;;;;;AAoBA,SAAS,YAAA,CACP,QAAA,EACA,OAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,OAAA,EAAS,KAAA,KAC5B,OAAA,CAAQ,gBAAgB,OAAA,EAAS;AAAA,MAC/B,GAAG,OAAA,CAAQ,QAAA;AAAA,MACX,IAAA,EAAMA,qBAAA,CAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAC;AAAA,KAChE;AAAA,GACH;AACF;AAMA,SAAS,UAAU,IAAA,EAAiD;AAClE,EAAA,OAAO,MAAA,IAAW,IAAA;AACpB;AAGA,SAAS,WAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,KAAW,OAAA,CAAQ,OAAA;AACjD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACvC,EAAA,MAAM,UAAA,GACJ,QAAA,IACA,OAAO,QAAA,KAAa,QAAA,IACpB,YAAA,IAAgB,QAAA,IAChB,CAAC,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,QAAA,CAAS,UAAA,GAAa,GAAG,CAAC,CAAC,CAAA;AACzE,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAA,CAAO,mBAAA,EAAoB;AAAA,EAC7B;AACA,EAAA,OAAOC,gCAAA,CAAiB,MAAM,IAAI,CAAA;AACpC;AAGA,SAAS,cAAA,CAAe,IAAA,EAAc,QAAA,EAA6B,OAAA,EAAgC;AACjG,EAAA,MAAM,GAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAS,IAAA,CAAsB,QAAQ,CAAA,GACnE,IAAA,CAAsB,QAAA,IAAY,KACpC,EAAC;AACP,EAAA,OAAO,OAAA,CAAQ,eAAA;AAAA,IACb,EAAE,GAAI,IAAA,EAAuB,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA,EAAE;AAAA,IAC7D,OAAA,CAAQ;AAAA,GACV;AACF;AAGA,SAAS,UAAA,CACP,KAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAA,GACT,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA,GACnC,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC1C,IAAA,MAAM,aAAA,GACH,SAAS,OAAA,CAAQ,OAAA,CAAQ,eAAe,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAC1D,IAAA,CAAsB,aAAA;AACzB,IAAA,OAAO,aAAA,EAAe,eAAeC,wBAAA,CAAS,IAAA,EAAM,CAAC,aAAA,CAAc,YAAY,CAAC,CAAA,GAAI,IAAA;AAAA,EACtF,CAAC,CAAA;AACH;AAEA,SAAS,SAAA,CAAU,UAAyB,QAAA,EAAqC;AAC/E,EAAA,MAAM,SAAS,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,CAAC,QAAQ,CAAA;AAEjD,EAAA,OAAO,SAAS,KAAA,CAAMC,+BAAe,IACjCC,uBAAA,CAAQ,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAC,CAAA,GAChCC,+BAAe,CAAC,GAAG,QAAQD,uBAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AACnD;AAQA,SAAS,SAAA,CACP,QAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,YAAA,CAAa,MAAA,CAAO,SAAS,EAAC,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AAC9C,IAAA,OAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,QAAA,GAAWA,wBAAQ,QAAQ,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIE,qBAAA,CAAU,gBAAgB,CAAA,EAAG;AAClE,IAAA,OAAOF,uBAAA,CAAQ,CAAC,QAAA,EAAU,GAAG,QAAQ,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,QAAA,GAAWC,8BAAA,CAAe,CAAC,QAAA,EAAUD,uBAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAC7F;AAGA,SAAS,cAAc,MAAA,EAAyC;AAC9D,EAAA,MAAM,aACJ,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,YAAa,MAAA,CAAO,IAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,UAAA,IAAc,EAAC;AACxC;AAMA,SAAS,YAAA,CAAa,QAAsB,YAAA,EAAoD;AAC9F,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,IAAY,EAAC;AAChC,EAAA,OAAO,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,GAAA,EAAK,GAAG,YAAY,CAAC,CAAC,CAAA;AACjF;AAEA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,MAAM,IAAA,GAAOG,iBAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,EAAE,SAAS,QAAA,EAAS,GAAIC,6BAAa,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,OAAO,CAAA;AACtE,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA,EAAS,aAAa,MAAA,EAAQ,QAAQ,GAAG,OAAO,CAAA;AACzE,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,GAAS,CAAA,GAAI,CAACH,8BAAA,CAAe,KAAK,CAAC,CAAA,GAAI,EAAC;AAChE,IAAA,IAAA,GAAOA,8BAAA,CAAe,CAAC,GAAI,IAAA,KAAS,IAAA,GAAO,EAAC,GAAI,CAAC,IAAI,CAAA,EAAI,GAAG,SAAS,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AACtC,EAAA,MAAM,QAAQ,YAAA,CAAa,aAAA,CAAc,MAAM,CAAA,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA;AACrD;AAGA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACzC,EAAA,MAAM,WAAA,GAAcI,+CAAA,CAA0B,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACnE,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,iBAAiB,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAI,CAAA;AAC/D,EAAA,OAAOJ,8BAAA,CAAe,CAAC,GAAG,KAAA,EAAO,WAAW,CAAC,CAAA;AAC/C;AAOO,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAgC;AACpF,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAChD,EAAA,MAAM,KAAA,GACJ,MAAA,IAAU,MAAA,GACNK,qBAAA,CAASC,sBAAA,CAAU,QAAQ,CAAA,EAAG,mBAAA,GAAsBC,wBAAA,GAAeD,sBAAA,CAAU,OAAO,CAAC,CAAA,GACrFC,wBAAA;AACN,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,IAAK,KAAA;AAC9C,EAAA,OAAO,IAAA,KAASA,4BAAgB,MAAA,CAAO,QAAA,GAAWC,2BAAW,CAAC,IAAI,CAAC,CAAA,GAAI,IAAA;AACzE;;"}
@@ -0,0 +1,105 @@
1
+ import { irRecord, irKeyword } from '../../../domain/ir/constructors.mjs';
2
+ import { createRef } from '../../../domain/openapi/json-pointer.mjs';
3
+ import { OutputFix } from '../../../domain/output-fixes.mjs';
4
+ import { UNKNOWN_TYPE } from '../shared-types.mjs';
5
+ import { nullableOf, intersectionOf, omitKeys, unionOf, isPrimitiveType, withRequiredKeys } from '../type-combinators.mjs';
6
+ import { coreType } from './core-type.mjs';
7
+ import { allOfMembers } from './presence-members.mjs';
8
+ import { unevaluatedPropertiesType } from './unevaluated-properties.mjs';
9
+
10
+ function variantTypes(variants, keyword, request) {
11
+ return variants.map(
12
+ (variant, index) => request.transformNested(variant, {
13
+ ...request.location,
14
+ path: createRef([request.location.path, keyword, String(index)])
15
+ })
16
+ );
17
+ }
18
+ function isRefItem(item) {
19
+ return "$ref" in item;
20
+ }
21
+ function refItemType(item, required, request) {
22
+ const type = request.transformNested(item, request.location);
23
+ const { refs, discriminators, footer } = request.context;
24
+ const resolved = refs.resolve(item.$ref);
25
+ const isEligible = resolved && typeof resolved === "object" && "properties" in resolved && !discriminators.isHandled(item.$ref);
26
+ if (!isEligible) {
27
+ return type;
28
+ }
29
+ const keys = required.filter((key) => Boolean(resolved.properties?.[key]));
30
+ if (keys.length > 0) {
31
+ footer.requireWithRequired();
32
+ }
33
+ return withRequiredKeys(type, keys);
34
+ }
35
+ function inlineItemType(item, required, request) {
36
+ const own = typeof item === "object" && Array.isArray(item.required) ? item.required ?? [] : [];
37
+ return request.transformNested(
38
+ { ...item, required: [...required, ...own] },
39
+ request.location
40
+ );
41
+ }
42
+ function allOfTypes(items, required, request) {
43
+ return items.map((item) => {
44
+ const isRef = isRefItem(item);
45
+ const type = isRef ? refItemType(item, required, request) : inlineItemType(item, required, request);
46
+ const discriminator = isRef && request.context.discriminators.objectAt(item.$ref) || item.discriminator;
47
+ return discriminator?.propertyName ? omitKeys(type, [discriminator.propertyName]) : type;
48
+ });
49
+ }
50
+ function oneOfType(previous, variants) {
51
+ const before = previous === null ? [] : [previous];
52
+ return variants.every(isPrimitiveType) ? unionOf([...before, ...variants]) : intersectionOf([...before, unionOf(variants)]);
53
+ }
54
+ function anyOfType(previous, schema, request) {
55
+ const variants = variantTypes(schema.anyOf ?? [], "anyOf", request);
56
+ if (variants.length === 0 || previous === null) {
57
+ return variants.length === 0 ? previous : unionOf(variants);
58
+ }
59
+ if (!request.context.options.fixes.has(OutputFix.ANYOF_PROPERTIES)) {
60
+ return unionOf([previous, ...variants]);
61
+ }
62
+ return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);
63
+ }
64
+ function oneOfVariants(schema) {
65
+ const objectEnum = "type" in schema && schema.type === "object" && schema.enum;
66
+ return schema.oneOf || objectEnum || [];
67
+ }
68
+ function requiredKeys(schema, presenceKeys) {
69
+ const own = schema.required ?? [];
70
+ return presenceKeys.length === 0 ? own : [.../* @__PURE__ */ new Set([...own, ...presenceKeys])];
71
+ }
72
+ function composedType(schema, request) {
73
+ let type = null;
74
+ const core = coreType(schema, request);
75
+ const { members, required } = allOfMembers(schema.allOf ?? [], request);
76
+ const allOf = allOfTypes(members, requiredKeys(schema, required), request);
77
+ if (core !== null || allOf.length > 0) {
78
+ const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];
79
+ type = intersectionOf([...core === null ? [] : [core], ...allOfType]);
80
+ }
81
+ type = anyOfType(type, schema, request);
82
+ const oneOf = variantTypes(oneOfVariants(schema), "oneOf", request);
83
+ return oneOf.length > 0 ? oneOfType(type, oneOf) : type;
84
+ }
85
+ function combinedType(schema, request) {
86
+ const type = composedType(schema, request);
87
+ const unevaluated = unevaluatedPropertiesType(schema, type, request);
88
+ if (unevaluated === null) {
89
+ return type;
90
+ }
91
+ if (type === null) {
92
+ return unevaluated;
93
+ }
94
+ const parts = type.kind === "intersection" ? type.types : [type];
95
+ return intersectionOf([...parts, unevaluated]);
96
+ }
97
+ function compositionType(schema, request) {
98
+ const { emptyObjectsUnknown } = request.context.options;
99
+ const empty = "type" in schema ? irRecord(irKeyword("string"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword("never")) : UNKNOWN_TYPE;
100
+ const type = combinedType(schema, request) ?? empty;
101
+ return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;
102
+ }
103
+
104
+ export { compositionType };
105
+ //# sourceMappingURL=composition-type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-type.mjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: createRef([request.location.path, keyword, String(index)]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const { refs, discriminators, footer } = request.context;\n const resolved = refs.resolve(item.$ref) as SchemaObject | undefined;\n const isEligible =\n resolved &&\n typeof resolved === \"object\" &&\n \"properties\" in resolved &&\n !discriminators.isHandled(item.$ref);\n if (!isEligible) {\n return type;\n }\n const keys = required.filter((key) => Boolean(resolved.properties?.[key]));\n if (keys.length > 0) {\n footer.requireWithRequired();\n }\n return withRequiredKeys(type, keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/** `allOf` items; an item with a discriminator omits that property (the parent redefines it). */\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.map((item) => {\n const isRef = isRefItem(item);\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n return discriminator?.propertyName ? omitKeys(type, [discriminator.propertyName]) : type;\n });\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(OutputFix.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n type = anyOfType(type, schema, request);\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":[],"mappings":";;;;;;;;;AAoBA,SAAS,YAAA,CACP,QAAA,EACA,OAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,OAAA,EAAS,KAAA,KAC5B,OAAA,CAAQ,gBAAgB,OAAA,EAAS;AAAA,MAC/B,GAAG,OAAA,CAAQ,QAAA;AAAA,MACX,IAAA,EAAM,SAAA,CAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAC;AAAA,KAChE;AAAA,GACH;AACF;AAMA,SAAS,UAAU,IAAA,EAAiD;AAClE,EAAA,OAAO,MAAA,IAAW,IAAA;AACpB;AAGA,SAAS,WAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,KAAW,OAAA,CAAQ,OAAA;AACjD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACvC,EAAA,MAAM,UAAA,GACJ,QAAA,IACA,OAAO,QAAA,KAAa,QAAA,IACpB,YAAA,IAAgB,QAAA,IAChB,CAAC,cAAA,CAAe,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,QAAA,CAAS,UAAA,GAAa,GAAG,CAAC,CAAC,CAAA;AACzE,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAA,CAAO,mBAAA,EAAoB;AAAA,EAC7B;AACA,EAAA,OAAO,gBAAA,CAAiB,MAAM,IAAI,CAAA;AACpC;AAGA,SAAS,cAAA,CAAe,IAAA,EAAc,QAAA,EAA6B,OAAA,EAAgC;AACjG,EAAA,MAAM,GAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAS,IAAA,CAAsB,QAAQ,CAAA,GACnE,IAAA,CAAsB,QAAA,IAAY,KACpC,EAAC;AACP,EAAA,OAAO,OAAA,CAAQ,eAAA;AAAA,IACb,EAAE,GAAI,IAAA,EAAuB,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA,EAAE;AAAA,IAC7D,OAAA,CAAQ;AAAA,GACV;AACF;AAGA,SAAS,UAAA,CACP,KAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAA,GACT,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA,GACnC,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC1C,IAAA,MAAM,aAAA,GACH,SAAS,OAAA,CAAQ,OAAA,CAAQ,eAAe,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAC1D,IAAA,CAAsB,aAAA;AACzB,IAAA,OAAO,aAAA,EAAe,eAAe,QAAA,CAAS,IAAA,EAAM,CAAC,aAAA,CAAc,YAAY,CAAC,CAAA,GAAI,IAAA;AAAA,EACtF,CAAC,CAAA;AACH;AAEA,SAAS,SAAA,CAAU,UAAyB,QAAA,EAAqC;AAC/E,EAAA,MAAM,SAAS,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,CAAC,QAAQ,CAAA;AAEjD,EAAA,OAAO,SAAS,KAAA,CAAM,eAAe,IACjC,OAAA,CAAQ,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAC,CAAA,GAChC,eAAe,CAAC,GAAG,QAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AACnD;AAQA,SAAS,SAAA,CACP,QAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,YAAA,CAAa,MAAA,CAAO,SAAS,EAAC,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AAC9C,IAAA,OAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,QAAA,GAAW,QAAQ,QAAQ,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAI,SAAA,CAAU,gBAAgB,CAAA,EAAG;AAClE,IAAA,OAAO,OAAA,CAAQ,CAAC,QAAA,EAAU,GAAG,QAAQ,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,QAAA,GAAW,cAAA,CAAe,CAAC,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAC7F;AAGA,SAAS,cAAc,MAAA,EAAyC;AAC9D,EAAA,MAAM,aACJ,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,YAAa,MAAA,CAAO,IAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,UAAA,IAAc,EAAC;AACxC;AAMA,SAAS,YAAA,CAAa,QAAsB,YAAA,EAAoD;AAC9F,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,IAAY,EAAC;AAChC,EAAA,OAAO,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,GAAA,EAAK,GAAG,YAAY,CAAC,CAAC,CAAA;AACjF;AAEA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,EAAE,SAAS,QAAA,EAAS,GAAI,aAAa,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,OAAO,CAAA;AACtE,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA,EAAS,aAAa,MAAA,EAAQ,QAAQ,GAAG,OAAO,CAAA;AACzE,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,GAAS,CAAA,GAAI,CAAC,cAAA,CAAe,KAAK,CAAC,CAAA,GAAI,EAAC;AAChE,IAAA,IAAA,GAAO,cAAA,CAAe,CAAC,GAAI,IAAA,KAAS,IAAA,GAAO,EAAC,GAAI,CAAC,IAAI,CAAA,EAAI,GAAG,SAAS,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AACtC,EAAA,MAAM,QAAQ,YAAA,CAAa,aAAA,CAAc,MAAM,CAAA,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA;AACrD;AAGA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACnE,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,iBAAiB,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAI,CAAA;AAC/D,EAAA,OAAO,cAAA,CAAe,CAAC,GAAG,KAAA,EAAO,WAAW,CAAC,CAAA;AAC/C;AAOO,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAgC;AACpF,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAChD,EAAA,MAAM,KAAA,GACJ,MAAA,IAAU,MAAA,GACN,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA,EAAG,mBAAA,GAAsB,YAAA,GAAe,SAAA,CAAU,OAAO,CAAC,CAAA,GACrF,YAAA;AACN,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,IAAK,KAAA;AAC9C,EAAA,OAAO,IAAA,KAAS,gBAAgB,MAAA,CAAO,QAAA,GAAW,WAAW,CAAC,IAAI,CAAC,CAAA,GAAI,IAAA;AACzE;;"}
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const binaryContent = require('../../../domain/openapi/binary-content.cjs');
5
+ const typeCombinators = require('../type-combinators.cjs');
6
+ const arrayType = require('./array-type.cjs');
7
+ const objectType = require('./object-type.cjs');
8
+
9
+ const PRIMITIVE_TYPE_NAMES = /* @__PURE__ */ new Set([
10
+ "boolean",
11
+ "string",
12
+ "number",
13
+ "integer",
14
+ "null"
15
+ ]);
16
+ function multipleTypes(schema, request) {
17
+ const typeNames = schema.type;
18
+ const { oneOf } = schema;
19
+ const members = [];
20
+ for (const typeName of typeNames) {
21
+ const isInOneOf = Array.isArray(oneOf) && PRIMITIVE_TYPE_NAMES.has(typeName) && oneOf.some(
22
+ (variant2) => typeof variant2 === "object" && "type" in variant2 && variant2.type === typeName
23
+ );
24
+ if (isInOneOf) {
25
+ continue;
26
+ }
27
+ const variant = Array.isArray(oneOf) ? { ...schema, type: typeName, oneOf: void 0 } : { ...schema, type: typeName };
28
+ members.push(
29
+ typeName === "null" || typeName === null ? constructors.irKeyword("null") : request.transformNested(variant, request.location)
30
+ );
31
+ }
32
+ return typeCombinators.unionOf(members);
33
+ }
34
+ function keywordRule(name, typeNames, keyword) {
35
+ return {
36
+ name,
37
+ matches: (schema) => typeNames.includes(schema.type),
38
+ transform: () => constructors.irKeyword(keyword)
39
+ };
40
+ }
41
+ const BLOB_TYPE_NAME = "Blob";
42
+ function isBinaryAsBlob(schema, request) {
43
+ return request.context.options.binaryAsBlob && binaryContent.isRawBinarySchema(schema);
44
+ }
45
+ function stringType(schema, request) {
46
+ return isBinaryAsBlob(schema, request) ? constructors.irReference(BLOB_TYPE_NAME) : constructors.irKeyword("string");
47
+ }
48
+ const TYPED_RULES = [
49
+ keywordRule("null", ["null"], "null"),
50
+ { name: "string", matches: (schema) => schema.type === "string", transform: stringType },
51
+ keywordRule("number", ["number", "integer"], "number"),
52
+ keywordRule("boolean", ["boolean"], "boolean"),
53
+ { name: "array", matches: (schema) => schema.type === "array", transform: arrayType.arrayType },
54
+ {
55
+ name: "multiple types",
56
+ matches: (schema) => Array.isArray(schema.type),
57
+ transform: multipleTypes
58
+ }
59
+ ];
60
+ function customType(schema, request) {
61
+ const custom = request.context.callbacks.transform(schema, request.location);
62
+ if (custom === null) {
63
+ return null;
64
+ }
65
+ return custom.isOptional ? constructors.irUnion([custom.type, constructors.irKeyword("undefined")]) : custom.type;
66
+ }
67
+ function coreType(schema, request) {
68
+ if ("type" in schema && schema.type) {
69
+ const custom = customType(schema, request);
70
+ if (custom !== null) {
71
+ return custom;
72
+ }
73
+ const rule = TYPED_RULES.find((candidate) => candidate.matches(schema));
74
+ if (rule !== void 0) {
75
+ return rule.transform(schema, request);
76
+ }
77
+ } else if (isBinaryAsBlob(schema, request)) {
78
+ return constructors.irReference(BLOB_TYPE_NAME);
79
+ }
80
+ return objectType.objectType(schema, request);
81
+ }
82
+
83
+ exports.coreType = coreType;
84
+ //# sourceMappingURL=core-type.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-type.cjs","sources":["../../../../src/application/transform/schema/core-type.ts"],"sourcesContent":["import { irKeyword, irReference, irUnion } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type {\n Schema,\n SchemaObject,\n SchemaTypeName,\n} from \"../../../domain/openapi/schema-object.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport { arrayType } from \"./array-type.js\";\nimport { objectType } from \"./object-type.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nconst PRIMITIVE_TYPE_NAMES: ReadonlySet<SchemaTypeName | null> = new Set([\n \"boolean\",\n \"string\",\n \"number\",\n \"integer\",\n \"null\",\n]);\n\n/** Each `type` of a list becomes a union member; one already listed in `oneOf` is skipped. */\nfunction multipleTypes(schema: SchemaObject, request: SchemaRequest): IrType {\n const typeNames = schema.type as readonly (SchemaTypeName | null)[];\n const { oneOf } = schema;\n const members: IrType[] = [];\n for (const typeName of typeNames) {\n const isInOneOf =\n Array.isArray(oneOf) &&\n PRIMITIVE_TYPE_NAMES.has(typeName) &&\n oneOf.some(\n (variant) => typeof variant === \"object\" && \"type\" in variant && variant.type === typeName,\n );\n if (isInOneOf) {\n continue;\n }\n // With oneOf, the member drops it, so oneOf is not applied once per member.\n const variant = Array.isArray(oneOf)\n ? { ...schema, type: typeName, oneOf: undefined }\n : { ...schema, type: typeName };\n members.push(\n typeName === \"null\" || typeName === null\n ? irKeyword(\"null\")\n : request.transformNested(variant as Schema, request.location),\n );\n }\n return unionOf(members);\n}\n\nfunction keywordRule(\n name: string,\n typeNames: readonly string[],\n keyword: \"null\" | \"number\" | \"boolean\",\n): SchemaRule {\n return {\n name,\n matches: (schema) => typeNames.includes(schema.type as string),\n transform: () => irKeyword(keyword),\n };\n}\n\n/** The global type of raw binary data with `--binary-as-blob` (DOM lib, `@types/node`). */\nconst BLOB_TYPE_NAME = \"Blob\";\n\nfunction isBinaryAsBlob(schema: SchemaObject, request: SchemaRequest): boolean {\n return request.context.options.binaryAsBlob && isRawBinarySchema(schema);\n}\n\nfunction stringType(schema: SchemaObject, request: SchemaRequest): IrType {\n return isBinaryAsBlob(schema, request) ? irReference(BLOB_TYPE_NAME) : irKeyword(\"string\");\n}\n\n/** Rules for schemas with a `type`, in the original order. */\nconst TYPED_RULES: readonly SchemaRule[] = [\n keywordRule(\"null\", [\"null\"], \"null\"),\n { name: \"string\", matches: (schema) => schema.type === \"string\", transform: stringType },\n keywordRule(\"number\", [\"number\", \"integer\"], \"number\"),\n keywordRule(\"boolean\", [\"boolean\"], \"boolean\"),\n { name: \"array\", matches: (schema) => schema.type === \"array\", transform: arrayType },\n {\n name: \"multiple types\",\n matches: (schema) => Array.isArray(schema.type),\n transform: multipleTypes,\n },\n];\n\n/** The `transform` callback's type; a `questionToken` adds `undefined` here. */\nfunction customType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const custom = request.context.callbacks.transform(schema, request.location);\n if (custom === null) {\n return null;\n }\n return custom.isOptional ? irUnion([custom.type, irKeyword(\"undefined\")]) : custom.type;\n}\n\n/**\n * The schema without composition keywords: the `transform` callback, then a typed rule, then raw\n * binary without `type` (OpenAPI 3.1 allows leaving it out), then the object keywords. Null means\n * the schema has no type of its own.\n */\nexport function coreType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n if (\"type\" in schema && schema.type) {\n const custom = customType(schema, request);\n if (custom !== null) {\n return custom;\n }\n const rule = TYPED_RULES.find((candidate) => candidate.matches(schema));\n if (rule !== undefined) {\n return rule.transform(schema, request);\n }\n } else if (isBinaryAsBlob(schema, request)) {\n return irReference(BLOB_TYPE_NAME);\n }\n return objectType(schema, request);\n}\n"],"names":["variant","irKeyword","unionOf","isRawBinarySchema","irReference","arrayType","irUnion","objectType"],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { irReference, irUnion, irKeyword } from '../../../domain/ir/constructors.mjs';
2
+ import { isRawBinarySchema } from '../../../domain/openapi/binary-content.mjs';
3
+ import { unionOf } from '../type-combinators.mjs';
4
+ import { arrayType } from './array-type.mjs';
5
+ import { objectType } from './object-type.mjs';
6
+
7
+ const PRIMITIVE_TYPE_NAMES = /* @__PURE__ */ new Set([
8
+ "boolean",
9
+ "string",
10
+ "number",
11
+ "integer",
12
+ "null"
13
+ ]);
14
+ function multipleTypes(schema, request) {
15
+ const typeNames = schema.type;
16
+ const { oneOf } = schema;
17
+ const members = [];
18
+ for (const typeName of typeNames) {
19
+ const isInOneOf = Array.isArray(oneOf) && PRIMITIVE_TYPE_NAMES.has(typeName) && oneOf.some(
20
+ (variant2) => typeof variant2 === "object" && "type" in variant2 && variant2.type === typeName
21
+ );
22
+ if (isInOneOf) {
23
+ continue;
24
+ }
25
+ const variant = Array.isArray(oneOf) ? { ...schema, type: typeName, oneOf: void 0 } : { ...schema, type: typeName };
26
+ members.push(
27
+ typeName === "null" || typeName === null ? irKeyword("null") : request.transformNested(variant, request.location)
28
+ );
29
+ }
30
+ return unionOf(members);
31
+ }
32
+ function keywordRule(name, typeNames, keyword) {
33
+ return {
34
+ name,
35
+ matches: (schema) => typeNames.includes(schema.type),
36
+ transform: () => irKeyword(keyword)
37
+ };
38
+ }
39
+ const BLOB_TYPE_NAME = "Blob";
40
+ function isBinaryAsBlob(schema, request) {
41
+ return request.context.options.binaryAsBlob && isRawBinarySchema(schema);
42
+ }
43
+ function stringType(schema, request) {
44
+ return isBinaryAsBlob(schema, request) ? irReference(BLOB_TYPE_NAME) : irKeyword("string");
45
+ }
46
+ const TYPED_RULES = [
47
+ keywordRule("null", ["null"], "null"),
48
+ { name: "string", matches: (schema) => schema.type === "string", transform: stringType },
49
+ keywordRule("number", ["number", "integer"], "number"),
50
+ keywordRule("boolean", ["boolean"], "boolean"),
51
+ { name: "array", matches: (schema) => schema.type === "array", transform: arrayType },
52
+ {
53
+ name: "multiple types",
54
+ matches: (schema) => Array.isArray(schema.type),
55
+ transform: multipleTypes
56
+ }
57
+ ];
58
+ function customType(schema, request) {
59
+ const custom = request.context.callbacks.transform(schema, request.location);
60
+ if (custom === null) {
61
+ return null;
62
+ }
63
+ return custom.isOptional ? irUnion([custom.type, irKeyword("undefined")]) : custom.type;
64
+ }
65
+ function coreType(schema, request) {
66
+ if ("type" in schema && schema.type) {
67
+ const custom = customType(schema, request);
68
+ if (custom !== null) {
69
+ return custom;
70
+ }
71
+ const rule = TYPED_RULES.find((candidate) => candidate.matches(schema));
72
+ if (rule !== void 0) {
73
+ return rule.transform(schema, request);
74
+ }
75
+ } else if (isBinaryAsBlob(schema, request)) {
76
+ return irReference(BLOB_TYPE_NAME);
77
+ }
78
+ return objectType(schema, request);
79
+ }
80
+
81
+ export { coreType };
82
+ //# sourceMappingURL=core-type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-type.mjs","sources":["../../../../src/application/transform/schema/core-type.ts"],"sourcesContent":["import { irKeyword, irReference, irUnion } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type {\n Schema,\n SchemaObject,\n SchemaTypeName,\n} from \"../../../domain/openapi/schema-object.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport { arrayType } from \"./array-type.js\";\nimport { objectType } from \"./object-type.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nconst PRIMITIVE_TYPE_NAMES: ReadonlySet<SchemaTypeName | null> = new Set([\n \"boolean\",\n \"string\",\n \"number\",\n \"integer\",\n \"null\",\n]);\n\n/** Each `type` of a list becomes a union member; one already listed in `oneOf` is skipped. */\nfunction multipleTypes(schema: SchemaObject, request: SchemaRequest): IrType {\n const typeNames = schema.type as readonly (SchemaTypeName | null)[];\n const { oneOf } = schema;\n const members: IrType[] = [];\n for (const typeName of typeNames) {\n const isInOneOf =\n Array.isArray(oneOf) &&\n PRIMITIVE_TYPE_NAMES.has(typeName) &&\n oneOf.some(\n (variant) => typeof variant === \"object\" && \"type\" in variant && variant.type === typeName,\n );\n if (isInOneOf) {\n continue;\n }\n // With oneOf, the member drops it, so oneOf is not applied once per member.\n const variant = Array.isArray(oneOf)\n ? { ...schema, type: typeName, oneOf: undefined }\n : { ...schema, type: typeName };\n members.push(\n typeName === \"null\" || typeName === null\n ? irKeyword(\"null\")\n : request.transformNested(variant as Schema, request.location),\n );\n }\n return unionOf(members);\n}\n\nfunction keywordRule(\n name: string,\n typeNames: readonly string[],\n keyword: \"null\" | \"number\" | \"boolean\",\n): SchemaRule {\n return {\n name,\n matches: (schema) => typeNames.includes(schema.type as string),\n transform: () => irKeyword(keyword),\n };\n}\n\n/** The global type of raw binary data with `--binary-as-blob` (DOM lib, `@types/node`). */\nconst BLOB_TYPE_NAME = \"Blob\";\n\nfunction isBinaryAsBlob(schema: SchemaObject, request: SchemaRequest): boolean {\n return request.context.options.binaryAsBlob && isRawBinarySchema(schema);\n}\n\nfunction stringType(schema: SchemaObject, request: SchemaRequest): IrType {\n return isBinaryAsBlob(schema, request) ? irReference(BLOB_TYPE_NAME) : irKeyword(\"string\");\n}\n\n/** Rules for schemas with a `type`, in the original order. */\nconst TYPED_RULES: readonly SchemaRule[] = [\n keywordRule(\"null\", [\"null\"], \"null\"),\n { name: \"string\", matches: (schema) => schema.type === \"string\", transform: stringType },\n keywordRule(\"number\", [\"number\", \"integer\"], \"number\"),\n keywordRule(\"boolean\", [\"boolean\"], \"boolean\"),\n { name: \"array\", matches: (schema) => schema.type === \"array\", transform: arrayType },\n {\n name: \"multiple types\",\n matches: (schema) => Array.isArray(schema.type),\n transform: multipleTypes,\n },\n];\n\n/** The `transform` callback's type; a `questionToken` adds `undefined` here. */\nfunction customType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const custom = request.context.callbacks.transform(schema, request.location);\n if (custom === null) {\n return null;\n }\n return custom.isOptional ? irUnion([custom.type, irKeyword(\"undefined\")]) : custom.type;\n}\n\n/**\n * The schema without composition keywords: the `transform` callback, then a typed rule, then raw\n * binary without `type` (OpenAPI 3.1 allows leaving it out), then the object keywords. Null means\n * the schema has no type of its own.\n */\nexport function coreType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n if (\"type\" in schema && schema.type) {\n const custom = customType(schema, request);\n if (custom !== null) {\n return custom;\n }\n const rule = TYPED_RULES.find((candidate) => candidate.matches(schema));\n if (rule !== undefined) {\n return rule.transform(schema, request);\n }\n } else if (isBinaryAsBlob(schema, request)) {\n return irReference(BLOB_TYPE_NAME);\n }\n return objectType(schema, request);\n}\n"],"names":["variant"],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const propertyName = require('../../../domain/ir/property-name.cjs');
5
+ const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
6
+ const literalType = require('../literal-type.cjs');
7
+
8
+ function discriminatorValue(discriminator, path) {
9
+ const name = jsonPointer.parseRefPointer(path).pop();
10
+ const match = Object.entries(discriminator.mapping ?? {}).find(
11
+ ([, target]) => target.startsWith("#") ? jsonPointer.parseRefPointer(target).pop() === name : target === name
12
+ );
13
+ return match ? match[0] : name;
14
+ }
15
+ function discriminatorProperty(discriminator, path, isReadonly) {
16
+ const value = discriminatorValue(discriminator, path);
17
+ return constructors.irProperty(propertyName.toPropertyName(discriminator.propertyName), literalType.literalType(value), { isReadonly });
18
+ }
19
+
20
+ exports.discriminatorProperty = discriminatorProperty;
21
+ //# sourceMappingURL=discriminator-property.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminator-property.cjs","sources":["../../../../src/application/transform/schema/discriminator-property.ts"],"sourcesContent":["import { irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrPropertySignature } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport { literalType } from \"../literal-type.js\";\nimport type { Discriminator } from \"./schema-context.js\";\n\n/**\n * The value a schema has for its parent's discriminator: the mapping key whose target is this\n * schema (a full `$ref` or a bare schema name), else the schema's own name (the last segment).\n */\nfunction discriminatorValue(discriminator: Discriminator, path: string): string | undefined {\n const name = parseRefPointer(path).pop();\n const match = Object.entries(discriminator.mapping ?? {}).find(([, target]) =>\n target.startsWith(\"#\") ? parseRefPointer(target).pop() === name : target === name,\n );\n return match ? match[0] : name;\n}\n\n/** The discriminator property, typed as its literal value (`createDiscriminatorProperty`). */\nexport function discriminatorProperty(\n discriminator: Discriminator,\n path: string,\n isReadonly: boolean,\n): IrPropertySignature {\n const value = discriminatorValue(discriminator, path);\n return irProperty(toPropertyName(discriminator.propertyName), literalType(value), { isReadonly });\n}\n"],"names":["parseRefPointer","irProperty","toPropertyName","literalType"],"mappings":";;;;;;;AAWA,SAAS,kBAAA,CAAmB,eAA8B,IAAA,EAAkC;AAC1F,EAAA,MAAM,IAAA,GAAOA,2BAAA,CAAgB,IAAI,CAAA,CAAE,GAAA,EAAI;AACvC,EAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,cAAc,OAAA,IAAW,EAAE,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,GAAG,MAAM,MACvE,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAIA,4BAAgB,MAAM,CAAA,CAAE,GAAA,EAAI,KAAM,OAAO,MAAA,KAAW;AAAA,GAC/E;AACA,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC5B;AAGO,SAAS,qBAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACqB;AACrB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,aAAA,EAAe,IAAI,CAAA;AACpD,EAAA,OAAOC,uBAAA,CAAWC,2BAAA,CAAe,aAAA,CAAc,YAAY,CAAA,EAAGC,wBAAY,KAAK,CAAA,EAAG,EAAE,UAAA,EAAY,CAAA;AAClG;;"}
@@ -0,0 +1,19 @@
1
+ import { irProperty } from '../../../domain/ir/constructors.mjs';
2
+ import { toPropertyName } from '../../../domain/ir/property-name.mjs';
3
+ import { parseRefPointer } from '../../../domain/openapi/json-pointer.mjs';
4
+ import { literalType } from '../literal-type.mjs';
5
+
6
+ function discriminatorValue(discriminator, path) {
7
+ const name = parseRefPointer(path).pop();
8
+ const match = Object.entries(discriminator.mapping ?? {}).find(
9
+ ([, target]) => target.startsWith("#") ? parseRefPointer(target).pop() === name : target === name
10
+ );
11
+ return match ? match[0] : name;
12
+ }
13
+ function discriminatorProperty(discriminator, path, isReadonly) {
14
+ const value = discriminatorValue(discriminator, path);
15
+ return irProperty(toPropertyName(discriminator.propertyName), literalType(value), { isReadonly });
16
+ }
17
+
18
+ export { discriminatorProperty };
19
+ //# sourceMappingURL=discriminator-property.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminator-property.mjs","sources":["../../../../src/application/transform/schema/discriminator-property.ts"],"sourcesContent":["import { irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrPropertySignature } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport { literalType } from \"../literal-type.js\";\nimport type { Discriminator } from \"./schema-context.js\";\n\n/**\n * The value a schema has for its parent's discriminator: the mapping key whose target is this\n * schema (a full `$ref` or a bare schema name), else the schema's own name (the last segment).\n */\nfunction discriminatorValue(discriminator: Discriminator, path: string): string | undefined {\n const name = parseRefPointer(path).pop();\n const match = Object.entries(discriminator.mapping ?? {}).find(([, target]) =>\n target.startsWith(\"#\") ? parseRefPointer(target).pop() === name : target === name,\n );\n return match ? match[0] : name;\n}\n\n/** The discriminator property, typed as its literal value (`createDiscriminatorProperty`). */\nexport function discriminatorProperty(\n discriminator: Discriminator,\n path: string,\n isReadonly: boolean,\n): IrPropertySignature {\n const value = discriminatorValue(discriminator, path);\n return irProperty(toPropertyName(discriminator.propertyName), literalType(value), { isReadonly });\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAS,kBAAA,CAAmB,eAA8B,IAAA,EAAkC;AAC1F,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,CAAE,GAAA,EAAI;AACvC,EAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,cAAc,OAAA,IAAW,EAAE,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,GAAG,MAAM,MACvE,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,gBAAgB,MAAM,CAAA,CAAE,GAAA,EAAI,KAAM,OAAO,MAAA,KAAW;AAAA,GAC/E;AACA,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC5B;AAGO,SAAS,qBAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACqB;AACrB,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,aAAA,EAAe,IAAI,CAAA;AACpD,EAAA,OAAO,UAAA,CAAW,cAAA,CAAe,aAAA,CAAc,YAAY,CAAA,EAAG,YAAY,KAAK,CAAA,EAAG,EAAE,UAAA,EAAY,CAAA;AAClG;;"}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
5
+ const literalType = require('../literal-type.cjs');
6
+ const refType = require('../ref-type.cjs');
7
+ const typeCombinators = require('../type-combinators.cjs');
8
+
9
+ const COMPONENT_SCHEMAS_PREFIX = "components/schemas";
10
+ const UNION_KEYWORDS = /* @__PURE__ */ new Set(["anyOf", "oneOf"]);
11
+ const INDEX_RE = /^\d+$/;
12
+ function hasAdditionalProperties(schema) {
13
+ return "additionalProperties" in schema && Boolean(schema.additionalProperties);
14
+ }
15
+ function nameFromPath(path) {
16
+ return jsonPointer.parseRefPointer(path ?? "").join("/").replace(COMPONENT_SCHEMAS_PREFIX, "");
17
+ }
18
+ function hasEnumMetadata(schema) {
19
+ return [
20
+ schema["x-enum-varnames"],
21
+ schema["x-enumNames"],
22
+ schema["x-enum-descriptions"],
23
+ schema["x-enumDescriptions"]
24
+ ].some(Array.isArray);
25
+ }
26
+ function isTsEnum(schema, options) {
27
+ if (!options.enum || !schema.enum) {
28
+ return false;
29
+ }
30
+ const isSupported = schema.enum.every((value) => ["string", "number"].includes(typeof value));
31
+ return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));
32
+ }
33
+ function enumMetadata(schema) {
34
+ return (schema.enum ?? []).map((_, index) => ({
35
+ name: schema["x-enum-varnames"]?.[index] ?? schema["x-enumNames"]?.[index],
36
+ description: schema["x-enum-descriptions"]?.[index] ?? schema["x-enumDescriptions"]?.[index]
37
+ }));
38
+ }
39
+ function withOtherStrings(type, schema) {
40
+ if (!hasAdditionalProperties(schema) || schema.type !== "string") {
41
+ return type;
42
+ }
43
+ return typeCombinators.unionOf([type, typeCombinators.intersectionOf([constructors.irKeyword("string"), constructors.irObject([])])]);
44
+ }
45
+ function tsEnumType(schema, request) {
46
+ const name = request.context.footer.addEnum({
47
+ name: nameFromPath(request.location.path),
48
+ values: schema.enum ?? [],
49
+ metadata: enumMetadata(schema)
50
+ });
51
+ return withOtherStrings(constructors.irReference(name), schema);
52
+ }
53
+ function isUnionPosition(pointer, index) {
54
+ const next = pointer[index + 1];
55
+ return UNION_KEYWORDS.has(pointer[index]) && next !== void 0 && INDEX_RE.test(next);
56
+ }
57
+ function enumValuesPointer(path) {
58
+ const pointer = jsonPointer.parseRefPointer(path ?? "");
59
+ const kept = [];
60
+ let firstVariantStart = null;
61
+ for (let index = 0; index < pointer.length; index++) {
62
+ if (isUnionPosition(pointer, index)) {
63
+ firstVariantStart ??= index + 2;
64
+ index++;
65
+ continue;
66
+ }
67
+ kept.push(pointer[index]);
68
+ }
69
+ const extract = firstVariantStart === null ? [] : pointer.slice(firstVariantStart).filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));
70
+ return { ref: jsonPointer.createRef(kept), extract };
71
+ }
72
+ function addEnumValues(schema, request) {
73
+ const { ref, extract } = enumValuesPointer(request.location.path);
74
+ const valuesType = refType.refType(ref, { isDeep: true, extractProperties: extract });
75
+ request.context.footer.addEnumValues({
76
+ name: `${nameFromPath(request.location.path)}Values`,
77
+ // A record value (`additionalProperties`) is reached by indexing with `string`.
78
+ type: request.isFromAdditionalProperties ? constructors.irIndexedAccess(valuesType, constructors.irReference("string")) : valuesType,
79
+ values: schema.enum ?? []
80
+ });
81
+ }
82
+ function literalEnumType(schema, request) {
83
+ const values = schema.enum ?? [];
84
+ const isNullable = Array.isArray(schema.type) && schema.type.includes("null") || Boolean(schema.nullable);
85
+ const literals = [...values.map(literalType.literalType), ...isNullable ? [constructors.irKeyword("null")] : []];
86
+ const type = withOtherStrings(typeCombinators.unionOf(literals), schema);
87
+ const isListable = values.every(
88
+ (value) => typeof value === "string" || typeof value === "number"
89
+ );
90
+ if (request.context.options.enumValues && isListable) {
91
+ addEnumValues(schema, request);
92
+ }
93
+ return type;
94
+ }
95
+ const enumRule = {
96
+ name: "enum",
97
+ matches(schema) {
98
+ const isCandidate = Array.isArray(schema.enum) && schema.type !== "object" && !("properties" in schema);
99
+ return isCandidate && (!hasAdditionalProperties(schema) || schema.type === "string");
100
+ },
101
+ transform(schema, request) {
102
+ return isTsEnum(schema, request.context.options) ? tsEnumType(schema, request) : literalEnumType(schema, request);
103
+ }
104
+ };
105
+
106
+ exports.enumRule = enumRule;
107
+ //# sourceMappingURL=enum-rule.cjs.map