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,311 @@
1
+ import { toTypeNode, toValueExpression } from "../adapters/type-ast-bridge/ir-to-typescript.js";
2
+ import { lazyNode } from "../adapters/type-ast-bridge/lazy-node.js";
3
+ import { loadTypeScript } from "../adapters/type-ast-bridge/load-typescript.js";
4
+ import type { ts } from "../adapters/type-ast-bridge/typescript-types.js";
5
+ import {
6
+ enumMemberDescription,
7
+ quotedMemberName,
8
+ } from "../application/transform/footer/enum-naming.js";
9
+ import { HELPER_TYPES } from "../application/transform/helper-types.js";
10
+ import { schemaComment } from "../application/transform/schema-comment.js";
11
+ import type { IrType } from "../domain/ir/nodes.js";
12
+ import { declaresTypeAlias, type FooterEntry } from "./footer-entry.js";
13
+ import type { TypeInput } from "./type-helpers.js";
14
+
15
+ /**
16
+ * The original's helpers that build TypeScript compiler nodes, kept for 1.x and deprecated
17
+ * (ADR-004, decision 9). They load TypeScript on first use through the bridge; the generator
18
+ * itself does not use them.
19
+ */
20
+
21
+ export const JS_PROPERTY_INDEX_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/;
22
+ export const JS_ENUM_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+(.)?/g;
23
+ export const JS_PROPERTY_INDEX_INVALID_CHARS_RE = /[^A-Za-z_$0-9]+/g;
24
+ export const SPECIAL_CHARACTER_MAP: Record<string, string> = {
25
+ "+": "Plus",
26
+ // Add more mappings as needed
27
+ };
28
+
29
+ /**
30
+ * The `?` token. Created on first use, so importing the package needs no TypeScript.
31
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
32
+ */
33
+ export const QUESTION_TOKEN: ts.QuestionToken = lazyNode(() => {
34
+ const ts = loadTypeScript();
35
+ return ts.factory.createToken(ts.SyntaxKind.QuestionToken);
36
+ });
37
+
38
+ export interface AnnotatedSchemaObject {
39
+ const?: unknown; // jsdoc without value
40
+ default?: unknown; // jsdoc with value
41
+ deprecated?: boolean; // jsdoc without value
42
+ description?: string; // jsdoc with value
43
+ enum?: unknown[]; // jsdoc without value
44
+ example?: string; // jsdoc with value
45
+ examples?: unknown;
46
+ format?: string; // not jsdoc
47
+ nullable?: boolean; // Node information
48
+ summary?: string; // not jsdoc
49
+ title?: string; // not jsdoc
50
+ type?: string | string[]; // Type of node
51
+ }
52
+
53
+ /**
54
+ * Add the schema's JSDoc comment to a TypeScript property signature.
55
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
56
+ */
57
+ export function addJSDocComment(
58
+ schemaObject: AnnotatedSchemaObject,
59
+ node: ts.PropertySignature,
60
+ ): void {
61
+ const ts = loadTypeScript();
62
+ const comment = schemaComment(schemaObject);
63
+ if (comment) {
64
+ ts.addSyntheticLeadingComment(node, ts.SyntaxKind.MultiLineCommentTrivia, comment.text, true);
65
+ }
66
+ }
67
+
68
+ /** A type argument of the deprecated helpers as TypeScript; IR from type helpers is converted. */
69
+ function legacyTypeNode(type: TypeInput): ts.TypeNode {
70
+ const ts = loadTypeScript();
71
+ return typeof type.kind === "string" ? toTypeNode(ts, type as IrType) : (type as ts.TypeNode);
72
+ }
73
+
74
+ /** Add a helper type alias to the footer once, as a named raw declaration (like the generator). */
75
+ function requireHelper(injectFooter: FooterEntry[], helper: { name: string; text: string }): void {
76
+ if (!injectFooter.some((entry) => declaresTypeAlias(entry, helper.name))) {
77
+ injectFooter.push({ kind: "rawDeclaration", name: helper.name, text: helper.text });
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Deduplicate simple primitive types from an array of nodes
83
+ * Note: won’t deduplicate complex types like objects
84
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
85
+ */
86
+ export function tsDedupe(types: TypeInput[]): ts.TypeNode[] {
87
+ const encounteredTypes = new Set<number>();
88
+ const filteredTypes: ts.TypeNode[] = [];
89
+ for (const t of types.map(legacyTypeNode)) {
90
+ // only mark for deduplication if this is not a const ("text" means it is a const)
91
+ if (!("text" in ((t as ts.LiteralTypeNode).literal ?? t))) {
92
+ const { kind } = (t as ts.LiteralTypeNode).literal ?? t;
93
+ if (encounteredTypes.has(kind)) {
94
+ continue;
95
+ }
96
+ if (tsIsPrimitive(t)) {
97
+ encounteredTypes.add(kind);
98
+ }
99
+ }
100
+ filteredTypes.push(t);
101
+ }
102
+ return filteredTypes;
103
+ }
104
+
105
+ /** @deprecated The generator keeps its own enum registry per run; kept for 1.x (ADR-004). */
106
+ export const enumCache = new Map<string, ts.EnumDeclaration>();
107
+
108
+ /**
109
+ * Create a TS enum (with sanitized name and members)
110
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
111
+ */
112
+ export function tsEnum(
113
+ name: string,
114
+ members: (string | number)[],
115
+ metadata?: { name?: string; description?: string | null }[],
116
+ options?: { export?: boolean; shouldCache?: boolean },
117
+ ) {
118
+ const ts = loadTypeScript();
119
+ let enumName = sanitizeMemberName(name);
120
+ enumName = `${enumName.charAt(0).toUpperCase()}${enumName.substring(1)}`;
121
+ let key = "";
122
+ if (options?.shouldCache) {
123
+ key = `${members
124
+ .slice(0)
125
+ .sort()
126
+ .map((v, i) => {
127
+ return `${metadata?.[i]?.name ?? String(v)}:${metadata?.[i]?.description || ""}`;
128
+ })
129
+ .join(",")}`;
130
+ if (enumCache.has(key)) {
131
+ return enumCache.get(key) as ts.EnumDeclaration;
132
+ }
133
+ }
134
+ const enumDeclaration = ts.factory.createEnumDeclaration(
135
+ /* modifiers */ options ? tsModifiers({ export: options.export ?? false }) : undefined,
136
+ /* name */ enumName,
137
+ /* members */ members.map((value, i) => tsEnumMember(value, metadata?.[i])),
138
+ );
139
+ options?.shouldCache && enumCache.set(key, enumDeclaration);
140
+ return enumDeclaration;
141
+ }
142
+
143
+ /**
144
+ * Create an exported TS array literal expression
145
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
146
+ */
147
+ export function tsArrayLiteralExpression(
148
+ name: string,
149
+ elementType: TypeInput,
150
+ values: (string | number)[],
151
+ options?: { export?: boolean; readonly?: boolean; injectFooter?: FooterEntry[] },
152
+ ) {
153
+ const ts = loadTypeScript();
154
+ let variableName = sanitizeMemberName(name);
155
+ variableName = `${variableName.charAt(0).toLowerCase()}${variableName.substring(1)}`;
156
+
157
+ if (options?.injectFooter) {
158
+ requireHelper(options.injectFooter, HELPER_TYPES.flattenedDeepRequired);
159
+ }
160
+
161
+ const arrayType = options?.readonly
162
+ ? tsReadonlyArray(elementType, options.injectFooter)
163
+ : ts.factory.createArrayTypeNode(legacyTypeNode(elementType));
164
+
165
+ return ts.factory.createVariableStatement(
166
+ options ? tsModifiers({ export: options.export ?? false }) : undefined,
167
+ ts.factory.createVariableDeclarationList(
168
+ [
169
+ ts.factory.createVariableDeclaration(
170
+ variableName,
171
+ undefined,
172
+ arrayType,
173
+ ts.factory.createArrayLiteralExpression(
174
+ values.map((value) => toValueExpression(ts, value)),
175
+ ),
176
+ ),
177
+ ],
178
+ ts.NodeFlags.Const,
179
+ ),
180
+ );
181
+ }
182
+
183
+ function sanitizeMemberName(name: string) {
184
+ let sanitizedName = name.replace(JS_ENUM_INVALID_CHARS_RE, (c) => {
185
+ // The pattern matches at least one character, so `last` is always a character.
186
+ const last = c.at(-1) ?? "";
187
+ return JS_PROPERTY_INDEX_INVALID_CHARS_RE.test(last) ? "" : last.toUpperCase();
188
+ });
189
+ if (Number(name[0]) >= 0) {
190
+ sanitizedName = `Value${name}`;
191
+ }
192
+ return sanitizedName;
193
+ }
194
+
195
+ /** An enum member name: a valid identifier as is; anything else prefixed, replaced or quoted. */
196
+ function enumMemberName(value: string | number, explicitName: string | undefined): string {
197
+ let name = explicitName ?? String(value);
198
+ if (JS_PROPERTY_INDEX_RE.test(name)) {
199
+ return name;
200
+ }
201
+ if (Number(name[0]) >= 0) {
202
+ // A decimal point is not valid in a name; keep the digits readable.
203
+ name = `Value${name}`.replace(".", "_");
204
+ } else if (name[0] === "-") {
205
+ name = `ValueMinus${name.slice(1)}`;
206
+ }
207
+ const invalidCharMatch = name.match(JS_PROPERTY_INDEX_INVALID_CHARS_RE);
208
+ if (!invalidCharMatch) {
209
+ return name === "" ? quotedMemberName(name) : name;
210
+ }
211
+ if (invalidCharMatch[0] === name) {
212
+ return quotedMemberName(name);
213
+ }
214
+ return name.replace(JS_PROPERTY_INDEX_INVALID_CHARS_RE, (s) =>
215
+ s in SPECIAL_CHARACTER_MAP ? (SPECIAL_CHARACTER_MAP[s] as string) : "_",
216
+ );
217
+ }
218
+
219
+ /**
220
+ * Sanitize TS enum member expression
221
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
222
+ */
223
+ export function tsEnumMember(
224
+ value: string | number,
225
+ metadata: { name?: string; description?: string | null } = {},
226
+ ) {
227
+ const ts = loadTypeScript();
228
+ const name = enumMemberName(value, metadata.name);
229
+ const member = ts.factory.createEnumMember(name, toValueExpression(ts, value));
230
+ const trimmedDescription = enumMemberDescription(metadata.description);
231
+ if (trimmedDescription === "") {
232
+ return member;
233
+ }
234
+
235
+ return ts.addSyntheticLeadingComment(
236
+ member,
237
+ ts.SyntaxKind.SingleLineCommentTrivia,
238
+ ` ${trimmedDescription}`,
239
+ true,
240
+ );
241
+ }
242
+
243
+ /**
244
+ * Is this a primitive type (string, number, boolean, null, undefined)?
245
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
246
+ */
247
+ export function tsIsPrimitive(input: TypeInput): boolean {
248
+ const ts = loadTypeScript();
249
+ if (!input) {
250
+ return true;
251
+ }
252
+ const type = legacyTypeNode(input);
253
+ return (
254
+ ts.SyntaxKind[type.kind] === "BooleanKeyword" ||
255
+ ts.SyntaxKind[type.kind] === "NeverKeyword" ||
256
+ ts.SyntaxKind[type.kind] === "NullKeyword" ||
257
+ ts.SyntaxKind[type.kind] === "NumberKeyword" ||
258
+ ts.SyntaxKind[type.kind] === "StringKeyword" ||
259
+ ts.SyntaxKind[type.kind] === "UndefinedKeyword" ||
260
+ ("literal" in type && tsIsPrimitive(type.literal as ts.TypeLiteralNode))
261
+ );
262
+ }
263
+
264
+ /**
265
+ * Modifiers (readonly)
266
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
267
+ */
268
+ export function tsModifiers(modifiers: { readonly?: boolean; export?: boolean }): ts.Modifier[] {
269
+ const ts = loadTypeScript();
270
+ const typeMods: ts.Modifier[] = [];
271
+ if (modifiers.export) {
272
+ typeMods.push(ts.factory.createModifier(ts.SyntaxKind.ExportKeyword));
273
+ }
274
+ if (modifiers.readonly) {
275
+ typeMods.push(ts.factory.createModifier(ts.SyntaxKind.ReadonlyKeyword));
276
+ }
277
+ return typeMods;
278
+ }
279
+
280
+ /**
281
+ * Create a valid property index
282
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
283
+ */
284
+ export function tsPropertyIndex(index: string | number) {
285
+ const ts = loadTypeScript();
286
+ if (
287
+ (typeof index === "number" && !(index < 0)) ||
288
+ (typeof index === "string" && String(Number(index)) === index && index[0] !== "-")
289
+ ) {
290
+ return ts.factory.createNumericLiteral(index);
291
+ }
292
+ return typeof index === "string" && JS_PROPERTY_INDEX_RE.test(index)
293
+ ? ts.factory.createIdentifier(index)
294
+ : ts.factory.createStringLiteral(String(index));
295
+ }
296
+
297
+ /**
298
+ * Enhanced ReadonlyArray.
299
+ * eg: type Foo = ReadonlyArray<T>; type Bar = ReadonlyArray<T[]>
300
+ * Foo and Bar are both of type `readonly T[]`
301
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
302
+ */
303
+ export function tsReadonlyArray(type: TypeInput, injectFooter?: FooterEntry[]): ts.TypeNode {
304
+ const ts = loadTypeScript();
305
+ if (injectFooter) {
306
+ requireHelper(injectFooter, HELPER_TYPES.readonlyArray);
307
+ }
308
+ return ts.factory.createTypeReferenceNode(ts.factory.createIdentifier("ReadonlyArray"), [
309
+ legacyTypeNode(type),
310
+ ]);
311
+ }
@@ -0,0 +1,118 @@
1
+ import colors from "ansi-colors";
2
+ import { formatDuration } from "../adapters/terminal-logger/terminal-logger.js";
3
+ import type { DebugGroup } from "../application/ports/logger.js";
4
+ import { discriminatorProperty } from "../application/transform/schema/discriminator-property.js";
5
+ import type { IrPropertySignature } from "../domain/ir/nodes.js";
6
+ import { createRef as createDomainRef } from "../domain/openapi/json-pointer.js";
7
+ import type { DiscriminatorObject } from "../types.js";
8
+ import { defaultLogger, terminalSupportsColor } from "./default-ports.js";
9
+ import { type ResolveRefOptions, resolveDocumentRef, walkDocument } from "./document-refs.js";
10
+
11
+ /**
12
+ * The original's exported utilities, kept for 1.x (ADR-004, decision 9). The generator itself
13
+ * logs through the Logger port; `debug`, `warn` and `error` here write through the default one.
14
+ */
15
+
16
+ // The exported `c` is the shared ansi-colors instance, switched off at import when the terminal has
17
+ // no colors, as the original did. The generator's own logger uses a separate instance.
18
+ if (!terminalSupportsColor()) {
19
+ colors.enabled = false;
20
+ }
21
+
22
+ /**
23
+ * The shared ansi-colors instance.
24
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9). Use a color library directly.
25
+ */
26
+ export const c = colors;
27
+
28
+ /**
29
+ * The discriminator property of a schema at `path`, typed as its discriminator value. Returns IR
30
+ * (task 6.2), like the exported transformers.
31
+ */
32
+ export function createDiscriminatorProperty(
33
+ discriminator: DiscriminatorObject,
34
+ { path, readonly = false }: { path: string; readonly?: boolean },
35
+ ): IrPropertySignature {
36
+ return discriminatorProperty(discriminator, path, readonly);
37
+ }
38
+
39
+ /** Create a $ref pointer (even from other $refs) */
40
+ export function createRef(parts: (number | string | undefined | null)[]): string {
41
+ return createDomainRef(parts);
42
+ }
43
+
44
+ /**
45
+ * Print debug message (cribbed from the `debug` package, but without all the bells & whistles
46
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
47
+ */
48
+ export function debug(msg: string, group?: string, time?: number) {
49
+ // Any group name was accepted; one the logger does not know prints in white, as before.
50
+ defaultLogger(false).debug(msg, group as DebugGroup | undefined, time);
51
+ }
52
+
53
+ /**
54
+ * Print error message
55
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
56
+ */
57
+ export function error(msg: string) {
58
+ defaultLogger(false).error(msg);
59
+ }
60
+
61
+ /** Format a performance log in a friendly format */
62
+ export function formatTime(t: number) {
63
+ return typeof t === "number" ? formatDuration(t) : t;
64
+ }
65
+
66
+ /** Call Object.entries() and optionally sort */
67
+ export function getEntries<T>(
68
+ obj: ArrayLike<T> | Record<string, T>,
69
+ options?: {
70
+ alphabetize?: boolean;
71
+ excludeDeprecated?: boolean;
72
+ },
73
+ ) {
74
+ let entries = Object.entries(obj);
75
+ if (options?.alphabetize) {
76
+ entries.sort(([a], [b]) => a.localeCompare(b, "en-us", { numeric: true }));
77
+ }
78
+ if (options?.excludeDeprecated) {
79
+ entries = entries.filter(
80
+ ([, v]) => !(v && typeof v === "object" && "deprecated" in v && v.deprecated),
81
+ );
82
+ }
83
+ return entries;
84
+ }
85
+
86
+ export type { ResolveRefOptions } from "./document-refs.js";
87
+
88
+ /**
89
+ * resolve a $ref in a schema
90
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
91
+ */
92
+ export function resolveRef<T>(
93
+ schema: any,
94
+ $ref: string,
95
+ options: ResolveRefOptions,
96
+ ): T | undefined {
97
+ return resolveDocumentRef<T>(schema, $ref, options);
98
+ }
99
+
100
+ /**
101
+ * Walk through any JSON-serializable (i.e. non-circular) object
102
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
103
+ */
104
+ export function walk(
105
+ obj: unknown,
106
+ cb: (value: Record<string, unknown>, path: (string | number)[]) => void,
107
+ path: (string | number)[] = [],
108
+ ): void {
109
+ walkDocument(obj, cb, path);
110
+ }
111
+
112
+ /**
113
+ * Print warning message
114
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).
115
+ */
116
+ export function warn(msg: string, silent = false) {
117
+ defaultLogger(silent).warn(msg);
118
+ }
@@ -0,0 +1,62 @@
1
+ import { createRedoclySchemaLoader } from "../adapters/redocly-loader/redocly-schema-loader.js";
2
+ import { withStackOverflowReported } from "../application/stack-overflow.js";
3
+ import type { IrDeclaration } from "../domain/ir/nodes.js";
4
+ import type { GeneratorOptions, SchemaSource } from "../types.js";
5
+ import {
6
+ defaultLogger,
7
+ defaultRedoclyConfig,
8
+ monotonicNow,
9
+ REMOTE_REF_TIMEOUT_MS,
10
+ } from "./default-ports.js";
11
+ import { createDocumentRun, type GeneratorPorts } from "./document-run.js";
12
+ import transformSchema from "./transform-schema.js";
13
+
14
+ /**
15
+ * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;
16
+ * `generateDeclarations` runs with any ports, which is how the CLI calls it.
17
+ */
18
+
19
+ /** Load, validate and bundle the source, then transform it into IR declarations. */
20
+ export async function generateDeclarations(
21
+ source: SchemaSource,
22
+ options: GeneratorOptions,
23
+ ports: GeneratorPorts,
24
+ ): Promise<IrDeclaration[]> {
25
+ const { schema, ctx } = await createDocumentRun(source, options, ports);
26
+ const startedAt = ports.now();
27
+ const result = withStackOverflowReported("transform", () => transformSchema(schema, ctx));
28
+ ports.logger.debug(
29
+ "Completed AST transformation for entire document",
30
+ "ts",
31
+ ports.now() - startedAt,
32
+ );
33
+ return result;
34
+ }
35
+
36
+ /** The default ports: the terminal logger, the given or default Redocly config, Redocly loading. */
37
+ export async function defaultGeneratorPorts(options: GeneratorOptions): Promise<GeneratorPorts> {
38
+ const logger = defaultLogger(options.silent ?? false);
39
+ const redoc = options.redocly ?? (await defaultRedoclyConfig());
40
+ const loader = createRedoclySchemaLoader({
41
+ redoc,
42
+ logger,
43
+ now: monotonicNow,
44
+ remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,
45
+ });
46
+ return { loader, logger, redoc, now: monotonicNow };
47
+ }
48
+
49
+ /**
50
+ * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)
51
+ * @param {string|URL|object|Readable} source OpenAPI schema source:
52
+ * - YAML: string
53
+ * - JSON: parsed object
54
+ * - URL: URL to a YAML or JSON file (local or remote)
55
+ * - Readable: Readable stream of YAML or JSON
56
+ */
57
+ export default async function openapiTS(
58
+ source: SchemaSource,
59
+ options: GeneratorOptions = {},
60
+ ): Promise<IrDeclaration[]> {
61
+ return generateDeclarations(source, options, await defaultGeneratorPorts(options));
62
+ }
@@ -0,0 +1,211 @@
1
+ import { toPropertySignature, toTypeNode } from "../adapters/type-ast-bridge/ir-to-typescript.js";
2
+ import { loadTypeScript } from "../adapters/type-ast-bridge/load-typescript.js";
3
+ import { fromPropertySignature } from "../adapters/type-ast-bridge/typescript-to-ir.js";
4
+ import type { ts } from "../adapters/type-ast-bridge/typescript-types.js";
5
+ import type {
6
+ CustomType,
7
+ SchemaCallbacks,
8
+ SchemaLocation,
9
+ } from "../application/transform/schema/schema-context.js";
10
+ import { ERROR_CODES, OpenAPITypesafeError } from "../domain/errors.js";
11
+ import { irRaw } from "../domain/ir/constructors.js";
12
+ import type { IrPropertySignature, IrType } from "../domain/ir/nodes.js";
13
+ import type {
14
+ GlobalContext,
15
+ IrCallbackType,
16
+ IrPostTransform,
17
+ IrTransform,
18
+ IrTransformProperty,
19
+ LegacyCallbackOptions,
20
+ SchemaObject,
21
+ TransformNodeOptions,
22
+ } from "../types.js";
23
+ import { warnLegacyCallback } from "./legacy-callback-warning.js";
24
+ import { toIrType } from "./type-helpers.js";
25
+
26
+ /**
27
+ * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).
28
+ * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and
29
+ * their results are read by the bridge.
30
+ */
31
+
32
+ export class UnreadablePropertyError extends OpenAPITypesafeError {
33
+ constructor(path: string | undefined) {
34
+ super({
35
+ code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
36
+ message:
37
+ `transformProperty at ${path} returned a property ` +
38
+ "with syntax the generator cannot read",
39
+ details: { callback: "transformProperty", path },
40
+ });
41
+ this.name = "UnreadablePropertyError";
42
+ }
43
+ }
44
+
45
+ /** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */
46
+ export class UnreadableTypeError extends OpenAPITypesafeError {
47
+ constructor(callback: "transform" | "postTransform", path: string | undefined) {
48
+ super({
49
+ code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
50
+ message: `${callback} at ${path} returned a value that is not a TypeScript node`,
51
+ details: { callback, path },
52
+ });
53
+ this.name = "UnreadableTypeError";
54
+ }
55
+ }
56
+
57
+ function nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {
58
+ return { ...location, ctx } as TransformNodeOptions;
59
+ }
60
+
61
+ /** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */
62
+ export function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {
63
+ return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);
64
+ }
65
+
66
+ /** An IR callback type; text is a raw type, printed as written. */
67
+ function fromCallbackType(type: IrCallbackType): IrType {
68
+ return typeof type === "string" ? irRaw(type) : type;
69
+ }
70
+
71
+ function irCustomType(result: ReturnType<IrTransform>): CustomType | null {
72
+ if (result === undefined || result === null) {
73
+ return null;
74
+ }
75
+ if (typeof result === "object" && "schema" in result) {
76
+ return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };
77
+ }
78
+ return { type: fromCallbackType(result), isOptional: false };
79
+ }
80
+
81
+ /**
82
+ * The context fields hold either callback form; `irCallbacks` says which one, so the casts below
83
+ * only name the form the user declared with `OpenAPITSIrOptions`.
84
+ */
85
+ function irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {
86
+ const transform = ctx.transform as IrTransform | undefined;
87
+ const postTransform = ctx.postTransform as IrPostTransform | undefined;
88
+ const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;
89
+ return {
90
+ transform: (schema, location) =>
91
+ transform
92
+ ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)))
93
+ : null,
94
+ postTransform(type, location) {
95
+ const result = postTransform?.(type, nodeOptions(ctx, location));
96
+ return result === undefined ? null : fromCallbackType(result);
97
+ },
98
+ transformProperty: (property, schema, location) =>
99
+ transformProperty?.(property, schema as SchemaObject, nodeOptions(ctx, location)) ?? null,
100
+ };
101
+ }
102
+
103
+ type LegacyTransform = NonNullable<LegacyCallbackOptions["transform"]>;
104
+ type LegacyPostTransform = NonNullable<LegacyCallbackOptions["postTransform"]>;
105
+ type LegacyTransformProperty = NonNullable<LegacyCallbackOptions["transformProperty"]>;
106
+
107
+ /** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */
108
+ /**
109
+ * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any
110
+ * value, and anything else would crash the TypeScript printer later.
111
+ */
112
+ function readResultType(
113
+ callback: "transform" | "postTransform",
114
+ result: unknown,
115
+ location: SchemaLocation,
116
+ ): IrType {
117
+ const kind = (result as { kind?: unknown }).kind;
118
+ if (typeof kind !== "string" && typeof kind !== "number") {
119
+ throw new UnreadableTypeError(callback, location.path);
120
+ }
121
+ return toIrType(result as IrType | ts.TypeNode);
122
+ }
123
+
124
+ function legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {
125
+ const result = readResultType("transform", type, location);
126
+ if (typeof (type as { kind: unknown }).kind !== "string") {
127
+ warnLegacyCallback(ctx, "transform");
128
+ }
129
+ return result;
130
+ }
131
+
132
+ function legacyCustomType(
133
+ ctx: GlobalContext,
134
+ result: ReturnType<LegacyTransform>,
135
+ location: SchemaLocation,
136
+ ): CustomType | null {
137
+ if (!result || typeof result !== "object") {
138
+ return null;
139
+ }
140
+ if ("schema" in result) {
141
+ return {
142
+ type: legacyResultType(ctx, result.schema, location),
143
+ isOptional: Boolean(result.questionToken),
144
+ };
145
+ }
146
+ return { type: legacyResultType(ctx, result, location), isOptional: false };
147
+ }
148
+
149
+ /** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */
150
+ function legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {
151
+ const transform = ctx.transform as LegacyTransform | undefined;
152
+ const postTransform = ctx.postTransform as LegacyPostTransform | undefined;
153
+ return {
154
+ transform: (schema, location) =>
155
+ typeof transform === "function"
156
+ ? legacyCustomType(
157
+ ctx,
158
+ transform(schema as SchemaObject, nodeOptions(ctx, location)),
159
+ location,
160
+ )
161
+ : null,
162
+ postTransform(type, location) {
163
+ if (typeof postTransform !== "function") {
164
+ return null;
165
+ }
166
+ warnLegacyCallback(ctx, "postTransform");
167
+ const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));
168
+ return result ? readResultType("postTransform", result, location) : null;
169
+ },
170
+ transformProperty: (property, schema, location) =>
171
+ legacyTransformProperty(ctx, property, schema, location),
172
+ };
173
+ }
174
+
175
+ function isIrProperty(
176
+ property: IrPropertySignature | ts.PropertySignature,
177
+ ): property is IrPropertySignature {
178
+ return typeof property.kind === "string";
179
+ }
180
+
181
+ function legacyTransformProperty(
182
+ ctx: GlobalContext,
183
+ property: IrPropertySignature,
184
+ schema: unknown,
185
+ location: SchemaLocation,
186
+ ): IrPropertySignature | null {
187
+ const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;
188
+ if (typeof transformProperty !== "function") {
189
+ return null;
190
+ }
191
+ warnLegacyCallback(ctx, "transformProperty");
192
+ const ts = loadTypeScript();
193
+ const options = nodeOptions(ctx, location);
194
+ const result = transformProperty(
195
+ toPropertySignature(ts, property),
196
+ schema as SchemaObject,
197
+ options,
198
+ );
199
+ if (!result) {
200
+ return null;
201
+ }
202
+ if (isIrProperty(result)) {
203
+ return result;
204
+ }
205
+ // JavaScript callers can return any value, so check the node kind before reading it.
206
+ const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;
207
+ if (converted === null) {
208
+ throw new UnreadablePropertyError(location.path);
209
+ }
210
+ return converted;
211
+ }