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,62 @@
1
+ import type { IrDeclaration, IrMember, IrType } from "../../domain/ir/nodes.js";
2
+ import { writeDeclaration } from "./declaration-printer.js";
3
+ import { DEFAULT_PRINT_OPTIONS, type PrintOptions } from "./print-options.js";
4
+ import { TextWriter } from "./text-writer.js";
5
+ import { writeMember, writeType } from "./type-printer.js";
6
+
7
+ /**
8
+ * Print declarations as a TypeScript file body: one declaration per line, a line break at the end,
9
+ * and nothing for an empty list. Pure and deterministic (ENGINEERING_PLAN §4.3).
10
+ */
11
+ export function printNodes(
12
+ declarations: readonly IrDeclaration[],
13
+ options: PrintOptions = DEFAULT_PRINT_OPTIONS,
14
+ ): string {
15
+ const writer = new TextWriter(options);
16
+ for (const declaration of declarations) {
17
+ writeDeclaration(writer, declaration);
18
+ }
19
+ writer.writeLine();
20
+ return writer.text;
21
+ }
22
+
23
+ /** Anything the IR printer can print at the top level of a file. */
24
+ export type IrPrintable = IrDeclaration | IrMember | IrType;
25
+
26
+ const DECLARATION_KINDS: ReadonlySet<string> = new Set<IrDeclaration["kind"]>([
27
+ "interface",
28
+ "typeAlias",
29
+ "enum",
30
+ "constArray",
31
+ "rawDeclaration",
32
+ ]);
33
+ const MEMBER_KINDS: ReadonlySet<string> = new Set<IrMember["kind"]>(["property", "indexSignature"]);
34
+
35
+ function writePrintable(writer: TextWriter, node: IrPrintable): void {
36
+ if (DECLARATION_KINDS.has(node.kind)) {
37
+ writeDeclaration(writer, node as IrDeclaration);
38
+ return;
39
+ }
40
+ writer.writeLine();
41
+ if (MEMBER_KINDS.has(node.kind)) {
42
+ writeMember(writer, node as IrMember);
43
+ } else {
44
+ writeType(writer, node as IrType);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Print declarations, members or types, one per line, as the TypeScript printer prints such nodes
50
+ * placed in a file (the original `astToString` accepted any node).
51
+ */
52
+ export function printFragments(
53
+ nodes: readonly IrPrintable[],
54
+ options: PrintOptions = DEFAULT_PRINT_OPTIONS,
55
+ ): string {
56
+ const writer = new TextWriter(options);
57
+ for (const node of nodes) {
58
+ writePrintable(writer, node);
59
+ }
60
+ writer.writeLine();
61
+ return writer.text;
62
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Formatting rules of the printer as data (ENGINEERING_PLAN §4.3). The defaults reproduce the
3
+ * TypeScript printer that the original generator used: 4-space indentation and LF line endings.
4
+ */
5
+ export interface PrintOptions {
6
+ /** Columns per indentation level; also the tab width used when re-indenting comment lines. */
7
+ readonly indentSize: number;
8
+ readonly newLine: string;
9
+ }
10
+
11
+ export const DEFAULT_PRINT_OPTIONS: PrintOptions = { indentSize: 4, newLine: "\n" };
@@ -0,0 +1,83 @@
1
+ import type { PrintOptions } from "./print-options.js";
2
+
3
+ const LINE_FEED = 0x0a;
4
+ const CARRIAGE_RETURN = 0x0d;
5
+ const LINE_SEPARATOR = 0x2028;
6
+ const PARAGRAPH_SEPARATOR = 0x2029;
7
+
8
+ /** Line breaks as the TypeScript scanner defines them (`isLineBreak`). */
9
+ export function isLineBreak(code: number): boolean {
10
+ return (
11
+ code === LINE_FEED ||
12
+ code === CARRIAGE_RETURN ||
13
+ code === LINE_SEPARATOR ||
14
+ code === PARAGRAPH_SEPARATOR
15
+ );
16
+ }
17
+
18
+ /**
19
+ * Output buffer with indentation, modeled on the TypeScript printer's text writer: `write` indents
20
+ * text that starts a line, `rawWrite` never does, and `writeLine` does nothing at the start of a
21
+ * line. Matching these rules is what makes comment re-indentation byte-identical to the original.
22
+ */
23
+ export class TextWriter {
24
+ readonly #options: PrintOptions;
25
+ #output = "";
26
+ #indent = 0;
27
+ #isAtLineStart = true;
28
+
29
+ constructor(options: PrintOptions) {
30
+ this.#options = options;
31
+ }
32
+
33
+ get indent(): number {
34
+ return this.#indent;
35
+ }
36
+
37
+ get options(): PrintOptions {
38
+ return this.#options;
39
+ }
40
+
41
+ get text(): string {
42
+ return this.#output;
43
+ }
44
+
45
+ increaseIndent(): void {
46
+ this.#indent++;
47
+ }
48
+
49
+ decreaseIndent(): void {
50
+ this.#indent--;
51
+ }
52
+
53
+ /** Write text, indenting it first when it starts a line. */
54
+ write(text: string): void {
55
+ if (text.length === 0) {
56
+ return;
57
+ }
58
+ const prefix = this.#isAtLineStart ? this.indentString(this.#indent) : "";
59
+ this.rawWrite(prefix + text);
60
+ }
61
+
62
+ /** Write text exactly as given. */
63
+ rawWrite(text: string): void {
64
+ this.#output += text;
65
+ this.#updateLineStart(text);
66
+ }
67
+
68
+ /** End the current line; does nothing when nothing has been written on it yet. */
69
+ writeLine(): void {
70
+ if (!this.#isAtLineStart) {
71
+ this.rawWrite(this.#options.newLine);
72
+ }
73
+ }
74
+
75
+ indentString(level: number): string {
76
+ return " ".repeat(level * this.#options.indentSize);
77
+ }
78
+
79
+ // Like TypeScript: any write leaves the writer mid-line unless the text ends with a line break.
80
+ #updateLineStart(text: string): void {
81
+ this.#isAtLineStart = text.length > 0 && isLineBreak(text.charCodeAt(text.length - 1));
82
+ }
83
+ }
@@ -0,0 +1,281 @@
1
+ import { assertNever } from "../../domain/assert-never.js";
2
+ import type {
3
+ IrIndexedAccessType,
4
+ IrMember,
5
+ IrPropertyName,
6
+ IrRawType,
7
+ IrTupleElement,
8
+ IrType,
9
+ } from "../../domain/ir/nodes.js";
10
+ import { writeLeadingComment } from "./comment-writer.js";
11
+ import { printEscapedString, printNumberLiteral, printStringLiteral } from "./literal-text.js";
12
+ import type { TextWriter } from "./text-writer.js";
13
+
14
+ /**
15
+ * Parenthesization contexts. Each predicate says when a child type needs parentheses; together they
16
+ * reproduce the TypeScript factory's parenthesizer rules for the node kinds of the IR, so output
17
+ * matches the original even when unions are nested (`A | (B | C)`).
18
+ */
19
+ const isUnionOrIntersection = (type: IrType): boolean =>
20
+ type.kind === "union" || type.kind === "intersection";
21
+ /** Union and intersection members (`parenthesizeConstituentTypeOf{Union,Intersection}Type`). */
22
+ const needsParensAsConstituent = isUnionOrIntersection;
23
+ /** Array element and indexed-access object (`parenthesizeNonArrayTypeOfPostfixType`). */
24
+ const needsParensAsPostfixOperand = (type: IrType): boolean =>
25
+ type.kind === "readonly" || isUnionOrIntersection(type);
26
+ /** Operand of `readonly` (`parenthesizeOperandOfReadonlyTypeOperator`). */
27
+ const needsParensAsReadonlyOperand = needsParensAsPostfixOperand;
28
+
29
+ function writeTypeIn(
30
+ writer: TextWriter,
31
+ type: IrType,
32
+ needsParens: (type: IrType) => boolean,
33
+ ): void {
34
+ if (!needsParens(type)) {
35
+ writeType(writer, type);
36
+ return;
37
+ }
38
+ writer.write("(");
39
+ writeType(writer, type);
40
+ writer.write(")");
41
+ }
42
+
43
+ /** Write a single-line list: `separator` between items, nothing for an empty list. */
44
+ function writeInlineList<T>(
45
+ writer: TextWriter,
46
+ items: readonly T[],
47
+ separator: string,
48
+ writeItem: (item: T) => void,
49
+ ) {
50
+ items.forEach((item, index) => {
51
+ if (index > 0) {
52
+ writer.write(separator);
53
+ }
54
+ writeItem(item);
55
+ });
56
+ }
57
+
58
+ /**
59
+ * Write a multi-line list the way the TypeScript printer does: a line break after the opening
60
+ * token, one item per indented line, `delimiter` after every item but the last, and a line break
61
+ * before the closing token. An empty list prints the line break only when `isLineBreakWhenEmpty`
62
+ * (interfaces, enums and tuples do; object type literals print `{}`).
63
+ */
64
+ export function writeMultiLineList<T>(
65
+ writer: TextWriter,
66
+ items: readonly T[],
67
+ format: { readonly delimiter: string; readonly isLineBreakWhenEmpty: boolean },
68
+ writeItem: (item: T) => void,
69
+ ): void {
70
+ if (items.length === 0) {
71
+ if (format.isLineBreakWhenEmpty) {
72
+ writer.writeLine();
73
+ }
74
+ return;
75
+ }
76
+ writer.writeLine();
77
+ writer.increaseIndent();
78
+ items.forEach((item, index) => {
79
+ if (index > 0) {
80
+ writer.write(format.delimiter);
81
+ writer.writeLine();
82
+ }
83
+ writeItem(item);
84
+ });
85
+ writer.decreaseIndent();
86
+ writer.writeLine();
87
+ }
88
+
89
+ function writePropertyName(writer: TextWriter, name: IrPropertyName): void {
90
+ switch (name.kind) {
91
+ case "identifier":
92
+ case "number":
93
+ writer.write(name.text);
94
+ break;
95
+ case "string":
96
+ writer.write(printEscapedString(name.value));
97
+ break;
98
+ default:
99
+ assertNever(name);
100
+ }
101
+ }
102
+
103
+ /**
104
+ * `[name: type]`. TypeScript prints index signature parameters as an indented list, so a multi-line
105
+ * parameter type (an object or tuple) is indented one level deeper than the member.
106
+ */
107
+ function writeIndexSignatureParameter(writer: TextWriter, name: string, type: IrType): void {
108
+ writer.write(`[${name}: `);
109
+ writer.increaseIndent();
110
+ writeType(writer, type);
111
+ writer.decreaseIndent();
112
+ writer.write("]");
113
+ }
114
+
115
+ /** Write one member of an interface or object type, with its comment and trailing semicolon. */
116
+ export function writeMember(writer: TextWriter, member: IrMember): void {
117
+ for (const comment of member.comments) {
118
+ writeLeadingComment(writer, comment);
119
+ }
120
+ if (member.isReadonly) {
121
+ writer.write("readonly ");
122
+ }
123
+ if (member.kind === "property") {
124
+ writePropertyName(writer, member.name);
125
+ writer.write(member.isOptional ? "?: " : ": ");
126
+ } else {
127
+ writeIndexSignatureParameter(writer, member.parameterName, member.parameterType);
128
+ writer.write(": ");
129
+ }
130
+ writeType(writer, member.type);
131
+ writer.write(";");
132
+ }
133
+
134
+ function writeTupleElement(writer: TextWriter, element: IrTupleElement): void {
135
+ if (element.isRest) {
136
+ writer.write("...");
137
+ }
138
+ writeType(writer, element.type);
139
+ }
140
+
141
+ function writeObjectType(writer: TextWriter, members: readonly IrMember[]): void {
142
+ writer.write("{");
143
+ writeMultiLineList(writer, members, { delimiter: "", isLineBreakWhenEmpty: false }, (member) =>
144
+ writeMember(writer, member),
145
+ );
146
+ writer.write("}");
147
+ }
148
+
149
+ function writeTupleType(writer: TextWriter, elements: readonly IrTupleElement[]): void {
150
+ writer.write("[");
151
+ writeMultiLineList(writer, elements, { delimiter: ",", isLineBreakWhenEmpty: true }, (element) =>
152
+ writeTupleElement(writer, element),
153
+ );
154
+ writer.write("]");
155
+ }
156
+
157
+ function writeReferenceType(
158
+ writer: TextWriter,
159
+ name: string,
160
+ typeArguments: readonly IrType[],
161
+ ): void {
162
+ writer.write(name);
163
+ if (typeArguments.length > 0) {
164
+ writer.write("<");
165
+ writeInlineList(writer, typeArguments, ", ", (argument) => writeType(writer, argument));
166
+ writer.write(">");
167
+ }
168
+ }
169
+
170
+ function writeIndexedAccessType(writer: TextWriter, type: IrIndexedAccessType): void {
171
+ writeTypeIn(writer, type.object, needsParensAsPostfixOperand);
172
+ writer.write("[");
173
+ writeType(writer, type.index);
174
+ writer.write("]");
175
+ }
176
+
177
+ function writeConstituents(writer: TextWriter, types: readonly IrType[], separator: string): void {
178
+ writeInlineList(writer, types, separator, (member) =>
179
+ writeTypeIn(writer, member, needsParensAsConstituent),
180
+ );
181
+ }
182
+
183
+ type IrLeafType = Extract<
184
+ IrType,
185
+ { kind: "keyword" | "stringLiteral" | "numberLiteral" | "booleanLiteral" }
186
+ >;
187
+
188
+ function printLeafType(type: IrLeafType): string {
189
+ switch (type.kind) {
190
+ case "keyword":
191
+ return type.keyword;
192
+ case "stringLiteral":
193
+ return printStringLiteral(type.value, type.encoding);
194
+ case "numberLiteral":
195
+ return printNumberLiteral(type.value);
196
+ case "booleanLiteral":
197
+ return String(type.value);
198
+ default:
199
+ return assertNever(type);
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Raw text is printed as if it started at column 0, so its continuation lines get the current
205
+ * indentation, as the TypeScript printer indents a nested node.
206
+ */
207
+ function writeRawType(writer: TextWriter, text: string): void {
208
+ text.split("\n").forEach((line, index) => {
209
+ if (index > 0) {
210
+ writer.rawWrite(writer.options.newLine);
211
+ }
212
+ writer.write(line);
213
+ });
214
+ }
215
+
216
+ function writeArrayType(writer: TextWriter, element: IrType): void {
217
+ writeTypeIn(writer, element, needsParensAsPostfixOperand);
218
+ writer.write("[]");
219
+ }
220
+
221
+ function writeReadonlyType(writer: TextWriter, operand: IrType): void {
222
+ writer.write("readonly ");
223
+ writeTypeIn(writer, operand, needsParensAsReadonlyOperand);
224
+ }
225
+
226
+ type IrOperatorType = Extract<IrType, { kind: "array" | "indexedAccess" | "readonly" }>;
227
+
228
+ /** Types built with a type operator: `T[]`, `T[K]` and `readonly T`. */
229
+ function writeOperatorType(writer: TextWriter, type: IrOperatorType): void {
230
+ if (type.kind === "array") {
231
+ writeArrayType(writer, type.element);
232
+ } else if (type.kind === "indexedAccess") {
233
+ writeIndexedAccessType(writer, type);
234
+ } else {
235
+ writeReadonlyType(writer, type.type);
236
+ }
237
+ }
238
+
239
+ const CONSTITUENT_SEPARATORS = { union: " | ", intersection: " & " } as const;
240
+
241
+ /** A raw type may span lines and is re-indented; any other leaf prints on one line. */
242
+ function writeLeafType(writer: TextWriter, type: IrLeafType | IrRawType): void {
243
+ if (type.kind === "raw") {
244
+ writeRawType(writer, type.text);
245
+ } else {
246
+ writer.write(printLeafType(type));
247
+ }
248
+ }
249
+
250
+ /** Write a type at the writer's current position. */
251
+ export function writeType(writer: TextWriter, type: IrType): void {
252
+ switch (type.kind) {
253
+ case "keyword":
254
+ case "stringLiteral":
255
+ case "numberLiteral":
256
+ case "booleanLiteral":
257
+ case "raw":
258
+ writeLeafType(writer, type);
259
+ break;
260
+ case "reference":
261
+ writeReferenceType(writer, type.name, type.typeArguments);
262
+ break;
263
+ case "array":
264
+ case "indexedAccess":
265
+ case "readonly":
266
+ writeOperatorType(writer, type);
267
+ break;
268
+ case "union":
269
+ case "intersection":
270
+ writeConstituents(writer, type.types, CONSTITUENT_SEPARATORS[type.kind]);
271
+ break;
272
+ case "object":
273
+ writeObjectType(writer, type.members);
274
+ break;
275
+ case "tuple":
276
+ writeTupleType(writer, type.elements);
277
+ break;
278
+ default:
279
+ assertNever(type);
280
+ }
281
+ }
@@ -0,0 +1,54 @@
1
+ import { ERROR_CODES, OpenAPITypesafeError } from "../domain/errors.js";
2
+
3
+ /**
4
+ * Deeply nested schemas (ENGINEERING_PLAN 8.5). Loading, bundling, transforming and printing walk
5
+ * schemas recursively, and Redocly follows each `$ref` inside the walk. On the default Node.js
6
+ * stack, about 550 levels of inline schemas or a chain of about 900 `$ref`s (each schema refers to
7
+ * the next) run out of call stack. Real documents stay far below: every YAML or JSON file goes
8
+ * through the YAML parser, which stops at 100 levels, and the whole corpus passes. The overflow is
9
+ * reported as a typed error instead of a `RangeError` with a stack trace.
10
+ */
11
+
12
+ /** The step that ran out of call stack; named in the message and the details. */
13
+ export type DeepSchemaStep = "load" | "transform" | "print";
14
+
15
+ /** V8 and JavaScriptCore (Node.js, Deno, Bun) throw a `RangeError` with this message. */
16
+ const STACK_OVERFLOW_MESSAGE = /maximum call stack size exceeded/i;
17
+
18
+ /** Whether a thrown value is a call stack overflow. */
19
+ export function isStackOverflowError(error: unknown): boolean {
20
+ return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);
21
+ }
22
+
23
+ /** The typed error for a document nested too deeply for the call stack. */
24
+ export function schemaTooDeepError(step: DeepSchemaStep, cause: unknown): OpenAPITypesafeError {
25
+ return new OpenAPITypesafeError({
26
+ code: ERROR_CODES.SCHEMA_TOO_DEEP,
27
+ message:
28
+ `The schema is nested too deeply to ${step}: the call stack ran out. Both inline ` +
29
+ "schemas and chains of $ref (each schema referring to the next) count; shorten the deepest.",
30
+ details: { step },
31
+ cause,
32
+ });
33
+ }
34
+
35
+ /** Run a step and report a stack overflow in it as SCHEMA_TOO_DEEP; other errors pass through. */
36
+ export function withStackOverflowReported<T>(step: DeepSchemaStep, run: () => T): T {
37
+ try {
38
+ return run();
39
+ } catch (error) {
40
+ throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;
41
+ }
42
+ }
43
+
44
+ /** The asynchronous form of `withStackOverflowReported`. */
45
+ export async function withStackOverflowReportedAsync<T>(
46
+ step: DeepSchemaStep,
47
+ run: () => Promise<T>,
48
+ ): Promise<T> {
49
+ try {
50
+ return await run();
51
+ } catch (error) {
52
+ throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;
53
+ }
54
+ }
@@ -0,0 +1,189 @@
1
+ import { irKeyword, irObject, irProperty } from "../../../domain/ir/constructors.js";
2
+ import {
3
+ hasIdentifierStart,
4
+ isReservedTypeName,
5
+ withIdentifierParts,
6
+ } from "../../../domain/ir/identifier-text.js";
7
+ import type {
8
+ IrPropertySignature,
9
+ IrType,
10
+ IrTypeAliasDeclaration,
11
+ } from "../../../domain/ir/nodes.js";
12
+ import { toPropertyName } from "../../../domain/ir/property-name.js";
13
+ import {
14
+ COMPONENT_KINDS,
15
+ type ComponentKind,
16
+ type ComponentsObject,
17
+ DECLARED_COMPONENT_KINDS,
18
+ isEnumSchema,
19
+ singularizeComponentKind,
20
+ } from "../../../domain/openapi/components-object.js";
21
+ import { createRef } from "../../../domain/openapi/json-pointer.js";
22
+ import { OutputFix } from "../../../domain/output-fixes.js";
23
+ import { type DeprecatedEntryFilter, documentEntries } from "../document-entries.js";
24
+ import type { SchemaLocation } from "../schema/schema-context.js";
25
+ import { transformSchema } from "../schema/schema-transform.js";
26
+ import { withSchemaComment } from "../schema-comment.js";
27
+ import type { TransformContext } from "../transform-context.js";
28
+ import { headerType } from "./header.js";
29
+ import { contentEntryType } from "./media-type.js";
30
+ import { parameterType } from "./parameter.js";
31
+ import { pathItemType } from "./path-item.js";
32
+ import { requestBodyType } from "./request-body.js";
33
+ import { responseType } from "./response.js";
34
+ import { numberDisplacedAliases, rootTypeAlias } from "./root-type-aliases.js";
35
+
36
+ type ComponentTransform = (
37
+ item: never,
38
+ location: SchemaLocation,
39
+ context: TransformContext,
40
+ ) => IrType;
41
+
42
+ const COMPONENT_TRANSFORMS: Readonly<Record<ComponentKind, ComponentTransform>> = {
43
+ schemas: transformSchema,
44
+ responses: responseType,
45
+ parameters: parameterType,
46
+ requestBodies: requestBodyType,
47
+ headers: headerType,
48
+ pathItems: pathItemType,
49
+ mediaTypes: contentEntryType,
50
+ };
51
+
52
+ /** The `components` type and the `--root-types` aliases. */
53
+ export interface ComponentsResult {
54
+ readonly type: IrType;
55
+ readonly rootTypes: readonly IrTypeAliasDeclaration[];
56
+ }
57
+
58
+ /** One component; the `transform` callback may replace its type, as for nested schemas. */
59
+ function componentMember(
60
+ kind: ComponentKind,
61
+ name: string,
62
+ item: unknown,
63
+ context: TransformContext,
64
+ ): IrPropertySignature {
65
+ const location = { path: createRef(["components", kind, name]), schema: item };
66
+ const type = COMPONENT_TRANSFORMS[kind](item as never, location, context);
67
+ const custom = context.callbacks.transform(item, location);
68
+ const property = irProperty(toPropertyName(name), custom?.type ?? type, {
69
+ isOptional: custom?.isOptional ?? false,
70
+ isReadonly: context.options.immutable,
71
+ });
72
+ return withSchemaComment(property, item);
73
+ }
74
+
75
+ /**
76
+ * The root alias name: `SchemaPet`, `ResponseNotFound`, … A taken name gets `_2`, `_3`, … The
77
+ * original checks for conflicts before it removes the schema prefix, and so does this; for a clash
78
+ * of exported names see `addRootAlias`.
79
+ *
80
+ * The original could build a name that is no identifier, so the generated file did not parse
81
+ * (research/legacy-bugs.md, item 16): a kept casing keeps spaces and symbols, which become `_`;
82
+ * and a name without the prefix can start with a digit, so it keeps the prefix (`Schema1`). A
83
+ * kept casing without the prefix can also give a reserved name (`void`, `class`), which keeps the
84
+ * prefix too (`Schemavoid`).
85
+ */
86
+ function rootTypeName(
87
+ kind: ComponentKind,
88
+ name: string,
89
+ aliases: Readonly<Record<string, IrTypeAliasDeclaration>>,
90
+ context: TransformContext,
91
+ ): string {
92
+ const { options, casing } = context;
93
+ const prefix = casing.pascalCase(singularizeComponentKind(kind));
94
+ const isSchema = kind === "schemas";
95
+ const base = withIdentifierParts(
96
+ options.rootTypesKeepCasing && isSchema ? name : casing.pascalCase(name),
97
+ );
98
+ const exportedName = (alias: string): string => {
99
+ const unprefixed = alias.replace(prefix, "");
100
+ const isUnprefixed = options.rootTypesNoSchemaPrefix && isSchema;
101
+ const isTypeName = hasIdentifierStart(unprefixed) && !isReservedTypeName(unprefixed);
102
+ return isUnprefixed && isTypeName ? unprefixed : alias;
103
+ };
104
+ let alias = `${prefix}${base}`;
105
+ for (let counter = 2; aliases[alias] !== undefined; counter++) {
106
+ alias = `${prefix}${base}_${counter}`;
107
+ }
108
+ return exportedName(alias);
109
+ }
110
+
111
+ /**
112
+ * Add a root alias. When its exported name is taken (two schemas of one PascalCase name without
113
+ * the prefix), the later schema takes the name, as in the original. Without the
114
+ * `root-type-numbering` fix the earlier one then has no alias: that output is valid, so a number
115
+ * for it would change it (backlog 30). With the fix the earlier alias is kept aside and numbered
116
+ * at the end.
117
+ */
118
+ function addRootAlias(request: ComponentsRequest, alias: IrTypeAliasDeclaration): void {
119
+ const { aliases, displaced } = request;
120
+ const previous = aliases[alias.name];
121
+ if (previous !== undefined && displaced !== null) {
122
+ displaced.push(previous);
123
+ }
124
+ aliases[alias.name] = alias;
125
+ }
126
+
127
+ /** `--root-types` skips enum schemas under `--enum`: the enum itself is exported. */
128
+ function hasRootType(kind: ComponentKind, item: unknown, context: TransformContext): boolean {
129
+ const { options } = context;
130
+ return options.rootTypes && !(options.enum && kind === "schemas" && isEnumSchema(item));
131
+ }
132
+
133
+ /** The components of one run, and the deprecated ones that kept output still references. */
134
+ interface ComponentsRequest {
135
+ readonly components: ComponentsObject;
136
+ readonly isKept: DeprecatedEntryFilter;
137
+ readonly aliases: Record<string, IrTypeAliasDeclaration>;
138
+ /** With the `root-type-numbering` fix: the aliases a later schema took the name of, in order. */
139
+ readonly displaced: IrTypeAliasDeclaration[] | null;
140
+ }
141
+
142
+ function kindMember(
143
+ kind: ComponentKind,
144
+ request: ComponentsRequest,
145
+ context: TransformContext,
146
+ ): IrPropertySignature {
147
+ const { components, isKept, aliases } = request;
148
+ const startedAt = context.diagnostics.now();
149
+ const items: IrPropertySignature[] = [];
150
+ for (const [name, item] of documentEntries(components[kind] ?? {}, context.options, isKept)) {
151
+ items.push(componentMember(kind, name, item, context));
152
+ if (hasRootType(kind, item, context)) {
153
+ addRootAlias(request, rootTypeAlias(rootTypeName(kind, name, aliases, context), kind, name));
154
+ }
155
+ }
156
+ const type = items.length > 0 ? irObject(items) : irKeyword("never");
157
+ context.diagnostics.debug(
158
+ `Transformed components → ${kind}`,
159
+ context.diagnostics.now() - startedAt,
160
+ );
161
+ return irProperty(toPropertyName(kind), type);
162
+ }
163
+
164
+ /**
165
+ * The `components` interface body (OpenAPI 3.1 §4.8.7), one member per component kind. With
166
+ * `--exclude-deprecated`, `kept` holds the deprecated components that kept output references
167
+ * (`keptDeprecatedComponents`); they stay, so no reference names a missing key.
168
+ */
169
+ export function componentsType(
170
+ components: ComponentsObject,
171
+ context: TransformContext,
172
+ kept: ReadonlySet<object> = new Set(),
173
+ ): ComponentsResult {
174
+ // A plain object, as in the original: its key order (integer-like names first) is the
175
+ // output order.
176
+ const aliases: Record<string, IrTypeAliasDeclaration> = {};
177
+ const displaced = context.options.fixes.has(OutputFix.ROOT_TYPE_NUMBERING) ? [] : null;
178
+ const isKept = (item: unknown) => kept.has(item as object);
179
+ const request = { components, isKept, aliases, displaced };
180
+ const declaredKinds = DECLARED_COMPONENT_KINDS.filter((kind) => components[kind] !== undefined);
181
+ const members = [...COMPONENT_KINDS, ...declaredKinds].map((kind) =>
182
+ kindMember(kind, request, context),
183
+ );
184
+ const rootTypes = Object.values(aliases);
185
+ return {
186
+ type: irObject(members),
187
+ rootTypes: [...rootTypes, ...numberDisplacedAliases(displaced ?? [], rootTypes)],
188
+ };
189
+ }