openapi-typesafe 1.0.0-rc.2 → 1.0.0-rc.4

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 (514) hide show
  1. package/CHANGELOG.md +1831 -0
  2. package/dist/adapters/node-deprecations/node-deprecations.cjs +14 -0
  3. package/dist/adapters/node-deprecations/node-deprecations.cjs.map +1 -0
  4. package/dist/adapters/node-deprecations/node-deprecations.mjs +12 -0
  5. package/dist/adapters/node-deprecations/node-deprecations.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  7. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  9. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  11. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  12. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  13. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  14. package/dist/adapters/node-file-system/node-file-system.cjs +90 -14
  15. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  16. package/dist/adapters/node-file-system/node-file-system.mjs +90 -14
  17. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +75 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +72 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  27. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  29. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +14 -15
  31. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +12 -13
  33. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-access.cjs +31 -3
  35. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-access.mjs +31 -3
  37. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-holders.cjs +2 -2
  39. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-holders.mjs +3 -3
  41. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  43. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  44. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  45. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +35 -6
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +35 -6
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +47 -0
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +44 -0
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  54. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  55. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  57. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  58. package/dist/adapters/redocly-loader/schema-source.cjs +11 -7
  59. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/schema-source.mjs +12 -8
  61. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  63. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  64. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  65. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  66. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  67. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  68. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  69. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  70. package/dist/api/default-ports.cjs +19 -2
  71. package/dist/api/default-ports.cjs.map +1 -1
  72. package/dist/api/default-ports.mjs +19 -3
  73. package/dist/api/default-ports.mjs.map +1 -1
  74. package/dist/api/discriminator-conflict-warnings.cjs +1 -1
  75. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -1
  76. package/dist/api/discriminator-conflict-warnings.mjs +2 -2
  77. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -1
  78. package/dist/api/discriminator-enum-parent.cjs +2 -2
  79. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  80. package/dist/api/discriminator-enum-parent.mjs +3 -3
  81. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  82. package/dist/api/discriminator-other-owners.cjs +5 -3
  83. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  84. package/dist/api/discriminator-other-owners.mjs +5 -3
  85. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  86. package/dist/api/discriminator-patch.cjs +8 -4
  87. package/dist/api/discriminator-patch.cjs.map +1 -1
  88. package/dist/api/discriminator-patch.mjs +9 -5
  89. package/dist/api/discriminator-patch.mjs.map +1 -1
  90. package/dist/api/discriminator-scan.cjs +17 -10
  91. package/dist/api/discriminator-scan.cjs.map +1 -1
  92. package/dist/api/discriminator-scan.mjs +18 -11
  93. package/dist/api/discriminator-scan.mjs.map +1 -1
  94. package/dist/api/document-run.cjs +4 -3
  95. package/dist/api/document-run.cjs.map +1 -1
  96. package/dist/api/document-run.mjs +4 -3
  97. package/dist/api/document-run.mjs.map +1 -1
  98. package/dist/api/legacy-callback-warning.cjs +7 -4
  99. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.mjs +8 -5
  101. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  102. package/dist/api/legacy-utils.cjs.map +1 -1
  103. package/dist/api/legacy-utils.mjs.map +1 -1
  104. package/dist/api/openapi-ts.cjs +9 -5
  105. package/dist/api/openapi-ts.cjs.map +1 -1
  106. package/dist/api/openapi-ts.mjs +10 -7
  107. package/dist/api/openapi-ts.mjs.map +1 -1
  108. package/dist/api/schema-callbacks.cjs +36 -12
  109. package/dist/api/schema-callbacks.cjs.map +1 -1
  110. package/dist/api/schema-callbacks.mjs +36 -12
  111. package/dist/api/schema-callbacks.mjs.map +1 -1
  112. package/dist/api/string-to-ast.cjs +7 -9
  113. package/dist/api/string-to-ast.cjs.map +1 -1
  114. package/dist/api/string-to-ast.mjs +8 -9
  115. package/dist/api/string-to-ast.mjs.map +1 -1
  116. package/dist/api/transform-context.cjs +7 -3
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +7 -3
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +42 -12
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +44 -14
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/application/print/text-writer.cjs +10 -3
  125. package/dist/application/print/text-writer.cjs.map +1 -1
  126. package/dist/application/print/text-writer.mjs +10 -3
  127. package/dist/application/print/text-writer.mjs.map +1 -1
  128. package/dist/application/stack-overflow.cjs +2 -1
  129. package/dist/application/stack-overflow.cjs.map +1 -1
  130. package/dist/application/stack-overflow.mjs +2 -1
  131. package/dist/application/stack-overflow.mjs.map +1 -1
  132. package/dist/application/transform/document/components.cjs +2 -2
  133. package/dist/application/transform/document/components.cjs.map +1 -1
  134. package/dist/application/transform/document/components.mjs +4 -4
  135. package/dist/application/transform/document/components.mjs.map +1 -1
  136. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  137. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  138. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  139. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  140. package/dist/application/transform/document/defs-root.cjs +1 -1
  141. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  142. package/dist/application/transform/document/defs-root.mjs +2 -2
  143. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  144. package/dist/application/transform/document/document.cjs +4 -1
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +3 -2
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  149. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  150. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  151. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +1 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  154. package/dist/application/transform/document/global-type-references.mjs +1 -1
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  156. package/dist/application/transform/document/media-type.cjs +2 -2
  157. package/dist/application/transform/document/media-type.cjs.map +1 -1
  158. package/dist/application/transform/document/media-type.mjs +3 -3
  159. package/dist/application/transform/document/media-type.mjs.map +1 -1
  160. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  161. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  162. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  163. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  164. package/dist/application/transform/document/operation.cjs +1 -1
  165. package/dist/application/transform/document/operation.cjs.map +1 -1
  166. package/dist/application/transform/document/operation.mjs +2 -2
  167. package/dist/application/transform/document/operation.mjs.map +1 -1
  168. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  169. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  170. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  171. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  172. package/dist/application/transform/document/parameter.cjs +12 -4
  173. package/dist/application/transform/document/parameter.cjs.map +1 -1
  174. package/dist/application/transform/document/parameter.mjs +13 -5
  175. package/dist/application/transform/document/parameter.mjs.map +1 -1
  176. package/dist/application/transform/document/parameters.cjs +7 -30
  177. package/dist/application/transform/document/parameters.cjs.map +1 -1
  178. package/dist/application/transform/document/parameters.mjs +8 -31
  179. package/dist/application/transform/document/parameters.mjs.map +1 -1
  180. package/dist/application/transform/document/path-item.cjs +11 -14
  181. package/dist/application/transform/document/path-item.cjs.map +1 -1
  182. package/dist/application/transform/document/path-item.mjs +12 -16
  183. package/dist/application/transform/document/path-item.mjs.map +1 -1
  184. package/dist/application/transform/document/paths-enum.cjs +1 -0
  185. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  186. package/dist/application/transform/document/paths-enum.mjs +1 -1
  187. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  188. package/dist/application/transform/document/paths.cjs +6 -2
  189. package/dist/application/transform/document/paths.cjs.map +1 -1
  190. package/dist/application/transform/document/paths.mjs +8 -4
  191. package/dist/application/transform/document/paths.mjs.map +1 -1
  192. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  193. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  194. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  195. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  196. package/dist/application/transform/document/request-body.cjs +1 -1
  197. package/dist/application/transform/document/request-body.cjs.map +1 -1
  198. package/dist/application/transform/document/request-body.mjs +2 -2
  199. package/dist/application/transform/document/request-body.mjs.map +1 -1
  200. package/dist/application/transform/document/response.cjs +2 -2
  201. package/dist/application/transform/document/response.cjs.map +1 -1
  202. package/dist/application/transform/document/response.mjs +3 -3
  203. package/dist/application/transform/document/response.mjs.map +1 -1
  204. package/dist/application/transform/document/responses.cjs +1 -1
  205. package/dist/application/transform/document/responses.cjs.map +1 -1
  206. package/dist/application/transform/document/responses.mjs +2 -2
  207. package/dist/application/transform/document/responses.mjs.map +1 -1
  208. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  209. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  210. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  211. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  212. package/dist/application/transform/document/type-resolution.cjs +3 -1
  213. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  214. package/dist/application/transform/document/type-resolution.mjs +3 -1
  215. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  216. package/dist/application/transform/document/webhooks.cjs +1 -1
  217. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  218. package/dist/application/transform/document/webhooks.mjs +2 -2
  219. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  220. package/dist/application/transform/footer/document-footer.cjs +10 -2
  221. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  222. package/dist/application/transform/footer/document-footer.mjs +10 -2
  223. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  224. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  225. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  226. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  227. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  228. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  229. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  230. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  231. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  232. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  233. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  234. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  235. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  236. package/dist/application/transform/helper-types.cjs +1 -1
  237. package/dist/application/transform/helper-types.cjs.map +1 -1
  238. package/dist/application/transform/helper-types.mjs +1 -1
  239. package/dist/application/transform/helper-types.mjs.map +1 -1
  240. package/dist/application/transform/numbered-names.cjs +9 -0
  241. package/dist/application/transform/numbered-names.cjs.map +1 -1
  242. package/dist/application/transform/numbered-names.mjs +9 -1
  243. package/dist/application/transform/numbered-names.mjs.map +1 -1
  244. package/dist/application/transform/ref-pointer/generated-location.cjs +1 -1
  245. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  246. package/dist/application/transform/ref-pointer/generated-location.mjs +2 -2
  247. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  248. package/dist/application/transform/ref-pointer/pointer-type.cjs +1 -1
  249. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  250. package/dist/application/transform/ref-pointer/pointer-type.mjs +2 -2
  251. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  252. package/dist/application/transform/ref-type.cjs +2 -1
  253. package/dist/application/transform/ref-type.cjs.map +1 -1
  254. package/dist/application/transform/ref-type.mjs +2 -1
  255. package/dist/application/transform/ref-type.mjs.map +1 -1
  256. package/dist/application/transform/schema/access-flags.cjs +1 -1
  257. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  258. package/dist/application/transform/schema/access-flags.mjs +2 -2
  259. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  260. package/dist/application/transform/schema/array-type.cjs +2 -2
  261. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  262. package/dist/application/transform/schema/array-type.mjs +3 -3
  263. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  264. package/dist/application/transform/schema/composition-type.cjs +4 -4
  265. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/composition-type.mjs +6 -6
  267. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/enum-rule.cjs +4 -6
  269. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  270. package/dist/application/transform/schema/enum-rule.mjs +6 -8
  271. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  272. package/dist/application/transform/schema/object-type.cjs +3 -3
  273. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/object-type.mjs +4 -4
  275. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/presence-members.cjs +1 -1
  277. package/dist/application/transform/schema/presence-members.cjs.map +1 -1
  278. package/dist/application/transform/schema/presence-members.mjs +2 -2
  279. package/dist/application/transform/schema/presence-members.mjs.map +1 -1
  280. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  281. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  282. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  283. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  284. package/dist/application/transform/schema/required-variants.cjs +2 -2
  285. package/dist/application/transform/schema/required-variants.cjs.map +1 -1
  286. package/dist/application/transform/schema/required-variants.mjs +3 -3
  287. package/dist/application/transform/schema/required-variants.mjs.map +1 -1
  288. package/dist/application/transform/schema/schema-transform.cjs +4 -2
  289. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  290. package/dist/application/transform/schema/schema-transform.mjs +4 -2
  291. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  292. package/dist/application/transform/schema/unevaluated-properties.cjs +1 -1
  293. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  294. package/dist/application/transform/schema/unevaluated-properties.mjs +2 -2
  295. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  296. package/dist/application/transform/schema-comment.cjs +6 -2
  297. package/dist/application/transform/schema-comment.cjs.map +1 -1
  298. package/dist/application/transform/schema-comment.mjs +7 -3
  299. package/dist/application/transform/schema-comment.mjs.map +1 -1
  300. package/dist/cli/api-settings.cjs +62 -6
  301. package/dist/cli/api-settings.cjs.map +1 -1
  302. package/dist/cli/api-settings.mjs +60 -7
  303. package/dist/cli/api-settings.mjs.map +1 -1
  304. package/dist/cli/api-writes.cjs +72 -0
  305. package/dist/cli/api-writes.cjs.map +1 -0
  306. package/dist/cli/api-writes.mjs +69 -0
  307. package/dist/cli/api-writes.mjs.map +1 -0
  308. package/dist/cli/cli-errors.cjs +12 -1
  309. package/dist/cli/cli-errors.cjs.map +1 -1
  310. package/dist/cli/cli-errors.mjs +12 -1
  311. package/dist/cli/cli-errors.mjs.map +1 -1
  312. package/dist/cli/cli-output.cjs +106 -1
  313. package/dist/cli/cli-output.cjs.map +1 -1
  314. package/dist/cli/cli-output.mjs +99 -2
  315. package/dist/cli/cli-output.mjs.map +1 -1
  316. package/dist/cli/main.cjs +5 -1
  317. package/dist/cli/main.cjs.map +1 -1
  318. package/dist/cli/main.mjs +6 -2
  319. package/dist/cli/main.mjs.map +1 -1
  320. package/dist/cli/redocly-apis.cjs +82 -36
  321. package/dist/cli/redocly-apis.cjs.map +1 -1
  322. package/dist/cli/redocly-apis.mjs +85 -39
  323. package/dist/cli/redocly-apis.mjs.map +1 -1
  324. package/dist/cli/run-cli.cjs +13 -7
  325. package/dist/cli/run-cli.cjs.map +1 -1
  326. package/dist/cli/run-cli.mjs +14 -8
  327. package/dist/cli/run-cli.mjs.map +1 -1
  328. package/dist/domain/append-all.cjs +10 -0
  329. package/dist/domain/append-all.cjs.map +1 -0
  330. package/dist/domain/append-all.mjs +8 -0
  331. package/dist/domain/append-all.mjs.map +1 -0
  332. package/dist/domain/cause-secrets.cjs +37 -0
  333. package/dist/domain/cause-secrets.cjs.map +1 -0
  334. package/dist/domain/cause-secrets.mjs +35 -0
  335. package/dist/domain/cause-secrets.mjs.map +1 -0
  336. package/dist/domain/deprecations.cjs +11 -0
  337. package/dist/domain/deprecations.cjs.map +1 -0
  338. package/dist/domain/deprecations.mjs +9 -0
  339. package/dist/domain/deprecations.mjs.map +1 -0
  340. package/dist/domain/errors.cjs +9 -3
  341. package/dist/domain/errors.cjs.map +1 -1
  342. package/dist/domain/errors.mjs +9 -3
  343. package/dist/domain/errors.mjs.map +1 -1
  344. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  345. package/dist/domain/ir/identifier-text.mjs +1 -1
  346. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  347. package/dist/domain/ir/ir-shape.cjs +187 -0
  348. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  349. package/dist/domain/ir/ir-shape.mjs +184 -0
  350. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  351. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  352. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  353. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  354. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  355. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  356. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  357. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  358. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  359. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  360. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  361. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  362. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  363. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  364. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  365. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  366. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  367. package/dist/domain/openapi/json-pointer.cjs +43 -1
  368. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  369. package/dist/domain/openapi/json-pointer.mjs +40 -2
  370. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  371. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  372. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  373. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  374. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  375. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  376. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  377. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  378. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  379. package/dist/domain/output-fixes.cjs +25 -14
  380. package/dist/domain/output-fixes.cjs.map +1 -1
  381. package/dist/domain/output-fixes.mjs +25 -13
  382. package/dist/domain/output-fixes.mjs.map +1 -1
  383. package/dist/domain/url-secrets.cjs +48 -0
  384. package/dist/domain/url-secrets.cjs.map +1 -0
  385. package/dist/domain/url-secrets.mjs +45 -0
  386. package/dist/domain/url-secrets.mjs.map +1 -0
  387. package/dist/domain/warnings.cjs +0 -1
  388. package/dist/domain/warnings.cjs.map +1 -1
  389. package/dist/domain/warnings.mjs +0 -1
  390. package/dist/domain/warnings.mjs.map +1 -1
  391. package/dist/index.cjs +2 -3
  392. package/dist/index.cjs.map +1 -1
  393. package/dist/index.d.cts +57 -20
  394. package/dist/index.d.mts +57 -20
  395. package/dist/index.d.ts +57 -20
  396. package/dist/index.mjs +3 -2
  397. package/dist/index.mjs.map +1 -1
  398. package/package.json +5 -6
  399. package/src/adapters/node-deprecations/node-deprecations.ts +14 -0
  400. package/src/adapters/node-file-system/file-claims.ts +138 -0
  401. package/src/adapters/node-file-system/file-identity.ts +137 -0
  402. package/src/adapters/node-file-system/node-file-system.ts +145 -18
  403. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +95 -0
  404. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  405. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  406. package/src/adapters/redocly-loader/redocly-schema-loader.ts +18 -24
  407. package/src/adapters/redocly-loader/ref-access.ts +37 -3
  408. package/src/adapters/redocly-loader/ref-holders.ts +3 -3
  409. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  410. package/src/adapters/redocly-loader/remote-fetch.ts +74 -11
  411. package/src/adapters/redocly-loader/remote-node-limit.ts +62 -0
  412. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  413. package/src/adapters/redocly-loader/schema-source.ts +20 -8
  414. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  415. package/src/adapters/terminal-logger/terminal-logger.ts +10 -5
  416. package/src/api/default-ports.ts +40 -4
  417. package/src/api/discriminator-conflict-warnings.ts +2 -2
  418. package/src/api/discriminator-enum-parent.ts +3 -3
  419. package/src/api/discriminator-other-owners.ts +5 -3
  420. package/src/api/discriminator-patch.ts +9 -6
  421. package/src/api/discriminator-scan.ts +19 -11
  422. package/src/api/document-run.ts +9 -3
  423. package/src/api/legacy-callback-warning.ts +13 -6
  424. package/src/api/legacy-utils.ts +5 -1
  425. package/src/api/openapi-ts.ts +26 -7
  426. package/src/api/run-context.ts +6 -0
  427. package/src/api/schema-callbacks.ts +60 -17
  428. package/src/api/string-to-ast.ts +11 -15
  429. package/src/api/transform-context.ts +7 -3
  430. package/src/api/transform-schema.ts +67 -15
  431. package/src/application/ports/deprecation-reporter.ts +9 -0
  432. package/src/application/ports/file-system.ts +39 -0
  433. package/src/application/ports/schema-loader.ts +11 -1
  434. package/src/application/print/text-writer.ts +10 -3
  435. package/src/application/stack-overflow.ts +9 -5
  436. package/src/application/transform/document/components.ts +4 -4
  437. package/src/application/transform/document/declared-type-names.ts +36 -0
  438. package/src/application/transform/document/defs-root.ts +2 -2
  439. package/src/application/transform/document/document.ts +4 -3
  440. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  441. package/src/application/transform/document/global-type-references.ts +1 -1
  442. package/src/application/transform/document/media-type.ts +4 -3
  443. package/src/application/transform/document/operation-keys-written.ts +27 -0
  444. package/src/application/transform/document/operation.ts +2 -2
  445. package/src/application/transform/document/parameter-entries.ts +70 -0
  446. package/src/application/transform/document/parameter.ts +21 -9
  447. package/src/application/transform/document/parameters.ts +13 -58
  448. package/src/application/transform/document/path-item.ts +13 -31
  449. package/src/application/transform/document/paths-enum.ts +1 -1
  450. package/src/application/transform/document/paths.ts +8 -4
  451. package/src/application/transform/document/referenced-parameter.ts +146 -0
  452. package/src/application/transform/document/request-body.ts +2 -2
  453. package/src/application/transform/document/response.ts +3 -3
  454. package/src/application/transform/document/responses.ts +2 -2
  455. package/src/application/transform/document/root-type-aliases.ts +17 -38
  456. package/src/application/transform/document/type-resolution.ts +2 -1
  457. package/src/application/transform/document/webhooks.ts +2 -2
  458. package/src/application/transform/footer/document-footer.ts +18 -1
  459. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  460. package/src/application/transform/footer/operation-keys.ts +28 -0
  461. package/src/application/transform/footer/type-evaluation.ts +4 -4
  462. package/src/application/transform/helper-types.ts +6 -5
  463. package/src/application/transform/numbered-names.ts +15 -0
  464. package/src/application/transform/ref-pointer/generated-location.ts +2 -2
  465. package/src/application/transform/ref-pointer/pointer-type.ts +2 -4
  466. package/src/application/transform/ref-type.ts +2 -1
  467. package/src/application/transform/schema/access-flags.ts +2 -2
  468. package/src/application/transform/schema/array-type.ts +3 -5
  469. package/src/application/transform/schema/composition-type.ts +6 -6
  470. package/src/application/transform/schema/enum-rule.ts +10 -8
  471. package/src/application/transform/schema/object-type.ts +4 -4
  472. package/src/application/transform/schema/presence-members.ts +2 -2
  473. package/src/application/transform/schema/ref-siblings.ts +76 -0
  474. package/src/application/transform/schema/required-variants.ts +3 -3
  475. package/src/application/transform/schema/schema-context.ts +3 -0
  476. package/src/application/transform/schema/schema-transform.ts +4 -2
  477. package/src/application/transform/schema/unevaluated-properties.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +7 -3
  479. package/src/application/transform/transform-context.ts +5 -0
  480. package/src/cli/api-settings.ts +82 -7
  481. package/src/cli/api-writes.ts +117 -0
  482. package/src/cli/cli-dependencies.ts +21 -4
  483. package/src/cli/cli-errors.ts +20 -1
  484. package/src/cli/cli-output.ts +186 -7
  485. package/src/cli/main.ts +6 -3
  486. package/src/cli/redocly-apis.ts +153 -48
  487. package/src/cli/run-cli.ts +37 -8
  488. package/src/domain/append-all.ts +10 -0
  489. package/src/domain/cause-secrets.ts +52 -0
  490. package/src/domain/deprecations.ts +15 -0
  491. package/src/domain/errors.ts +22 -7
  492. package/src/domain/ir/identifier-text.ts +6 -5
  493. package/src/domain/ir/ir-shape.ts +299 -0
  494. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  495. package/src/domain/openapi/alias-expansion.ts +4 -1
  496. package/src/domain/openapi/discriminated-union.ts +6 -4
  497. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  498. package/src/domain/openapi/document-object.ts +2 -0
  499. package/src/domain/openapi/json-pointer.ts +96 -7
  500. package/src/domain/openapi/schema-dialect.ts +22 -0
  501. package/src/domain/openapi/unsupported-features.ts +2 -2
  502. package/src/domain/output-fixes.ts +37 -18
  503. package/src/domain/url-secrets.ts +72 -0
  504. package/src/domain/warnings.ts +0 -1
  505. package/src/index.ts +2 -6
  506. package/src/types/generator-options.ts +1 -1
  507. package/dist/cli/main.d.cts +0 -2
  508. package/dist/cli/main.d.mts +0 -2
  509. package/dist/cli/main.d.ts +0 -2
  510. package/dist/domain/url-credentials.cjs +0 -10
  511. package/dist/domain/url-credentials.cjs.map +0 -1
  512. package/dist/domain/url-credentials.mjs +0 -8
  513. package/dist/domain/url-credentials.mjs.map +0 -1
  514. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"schema-callbacks.mjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrCallbackType,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message:\n `transformProperty at ${path} returned a property ` +\n \"with syntax the generator cannot read\",\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(callback: \"transform\" | \"postTransform\", path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not a TypeScript node`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/** An IR callback type; text is a raw type, printed as written. */\nfunction fromCallbackType(type: IrCallbackType): IrType {\n return typeof type === \"string\" ? irRaw(type) : type;\n}\n\nfunction irCustomType(result: ReturnType<IrTransform>): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };\n }\n return { type: fromCallbackType(result), isOptional: false };\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)))\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(result);\n },\n transformProperty: (property, schema, location) =>\n transformProperty?.(property, schema as SchemaObject, nodeOptions(ctx, location)) ?? null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-callbacks.mjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport { isPrintableIrProperty, isPrintableIrType } from \"../domain/ir/ir-shape.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\n/** What a legacy `transformProperty` result fails to be. */\nconst LEGACY_PROPERTY_PROBLEM = \"a property with syntax the generator cannot read\";\n\n/** A `transformProperty` result the generator cannot print as a property. */\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, problem = LEGACY_PROPERTY_PROBLEM) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `transformProperty at ${path} returned ${problem}`,\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(\n callback: \"transform\" | \"postTransform\",\n path: string | undefined,\n expected = \"a TypeScript node\",\n ) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not ${expected}`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\n/** What an IR type result must be (docs/node.md, IR callbacks). */\nconst IR_TYPE_EXPECTED = \"an IR type or non-empty type text\";\n\n/** What an IR property result must be. */\nconst IR_PROPERTY_PROBLEM = \"a value that is not an IR property the generator can print\";\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/**\n * An IR callback type; text is a raw type, printed as written. Any other value, and IR the\n * printer cannot write as TypeScript, fails with `CALLBACK_RESULT_UNREADABLE` (`ir-shape.ts`).\n */\nfunction fromCallbackType(\n callback: \"transform\" | \"postTransform\",\n type: unknown,\n location: SchemaLocation,\n): IrType {\n const candidate = typeof type === \"string\" ? irRaw(type) : type;\n if (!isPrintableIrType(candidate)) {\n throw new UnreadableTypeError(callback, location.path, IR_TYPE_EXPECTED);\n }\n return candidate;\n}\n\nfunction irCustomType(result: unknown, location: SchemaLocation): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n const { schema, questionToken } = result as { schema: unknown; questionToken?: unknown };\n return {\n type: fromCallbackType(\"transform\", schema, location),\n isOptional: Boolean(questionToken),\n };\n }\n return { type: fromCallbackType(\"transform\", result, location), isOptional: false };\n}\n\nfunction irProperty(result: unknown, location: SchemaLocation): IrPropertySignature | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (!isPrintableIrProperty(result)) {\n throw new UnreadablePropertyError(location.path, IR_PROPERTY_PROBLEM);\n }\n return result;\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`. The results are checked, since\n * JavaScript callers can return any value.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)), location)\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(\"postTransform\", result, location);\n },\n transformProperty: (property, schema, location) =>\n transformProperty\n ? irProperty(\n transformProperty(property, schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":[],"mappings":"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"}
