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,59 @@
1
+ 'use strict';
2
+
3
+ const outputFixes = require('../../../domain/output-fixes.cjs');
4
+
5
+ const PRESENCE_KEYWORDS = /* @__PURE__ */ new Set([
6
+ "$comment",
7
+ "deprecated",
8
+ "description",
9
+ "example",
10
+ "examples",
11
+ "required",
12
+ "title",
13
+ "type"
14
+ ]);
15
+ const EXTENSION_PREFIX = "x-";
16
+ const OBJECT_TYPE = "object";
17
+ function isStringList(value) {
18
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
19
+ }
20
+ function isPresenceKeyword([key, value]) {
21
+ if (key === "type") {
22
+ return value === OBJECT_TYPE;
23
+ }
24
+ if (key === "required") {
25
+ return isStringList(value);
26
+ }
27
+ return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);
28
+ }
29
+ function isPresenceObject(schema) {
30
+ return typeof schema === "object" && schema !== null && !Array.isArray(schema) && !("$ref" in schema) && Object.entries(schema).every(isPresenceKeyword);
31
+ }
32
+ function memberSchema(member, request) {
33
+ if (typeof member !== "object" || member === null || !("$ref" in member)) {
34
+ return member;
35
+ }
36
+ const ref = member.$ref;
37
+ if (typeof ref !== "string" || Object.keys(member).length !== 1) {
38
+ return void 0;
39
+ }
40
+ return request.context.refs.resolve(ref);
41
+ }
42
+ function allOfMembers(members, request) {
43
+ const unchanged = { members, required: [] };
44
+ if (!request.context.options.fixes.has(outputFixes.OutputFix.ALLOF_REQUIRED)) {
45
+ return unchanged;
46
+ }
47
+ const schemas = members.map((member) => memberSchema(member, request));
48
+ const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));
49
+ if (kept.length === 0 || kept.length === members.length) {
50
+ return unchanged;
51
+ }
52
+ const required = schemas.flatMap(
53
+ (schema) => isPresenceObject(schema) ? schema.required ?? [] : []
54
+ );
55
+ return { members: kept, required };
56
+ }
57
+
58
+ exports.allOfMembers = allOfMembers;
59
+ //# sourceMappingURL=presence-members.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence-members.cjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `allof-required` fix (ADR-021, roadmap R6). An `allOf` member such as `{ required: [name] }`\n * or `{ type: object }` says nothing about the shape of the object; it only asks that keys are\n * present. Typed as an object of its own, it adds `& Record<string, never>` or `& unknown`. With\n * the fix, such members are left out and their keys are made required in the other members, the\n * same way the parent's `required` is (upstream #1474, #1520, #2165).\n */\n\n/**\n * Keywords that do not change the shape: `type: object`, `required`, and annotations that the\n * generator does not read on an `allOf` member. `default`, `readOnly` and `writeOnly` are left out:\n * they change types elsewhere.\n */\nconst PRESENCE_KEYWORDS: ReadonlySet<string> = new Set([\n \"$comment\",\n \"deprecated\",\n \"description\",\n \"example\",\n \"examples\",\n \"required\",\n \"title\",\n \"type\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\nconst OBJECT_TYPE = \"object\";\n\nfunction isStringList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isPresenceKeyword([key, value]: readonly [string, unknown]): boolean {\n if (key === \"type\") {\n return value === OBJECT_TYPE;\n }\n if (key === \"required\") {\n return isStringList(value);\n }\n return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);\n}\n\nfunction isPresenceObject(schema: unknown): schema is SchemaObject {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n !Array.isArray(schema) &&\n !(\"$ref\" in schema) &&\n Object.entries(schema).every(isPresenceKeyword)\n );\n}\n\n/**\n * The schema a member stands for: itself, or the target of a `$ref` with no sibling keywords. The\n * discriminator scan has already added the discriminator property to a mapped target, so such a\n * target is never presence-only.\n */\nfunction memberSchema(member: Schema, request: SchemaRequest): unknown {\n if (typeof member !== \"object\" || member === null || !(\"$ref\" in member)) {\n return member;\n }\n const ref = (member as { readonly $ref: unknown }).$ref;\n if (typeof ref !== \"string\" || Object.keys(member).length !== 1) {\n return undefined;\n }\n return request.context.refs.resolve(ref);\n}\n\n/** The `allOf` members to type, and the keys the left-out members make required. */\nexport interface AllOfMembers {\n readonly members: readonly Schema[];\n readonly required: readonly string[];\n}\n\n/**\n * The members of `allOf` with presence-only ones left out, when the fix is on and another member\n * is left to carry the keys; otherwise the members as they are.\n */\nexport function allOfMembers(members: readonly Schema[], request: SchemaRequest): AllOfMembers {\n const unchanged = { members, required: [] };\n if (!request.context.options.fixes.has(OutputFix.ALLOF_REQUIRED)) {\n return unchanged;\n }\n const schemas = members.map((member) => memberSchema(member, request));\n const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));\n if (kept.length === 0 || kept.length === members.length) {\n return unchanged;\n }\n const required = schemas.flatMap((schema) =>\n isPresenceObject(schema) ? (schema.required ?? []) : [],\n );\n return { members: kept, required };\n}\n"],"names":["OutputFix"],"mappings":";;;;AAiBA,MAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AACzB,MAAM,WAAA,GAAc,QAAA;AAEpB,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,CAAA;AACjF;AAEA,SAAS,iBAAA,CAAkB,CAAC,GAAA,EAAK,KAAK,CAAA,EAAwC;AAC5E,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO,KAAA,KAAU,WAAA;AAAA,EACnB;AACA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,kBAAkB,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,gBAAgB,CAAA;AACtE;AAEA,SAAS,iBAAiB,MAAA,EAAyC;AACjE,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,IACrB,EAAE,UAAU,MAAA,CAAA,IACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,MAAM,iBAAiB,CAAA;AAElD;AAOA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAiC;AACrE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,EAAE,UAAU,MAAA,CAAA,EAAS;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAO,MAAA,CAAsC,IAAA;AACnD,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACzC;AAYO,SAAS,YAAA,CAAa,SAA4B,OAAA,EAAsC;AAC7F,EAAA,MAAM,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,EAAU,EAAC,EAAE;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIA,qBAAA,CAAU,cAAc,CAAA,EAAG;AAChE,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAC,WAAW,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACvD,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,WAChC,gBAAA,CAAiB,MAAM,IAAK,MAAA,CAAO,QAAA,IAAY,EAAC,GAAK;AAAC,GACxD;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AACnC;;"}
@@ -0,0 +1,57 @@
1
+ import { OutputFix } from '../../../domain/output-fixes.mjs';
2
+
3
+ const PRESENCE_KEYWORDS = /* @__PURE__ */ new Set([
4
+ "$comment",
5
+ "deprecated",
6
+ "description",
7
+ "example",
8
+ "examples",
9
+ "required",
10
+ "title",
11
+ "type"
12
+ ]);
13
+ const EXTENSION_PREFIX = "x-";
14
+ const OBJECT_TYPE = "object";
15
+ function isStringList(value) {
16
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
17
+ }
18
+ function isPresenceKeyword([key, value]) {
19
+ if (key === "type") {
20
+ return value === OBJECT_TYPE;
21
+ }
22
+ if (key === "required") {
23
+ return isStringList(value);
24
+ }
25
+ return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);
26
+ }
27
+ function isPresenceObject(schema) {
28
+ return typeof schema === "object" && schema !== null && !Array.isArray(schema) && !("$ref" in schema) && Object.entries(schema).every(isPresenceKeyword);
29
+ }
30
+ function memberSchema(member, request) {
31
+ if (typeof member !== "object" || member === null || !("$ref" in member)) {
32
+ return member;
33
+ }
34
+ const ref = member.$ref;
35
+ if (typeof ref !== "string" || Object.keys(member).length !== 1) {
36
+ return void 0;
37
+ }
38
+ return request.context.refs.resolve(ref);
39
+ }
40
+ function allOfMembers(members, request) {
41
+ const unchanged = { members, required: [] };
42
+ if (!request.context.options.fixes.has(OutputFix.ALLOF_REQUIRED)) {
43
+ return unchanged;
44
+ }
45
+ const schemas = members.map((member) => memberSchema(member, request));
46
+ const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));
47
+ if (kept.length === 0 || kept.length === members.length) {
48
+ return unchanged;
49
+ }
50
+ const required = schemas.flatMap(
51
+ (schema) => isPresenceObject(schema) ? schema.required ?? [] : []
52
+ );
53
+ return { members: kept, required };
54
+ }
55
+
56
+ export { allOfMembers };
57
+ //# sourceMappingURL=presence-members.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence-members.mjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `allof-required` fix (ADR-021, roadmap R6). An `allOf` member such as `{ required: [name] }`\n * or `{ type: object }` says nothing about the shape of the object; it only asks that keys are\n * present. Typed as an object of its own, it adds `& Record<string, never>` or `& unknown`. With\n * the fix, such members are left out and their keys are made required in the other members, the\n * same way the parent's `required` is (upstream #1474, #1520, #2165).\n */\n\n/**\n * Keywords that do not change the shape: `type: object`, `required`, and annotations that the\n * generator does not read on an `allOf` member. `default`, `readOnly` and `writeOnly` are left out:\n * they change types elsewhere.\n */\nconst PRESENCE_KEYWORDS: ReadonlySet<string> = new Set([\n \"$comment\",\n \"deprecated\",\n \"description\",\n \"example\",\n \"examples\",\n \"required\",\n \"title\",\n \"type\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\nconst OBJECT_TYPE = \"object\";\n\nfunction isStringList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isPresenceKeyword([key, value]: readonly [string, unknown]): boolean {\n if (key === \"type\") {\n return value === OBJECT_TYPE;\n }\n if (key === \"required\") {\n return isStringList(value);\n }\n return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);\n}\n\nfunction isPresenceObject(schema: unknown): schema is SchemaObject {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n !Array.isArray(schema) &&\n !(\"$ref\" in schema) &&\n Object.entries(schema).every(isPresenceKeyword)\n );\n}\n\n/**\n * The schema a member stands for: itself, or the target of a `$ref` with no sibling keywords. The\n * discriminator scan has already added the discriminator property to a mapped target, so such a\n * target is never presence-only.\n */\nfunction memberSchema(member: Schema, request: SchemaRequest): unknown {\n if (typeof member !== \"object\" || member === null || !(\"$ref\" in member)) {\n return member;\n }\n const ref = (member as { readonly $ref: unknown }).$ref;\n if (typeof ref !== \"string\" || Object.keys(member).length !== 1) {\n return undefined;\n }\n return request.context.refs.resolve(ref);\n}\n\n/** The `allOf` members to type, and the keys the left-out members make required. */\nexport interface AllOfMembers {\n readonly members: readonly Schema[];\n readonly required: readonly string[];\n}\n\n/**\n * The members of `allOf` with presence-only ones left out, when the fix is on and another member\n * is left to carry the keys; otherwise the members as they are.\n */\nexport function allOfMembers(members: readonly Schema[], request: SchemaRequest): AllOfMembers {\n const unchanged = { members, required: [] };\n if (!request.context.options.fixes.has(OutputFix.ALLOF_REQUIRED)) {\n return unchanged;\n }\n const schemas = members.map((member) => memberSchema(member, request));\n const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));\n if (kept.length === 0 || kept.length === members.length) {\n return unchanged;\n }\n const required = schemas.flatMap((schema) =>\n isPresenceObject(schema) ? (schema.required ?? []) : [],\n );\n return { members: kept, required };\n}\n"],"names":[],"mappings":";;AAiBA,MAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AACzB,MAAM,WAAA,GAAc,QAAA;AAEpB,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,CAAA;AACjF;AAEA,SAAS,iBAAA,CAAkB,CAAC,GAAA,EAAK,KAAK,CAAA,EAAwC;AAC5E,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO,KAAA,KAAU,WAAA;AAAA,EACnB;AACA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,kBAAkB,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,gBAAgB,CAAA;AACtE;AAEA,SAAS,iBAAiB,MAAA,EAAyC;AACjE,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,IACrB,EAAE,UAAU,MAAA,CAAA,IACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,MAAM,iBAAiB,CAAA;AAElD;AAOA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAiC;AACrE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,EAAE,UAAU,MAAA,CAAA,EAAS;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAO,MAAA,CAAsC,IAAA;AACnD,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACzC;AAYO,SAAS,YAAA,CAAa,SAA4B,OAAA,EAAsC;AAC7F,EAAA,MAAM,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,EAAU,EAAC,EAAE;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAI,SAAA,CAAU,cAAc,CAAA,EAAG;AAChE,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAC,WAAW,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACvD,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,WAChC,gBAAA,CAAiB,MAAM,IAAK,MAAA,CAAO,QAAA,IAAY,EAAC,GAAK;AAAC,GACxD;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AACnC;;"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ const errors = require('../../../domain/errors.cjs');
4
+ const constructors = require('../../../domain/ir/constructors.cjs');
5
+ const literalType = require('../literal-type.cjs');
6
+ const refType = require('../ref-type.cjs');
7
+ const sharedTypes = require('../shared-types.cjs');
8
+ const compositionType = require('./composition-type.cjs');
9
+ const enumRule = require('./enum-rule.cjs');
10
+
11
+ class InvalidSchemaError extends errors.OpenAPITypesafeError {
12
+ constructor(schema, path) {
13
+ const received = Array.isArray(schema) ? "Array" : typeof schema;
14
+ super({
15
+ code: errors.ERROR_CODES.SCHEMA_OBJECT_INVALID,
16
+ message: `Expected SchemaObject, received ${received} at ${path}`,
17
+ details: { path, received }
18
+ });
19
+ this.name = "InvalidSchemaError";
20
+ }
21
+ }
22
+ const SHAPE_RULES = [
23
+ {
24
+ name: "$ref",
25
+ matches: (schema) => "$ref" in schema,
26
+ transform: (schema) => refType.refType(schema.$ref)
27
+ },
28
+ {
29
+ name: "const",
30
+ matches: (schema) => schema.const !== null && schema.const !== void 0,
31
+ transform: (schema) => literalType.literalType(schema.const)
32
+ },
33
+ enumRule.enumRule
34
+ ];
35
+ function checkSchema(schema, path) {
36
+ if (!schema) {
37
+ return { type: constructors.irKeyword("never") };
38
+ }
39
+ if (schema === true) {
40
+ return { type: sharedTypes.UNKNOWN_TYPE };
41
+ }
42
+ if (Array.isArray(schema) || typeof schema !== "object") {
43
+ throw new InvalidSchemaError(schema, path);
44
+ }
45
+ return { schema };
46
+ }
47
+ function request(location, context, isFromAdditionalProperties) {
48
+ return {
49
+ location,
50
+ context,
51
+ isFromAdditionalProperties,
52
+ transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) => transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties)
53
+ };
54
+ }
55
+ function transformSchemaShape(schema, location, context, isFromAdditionalProperties = false) {
56
+ const checked = checkSchema(schema, location.path);
57
+ if ("type" in checked) {
58
+ return checked.type;
59
+ }
60
+ const current = request(location, context, isFromAdditionalProperties);
61
+ const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));
62
+ return rule ? rule.transform(checked.schema, current) : compositionType.compositionType(checked.schema, current);
63
+ }
64
+ function transformSchema(schema, location, context, isFromAdditionalProperties = false) {
65
+ const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);
66
+ return context.callbacks.postTransform(type, location) ?? type;
67
+ }
68
+
69
+ exports.InvalidSchemaError = InvalidSchemaError;
70
+ exports.transformSchema = transformSchema;
71
+ exports.transformSchemaShape = transformSchemaShape;
72
+ //# sourceMappingURL=schema-transform.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-transform.cjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema) => refType((schema as { $ref: string }).$ref),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","refType","literalType","enumRule","irKeyword","UNKNOWN_TYPE","compositionType"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { OpenAPITypesafeError, ERROR_CODES } from '../../../domain/errors.mjs';
2
+ import { irKeyword } from '../../../domain/ir/constructors.mjs';
3
+ import { literalType } from '../literal-type.mjs';
4
+ import { refType } from '../ref-type.mjs';
5
+ import { UNKNOWN_TYPE } from '../shared-types.mjs';
6
+ import { compositionType } from './composition-type.mjs';
7
+ import { enumRule } from './enum-rule.mjs';
8
+
9
+ class InvalidSchemaError extends OpenAPITypesafeError {
10
+ constructor(schema, path) {
11
+ const received = Array.isArray(schema) ? "Array" : typeof schema;
12
+ super({
13
+ code: ERROR_CODES.SCHEMA_OBJECT_INVALID,
14
+ message: `Expected SchemaObject, received ${received} at ${path}`,
15
+ details: { path, received }
16
+ });
17
+ this.name = "InvalidSchemaError";
18
+ }
19
+ }
20
+ const SHAPE_RULES = [
21
+ {
22
+ name: "$ref",
23
+ matches: (schema) => "$ref" in schema,
24
+ transform: (schema) => refType(schema.$ref)
25
+ },
26
+ {
27
+ name: "const",
28
+ matches: (schema) => schema.const !== null && schema.const !== void 0,
29
+ transform: (schema) => literalType(schema.const)
30
+ },
31
+ enumRule
32
+ ];
33
+ function checkSchema(schema, path) {
34
+ if (!schema) {
35
+ return { type: irKeyword("never") };
36
+ }
37
+ if (schema === true) {
38
+ return { type: UNKNOWN_TYPE };
39
+ }
40
+ if (Array.isArray(schema) || typeof schema !== "object") {
41
+ throw new InvalidSchemaError(schema, path);
42
+ }
43
+ return { schema };
44
+ }
45
+ function request(location, context, isFromAdditionalProperties) {
46
+ return {
47
+ location,
48
+ context,
49
+ isFromAdditionalProperties,
50
+ transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) => transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties)
51
+ };
52
+ }
53
+ function transformSchemaShape(schema, location, context, isFromAdditionalProperties = false) {
54
+ const checked = checkSchema(schema, location.path);
55
+ if ("type" in checked) {
56
+ return checked.type;
57
+ }
58
+ const current = request(location, context, isFromAdditionalProperties);
59
+ const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));
60
+ return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);
61
+ }
62
+ function transformSchema(schema, location, context, isFromAdditionalProperties = false) {
63
+ const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);
64
+ return context.callbacks.postTransform(type, location) ?? type;
65
+ }
66
+
67
+ export { InvalidSchemaError, transformSchema, transformSchemaShape };
68
+ //# sourceMappingURL=schema-transform.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-transform.mjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema) => refType((schema as { $ref: string }).$ref),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const outputFixes = require('../../../domain/output-fixes.cjs');
5
+ const helperTypes = require('../helper-types.cjs');
6
+ const sharedTypes = require('../shared-types.cjs');
7
+ const typeCombinators = require('../type-combinators.cjs');
8
+
9
+ function unevaluatedSchemaOf(schema, request) {
10
+ const { unevaluatedProperties } = schema;
11
+ if (!request.context.options.fixes.has(outputFixes.OutputFix.UNEVALUATED_PROPERTIES) || unevaluatedProperties === void 0 || unevaluatedProperties === false || schema.additionalProperties !== void 0) {
12
+ return null;
13
+ }
14
+ return schema.type === void 0 || schema.type === "object" ? unevaluatedProperties : null;
15
+ }
16
+ function isAnySchema(schema) {
17
+ return schema === true || typeof schema === "object" && Object.keys(schema).length === 0;
18
+ }
19
+ function memberValueTypes(member) {
20
+ if (member.kind === "indexSignature") {
21
+ return [member.type];
22
+ }
23
+ return member.isOptional ? [member.type, constructors.irKeyword("undefined")] : [member.type];
24
+ }
25
+ function declaredValueTypes(type, request) {
26
+ switch (type.kind) {
27
+ case "object":
28
+ return type.members.flatMap(memberValueTypes);
29
+ case "union":
30
+ case "intersection":
31
+ return type.types.flatMap((member) => declaredValueTypes(member, request));
32
+ case "reference":
33
+ case "indexedAccess":
34
+ case "raw":
35
+ request.context.footer.requirePropertyValues();
36
+ return [constructors.irReference(helperTypes.HELPER_TYPES.propertyValues.name, [type])];
37
+ case "keyword":
38
+ case "stringLiteral":
39
+ case "numberLiteral":
40
+ case "booleanLiteral":
41
+ case "array":
42
+ case "tuple":
43
+ case "readonly":
44
+ return [];
45
+ }
46
+ }
47
+ function unevaluatedPropertiesType(schema, composed, request) {
48
+ const unevaluated = unevaluatedSchemaOf(schema, request);
49
+ if (unevaluated === null) {
50
+ return null;
51
+ }
52
+ const valueTypes = isAnySchema(unevaluated) ? [sharedTypes.UNKNOWN_TYPE] : [
53
+ request.transformNested(unevaluated, request.location, true),
54
+ ...composed === null ? [] : declaredValueTypes(composed, request)
55
+ ];
56
+ const { immutable } = request.context.options;
57
+ return constructors.irObject([constructors.irStringIndexSignature("key", typeCombinators.unionOf(valueTypes), immutable)]);
58
+ }
59
+
60
+ exports.unevaluatedPropertiesType = unevaluatedPropertiesType;
61
+ //# sourceMappingURL=unevaluated-properties.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unevaluated-properties.cjs","sources":["../../../../src/application/transform/schema/unevaluated-properties.ts"],"sourcesContent":["import {\n irKeyword,\n irObject,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { HELPER_TYPES } from \"../helper-types.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `unevaluated-properties` fix (ADR-021, roadmap R11; upstream #2839, #2880). Without it\n * `unevaluatedProperties` is ignored, so its value type is lost and an object with only that\n * keyword is `Record<string, never>`. With it the composed type is intersected with an index\n * signature, as `additionalProperties` gives: every key that no other keyword declares has the\n * `unevaluatedProperties` type. TypeScript checks that index signature against every key of a\n * value, declared ones included, so its type also holds the types of the declared properties\n * (of this schema and of its `allOf`, `anyOf` and `oneOf` members); otherwise a valid value would\n * not be assignable. `false` adds nothing, like `additionalProperties: false`: TypeScript has no\n * closed object type.\n */\n\n/**\n * Whether `unevaluatedProperties` applies. It types the keys left over at this level, so it\n * does nothing next to `additionalProperties` (which already types them all), and only an object\n * schema has keys. A `type` list is typed one listed type at a time, so its object gets it.\n */\nfunction unevaluatedSchemaOf(schema: SchemaObject, request: SchemaRequest): Schema | null {\n const { unevaluatedProperties } = schema;\n if (\n !request.context.options.fixes.has(OutputFix.UNEVALUATED_PROPERTIES) ||\n unevaluatedProperties === undefined ||\n unevaluatedProperties === false ||\n schema.additionalProperties !== undefined\n ) {\n return null;\n }\n return schema.type === undefined || schema.type === \"object\" ? unevaluatedProperties : null;\n}\n\nfunction isAnySchema(schema: Schema): boolean {\n return schema === true || (typeof schema === \"object\" && Object.keys(schema).length === 0);\n}\n\nfunction memberValueTypes(member: IrMember): IrType[] {\n if (member.kind === \"indexSignature\") {\n return [member.type];\n }\n return member.isOptional ? [member.type, irKeyword(\"undefined\")] : [member.type];\n}\n\n/**\n * The value types a key of the composed type can have, read from its IR: the members of object\n * types, through unions and intersections. A reference (a `$ref`, `Omit`, `WithRequired`) or a raw\n * type is read with `PropertyValues`. Primitives, literals and arrays declare no keys.\n */\nfunction declaredValueTypes(type: IrType, request: SchemaRequest): IrType[] {\n switch (type.kind) {\n case \"object\":\n return type.members.flatMap(memberValueTypes);\n case \"union\":\n case \"intersection\":\n return type.types.flatMap((member) => declaredValueTypes(member, request));\n case \"reference\":\n case \"indexedAccess\":\n case \"raw\":\n request.context.footer.requirePropertyValues();\n return [irReference(HELPER_TYPES.propertyValues.name, [type])];\n case \"keyword\":\n case \"stringLiteral\":\n case \"numberLiteral\":\n case \"booleanLiteral\":\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return [];\n }\n}\n\n/**\n * The index signature object for `unevaluatedProperties`, given the composed type of the other\n * keywords (null when there is none). Null when the fix is off or the keyword does not apply.\n */\nexport function unevaluatedPropertiesType(\n schema: SchemaObject,\n composed: IrType | null,\n request: SchemaRequest,\n): IrType | null {\n const unevaluated = unevaluatedSchemaOf(schema, request);\n if (unevaluated === null) {\n return null;\n }\n const valueTypes = isAnySchema(unevaluated)\n ? [UNKNOWN_TYPE]\n : [\n request.transformNested(unevaluated, request.location, true),\n ...(composed === null ? [] : declaredValueTypes(composed, request)),\n ];\n const { immutable } = request.context.options;\n return irObject([irStringIndexSignature(\"key\", unionOf(valueTypes), immutable)]);\n}\n"],"names":["OutputFix","irKeyword","irReference","HELPER_TYPES","UNKNOWN_TYPE","irObject","irStringIndexSignature","unionOf"],"mappings":";;;;;;;;AA+BA,SAAS,mBAAA,CAAoB,QAAsB,OAAA,EAAuC;AACxF,EAAA,MAAM,EAAE,uBAAsB,GAAI,MAAA;AAClC,EAAA,IACE,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIA,qBAAA,CAAU,sBAAsB,CAAA,IACnE,0BAA0B,MAAA,IAC1B,qBAAA,KAA0B,KAAA,IAC1B,MAAA,CAAO,yBAAyB,MAAA,EAChC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,IAAA,KAAS,WAAW,qBAAA,GAAwB,IAAA;AACzF;AAEA,SAAS,YAAY,MAAA,EAAyB;AAC5C,EAAA,OAAO,MAAA,KAAW,QAAS,OAAO,MAAA,KAAW,YAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC1F;AAEA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,IAAA,EAAMC,sBAAA,CAAU,WAAW,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,IAAI,CAAA;AACjF;AAOA,SAAS,kBAAA,CAAmB,MAAc,OAAA,EAAkC;AAC1E,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAC,WAAW,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IAC3E,KAAK,WAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,qBAAA,EAAsB;AAC7C,MAAA,OAAO,CAACC,yBAAYC,wBAAA,CAAa,cAAA,CAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/D,KAAK,SAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA;AACvD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,WAAA,CAAY,WAAW,CAAA,GACtC,CAACC,wBAAY,CAAA,GACb;AAAA,IACE,OAAA,CAAQ,eAAA,CAAgB,WAAA,EAAa,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IAC3D,GAAI,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,kBAAA,CAAmB,UAAU,OAAO;AAAA,GACnE;AACJ,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AACtC,EAAA,OAAOC,qBAAA,CAAS,CAACC,mCAAA,CAAuB,KAAA,EAAOC,wBAAQ,UAAU,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA;AACjF;;"}
@@ -0,0 +1,59 @@
1
+ import { irObject, irStringIndexSignature, irReference, irKeyword } from '../../../domain/ir/constructors.mjs';
2
+ import { OutputFix } from '../../../domain/output-fixes.mjs';
3
+ import { HELPER_TYPES } from '../helper-types.mjs';
4
+ import { UNKNOWN_TYPE } from '../shared-types.mjs';
5
+ import { unionOf } from '../type-combinators.mjs';
6
+
7
+ function unevaluatedSchemaOf(schema, request) {
8
+ const { unevaluatedProperties } = schema;
9
+ if (!request.context.options.fixes.has(OutputFix.UNEVALUATED_PROPERTIES) || unevaluatedProperties === void 0 || unevaluatedProperties === false || schema.additionalProperties !== void 0) {
10
+ return null;
11
+ }
12
+ return schema.type === void 0 || schema.type === "object" ? unevaluatedProperties : null;
13
+ }
14
+ function isAnySchema(schema) {
15
+ return schema === true || typeof schema === "object" && Object.keys(schema).length === 0;
16
+ }
17
+ function memberValueTypes(member) {
18
+ if (member.kind === "indexSignature") {
19
+ return [member.type];
20
+ }
21
+ return member.isOptional ? [member.type, irKeyword("undefined")] : [member.type];
22
+ }
23
+ function declaredValueTypes(type, request) {
24
+ switch (type.kind) {
25
+ case "object":
26
+ return type.members.flatMap(memberValueTypes);
27
+ case "union":
28
+ case "intersection":
29
+ return type.types.flatMap((member) => declaredValueTypes(member, request));
30
+ case "reference":
31
+ case "indexedAccess":
32
+ case "raw":
33
+ request.context.footer.requirePropertyValues();
34
+ return [irReference(HELPER_TYPES.propertyValues.name, [type])];
35
+ case "keyword":
36
+ case "stringLiteral":
37
+ case "numberLiteral":
38
+ case "booleanLiteral":
39
+ case "array":
40
+ case "tuple":
41
+ case "readonly":
42
+ return [];
43
+ }
44
+ }
45
+ function unevaluatedPropertiesType(schema, composed, request) {
46
+ const unevaluated = unevaluatedSchemaOf(schema, request);
47
+ if (unevaluated === null) {
48
+ return null;
49
+ }
50
+ const valueTypes = isAnySchema(unevaluated) ? [UNKNOWN_TYPE] : [
51
+ request.transformNested(unevaluated, request.location, true),
52
+ ...composed === null ? [] : declaredValueTypes(composed, request)
53
+ ];
54
+ const { immutable } = request.context.options;
55
+ return irObject([irStringIndexSignature("key", unionOf(valueTypes), immutable)]);
56
+ }
57
+
58
+ export { unevaluatedPropertiesType };
59
+ //# sourceMappingURL=unevaluated-properties.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unevaluated-properties.mjs","sources":["../../../../src/application/transform/schema/unevaluated-properties.ts"],"sourcesContent":["import {\n irKeyword,\n irObject,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { HELPER_TYPES } from \"../helper-types.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `unevaluated-properties` fix (ADR-021, roadmap R11; upstream #2839, #2880). Without it\n * `unevaluatedProperties` is ignored, so its value type is lost and an object with only that\n * keyword is `Record<string, never>`. With it the composed type is intersected with an index\n * signature, as `additionalProperties` gives: every key that no other keyword declares has the\n * `unevaluatedProperties` type. TypeScript checks that index signature against every key of a\n * value, declared ones included, so its type also holds the types of the declared properties\n * (of this schema and of its `allOf`, `anyOf` and `oneOf` members); otherwise a valid value would\n * not be assignable. `false` adds nothing, like `additionalProperties: false`: TypeScript has no\n * closed object type.\n */\n\n/**\n * Whether `unevaluatedProperties` applies. It types the keys left over at this level, so it\n * does nothing next to `additionalProperties` (which already types them all), and only an object\n * schema has keys. A `type` list is typed one listed type at a time, so its object gets it.\n */\nfunction unevaluatedSchemaOf(schema: SchemaObject, request: SchemaRequest): Schema | null {\n const { unevaluatedProperties } = schema;\n if (\n !request.context.options.fixes.has(OutputFix.UNEVALUATED_PROPERTIES) ||\n unevaluatedProperties === undefined ||\n unevaluatedProperties === false ||\n schema.additionalProperties !== undefined\n ) {\n return null;\n }\n return schema.type === undefined || schema.type === \"object\" ? unevaluatedProperties : null;\n}\n\nfunction isAnySchema(schema: Schema): boolean {\n return schema === true || (typeof schema === \"object\" && Object.keys(schema).length === 0);\n}\n\nfunction memberValueTypes(member: IrMember): IrType[] {\n if (member.kind === \"indexSignature\") {\n return [member.type];\n }\n return member.isOptional ? [member.type, irKeyword(\"undefined\")] : [member.type];\n}\n\n/**\n * The value types a key of the composed type can have, read from its IR: the members of object\n * types, through unions and intersections. A reference (a `$ref`, `Omit`, `WithRequired`) or a raw\n * type is read with `PropertyValues`. Primitives, literals and arrays declare no keys.\n */\nfunction declaredValueTypes(type: IrType, request: SchemaRequest): IrType[] {\n switch (type.kind) {\n case \"object\":\n return type.members.flatMap(memberValueTypes);\n case \"union\":\n case \"intersection\":\n return type.types.flatMap((member) => declaredValueTypes(member, request));\n case \"reference\":\n case \"indexedAccess\":\n case \"raw\":\n request.context.footer.requirePropertyValues();\n return [irReference(HELPER_TYPES.propertyValues.name, [type])];\n case \"keyword\":\n case \"stringLiteral\":\n case \"numberLiteral\":\n case \"booleanLiteral\":\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return [];\n }\n}\n\n/**\n * The index signature object for `unevaluatedProperties`, given the composed type of the other\n * keywords (null when there is none). Null when the fix is off or the keyword does not apply.\n */\nexport function unevaluatedPropertiesType(\n schema: SchemaObject,\n composed: IrType | null,\n request: SchemaRequest,\n): IrType | null {\n const unevaluated = unevaluatedSchemaOf(schema, request);\n if (unevaluated === null) {\n return null;\n }\n const valueTypes = isAnySchema(unevaluated)\n ? [UNKNOWN_TYPE]\n : [\n request.transformNested(unevaluated, request.location, true),\n ...(composed === null ? [] : declaredValueTypes(composed, request)),\n ];\n const { immutable } = request.context.options;\n return irObject([irStringIndexSignature(\"key\", unionOf(valueTypes), immutable)]);\n}\n"],"names":[],"mappings":";;;;;;AA+BA,SAAS,mBAAA,CAAoB,QAAsB,OAAA,EAAuC;AACxF,EAAA,MAAM,EAAE,uBAAsB,GAAI,MAAA;AAClC,EAAA,IACE,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAI,SAAA,CAAU,sBAAsB,CAAA,IACnE,0BAA0B,MAAA,IAC1B,qBAAA,KAA0B,KAAA,IAC1B,MAAA,CAAO,yBAAyB,MAAA,EAChC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,IAAA,KAAS,WAAW,qBAAA,GAAwB,IAAA;AACzF;AAEA,SAAS,YAAY,MAAA,EAAyB;AAC5C,EAAA,OAAO,MAAA,KAAW,QAAS,OAAO,MAAA,KAAW,YAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC1F;AAEA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,IAAA,EAAM,SAAA,CAAU,WAAW,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,IAAI,CAAA;AACjF;AAOA,SAAS,kBAAA,CAAmB,MAAc,OAAA,EAAkC;AAC1E,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAC,WAAW,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IAC3E,KAAK,WAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,qBAAA,EAAsB;AAC7C,MAAA,OAAO,CAAC,YAAY,YAAA,CAAa,cAAA,CAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/D,KAAK,SAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA;AACvD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,WAAA,CAAY,WAAW,CAAA,GACtC,CAAC,YAAY,CAAA,GACb;AAAA,IACE,OAAA,CAAQ,eAAA,CAAgB,WAAA,EAAa,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IAC3D,GAAI,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,kBAAA,CAAmB,UAAU,OAAO;AAAA,GACnE;AACJ,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AACtC,EAAA,OAAO,QAAA,CAAS,CAAC,sBAAA,CAAuB,KAAA,EAAO,QAAQ,UAAU,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA;AACjF;;"}
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ const LINE_BREAK_RE = /\r?\n/g;
4
+ const CONTINUATION = "\n * ";
5
+ const COMMENT_END_RE = /\*\//g;
6
+ const VALUE_TAGS = ["description", "default", "example"];
7
+ const TAGS_KEEPING_EMPTY_STRING = /* @__PURE__ */ new Set(["default", "example"]);
8
+ const JSON_INDENT = 2;
9
+ function formatValue(value) {
10
+ const text = typeof value === "object" ? JSON.stringify(value, null, JSON_INDENT) : value;
11
+ return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);
12
+ }
13
+ function plainLines(schema) {
14
+ const lines = [];
15
+ for (const text of [schema.title, schema.summary]) {
16
+ if (typeof text === "string" && text) {
17
+ lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));
18
+ }
19
+ }
20
+ if (schema.format) {
21
+ lines.push(`Format: ${schema.format}`);
22
+ }
23
+ if (schema.deprecated) {
24
+ lines.push("@deprecated");
25
+ }
26
+ return lines;
27
+ }
28
+ function valueTagLines(schema) {
29
+ const lines = [];
30
+ for (const tag of VALUE_TAGS) {
31
+ const value = schema[tag];
32
+ if (value === void 0 || value === "" && !TAGS_KEEPING_EMPTY_STRING.has(tag)) {
33
+ continue;
34
+ }
35
+ lines.push(`@${tag} ${formatValue(value)}`);
36
+ }
37
+ if (Array.isArray(schema.examples)) {
38
+ lines.push(...schema.examples.map((example) => `@example ${formatValue(example)}`));
39
+ }
40
+ return lines;
41
+ }
42
+ function enumTypeName(schema) {
43
+ if (Array.isArray(schema.type)) {
44
+ return schema.type.join("|");
45
+ }
46
+ return typeof schema.type === "string" ? schema.type : "unknown";
47
+ }
48
+ function constantAndEnumLines(schema) {
49
+ const lines = [];
50
+ if ("const" in schema) {
51
+ lines.push("@constant");
52
+ }
53
+ if (schema.enum) {
54
+ lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? "|null" : ""}}`);
55
+ }
56
+ return lines;
57
+ }
58
+ function schemaComment(schema) {
59
+ if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
60
+ return null;
61
+ }
62
+ const annotated = schema;
63
+ const lines = [
64
+ ...plainLines(annotated),
65
+ ...valueTagLines(annotated),
66
+ ...constantAndEnumLines(annotated)
67
+ ];
68
+ if (lines.length === 0) {
69
+ return null;
70
+ }
71
+ const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes("\n"));
72
+ const text = isSingleLine ? `* ${lines.join("\n")} ` : `*
73
+ * ${lines.join("\n * ")}
74
+ `;
75
+ return { kind: "block", text: text.replace(COMMENT_END_RE, "*\\/") };
76
+ }
77
+ function withSchemaComment(property, schema) {
78
+ const comment = schemaComment(schema);
79
+ return comment === null ? property : { ...property, comments: [...property.comments, comment] };
80
+ }
81
+
82
+ exports.schemaComment = schemaComment;
83
+ exports.withSchemaComment = withSchemaComment;
84
+ //# sourceMappingURL=schema-comment.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-comment.cjs","sources":["../../../src/application/transform/schema-comment.ts"],"sourcesContent":["import type { IrComment, IrPropertySignature } from \"../../domain/ir/nodes.js\";\n\n/** Schema fields that produce JSDoc lines (the original `AnnotatedSchemaObject`). */\nexport interface AnnotatedSchema {\n readonly const?: unknown;\n readonly default?: unknown;\n readonly deprecated?: boolean;\n readonly description?: string;\n readonly enum?: unknown[];\n readonly example?: unknown;\n readonly examples?: unknown;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly summary?: string;\n readonly title?: string;\n readonly type?: string | string[];\n}\n\nconst LINE_BREAK_RE = /\\r?\\n/g;\n/** Continuation lines of a multi-line value are indented under the tag. */\nconst CONTINUATION = \"\\n * \";\nconst COMMENT_END_RE = /\\*\\//g;\n/** Tags written as `@tag value`; an empty string is kept only where it is a meaningful value. */\nconst VALUE_TAGS = [\"description\", \"default\", \"example\"] as const;\nconst TAGS_KEEPING_EMPTY_STRING: ReadonlySet<string> = new Set([\"default\", \"example\"]);\nconst JSON_INDENT = 2;\n\nfunction formatValue(value: unknown): string {\n const text = typeof value === \"object\" ? JSON.stringify(value, null, JSON_INDENT) : value;\n return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);\n}\n\nfunction plainLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const text of [schema.title, schema.summary]) {\n // The document is not validated against the schema dialect: a property named `summary`\n // written without `properties:` makes `summary` an object (upstream #2349).\n if (typeof text === \"string\" && text) {\n lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));\n }\n }\n if (schema.format) {\n lines.push(`Format: ${schema.format}`);\n }\n if (schema.deprecated) {\n lines.push(\"@deprecated\");\n }\n return lines;\n}\n\nfunction valueTagLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const tag of VALUE_TAGS) {\n const value = schema[tag];\n if (value === undefined || (value === \"\" && !TAGS_KEEPING_EMPTY_STRING.has(tag))) {\n continue;\n }\n lines.push(`@${tag} ${formatValue(value)}`);\n }\n if (Array.isArray(schema.examples)) {\n lines.push(...schema.examples.map((example: unknown) => `@example ${formatValue(example)}`));\n }\n return lines;\n}\n\nfunction enumTypeName(schema: AnnotatedSchema): string {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\"|\");\n }\n return typeof schema.type === \"string\" ? schema.type : \"unknown\";\n}\n\nfunction constantAndEnumLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n if (\"const\" in schema) {\n lines.push(\"@constant\");\n }\n if (schema.enum) {\n lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? \"|null\" : \"\"}}`);\n }\n return lines;\n}\n\n/**\n * The JSDoc comment the original writes for a schema (`addJSDocComment`): title, summary and\n * format, then `@deprecated`, `@description`, `@default`, `@example`, `@constant` and `@enum`\n * tags. One short line stays on the `/**` line; anything else is a block. Returns null when there\n * is nothing to say, or when the value is not a schema object.\n */\nexport function schemaComment(schema: unknown): IrComment | null {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return null;\n }\n const annotated = schema as AnnotatedSchema;\n const lines = [\n ...plainLines(annotated),\n ...valueTagLines(annotated),\n ...constantAndEnumLines(annotated),\n ];\n if (lines.length === 0) {\n return null;\n }\n const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes(\"\\n\"));\n const text = isSingleLine ? `* ${lines.join(\"\\n\")} ` : `*\\n * ${lines.join(\"\\n * \")}\\n `;\n // A `*/` inside a value would end the comment early.\n return { kind: \"block\", text: text.replace(COMMENT_END_RE, \"*\\\\/\") };\n}\n\n/** The property with the schema's JSDoc added after the comments it already has. */\nexport function withSchemaComment(\n property: IrPropertySignature,\n schema: unknown,\n): IrPropertySignature {\n const comment = schemaComment(schema);\n return comment === null ? property : { ...property, comments: [...property.comments, comment] };\n}\n"],"names":[],"mappings":"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"}