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,27 @@
1
+ import { deprecate } from "node:util";
2
+ import { parseStatements } from "../adapters/type-ast-bridge/ir-declarations-to-typescript.js";
3
+ import { loadTypeScript } from "../adapters/type-ast-bridge/load-typescript.js";
4
+ import { IR_CALLBACKS_GUIDE_URL } from "./legacy-callback-warning.js";
5
+
6
+ const STRING_TO_AST_DEPRECATION =
7
+ "stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR " +
8
+ `callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;
9
+
10
+ /** Node's deprecation code for `stringToAST`, so users can filter or trace the warning. */
11
+ export const STRING_TO_AST_DEPRECATION_CODE = "OPENAPI_TYPESAFE_DEP_STRING_TO_AST";
12
+
13
+ function parseSource(source: string): unknown[] {
14
+ return [...parseStatements(loadTypeScript(), source)];
15
+ }
16
+
17
+ /**
18
+ * Convert an arbitrary string to TS (assuming it’s valid). Parses with the TypeScript bridge, so
19
+ * it needs TypeScript 6 or earlier (or `@typescript/typescript6`). Node's `util.deprecate` warns
20
+ * on the first call only.
21
+ * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 7). Use type text in IR callbacks.
22
+ */
23
+ export const stringToAST: (source: string) => unknown[] = deprecate(
24
+ parseSource,
25
+ STRING_TO_AST_DEPRECATION,
26
+ STRING_TO_AST_DEPRECATION_CODE,
27
+ );
@@ -0,0 +1,87 @@
1
+ import * as changeCase from "change-case";
2
+ import { RunFooter } from "../application/transform/footer/document-footer.js";
3
+ import type { SchemaLocation } from "../application/transform/schema/schema-context.js";
4
+ import type {
5
+ DocumentFooter,
6
+ NameCasing,
7
+ TransformContext,
8
+ TransformDiagnostics,
9
+ TransformOptions,
10
+ } from "../application/transform/transform-context.js";
11
+ import type { GlobalContext, TransformNodeOptions } from "../types.js";
12
+ import { defaultLogger, monotonicNow } from "./default-ports.js";
13
+ import { ContextFooterSink } from "./footer-sink.js";
14
+ import { schemaCallbacks } from "./schema-callbacks.js";
15
+
16
+ /**
17
+ * Builds the ported transformers' context from the original `GlobalContext`: options, refs,
18
+ * discriminators, the run footer and the user callbacks (see `schema-callbacks.ts`).
19
+ */
20
+
21
+ function transformOptions(ctx: GlobalContext): TransformOptions {
22
+ return {
23
+ additionalProperties: ctx.additionalProperties,
24
+ alphabetize: ctx.alphabetize,
25
+ arrayLength: ctx.arrayLength,
26
+ binaryAsBlob: ctx.binaryAsBlob,
27
+ conditionalEnums: ctx.conditionalEnums,
28
+ dedupeEnums: ctx.dedupeEnums,
29
+ defaultNonNullable: ctx.defaultNonNullable,
30
+ emptyObjectsUnknown: ctx.emptyObjectsUnknown,
31
+ enum: ctx.enum,
32
+ enumValues: ctx.enumValues,
33
+ excludeDeprecated: ctx.excludeDeprecated,
34
+ fixes: new Set(ctx.fix ?? []),
35
+ immutable: ctx.immutable,
36
+ propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,
37
+ readWriteMarkers: ctx.readWriteMarkers,
38
+ generatePathParams: ctx.generatePathParams,
39
+ pathParamsAsTypes: ctx.pathParamsAsTypes,
40
+ rootTypes: ctx.rootTypes,
41
+ rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,
42
+ rootTypesKeepCasing: ctx.rootTypesKeepCasing,
43
+ exportType: ctx.exportType,
44
+ inject: ctx.inject,
45
+ makePathsEnum: ctx.makePathsEnum,
46
+ };
47
+ }
48
+
49
+ /** One footer per run: it holds the enum registry, so it lives on the run's context. */
50
+ function runFooter(ctx: GlobalContext): DocumentFooter {
51
+ ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);
52
+ return ctx.runFooter;
53
+ }
54
+
55
+ const CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };
56
+
57
+ /**
58
+ * A monotonic clock and the run's logger (the default one for a user's own context), "ts" group.
59
+ */
60
+ function diagnostics(ctx: GlobalContext): TransformDiagnostics {
61
+ const logger = ctx.logger ?? defaultLogger(ctx.silent);
62
+ return {
63
+ now: monotonicNow,
64
+ debug: (message, durationMs) => logger.debug(message, "ts", durationMs),
65
+ };
66
+ }
67
+
68
+ /** The ported transformers' context for one call from a legacy transformer. */
69
+ export function createTransformContext(ctx: GlobalContext): TransformContext {
70
+ return {
71
+ options: transformOptions(ctx),
72
+ refs: { resolve: (ref) => ctx.resolve(ref) },
73
+ discriminators: {
74
+ objectAt: (ref) => ctx.discriminators.objects[ref],
75
+ isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),
76
+ },
77
+ footer: runFooter(ctx),
78
+ callbacks: schemaCallbacks(ctx),
79
+ diagnostics: diagnostics(ctx),
80
+ casing: CASING,
81
+ };
82
+ }
83
+
84
+ /** The transformer's location for the original options object. */
85
+ export function schemaLocation(options: TransformNodeOptions): SchemaLocation {
86
+ return { path: options.path, schema: options.schema };
87
+ }
@@ -0,0 +1,39 @@
1
+ import type { ts } from "../adapters/type-ast-bridge/typescript-types.js";
2
+ import { documentBody, documentClosing } from "../application/transform/document/document.js";
3
+ import { renameAliasesTakenByFooter } from "../application/transform/document/root-type-aliases.js";
4
+ import type { IrDeclaration } from "../domain/ir/nodes.js";
5
+ import type { DocumentObject } from "../domain/openapi/document-object.js";
6
+ import type { GlobalContext, OpenAPI3 } from "../types.js";
7
+ import { documentDeclarations, type TransformedDocument } from "./document-declarations.js";
8
+ import { type FooterEntry, isIrDeclaration } from "./footer-entry.js";
9
+ import { createTransformContext } from "./transform-context.js";
10
+
11
+ const OPERATIONS_NAME = "operations";
12
+
13
+ /** Whether a footer entry is named `operations` (any declaration kind, as in the original). */
14
+ function isOperations(entry: FooterEntry): boolean {
15
+ const name = isIrDeclaration(entry)
16
+ ? (entry as { name?: string }).name
17
+ : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;
18
+ return name === OPERATIONS_NAME;
19
+ }
20
+
21
+ /** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */
22
+ export function transformDocument(schema: OpenAPI3, ctx: GlobalContext): TransformedDocument {
23
+ const document = schema as DocumentObject;
24
+ const context = createTransformContext(ctx);
25
+ // documentBody registers the enums in the footer, so the footer is read after it.
26
+ const rawBody = documentBody(document, context);
27
+ const footer: FooterEntry[] = [...ctx.injectFooter];
28
+ const body = renameAliasesTakenByFooter(rawBody, footer.filter(isIrDeclaration));
29
+ const closing = documentClosing(document, context, footer.some(isOperations));
30
+ return { body, footer, closing };
31
+ }
32
+
33
+ /**
34
+ * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same
35
+ * for a loaded document.
36
+ */
37
+ export default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {
38
+ return documentDeclarations(transformDocument(schema, ctx));
39
+ }
@@ -0,0 +1,130 @@
1
+ import { loadTypeScript } from "../adapters/type-ast-bridge/load-typescript.js";
2
+ import { fromTypeNode } from "../adapters/type-ast-bridge/typescript-to-ir.js";
3
+ import type { ts } from "../adapters/type-ast-bridge/typescript-types.js";
4
+ import { HELPER_TYPES } from "../application/transform/helper-types.js";
5
+ import { literalType } from "../application/transform/literal-type.js";
6
+ import { refType } from "../application/transform/ref-type.js";
7
+ import { UNKNOWN_TYPE } from "../application/transform/shared-types.js";
8
+ import {
9
+ intersectionOf,
10
+ nullableOf,
11
+ omitKeys,
12
+ unionOf,
13
+ withRequiredKeys,
14
+ } from "../application/transform/type-combinators.js";
15
+ import { irBoolean, irKeyword, irRecord } from "../domain/ir/constructors.js";
16
+ import type { IrType } from "../domain/ir/nodes.js";
17
+ import type { ParameterObject, ReferenceObject } from "../types.js";
18
+ import { declaresTypeAlias, type FooterEntry } from "./footer-entry.js";
19
+
20
+ /**
21
+ * The public type helpers (ENGINEERING_PLAN 6.2, ADR-004 decision 2). Same names and call
22
+ * signatures as the original helpers; they return IR types. A `ts.TypeNode` argument (from user
23
+ * code built with `ts.factory`) is read into IR by the bridge.
24
+ */
25
+
26
+ /** A helper argument: an IR type, or a TypeScript type node from user code. */
27
+ export type TypeInput = IrType | ts.TypeNode;
28
+
29
+ export const BOOLEAN: IrType = Object.freeze(irKeyword("boolean"));
30
+ export const FALSE: IrType = Object.freeze(irBoolean(false));
31
+ export const NEVER: IrType = Object.freeze(irKeyword("never"));
32
+ export const NULL: IrType = Object.freeze(irKeyword("null"));
33
+ export const NUMBER: IrType = Object.freeze(irKeyword("number"));
34
+ export const STRING: IrType = Object.freeze(irKeyword("string"));
35
+ export const TRUE: IrType = Object.freeze(irBoolean(true));
36
+ export const UNDEFINED: IrType = Object.freeze(irKeyword("undefined"));
37
+ /** The shared `unknown` type; the transformers compare with it by identity, as the original did. */
38
+ export const UNKNOWN: IrType = UNKNOWN_TYPE;
39
+
40
+ /** IR nodes have a string `kind`; TypeScript nodes have a numeric `SyntaxKind`. */
41
+ function isIrType(type: TypeInput): type is IrType {
42
+ return typeof type.kind === "string";
43
+ }
44
+
45
+ /** @internal Read a helper argument into IR. */
46
+ export function toIrType(type: TypeInput): IrType {
47
+ return isIrType(type) ? type : fromTypeNode(loadTypeScript(), type);
48
+ }
49
+
50
+ /** `A | B`: `never` for no types, the type itself for one; repeated primitives are removed. */
51
+ export function tsUnion(types: readonly TypeInput[]): IrType {
52
+ return unionOf(types.map(toIrType));
53
+ }
54
+
55
+ /** `A & B`, with the same rules as `tsUnion`. */
56
+ export function tsIntersection(types: readonly TypeInput[]): IrType {
57
+ return intersectionOf(types.map(toIrType));
58
+ }
59
+
60
+ /** `A | null`, without removing repeated types. */
61
+ export function tsNullable(types: readonly TypeInput[]): IrType {
62
+ return nullableOf(types.map(toIrType));
63
+ }
64
+
65
+ /** `Omit<T, "a" | "b">`. */
66
+ export function tsOmit(type: TypeInput, keys: readonly string[]): IrType {
67
+ return omitKeys(toIrType(type), keys);
68
+ }
69
+
70
+ /** `Record<K, V>`. */
71
+ export function tsRecord(key: TypeInput, value: TypeInput): IrType {
72
+ return irRecord(toIrType(key), toIrType(value));
73
+ }
74
+
75
+ /**
76
+ * The literal type of a JSON value: strings, numbers, booleans and `null` as literals, arrays as
77
+ * tuples (an empty one as `never[]`), objects as object types; anything else is `unknown`.
78
+ */
79
+ export function tsLiteral(value: unknown): IrType {
80
+ return literalType(value);
81
+ }
82
+
83
+ /**
84
+ * `WithRequired<T, "a" | "b">`, or the type itself for no keys. Adds the `WithRequired` helper
85
+ * type to the footer once.
86
+ */
87
+ export function tsWithRequired(
88
+ type: TypeInput,
89
+ keys: readonly string[],
90
+ injectFooter: FooterEntry[],
91
+ ): IrType {
92
+ if (keys.length === 0) {
93
+ return toIrType(type);
94
+ }
95
+ const { name, text } = HELPER_TYPES.withRequired;
96
+ if (!injectFooter.some((entry) => declaresTypeAlias(entry, name))) {
97
+ injectFooter.push({ kind: "rawDeclaration", name, text });
98
+ }
99
+ return withRequiredKeys(toIrType(type), keys);
100
+ }
101
+
102
+ export interface OapiRefOptions {
103
+ /** Whether to wrap with FlattenedDeepRequired<> (default: false) */
104
+ deep?: boolean;
105
+ /** Array of property names to wrap with Extract<> when accessing */
106
+ extractProperties?: string[];
107
+ }
108
+
109
+ function isParameterObject(
110
+ value: ParameterObject | ReferenceObject | undefined,
111
+ ): value is ParameterObject {
112
+ return Boolean(value && !("$ref" in value && value.$ref) && (value as ParameterObject).in);
113
+ }
114
+
115
+ /**
116
+ * The generated type a JSON Pointer refers to, as an indexed access: `#/components/schemas/Foo`
117
+ * → `components["schemas"]["Foo"]`. Object `properties` are skipped, and a referenced parameter
118
+ * is indexed by its location (`resolved`).
119
+ */
120
+ export function oapiRef(
121
+ path: string,
122
+ resolved?: ParameterObject | ReferenceObject,
123
+ options: OapiRefOptions = {},
124
+ ): IrType {
125
+ return refType(path, {
126
+ isDeep: options.deep ?? false,
127
+ extractProperties: options.extractProperties ?? [],
128
+ parameter: isParameterObject(resolved) ? { in: resolved.in, name: resolved.name } : null,
129
+ });
130
+ }
@@ -0,0 +1,26 @@
1
+ import type { Logger } from "../application/ports/logger.js";
2
+ import {
3
+ findUnsupportedFeatures,
4
+ UnsupportedFeature,
5
+ } from "../domain/openapi/unsupported-features.js";
6
+
7
+ const DOCS_BASE_URL = "https://github.com/openapi-typesafe/openapi-typesafe/blob/main/docs";
8
+ const SUPPORT_DOCS_URL = `${DOCS_BASE_URL}/introduction.md#openapi-3-2-support`;
9
+
10
+ /** Why each feature is not in the generated types. */
11
+ const REASONS: Readonly<Record<UnsupportedFeature, string>> = {
12
+ [UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY]:
13
+ 'is an "in: querystring" parameter next to "in: query" parameters, which OpenAPI 3.2 does ' +
14
+ "not allow; the query parameters keep their types and this parameter is not in the " +
15
+ "generated types",
16
+ };
17
+
18
+ /**
19
+ * Warn once per use of an OpenAPI 3.2 feature that the generated types leave out, so a missing
20
+ * parameter is never silent (CODING_PRINCIPLES §8.7).
21
+ */
22
+ export function warnUnsupportedFeatures(document: unknown, logger: Logger): void {
23
+ for (const { feature, pointer } of findUnsupportedFeatures(document)) {
24
+ logger.warn(`${pointer} ${REASONS[feature]}. See ${SUPPORT_DOCS_URL}`);
25
+ }
26
+ }
@@ -0,0 +1,12 @@
1
+ /** Read a generated file, for `--check` (ENGINEERING_PLAN 4.5). Fails with `OUTPUT_READ_FAILED`. */
2
+ export interface FileReader {
3
+ readText(file: URL): string;
4
+ }
5
+
6
+ /**
7
+ * Write a generated file, creating its directory first (ENGINEERING_PLAN 4.5). Fails with
8
+ * `OUTPUT_WRITE_FAILED`.
9
+ */
10
+ export interface FileWriter {
11
+ writeText(file: URL, contents: string): void;
12
+ }
@@ -0,0 +1,16 @@
1
+ /** The debug groups of the original `DEBUG=openapi-ts:<group>` output. */
2
+ export type DebugGroup = "redoc" | "lint" | "bundle" | "ts";
3
+
4
+ /**
5
+ * Where the generator reports progress and problems (ENGINEERING_PLAN 4.5). Whether warnings are
6
+ * printed (`silent`) and debug output (`DEBUG`) is decided by the adapter, when it is created.
7
+ */
8
+ export interface Logger {
9
+ /**
10
+ * A debug line, with how long the step took when it was measured. A line without a group is
11
+ * written whenever debug output is on.
12
+ */
13
+ debug(message: string, group?: DebugGroup, durationMs?: number): void;
14
+ warn(message: string): void;
15
+ error(message: string): void;
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { GeneratorOptions } from "../../types.js";
2
+
3
+ /** The loaded Redocly config, as the generator options take it. */
4
+ export type RedoclyConfig = NonNullable<GeneratorOptions["redocly"]>;
5
+
6
+ /** Where the CLI finds and loads `redocly.yaml` (ENGINEERING_PLAN 4.5). */
7
+ export interface RedoclyConfigSource {
8
+ /**
9
+ * The config file to use: `explicitPath` (a file, or a directory to search), or the one found
10
+ * from the working directory. Undefined when there is none.
11
+ */
12
+ find(explicitPath: string | undefined): string | undefined;
13
+ load(configPath: string): Promise<RedoclyConfig>;
14
+ /** The config used when there is no file: the minimal rules. */
15
+ createDefault(): Promise<RedoclyConfig>;
16
+ }
@@ -0,0 +1,32 @@
1
+ import type { OpenAPI3, SchemaSource } from "../../types.js";
2
+
3
+ /**
4
+ * Where `$ref` documents may be loaded from (threat model R1 and R2, ADR-017). An unset limit
5
+ * allows everything, as in openapi-typescript; the root document is never limited.
6
+ */
7
+ export interface RefAccess {
8
+ /** Local `$ref` files must be in this directory or below it (a `file:` URL). */
9
+ readonly localRoot?: URL;
10
+ /** Remote `$ref` documents must come from these hosts (`name` or `name:port`); `[]`: none. */
11
+ readonly remoteHosts?: readonly string[];
12
+ }
13
+
14
+ export interface SchemaLoadRequest {
15
+ readonly source: SchemaSource;
16
+ /** The base for relative `$ref`s of a source that is not a URL (a directory URL). */
17
+ readonly cwd: URL;
18
+ /** Lint with the Redocly config before bundling; off with the `lint: false` option. */
19
+ readonly shouldLint: boolean;
20
+ readonly refAccess: RefAccess;
21
+ }
22
+
23
+ /**
24
+ * Read, validate and bundle an OpenAPI 3 document into one document (ENGINEERING_PLAN 4.5).
25
+ * Fails with a typed error (ADR-011): `SCHEMA_SOURCE_*`, `SCHEMA_LOAD_FAILED`,
26
+ * `SCHEMA_REF_FORBIDDEN`,
27
+ * `SCHEMA_PARSE_FAILED`, `SCHEMA_VERSION_UNSUPPORTED`, `SCHEMA_INVALID`, `SCHEMA_REF_INVALID`,
28
+ * `SCHEMA_TOO_DEEP` or `SCHEMA_KEY_UNSUPPORTED`.
29
+ */
30
+ export interface SchemaLoader {
31
+ load(request: SchemaLoadRequest): Promise<OpenAPI3>;
32
+ }
@@ -0,0 +1,91 @@
1
+ import { assertNever } from "../../domain/assert-never.js";
2
+ import type { IrComment } from "../../domain/ir/nodes.js";
3
+ import { isLineBreak, type TextWriter } from "./text-writer.js";
4
+
5
+ const LINE_FEED = 0x0a;
6
+ const CARRIAGE_RETURN = 0x0d;
7
+
8
+ /** Single-line white space as the TypeScript scanner defines it (`isWhiteSpaceSingleLine`). */
9
+ const SINGLE_LINE_WHITESPACE = new Set([
10
+ 0x20, 0x09, 0x0b, 0x0c, 0xa0, 0x85, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005,
11
+ 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b, 0x202f, 0x205f, 0x3000, 0xfeff,
12
+ ]);
13
+ const TAB = 0x09;
14
+
15
+ /** Start offsets of every line, splitting at CR LF, CR, LF, U+2028 and U+2029 like TypeScript. */
16
+ function computeLineStarts(text: string): number[] {
17
+ const starts = [0];
18
+ for (let position = 0; position < text.length; position++) {
19
+ const code = text.charCodeAt(position);
20
+ if (code === CARRIAGE_RETURN && text.charCodeAt(position + 1) === LINE_FEED) {
21
+ position++;
22
+ }
23
+ if (isLineBreak(code)) {
24
+ starts.push(position + 1);
25
+ }
26
+ }
27
+ return starts;
28
+ }
29
+
30
+ /** Leading white space width of `text[start, end)`, counting a tab up to the next tab stop. */
31
+ function measureIndent(text: string, start: number, end: number, tabSize: number): number {
32
+ let width = 0;
33
+ for (
34
+ let position = start;
35
+ position < end && SINGLE_LINE_WHITESPACE.has(text.charCodeAt(position));
36
+ position++
37
+ ) {
38
+ width += text.charCodeAt(position) === TAB ? tabSize - (width % tabSize) : 1;
39
+ }
40
+ return width;
41
+ }
42
+
43
+ /** Write the line `text[start, end)` trimmed; a blank line becomes a bare line break. */
44
+ function writeTrimmedLine(writer: TextWriter, text: string, start: number, end: number): void {
45
+ const lineEnd = Math.min(text.length, end - 1);
46
+ const line = text.substring(start, lineEnd).trim();
47
+ if (line.length === 0) {
48
+ writer.rawWrite(writer.options.newLine);
49
+ return;
50
+ }
51
+ writer.write(line);
52
+ if (lineEnd !== text.length) {
53
+ writer.writeLine();
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Write a `/*...*\/` comment the way the TypeScript printer writes a synthesized one: every line
59
+ * after the first is re-indented to the current level plus the line's own leading white space, and
60
+ * every line is trimmed. (TypeScript only does this for comments whose second character is `*`,
61
+ * which is always true for a synthesized block comment, so there is no other branch.)
62
+ */
63
+ function writeBlockComment(writer: TextWriter, body: string): void {
64
+ const text = `/*${body}*/`;
65
+ const lineStarts = computeLineStarts(text);
66
+ const { indentSize } = writer.options;
67
+ lineStarts.forEach((start, line) => {
68
+ const end = line + 1 === lineStarts.length ? text.length + 1 : (lineStarts[line + 1] as number);
69
+ if (line > 0) {
70
+ const spaces = writer.indent * indentSize + measureIndent(text, start, end, indentSize);
71
+ writer.rawWrite(" ".repeat(spaces));
72
+ }
73
+ writeTrimmedLine(writer, text, start, end);
74
+ });
75
+ }
76
+
77
+ /** Write a comment on its own line before the node it belongs to. */
78
+ export function writeLeadingComment(writer: TextWriter, comment: IrComment): void {
79
+ switch (comment.kind) {
80
+ case "block":
81
+ writeBlockComment(writer, comment.text);
82
+ break;
83
+ case "line":
84
+ writer.writeLine();
85
+ writer.write(`//${comment.text}`);
86
+ break;
87
+ default:
88
+ assertNever(comment);
89
+ }
90
+ writer.writeLine();
91
+ }
@@ -0,0 +1,100 @@
1
+ import { assertNever } from "../../domain/assert-never.js";
2
+ import type {
3
+ IrComment,
4
+ IrConstArrayDeclaration,
5
+ IrDeclaration,
6
+ IrEnumDeclaration,
7
+ IrEnumMember,
8
+ IrInterfaceDeclaration,
9
+ IrTypeAliasDeclaration,
10
+ } from "../../domain/ir/nodes.js";
11
+ import { writeLeadingComment } from "./comment-writer.js";
12
+ import { printEscapedString, printNumberLiteral } from "./literal-text.js";
13
+ import type { TextWriter } from "./text-writer.js";
14
+ import { writeMember, writeMultiLineList, writeType } from "./type-printer.js";
15
+
16
+ /** Enum initializers and array elements are expressions: strings use printer escaping. */
17
+ function printValue(value: string | number): string {
18
+ return typeof value === "number" ? printNumberLiteral(value) : printEscapedString(value);
19
+ }
20
+
21
+ function writeHead(
22
+ writer: TextWriter,
23
+ declaration: { comments: readonly IrComment[]; isExported: boolean },
24
+ ): void {
25
+ for (const comment of declaration.comments) {
26
+ writeLeadingComment(writer, comment);
27
+ }
28
+ if (declaration.isExported) {
29
+ writer.write("export ");
30
+ }
31
+ }
32
+
33
+ function writeInterface(writer: TextWriter, declaration: IrInterfaceDeclaration): void {
34
+ writeHead(writer, declaration);
35
+ writer.write(`interface ${declaration.name} {`);
36
+ writeMultiLineList(
37
+ writer,
38
+ declaration.members,
39
+ { delimiter: "", isLineBreakWhenEmpty: true },
40
+ (member) => writeMember(writer, member),
41
+ );
42
+ writer.write("}");
43
+ }
44
+
45
+ function writeTypeAlias(writer: TextWriter, declaration: IrTypeAliasDeclaration): void {
46
+ writeHead(writer, declaration);
47
+ writer.write(`type ${declaration.name} = `);
48
+ writeType(writer, declaration.type);
49
+ writer.write(";");
50
+ }
51
+
52
+ function writeEnumMember(writer: TextWriter, member: IrEnumMember): void {
53
+ for (const comment of member.comments) {
54
+ writeLeadingComment(writer, comment);
55
+ }
56
+ writer.write(`${member.name} = ${printValue(member.value)}`);
57
+ }
58
+
59
+ function writeEnum(writer: TextWriter, declaration: IrEnumDeclaration): void {
60
+ writeHead(writer, declaration);
61
+ writer.write(`enum ${declaration.name} {`);
62
+ writeMultiLineList(
63
+ writer,
64
+ declaration.members,
65
+ { delimiter: ",", isLineBreakWhenEmpty: true },
66
+ (member) => writeEnumMember(writer, member),
67
+ );
68
+ writer.write("}");
69
+ }
70
+
71
+ function writeConstArray(writer: TextWriter, declaration: IrConstArrayDeclaration): void {
72
+ writeHead(writer, declaration);
73
+ writer.write(`const ${declaration.name}: `);
74
+ writeType(writer, declaration.type);
75
+ writer.write(` = [${declaration.values.map(printValue).join(", ")}];`);
76
+ }
77
+
78
+ /** Write one top-level declaration, starting on a new line. */
79
+ export function writeDeclaration(writer: TextWriter, declaration: IrDeclaration): void {
80
+ writer.writeLine();
81
+ switch (declaration.kind) {
82
+ case "interface":
83
+ writeInterface(writer, declaration);
84
+ break;
85
+ case "typeAlias":
86
+ writeTypeAlias(writer, declaration);
87
+ break;
88
+ case "enum":
89
+ writeEnum(writer, declaration);
90
+ break;
91
+ case "constArray":
92
+ writeConstArray(writer, declaration);
93
+ break;
94
+ case "rawDeclaration":
95
+ writer.write(declaration.text);
96
+ break;
97
+ default:
98
+ assertNever(declaration);
99
+ }
100
+ }
@@ -0,0 +1,62 @@
1
+ import type { IrStringEncoding } from "../../domain/ir/nodes.js";
2
+
3
+ /**
4
+ * Escapes TypeScript's printer uses inside a double-quoted string literal (its `escapeString`).
5
+ * Other characters below U+0020 use `\uXXXX`; so does every non-ASCII code unit
6
+ * (`escapeNonAsciiString`).
7
+ */
8
+ const NAMED_ESCAPES: ReadonlyMap<number, string> = new Map([
9
+ [0x09, "\\t"],
10
+ [0x0b, "\\v"],
11
+ [0x0c, "\\f"],
12
+ [0x08, "\\b"],
13
+ [0x0d, "\\r"],
14
+ [0x0a, "\\n"],
15
+ [0x5c, "\\\\"],
16
+ [0x22, '\\"'],
17
+ ]);
18
+ const NULL_CODE = 0x00;
19
+ const FIRST_PRINTABLE_ASCII = 0x20;
20
+ const LAST_ASCII = 0x7f;
21
+ const DIGIT_ZERO = 0x30;
22
+ const DIGIT_NINE = 0x39;
23
+
24
+ function toUtf16Escape(code: number): string {
25
+ return `\\u${code.toString(16).toUpperCase().padStart(4, "0")}`;
26
+ }
27
+
28
+ function isDigit(code: number): boolean {
29
+ return code >= DIGIT_ZERO && code <= DIGIT_NINE;
30
+ }
31
+
32
+ /** `\0` must not be followed by a digit, or it would read as an octal escape. */
33
+ function escapeCodeUnit(code: number, nextCode: number): string {
34
+ if (code === NULL_CODE) {
35
+ return isDigit(nextCode) ? "\\x00" : "\\0";
36
+ }
37
+ const named = NAMED_ESCAPES.get(code);
38
+ if (named !== undefined) {
39
+ return named;
40
+ }
41
+ const isPlainAscii = code >= FIRST_PRINTABLE_ASCII && code <= LAST_ASCII;
42
+ return isPlainAscii ? String.fromCharCode(code) : toUtf16Escape(code);
43
+ }
44
+
45
+ /** A double-quoted string literal as the TypeScript printer writes a synthesized one. */
46
+ export function printEscapedString(value: string): string {
47
+ let escaped = "";
48
+ for (let index = 0; index < value.length; index++) {
49
+ escaped += escapeCodeUnit(value.charCodeAt(index), value.charCodeAt(index + 1));
50
+ }
51
+ return `"${escaped}"`;
52
+ }
53
+
54
+ /** A string literal in the given encoding (see `IrStringEncoding`). */
55
+ export function printStringLiteral(value: string, encoding: IrStringEncoding): string {
56
+ return encoding === "json" ? JSON.stringify(value) : printEscapedString(value);
57
+ }
58
+
59
+ /** A number as the original writes it: the absolute value's `String()` text, with a minus sign. */
60
+ export function printNumberLiteral(value: number): string {
61
+ return value < 0 ? `-${String(Math.abs(value))}` : String(value);
62
+ }