@@ -1,21 +1,19 @@
1
1
  'use strict';
2
2
 
3
- const node_util = require('node:util');
4
3
  const irDeclarationsToTypescript = require('../adapters/type-ast-bridge/ir-declarations-to-typescript.cjs');
5
4
  const loadTypescript = require('../adapters/type-ast-bridge/load-typescript.cjs');
5
+ const deprecations = require('../domain/deprecations.cjs');
6
+ const defaultPorts = require('./default-ports.cjs');
6
7
  const legacyCallbackWarning = require('./legacy-callback-warning.cjs');
7
8
 
8
9
  const STRING_TO_AST_DEPRECATION = `stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR callback (irCallbacks: true) instead: ${legacyCallbackWarning.IR_CALLBACKS_GUIDE_URL}`;
9
- const STRING_TO_AST_DEPRECATION_CODE = "OPENAPI_TYPESAFE_DEP_STRING_TO_AST";
10
- function parseSource(source) {
10
+ function stringToAST(source) {
11
+ defaultPorts.defaultDeprecationReporter().report(
12
+ deprecations.DEPRECATION_CODES.OPENAPI_TYPESAFE_DEP_STRING_TO_AST,
13
+ STRING_TO_AST_DEPRECATION
14
+ );
11
15
  return [...irDeclarationsToTypescript.parseStatements(loadTypescript.loadTypeScript(), source)];
12
16
  }
13
- const stringToAST = node_util.deprecate(
14
- parseSource,
15
- STRING_TO_AST_DEPRECATION,
16
- STRING_TO_AST_DEPRECATION_CODE
17
- );
18
17
 
19
- exports.STRING_TO_AST_DEPRECATION_CODE = STRING_TO_AST_DEPRECATION_CODE;
20
18
  exports.stringToAST = stringToAST;
21
19
  //# sourceMappingURL=string-to-ast.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"string-to-ast.cjs","sources":["../../src/api/string-to-ast.ts"],"sourcesContent":["import { deprecate } from \"node:util\";\nimport { parseStatements } from \"../adapters/type-ast-bridge/ir-declarations-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { IR_CALLBACKS_GUIDE_URL } from \"./legacy-callback-warning.js\";\n\nconst STRING_TO_AST_DEPRECATION =\n \"stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR \" +\n `callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;\n\n/** Node's deprecation code for `stringToAST`, so users can filter or trace the warning. */\nexport const STRING_TO_AST_DEPRECATION_CODE = \"OPENAPI_TYPESAFE_DEP_STRING_TO_AST\";\n\nfunction parseSource(source: string): unknown[] {\n return [...parseStatements(loadTypeScript(), source)];\n}\n\n/**\n * Convert an arbitrary string to TS (assuming it’s valid). Parses with the TypeScript bridge, so\n * it needs TypeScript 6 or earlier (or `@typescript/typescript6`). Node's `util.deprecate` warns\n * on the first call only.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 7). Use type text in IR callbacks.\n */\nexport const stringToAST: (source: string) => unknown[] = deprecate(\n parseSource,\n STRING_TO_AST_DEPRECATION,\n STRING_TO_AST_DEPRECATION_CODE,\n);\n"],"names":["IR_CALLBACKS_GUIDE_URL","parseStatements","loadTypeScript","deprecate"],"mappings":";;;;;;;AAKA,MAAM,yBAAA,GACJ,gIACyCA,4CAAsB,CAAA,CAAA;AAG1D,MAAM,8BAAA,GAAiC;AAE9C,SAAS,YAAY,MAAA,EAA2B;AAC9C,EAAA,OAAO,CAAC,GAAGC,0CAAA,CAAgBC,6BAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AACtD;AAQO,MAAM,WAAA,GAA6CC,mBAAA;AAAA,EACxD,WAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF;;;"}
1
+ {"version":3,"file":"string-to-ast.cjs","sources":["../../src/api/string-to-ast.ts"],"sourcesContent":["import { parseStatements } from \"../adapters/type-ast-bridge/ir-declarations-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { DEPRECATION_CODES } from \"../domain/deprecations.js\";\nimport { defaultDeprecationReporter } from \"./default-ports.js\";\nimport { IR_CALLBACKS_GUIDE_URL } from \"./legacy-callback-warning.js\";\n\nconst STRING_TO_AST_DEPRECATION =\n \"stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR \" +\n `callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;\n\n/**\n * Convert an arbitrary string to TS (assuming it’s valid). Parses with the TypeScript bridge, so\n * it needs TypeScript 6 or earlier (or `@typescript/typescript6`). Emits a Node.js\n * `DeprecationWarning` (`OPENAPI_TYPESAFE_DEP_STRING_TO_AST`) on the first call only.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 7). Use type text in IR callbacks.\n */\nexport function stringToAST(source: string): unknown[] {\n defaultDeprecationReporter().report(\n DEPRECATION_CODES.OPENAPI_TYPESAFE_DEP_STRING_TO_AST,\n STRING_TO_AST_DEPRECATION,\n );\n return [...parseStatements(loadTypeScript(), source)];\n}\n"],"names":["IR_CALLBACKS_GUIDE_URL","defaultDeprecationReporter","DEPRECATION_CODES","parseStatements","loadTypeScript"],"mappings":";;;;;;;;AAMA,MAAM,yBAAA,GACJ,gIACyCA,4CAAsB,CAAA,CAAA;AAQ1D,SAAS,YAAY,MAAA,EAA2B;AACrD,EAAAC,uCAAA,EAA2B,CAAE,MAAA;AAAA,IAC3BC,8BAAA,CAAkB,kCAAA;AAAA,IAClB;AAAA,GACF;AACA,EAAA,OAAO,CAAC,GAAGC,0CAAA,CAAgBC,6BAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AACtD;;"}
@@ -1,18 +1,17 @@
1
- import { deprecate } from 'node:util';
2
1
  import { parseStatements } from '../adapters/type-ast-bridge/ir-declarations-to-typescript.mjs';
3
2
  import { loadTypeScript } from '../adapters/type-ast-bridge/load-typescript.mjs';
3
+ import { DEPRECATION_CODES } from '../domain/deprecations.mjs';
4
+ import { defaultDeprecationReporter } from './default-ports.mjs';
4
5
  import { IR_CALLBACKS_GUIDE_URL } from './legacy-callback-warning.mjs';
5
6
 
6
7
  const STRING_TO_AST_DEPRECATION = `stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;
7
- const STRING_TO_AST_DEPRECATION_CODE = "OPENAPI_TYPESAFE_DEP_STRING_TO_AST";
8
- function parseSource(source) {
8
+ function stringToAST(source) {
9
+ defaultDeprecationReporter().report(
10
+ DEPRECATION_CODES.OPENAPI_TYPESAFE_DEP_STRING_TO_AST,
11
+ STRING_TO_AST_DEPRECATION
12
+ );
9
13
  return [...parseStatements(loadTypeScript(), source)];
10
14
  }
11
- const stringToAST = deprecate(
12
- parseSource,
13
- STRING_TO_AST_DEPRECATION,
14
- STRING_TO_AST_DEPRECATION_CODE
15
- );
16
15
 
17
- export { STRING_TO_AST_DEPRECATION_CODE, stringToAST };
16
+ export { stringToAST };
18
17
  //# sourceMappingURL=string-to-ast.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"string-to-ast.mjs","sources":["../../src/api/string-to-ast.ts"],"sourcesContent":["import { deprecate } from \"node:util\";\nimport { parseStatements } from \"../adapters/type-ast-bridge/ir-declarations-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { IR_CALLBACKS_GUIDE_URL } from \"./legacy-callback-warning.js\";\n\nconst STRING_TO_AST_DEPRECATION =\n \"stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR \" +\n `callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;\n\n/** Node's deprecation code for `stringToAST`, so users can filter or trace the warning. */\nexport const STRING_TO_AST_DEPRECATION_CODE = \"OPENAPI_TYPESAFE_DEP_STRING_TO_AST\";\n\nfunction parseSource(source: string): unknown[] {\n return [...parseStatements(loadTypeScript(), source)];\n}\n\n/**\n * Convert an arbitrary string to TS (assuming it’s valid). Parses with the TypeScript bridge, so\n * it needs TypeScript 6 or earlier (or `@typescript/typescript6`). Node's `util.deprecate` warns\n * on the first call only.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 7). Use type text in IR callbacks.\n */\nexport const stringToAST: (source: string) => unknown[] = deprecate(\n parseSource,\n STRING_TO_AST_DEPRECATION,\n STRING_TO_AST_DEPRECATION_CODE,\n);\n"],"names":[],"mappings":";;;;;AAKA,MAAM,yBAAA,GACJ,gIACyC,sBAAsB,CAAA,CAAA;AAG1D,MAAM,8BAAA,GAAiC;AAE9C,SAAS,YAAY,MAAA,EAA2B;AAC9C,EAAA,OAAO,CAAC,GAAG,eAAA,CAAgB,cAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AACtD;AAQO,MAAM,WAAA,GAA6C,SAAA;AAAA,EACxD,WAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF;;"}
1
+ {"version":3,"file":"string-to-ast.mjs","sources":["../../src/api/string-to-ast.ts"],"sourcesContent":["import { parseStatements } from \"../adapters/type-ast-bridge/ir-declarations-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { DEPRECATION_CODES } from \"../domain/deprecations.js\";\nimport { defaultDeprecationReporter } from \"./default-ports.js\";\nimport { IR_CALLBACKS_GUIDE_URL } from \"./legacy-callback-warning.js\";\n\nconst STRING_TO_AST_DEPRECATION =\n \"stringToAST() is deprecated and removed in 2.0. Return TypeScript type text from an IR \" +\n `callback (irCallbacks: true) instead: ${IR_CALLBACKS_GUIDE_URL}`;\n\n/**\n * Convert an arbitrary string to TS (assuming it’s valid). Parses with the TypeScript bridge, so\n * it needs TypeScript 6 or earlier (or `@typescript/typescript6`). Emits a Node.js\n * `DeprecationWarning` (`OPENAPI_TYPESAFE_DEP_STRING_TO_AST`) on the first call only.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 7). Use type text in IR callbacks.\n */\nexport function stringToAST(source: string): unknown[] {\n defaultDeprecationReporter().report(\n DEPRECATION_CODES.OPENAPI_TYPESAFE_DEP_STRING_TO_AST,\n STRING_TO_AST_DEPRECATION,\n );\n return [...parseStatements(loadTypeScript(), source)];\n}\n"],"names":[],"mappings":";;;;;;AAMA,MAAM,yBAAA,GACJ,gIACyC,sBAAsB,CAAA,CAAA;AAQ1D,SAAS,YAAY,MAAA,EAA2B;AACrD,EAAA,0BAAA,EAA2B,CAAE,MAAA;AAAA,IAC3B,iBAAA,CAAkB,kCAAA;AAAA,IAClB;AAAA,GACF;AACA,EAAA,OAAO,CAAC,GAAG,eAAA,CAAgB,cAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AACtD;;"}
@@ -2,6 +2,8 @@
2
2
 
3
3
  const changeCase = require('change-case');
4
4
  const documentFooter = require('../application/transform/footer/document-footer.cjs');
5
+ const jsonPointer = require('../domain/openapi/json-pointer.cjs');
6
+ const schemaDialect = require('../domain/openapi/schema-dialect.cjs');
5
7
  const defaultPorts = require('./default-ports.cjs');
6
8
  const footerSink = require('./footer-sink.cjs');
7
9
  const schemaCallbacks = require('./schema-callbacks.cjs');
@@ -37,6 +39,7 @@ function transformOptions(ctx) {
37
39
  immutable: ctx.immutable,
38
40
  propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,
39
41
  readWriteMarkers: ctx.readWriteMarkers,
42
+ schemaDialect: ctx.schemaDialect ?? schemaDialect.SCHEMA_DIALECTS.OPENAPI_3_0,
40
43
  generatePathParams: ctx.generatePathParams,
41
44
  pathParamsAsTypes: ctx.pathParamsAsTypes,
42
45
  rootTypes: ctx.rootTypes,
@@ -64,9 +67,10 @@ function createTransformContext(ctx) {
64
67
  options: transformOptions(ctx),
65
68
  refs: { resolve: (ref) => ctx.resolve(ref) },
66
69
  discriminators: {
67
- objectAt: (ref) => ctx.discriminators.objects[ref],
68
- isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),
69
- otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],
70
+ // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.
71
+ objectAt: (ref) => ctx.discriminators.objects[jsonPointer.canonicalRef(ref)],
72
+ isHandled: (ref) => ctx.discriminators.refsHandled.includes(jsonPointer.canonicalRef(ref)),
73
+ otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[jsonPointer.canonicalRef(ref)] ?? [],
70
74
  enumParentOf: (schema) => ctx.discriminators.enumParents?.get(schema)
71
75
  },
72
76
  footer: runFooter(ctx),
@@ -1 +1 @@
1
- {"version":3,"file":"transform-context.cjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n objectAt: (ref) => ctx.discriminators.objects[ref],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":["RunFooter","ContextFooterSink","changeCase","defaultLogger","monotonicNow","schemaCallbacks"],"mappings":"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"}
1
+ {"version":3,"file":"transform-context.cjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport { canonicalRef } from \"../domain/openapi/json-pointer.js\";\nimport { SCHEMA_DIALECTS } from \"../domain/openapi/schema-dialect.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.\n objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":["SCHEMA_DIALECTS","RunFooter","ContextFooterSink","changeCase","defaultLogger","monotonicNow","canonicalRef","schemaCallbacks"],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import * as changeCase from 'change-case';
2
2
  import { RunFooter } from '../application/transform/footer/document-footer.mjs';
3
+ import { canonicalRef } from '../domain/openapi/json-pointer.mjs';
4
+ import { SCHEMA_DIALECTS } from '../domain/openapi/schema-dialect.mjs';
3
5
  import { defaultLogger, monotonicNow } from './default-ports.mjs';
4
6
  import { ContextFooterSink } from './footer-sink.mjs';
5
7
  import { schemaCallbacks } from './schema-callbacks.mjs';
@@ -21,6 +23,7 @@ function transformOptions(ctx) {
21
23
  immutable: ctx.immutable,
22
24
  propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,
23
25
  readWriteMarkers: ctx.readWriteMarkers,
26
+ schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,
24
27
  generatePathParams: ctx.generatePathParams,
25
28
  pathParamsAsTypes: ctx.pathParamsAsTypes,
26
29
  rootTypes: ctx.rootTypes,
@@ -48,9 +51,10 @@ function createTransformContext(ctx) {
48
51
  options: transformOptions(ctx),
49
52
  refs: { resolve: (ref) => ctx.resolve(ref) },
50
53
  discriminators: {
51
- objectAt: (ref) => ctx.discriminators.objects[ref],
52
- isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),
53
- otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],
54
+ // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.
55
+ objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],
56
+ isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),
57
+ otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],
54
58
  enumParentOf: (schema) => ctx.discriminators.enumParents?.get(schema)
55
59
  },
56
60
  footer: runFooter(ctx),
@@ -1 +1 @@
1
- {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n objectAt: (ref) => ctx.discriminators.objects[ref],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport { canonicalRef } from \"../domain/openapi/json-pointer.js\";\nimport { SCHEMA_DIALECTS } from \"../domain/openapi/schema-dialect.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.\n objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}
@@ -3,10 +3,15 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const document = require('../application/transform/document/document.cjs');
6
+ const enumNamesGivenBack = require('../application/transform/document/enum-names-given-back.cjs');
7
+ const operationKeysWritten = require('../application/transform/document/operation-keys-written.cjs');
6
8
  const rootTypeAliases = require('../application/transform/document/root-type-aliases.cjs');
7
9
  const documentFooter = require('../application/transform/footer/document-footer.cjs');
10
+ const enumNameClaims = require('../application/transform/footer/enum-name-claims.cjs');
8
11
  const enumValuesCheck = require('../application/transform/footer/enum-values-check.cjs');
12
+ const operationKeys = require('../application/transform/footer/operation-keys.cjs');
9
13
  const sharedEnumNames = require('../application/transform/footer/shared-enum-names.cjs');
14
+ const schemaDialect = require('../domain/openapi/schema-dialect.cjs');
10
15
  const outputFixes = require('../domain/output-fixes.cjs');
11
16
  const discriminatorEnumNames = require('./discriminator-enum-names.cjs');
12
17
  const documentDeclarations = require('./document-declarations.cjs');
@@ -36,18 +41,33 @@ function sharedEnumNamesOf(document$1, ctx, recorder) {
36
41
  return recorder.chosenNames();
37
42
  }
38
43
  function enumNameRecorderOf(ctx) {
39
- if (ctx.fix?.includes(outputFixes.OutputFix.DEDUPE_ENUM_NAMES)) {
44
+ if (ctx.fix?.includes(outputFixes.FIX.DEDUPE_ENUM_NAMES)) {
40
45
  return new sharedEnumNames.SharedEnumNameRecorder();
41
46
  }
42
- return ctx.fix?.includes(outputFixes.OutputFix.DISCRIMINATOR_VALUES) ? new discriminatorEnumNames.FirstSchemaNameRecorder() : null;
47
+ return ctx.fix?.includes(outputFixes.FIX.DISCRIMINATOR_VALUES) ? new discriminatorEnumNames.FirstSchemaNameRecorder() : null;
43
48
  }
44
- function withSharedEnumNames(document, ctx) {
45
- const recorder = ctx.runFooter === void 0 ? enumNameRecorderOf(ctx) : null;
46
- if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {
49
+ function withRunFooter(document, ctx, names) {
50
+ if (ctx.runFooter !== void 0) {
47
51
  return;
48
52
  }
49
- const names = sharedEnumNamesOf(document, ctx, recorder);
50
- ctx.runFooter = new documentFooter.RunFooter(new footerSink.ContextFooterSink(ctx.injectFooter), true, names);
53
+ const recorder = enumNameRecorderOf(ctx);
54
+ const shared = recorder === null || !ctx.enum || !ctx.dedupeEnums ? null : sharedEnumNamesOf(document, ctx, recorder);
55
+ const sink = new footerSink.ContextFooterSink(ctx.injectFooter);
56
+ ctx.runFooter = shared === null ? new documentFooter.RunFooter(sink, ctx.dedupeEnums, sharedEnumNames.FIRST_SCHEMA_NAMES, names) : new documentFooter.RunFooter(sink, true, shared, names);
57
+ }
58
+ function withEnumNamesGivenBack(parts, names) {
59
+ const footer = parts.footer.filter(footerEntry.isIrDeclaration);
60
+ const renames = names.enums.givenBack(enumNamesGivenBack.namesTheOutputNeeds({ ...parts, footer }));
61
+ if (renames.size === 0) {
62
+ return parts;
63
+ }
64
+ return {
65
+ body: enumNamesGivenBack.withEnumsRenamed(parts.body, renames),
66
+ footer: parts.footer.map(
67
+ (entry) => footerEntry.isIrDeclaration(entry) ? enumNamesGivenBack.withEnumsRenamed([entry], renames)[0] ?? entry : entry
68
+ ),
69
+ closing: enumNamesGivenBack.withEnumsRenamed(parts.closing, renames)
70
+ };
51
71
  }
52
72
  function enumValuesChecked(body, footer, ctx) {
53
73
  if (!ctx.enumValues) {
@@ -63,13 +83,23 @@ function enumValuesChecked(body, footer, ctx) {
63
83
  }
64
84
  function transformDocument(schema, ctx) {
65
85
  const document$1 = schema;
66
- withSharedEnumNames(document$1, ctx);
86
+ ctx.schemaDialect = schemaDialect.schemaDialectOf(document$1.openapi);
87
+ const names = {
88
+ enums: new enumNameClaims.EnumNameClaims(enumNamesGivenBack.NAMES_THE_OUTPUT_MAY_NEED),
89
+ operations: new operationKeys.OperationKeys(operationKeysWritten.operationKeysWritten(document$1))
90
+ };
91
+ withRunFooter(document$1, ctx, names);
67
92
  const context = transformContext.createTransformContext(ctx);
68
93
  const rawBody = document.documentBody(document$1, context, () => ctx.injectFooter.filter(footerEntry.isIrDeclaration));
69
- const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
70
- const closing = document.documentClosing(document$1, context, footer.some(isOperations));
71
- const body = rootTypeAliases.renameTakenAliases(rawBody, footer.filter(footerEntry.isIrDeclaration), closing);
72
- return { body, footer, closing };
94
+ const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
95
+ const rawClosing = document.documentClosing(document$1, context, rawFooter.some(isOperations));
96
+ const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };
97
+ const { body, footer, closing } = withEnumNamesGivenBack(parts, names);
98
+ return {
99
+ body: rootTypeAliases.renameTakenAliases(body, footer.filter(footerEntry.isIrDeclaration), closing),
100
+ footer,
101
+ closing
102
+ };
73
103
  }
74
104
  function transformSchema(schema, ctx) {
75
105
  return documentDeclarations.documentDeclarations(transformDocument(schema, ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"transform-schema.cjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport {\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(OutputFix.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(OutputFix.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/** With a naming fix, `--enum` and `--dedupe-enums`, the run's footer names shared enums. */\nfunction withSharedEnumNames(document: DocumentObject, ctx: RunContext): void {\n const recorder = ctx.runFooter === undefined ? enumNameRecorderOf(ctx) : null;\n if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {\n return;\n }\n const names = sharedEnumNamesOf(document, ctx, recorder);\n ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n withSharedEnumNames(document, ctx);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const closing = documentClosing(document, context, footer.some(isOperations));\n const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);\n return { body, footer, closing };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":["isIrDeclaration","document","RunFooter","ContextFooterSink","createTransformContext","documentBody","OutputFix","SharedEnumNameRecorder","FirstSchemaNameRecorder","checkedEnumValues","excludedValuesWarning","documentClosing","renameTakenAliases","documentDeclarations"],"mappings":"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"}
1
+ {"version":3,"file":"transform-schema.cjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport {\n NAMES_THE_OUTPUT_MAY_NEED,\n namesTheOutputNeeds,\n withEnumsRenamed,\n} from \"../application/transform/document/enum-names-given-back.js\";\nimport { operationKeysWritten } from \"../application/transform/document/operation-keys-written.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter, type RunFooterNames } from \"../application/transform/footer/document-footer.js\";\nimport { EnumNameClaims } from \"../application/transform/footer/enum-name-claims.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport { OperationKeys } from \"../application/transform/footer/operation-keys.js\";\nimport {\n FIRST_SCHEMA_NAMES,\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { schemaDialectOf } from \"../domain/openapi/schema-dialect.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/**\n * The run's footer: with a naming fix, `--enum` and `--dedupe-enums` it names shared enums. A\n * footer that a call before created on the context is kept.\n */\nfunction withRunFooter(document: DocumentObject, ctx: RunContext, names: RunFooterNames): void {\n if (ctx.runFooter !== undefined) {\n return;\n }\n const recorder = enumNameRecorderOf(ctx);\n const shared =\n recorder === null || !ctx.enum || !ctx.dedupeEnums\n ? null\n : sharedEnumNamesOf(document, ctx, recorder);\n const sink = new ContextFooterSink(ctx.injectFooter);\n ctx.runFooter =\n shared === null\n ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names)\n : new RunFooter(sink, true, shared, names);\n}\n\n/**\n * The document with the enums renamed that gave way to a name the output turned out not to need\n * (`EnumNameClaims`): they get that name back, as before.\n */\nfunction withEnumNamesGivenBack(\n parts: TransformedDocument,\n names: RunFooterNames,\n): TransformedDocument {\n const footer = parts.footer.filter(isIrDeclaration);\n const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));\n if (renames.size === 0) {\n return parts;\n }\n return {\n body: withEnumsRenamed(parts.body, renames),\n footer: parts.footer.map((entry) =>\n isIrDeclaration(entry) ? (withEnumsRenamed([entry], renames)[0] ?? entry) : entry,\n ),\n closing: withEnumsRenamed(parts.closing, renames),\n };\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n ctx.schemaDialect = schemaDialectOf(document.openapi);\n const names: RunFooterNames = {\n enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),\n operations: new OperationKeys(operationKeysWritten(document)),\n };\n withRunFooter(document, ctx, names);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));\n const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };\n const { body, footer, closing } = withEnumNamesGivenBack(parts, names);\n return {\n body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing),\n footer,\n closing,\n };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":["isIrDeclaration","document","RunFooter","ContextFooterSink","createTransformContext","documentBody","FIX","SharedEnumNameRecorder","FirstSchemaNameRecorder","FIRST_SCHEMA_NAMES","namesTheOutputNeeds","withEnumsRenamed","checkedEnumValues","excludedValuesWarning","schemaDialectOf","EnumNameClaims","NAMES_THE_OUTPUT_MAY_NEED","OperationKeys","operationKeysWritten","documentClosing","renameTakenAliases","documentDeclarations"],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  import { documentBody, documentClosing } from '../application/transform/document/document.mjs';
2
+ import { NAMES_THE_OUTPUT_MAY_NEED, namesTheOutputNeeds, withEnumsRenamed } from '../application/transform/document/enum-names-given-back.mjs';
3
+ import { operationKeysWritten } from '../application/transform/document/operation-keys-written.mjs';
2
4
  import { renameTakenAliases } from '../application/transform/document/root-type-aliases.mjs';
3
5
  import { RunFooter } from '../application/transform/footer/document-footer.mjs';
6
+ import { EnumNameClaims } from '../application/transform/footer/enum-name-claims.mjs';
4
7
  import { checkedEnumValues } from '../application/transform/footer/enum-values-check.mjs';
5
- import { SharedEnumNameRecorder } from '../application/transform/footer/shared-enum-names.mjs';
6
- import { OutputFix } from '../domain/output-fixes.mjs';
8
+ import { OperationKeys } from '../application/transform/footer/operation-keys.mjs';
9
+ import { FIRST_SCHEMA_NAMES, SharedEnumNameRecorder } from '../application/transform/footer/shared-enum-names.mjs';
10
+ import { schemaDialectOf } from '../domain/openapi/schema-dialect.mjs';
11
+ import { FIX } from '../domain/output-fixes.mjs';
7
12
  import { FirstSchemaNameRecorder } from './discriminator-enum-names.mjs';
8
13
  import { documentDeclarations } from './document-declarations.mjs';
9
14
  import { excludedValuesWarning } from './enum-values-warnings.mjs';
@@ -32,18 +37,33 @@ function sharedEnumNamesOf(document, ctx, recorder) {
32
37
  return recorder.chosenNames();
33
38
  }
34
39
  function enumNameRecorderOf(ctx) {
35
- if (ctx.fix?.includes(OutputFix.DEDUPE_ENUM_NAMES)) {
40
+ if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {
36
41
  return new SharedEnumNameRecorder();
37
42
  }
38
- return ctx.fix?.includes(OutputFix.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;
43
+ return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;
39
44
  }
40
- function withSharedEnumNames(document, ctx) {
41
- const recorder = ctx.runFooter === void 0 ? enumNameRecorderOf(ctx) : null;
42
- if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {
45
+ function withRunFooter(document, ctx, names) {
46
+ if (ctx.runFooter !== void 0) {
43
47
  return;
44
48
  }
45
- const names = sharedEnumNamesOf(document, ctx, recorder);
46
- ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);
49
+ const recorder = enumNameRecorderOf(ctx);
50
+ const shared = recorder === null || !ctx.enum || !ctx.dedupeEnums ? null : sharedEnumNamesOf(document, ctx, recorder);
51
+ const sink = new ContextFooterSink(ctx.injectFooter);
52
+ ctx.runFooter = shared === null ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names) : new RunFooter(sink, true, shared, names);
53
+ }
54
+ function withEnumNamesGivenBack(parts, names) {
55
+ const footer = parts.footer.filter(isIrDeclaration);
56
+ const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));
57
+ if (renames.size === 0) {
58
+ return parts;
59
+ }
60
+ return {
61
+ body: withEnumsRenamed(parts.body, renames),
62
+ footer: parts.footer.map(
63
+ (entry) => isIrDeclaration(entry) ? withEnumsRenamed([entry], renames)[0] ?? entry : entry
64
+ ),
65
+ closing: withEnumsRenamed(parts.closing, renames)
66
+ };
47
67
  }
48
68
  function enumValuesChecked(body, footer, ctx) {
49
69
  if (!ctx.enumValues) {
@@ -59,13 +79,23 @@ function enumValuesChecked(body, footer, ctx) {
59
79
  }
60
80
  function transformDocument(schema, ctx) {
61
81
  const document = schema;
62
- withSharedEnumNames(document, ctx);
82
+ ctx.schemaDialect = schemaDialectOf(document.openapi);
83
+ const names = {
84
+ enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),
85
+ operations: new OperationKeys(operationKeysWritten(document))
86
+ };
87
+ withRunFooter(document, ctx, names);
63
88
  const context = createTransformContext(ctx);
64
89
  const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));
65
- const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
66
- const closing = documentClosing(document, context, footer.some(isOperations));
67
- const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);
68
- return { body, footer, closing };
90
+ const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
91
+ const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));
92
+ const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };
93
+ const { body, footer, closing } = withEnumNamesGivenBack(parts, names);
94
+ return {
95
+ body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing),
96
+ footer,
97
+ closing
98
+ };
69
99
  }
70
100
  function transformSchema(schema, ctx) {
71
101
  return documentDeclarations(transformDocument(schema, ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"transform-schema.mjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport {\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(OutputFix.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(OutputFix.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/** With a naming fix, `--enum` and `--dedupe-enums`, the run's footer names shared enums. */\nfunction withSharedEnumNames(document: DocumentObject, ctx: RunContext): void {\n const recorder = ctx.runFooter === undefined ? enumNameRecorderOf(ctx) : null;\n if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {\n return;\n }\n const names = sharedEnumNamesOf(document, ctx, recorder);\n ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n withSharedEnumNames(document, ctx);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const closing = documentClosing(document, context, footer.some(isOperations));\n const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);\n return { body, footer, closing };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-schema.mjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport {\n NAMES_THE_OUTPUT_MAY_NEED,\n namesTheOutputNeeds,\n withEnumsRenamed,\n} from \"../application/transform/document/enum-names-given-back.js\";\nimport { operationKeysWritten } from \"../application/transform/document/operation-keys-written.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter, type RunFooterNames } from \"../application/transform/footer/document-footer.js\";\nimport { EnumNameClaims } from \"../application/transform/footer/enum-name-claims.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport { OperationKeys } from \"../application/transform/footer/operation-keys.js\";\nimport {\n FIRST_SCHEMA_NAMES,\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { schemaDialectOf } from \"../domain/openapi/schema-dialect.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/**\n * The run's footer: with a naming fix, `--enum` and `--dedupe-enums` it names shared enums. A\n * footer that a call before created on the context is kept.\n */\nfunction withRunFooter(document: DocumentObject, ctx: RunContext, names: RunFooterNames): void {\n if (ctx.runFooter !== undefined) {\n return;\n }\n const recorder = enumNameRecorderOf(ctx);\n const shared =\n recorder === null || !ctx.enum || !ctx.dedupeEnums\n ? null\n : sharedEnumNamesOf(document, ctx, recorder);\n const sink = new ContextFooterSink(ctx.injectFooter);\n ctx.runFooter =\n shared === null\n ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names)\n : new RunFooter(sink, true, shared, names);\n}\n\n/**\n * The document with the enums renamed that gave way to a name the output turned out not to need\n * (`EnumNameClaims`): they get that name back, as before.\n */\nfunction withEnumNamesGivenBack(\n parts: TransformedDocument,\n names: RunFooterNames,\n): TransformedDocument {\n const footer = parts.footer.filter(isIrDeclaration);\n const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));\n if (renames.size === 0) {\n return parts;\n }\n return {\n body: withEnumsRenamed(parts.body, renames),\n footer: parts.footer.map((entry) =>\n isIrDeclaration(entry) ? (withEnumsRenamed([entry], renames)[0] ?? entry) : entry,\n ),\n closing: withEnumsRenamed(parts.closing, renames),\n };\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n ctx.schemaDialect = schemaDialectOf(document.openapi);\n const names: RunFooterNames = {\n enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),\n operations: new OperationKeys(operationKeysWritten(document)),\n };\n withRunFooter(document, ctx, names);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));\n const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };\n const { body, footer, closing } = withEnumNamesGivenBack(parts, names);\n return {\n body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing),\n footer,\n closing,\n };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":[],"mappings":"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"}
@@ -9,7 +9,12 @@ function isLineBreak(code) {
9
9
  }
10
10
  class TextWriter {
11
11
  #options;
12
- #output = "";
12
+ /**
13
+ * The written parts, joined once at the end. A string built with `+=` is kept by V8 as a tree
14
+ * of its parts, several times the size of the text, for as long as the text is kept (until the
15
+ * CLI writes it); `join` gives one flat string.
16
+ */
17
+ #parts = [];
13
18
  #indent = 0;
14
19
  #isAtLineStart = true;
15
20
  constructor(options) {
@@ -22,7 +27,9 @@ class TextWriter {
22
27
  return this.#options;
23
28
  }
24
29
  get text() {
25
- return this.#output;
30
+ const text = this.#parts.join("");
31
+ this.#parts = [text];
32
+ return text;
26
33
  }
27
34
  increaseIndent() {
28
35
  this.#indent++;
@@ -40,7 +47,7 @@ class TextWriter {
40
47
  }
41
48
  /** Write text exactly as given. */
42
49
  rawWrite(text) {
43
- this.#output += text;
50
+ this.#parts.push(text);
44
51
  this.#updateLineStart(text);
45
52
  }
46
53
  /** End the current line; does nothing when nothing has been written on it yet. */