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
@@ -0,0 +1,91 @@
1
+ import type { IrDeclaration } from "../../../domain/ir/nodes.js";
2
+ import { HELPER_TYPES, READ_WRITE_MARKER_TYPES } from "../helper-types.js";
3
+ import { typeNamesDeclaredBy, typeNamesInText } from "./declared-type-names.js";
4
+ import { OPERATIONS_NAME, ROOT_KEYS } from "./document.js";
5
+ import { GLOBAL_TYPE_NAMES, globalTypeReferences } from "./global-type-references.js";
6
+ import { API_PATHS_NAME } from "./paths-enum.js";
7
+ import { isRootTypeAlias } from "./root-type-aliases.js";
8
+
9
+ /**
10
+ * The second step of naming `--enum` declarations (`EnumNameClaims`): once the output is known,
11
+ * an enum that gave way to a name the output turned out not to need gets that name back.
12
+ */
13
+
14
+ /**
15
+ * The type names the output of a document may need, besides its enums: the global types it may
16
+ * refer to and the names the generator declares itself. An enum avoids them until the end.
17
+ */
18
+ export const NAMES_THE_OUTPUT_MAY_NEED: ReadonlySet<string> = new Set([
19
+ ...GLOBAL_TYPE_NAMES,
20
+ ...Object.values(HELPER_TYPES).map(({ name }) => name),
21
+ ...typeNamesInText(READ_WRITE_MARKER_TYPES),
22
+ API_PATHS_NAME,
23
+ ...ROOT_KEYS,
24
+ OPERATIONS_NAME,
25
+ ]);
26
+
27
+ /** The parts of a transformed document; the footer holds only IR declarations here. */
28
+ export interface DocumentParts {
29
+ readonly body: readonly IrDeclaration[];
30
+ readonly footer: readonly IrDeclaration[];
31
+ readonly closing: readonly IrDeclaration[];
32
+ }
33
+
34
+ /**
35
+ * The type names the output needs besides its enums: the globals it refers to, and the names of
36
+ * its other declarations. Root aliases give way to enums (`renameTakenAliases`), so they count
37
+ * for nothing.
38
+ */
39
+ export function namesTheOutputNeeds({ body, footer, closing }: DocumentParts): Set<string> {
40
+ const others = [
41
+ ...body.filter((declaration) => !isRootTypeAlias(declaration)),
42
+ ...footer.filter((declaration) => declaration.kind !== "enum"),
43
+ ...closing,
44
+ ];
45
+ return new Set([
46
+ ...globalTypeReferences([...body, ...footer, ...closing]),
47
+ ...typeNamesDeclaredBy(others),
48
+ ]);
49
+ }
50
+
51
+ /** `origin` holds the compiler node a raw type was printed from; it is not IR. */
52
+ const SKIPPED_KEYS: ReadonlySet<string> = new Set(["origin"]);
53
+
54
+ /** The enum references the generator writes: `Name`, `Name.member` and `typeof Name`. */
55
+ const ENUM_REFERENCE_RE = /^(typeof )?([^.]+)(\..*)?$/s;
56
+
57
+ function renamedReference(name: string, renames: ReadonlyMap<string, string>): string {
58
+ const match = ENUM_REFERENCE_RE.exec(name);
59
+ const renamed = match === null ? undefined : renames.get(match[2] ?? "");
60
+ return renamed === undefined ? name : `${match?.[1] ?? ""}${renamed}${match?.[3] ?? ""}`;
61
+ }
62
+
63
+ function isNode(value: unknown): value is Readonly<Record<string, unknown>> {
64
+ return typeof value === "object" && value !== null;
65
+ }
66
+
67
+ function renamedNode(value: unknown, renames: ReadonlyMap<string, string>): unknown {
68
+ if (Array.isArray(value)) {
69
+ return value.map((item) => renamedNode(item, renames));
70
+ }
71
+ if (!isNode(value)) {
72
+ return value;
73
+ }
74
+ const node = Object.fromEntries(
75
+ Object.entries(value).map(([key, child]) => [
76
+ key,
77
+ SKIPPED_KEYS.has(key) ? child : renamedNode(child, renames),
78
+ ]),
79
+ );
80
+ const isNamed =
81
+ (node.kind === "reference" || node.kind === "enum") && typeof node.name === "string";
82
+ return isNamed ? { ...node, name: renamedReference(node.name as string, renames) } : node;
83
+ }
84
+
85
+ /** The declarations with each enum in `renames` (old name to new) renamed, references too. */
86
+ export function withEnumsRenamed<T extends IrDeclaration>(
87
+ declarations: readonly T[],
88
+ renames: ReadonlyMap<string, string>,
89
+ ): T[] {
90
+ return renames.size === 0 ? [...declarations] : (renamedNode(declarations, renames) as T[]);
91
+ }
@@ -6,7 +6,7 @@ import type { IrDeclaration } from "../../../domain/ir/nodes.js";
6
6
  * (`Exclude<…>`, `Readonly<…>`). A module declaration of the same name shadows the global: every
7
7
  * use of it then fails to compile, or silently names the module's type (`Blob`).
8
8
  */
9
- const GLOBAL_TYPE_NAMES: ReadonlySet<string> = new Set([
9
+ export const GLOBAL_TYPE_NAMES: ReadonlySet<string> = new Set([
10
10
  "Array",
11
11
  "Blob",
12
12
  "Exclude",
@@ -1,7 +1,7 @@
1
1
  import { irObject, irProperty } from "../../../domain/ir/constructors.js";
2
2
  import type { IrPropertySignature, IrType } from "../../../domain/ir/nodes.js";
3
3
  import { toPropertyName } from "../../../domain/ir/property-name.js";
4
- import { createRef } from "../../../domain/openapi/json-pointer.js";
4
+ import { appendPointer, createRef } from "../../../domain/openapi/json-pointer.js";
5
5
  import {
6
6
  type ContentMap,
7
7
  isMediaTypeComponentRef,
@@ -48,9 +48,10 @@ function itemSchemaAt(
48
48
  const resolved = isMediaTypeComponentRef(entry.$ref)
49
49
  ? (context.refs.resolve(entry.$ref) as MediaTypeObject | undefined)
50
50
  : undefined;
51
+ // `createRef` reads the `$ref` itself as a pointer; only the constant segment is appended.
51
52
  return { schema: resolved?.itemSchema, path: createRef([entry.$ref, "itemSchema"]) };
52
53
  }
53
- return { schema: entry.itemSchema, path: createRef([path, "itemSchema"]) };
54
+ return { schema: entry.itemSchema, path: appendPointer(path, ["itemSchema"]) };
54
55
  }
55
56
 
56
57
  /**
@@ -64,7 +65,7 @@ export function itemContentMember(
64
65
  flags: { readonly isReadonly: boolean },
65
66
  ): IrPropertySignature | null {
66
67
  const members = documentEntries(content, context.options).flatMap(([mediaType, entry]) => {
67
- const contentPath = createRef([location.path, "content", mediaType]);
68
+ const contentPath = appendPointer(location.path, ["content", mediaType]);
68
69
  const item = itemSchemaAt(entry, contentPath, context);
69
70
  if (item.schema === undefined) {
70
71
  return [];
@@ -0,0 +1,27 @@
1
+ import { appendAll } from "../../../domain/append-all.js";
2
+ import { operationKeyOf } from "./path-item.js";
3
+
4
+ /**
5
+ * Every `operations` key that an `operationId` in the document asks for, so that a repeated ID
6
+ * never gets a number another operation has as its own ID (`OperationKeys`). Operations can sit
7
+ * in `paths`, `webhooks`, `components.pathItems` and callbacks, so the whole document is read. A
8
+ * Link Object's `operationId` is read too; an extra name only makes a number skip it.
9
+ */
10
+ export function operationKeysWritten(document: object): Set<string> {
11
+ const keys = new Set<string>();
12
+ const seen = new WeakSet<object>();
13
+ const pending: unknown[] = [document];
14
+ while (pending.length > 0) {
15
+ const value = pending.pop();
16
+ if (typeof value !== "object" || value === null || seen.has(value)) {
17
+ continue;
18
+ }
19
+ seen.add(value);
20
+ const { operationId } = value as { operationId?: unknown };
21
+ if (typeof operationId === "string") {
22
+ keys.add(operationKeyOf(operationId));
23
+ }
24
+ appendAll(pending, Object.values(value));
25
+ }
26
+ return keys;
27
+ }
@@ -1,7 +1,7 @@
1
1
  import { irKeyword, irProperty } from "../../../domain/ir/constructors.js";
2
2
  import type { IrPropertySignature } from "../../../domain/ir/nodes.js";
3
3
  import { toPropertyName } from "../../../domain/ir/property-name.js";
4
- import { createRef } from "../../../domain/openapi/json-pointer.js";
4
+ import { appendPointer } from "../../../domain/openapi/json-pointer.js";
5
5
  import type { OperationObject } from "../../../domain/openapi/operation-object.js";
6
6
  import type { RequestBodyObject } from "../../../domain/openapi/request-body-object.js";
7
7
  import { refType } from "../ref-type.js";
@@ -31,7 +31,7 @@ function requestBodyMember(
31
31
  ? refType(body.$ref)
32
32
  : requestBodyType(
33
33
  body,
34
- { ...location, path: createRef([location.path, "requestBody"]) },
34
+ { ...location, path: appendPointer(location.path, ["requestBody"]) },
35
35
  context,
36
36
  );
37
37
  const resolved = isReference
@@ -0,0 +1,70 @@
1
+ import type { OperationObject } from "../../../domain/openapi/operation-object.js";
2
+ import type {
3
+ ParameterObject,
4
+ ParameterOrReference,
5
+ } from "../../../domain/openapi/parameter-object.js";
6
+ import type { PathItemObject } from "../../../domain/openapi/path-item-object.js";
7
+ import type { SchemaObject } from "../../../domain/openapi/schema-object.js";
8
+ import type { RefResolver } from "../schema/schema-context.js";
9
+ import type { TransformContext } from "../transform-context.js";
10
+
11
+ /** A parameter as written in the document, and the object its `$ref` points to. */
12
+ export interface ParameterEntry {
13
+ readonly original: ParameterOrReference;
14
+ readonly resolved: ParameterObject | undefined;
15
+ }
16
+
17
+ /** An entry whose `$ref` resolved, so its location and name are known. */
18
+ export type ResolvedEntry = ParameterEntry & { readonly resolved: ParameterObject };
19
+
20
+ /** The parameter object itself, or the one its `$ref` points to. */
21
+ export function resolveParameter(
22
+ parameter: ParameterOrReference,
23
+ refs: RefResolver,
24
+ ): ParameterObject | undefined {
25
+ return "$ref" in parameter
26
+ ? (refs.resolve(parameter.$ref) as ParameterObject | undefined)
27
+ : parameter;
28
+ }
29
+
30
+ function isDeprecatedParameter(parameter: ParameterObject | undefined): boolean {
31
+ const schema = parameter?.schema as SchemaObject | undefined;
32
+ return Boolean(parameter?.deprecated || schema?.deprecated);
33
+ }
34
+
35
+ /** Resolved parameters, sorted for `--alphabetize`, without deprecated ones if excluded. */
36
+ export function parameterEntries(
37
+ parameters: readonly ParameterOrReference[],
38
+ context: TransformContext,
39
+ ): ParameterEntry[] {
40
+ const entries = parameters.map((original) => ({
41
+ original,
42
+ resolved: resolveParameter(original, context.refs),
43
+ }));
44
+ if (context.options.alphabetize) {
45
+ // Unlike map keys, the original sorts parameters with the default locale's `localeCompare`.
46
+ entries.sort((left, right) =>
47
+ (left.resolved?.name ?? "").localeCompare(right.resolved?.name ?? ""),
48
+ );
49
+ }
50
+ return context.options.excludeDeprecated
51
+ ? entries.filter(({ resolved }) => !isDeprecatedParameter(resolved))
52
+ : entries;
53
+ }
54
+
55
+ /**
56
+ * Path item parameters followed by the operation's, keyed by location and name, so an operation
57
+ * parameter replaces the path item parameter it redefines (upstream issue #1798).
58
+ */
59
+ export function mergedParameters(
60
+ pathItem: PathItemObject,
61
+ operation: OperationObject,
62
+ refs: RefResolver,
63
+ ): ParameterOrReference[] {
64
+ const byKey = new Map<string, ParameterOrReference>();
65
+ for (const parameter of [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])]) {
66
+ const resolved = resolveParameter(parameter, refs);
67
+ byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);
68
+ }
69
+ return [...byKey.values()];
70
+ }
@@ -1,19 +1,22 @@
1
1
  import { irKeyword } from "../../../domain/ir/constructors.js";
2
2
  import type { IrType } from "../../../domain/ir/nodes.js";
3
- import { createRef } from "../../../domain/openapi/json-pointer.js";
3
+ import { appendPointer } from "../../../domain/openapi/json-pointer.js";
4
4
  import {
5
5
  type ParameterObject,
6
6
  QUERYSTRING_LOCATION,
7
7
  } from "../../../domain/openapi/parameter-object.js";
8
+ import { FIX } from "../../../domain/output-fixes.js";
8
9
  import type { SchemaContext, SchemaLocation } from "../schema/schema-context.js";
9
10
  import { transformSchema } from "../schema/schema-transform.js";
10
11
  import { contentEntryType } from "./media-type.js";
11
12
 
12
13
  /**
13
- * An `in: querystring` parameter (OpenAPI 3.2): the whole query string, typed by the schema of its
14
- * one `content` media type (ADR-020). Without one it is `string`, the query string as text.
14
+ * A parameter typed by the schema of its one `content` media type. An `in: querystring` parameter
15
+ * (OpenAPI 3.2) is the whole query string (ADR-020); without a media type it is `string`, the
16
+ * query string as text. With the `parameter-content` fix, any other parameter with `content`
17
+ * (OpenAPI 3.0 and later, for a JSON value in a query parameter) is typed the same way.
15
18
  */
16
- function querystringType(
19
+ function contentParameterType(
17
20
  parameter: ParameterObject,
18
21
  location: SchemaLocation,
19
22
  context: SchemaContext,
@@ -22,22 +25,31 @@ function querystringType(
22
25
  if (mediaType === undefined || entry === undefined) {
23
26
  return irKeyword("string");
24
27
  }
25
- const path = createRef([location.path, "content", mediaType]);
28
+ const path = appendPointer(location.path, ["content", mediaType]);
26
29
  return contentEntryType(entry, { ...location, path }, context);
27
30
  }
28
31
 
32
+ function isTypedByContent(parameter: ParameterObject, context: SchemaContext): boolean {
33
+ if (parameter.in === QUERYSTRING_LOCATION) {
34
+ return true;
35
+ }
36
+ const hasContent = parameter.schema === undefined && parameter.content !== undefined;
37
+ return hasContent && context.options.fixes.has(FIX.PARAMETER_CONTENT);
38
+ }
39
+
29
40
  /**
30
41
  * A parameter's type (OpenAPI 3.2 §4.8.12). Without a schema it is `string`, not `unknown`:
31
- * query, path, header and cookie values all arrive as text. `content` is read only for
32
- * `in: querystring`; other parameters with `content` keep their pre-3.2 type.
42
+ * query, path, header and cookie values all arrive as text. `content` is read for
43
+ * `in: querystring`, and with the `parameter-content` fix for every parameter; without the fix
44
+ * other parameters with `content` keep the original's `string`.
33
45
  */
34
46
  export function parameterType(
35
47
  parameter: ParameterObject,
36
48
  location: SchemaLocation,
37
49
  context: SchemaContext,
38
50
  ): IrType {
39
- if (parameter.in === QUERYSTRING_LOCATION) {
40
- return querystringType(parameter, location, context);
51
+ if (isTypedByContent(parameter, context)) {
52
+ return contentParameterType(parameter, location, context);
41
53
  }
42
54
  return parameter.schema
43
55
  ? transformSchema(parameter.schema, location, context)
@@ -7,7 +7,7 @@ import {
7
7
  } from "../../../domain/ir/constructors.js";
8
8
  import type { IrPropertyName, IrPropertySignature, IrType } from "../../../domain/ir/nodes.js";
9
9
  import { toPropertyName } from "../../../domain/ir/property-name.js";
10
- import { createRef } from "../../../domain/openapi/json-pointer.js";
10
+ import { appendPointer } from "../../../domain/openapi/json-pointer.js";
11
11
  import {
12
12
  PARAMETER_LOCATIONS,
13
13
  type ParameterLocation,
@@ -15,36 +15,23 @@ import {
15
15
  type ParameterOrReference,
16
16
  QUERYSTRING_LOCATION,
17
17
  } from "../../../domain/openapi/parameter-object.js";
18
- import type { SchemaObject } from "../../../domain/openapi/schema-object.js";
19
- import { OutputFix } from "../../../domain/output-fixes.js";
20
- import { refType } from "../ref-type.js";
18
+ import { FIX } from "../../../domain/output-fixes.js";
21
19
  import type { SchemaLocation } from "../schema/schema-context.js";
22
20
  import { withSchemaComment } from "../schema-comment.js";
23
21
  import type { TransformContext } from "../transform-context.js";
24
22
  import { isExplodedQueryObject } from "./exploded-query.js";
25
23
  import { parameterType } from "./parameter.js";
24
+ import {
25
+ type ParameterEntry,
26
+ parameterEntries,
27
+ type ResolvedEntry,
28
+ resolveParameter,
29
+ } from "./parameter-entries.js";
30
+ import { referencedParameterType } from "./referenced-parameter.js";
26
31
 
27
32
  /** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */
28
33
  const PATH_TEMPLATE_RE = /\{([^{}]+)\}/g;
29
34
 
30
- /** A parameter as written in the document, and the object its `$ref` points to. */
31
- interface ParameterEntry {
32
- readonly original: ParameterOrReference;
33
- readonly resolved: ParameterObject | undefined;
34
- }
35
-
36
- /** An entry whose `$ref` resolved, so its location and name are known. */
37
- type ResolvedEntry = ParameterEntry & { readonly resolved: ParameterObject };
38
-
39
- function resolveParameter(
40
- parameter: ParameterOrReference,
41
- context: TransformContext,
42
- ): ParameterObject | undefined {
43
- return "$ref" in parameter
44
- ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)
45
- : parameter;
46
- }
47
-
48
35
  /** Required string parameters for every `{name}` in a path template. */
49
36
  function pathTemplateParameters(path: string): ParameterObject[] {
50
37
  return (path.match(PATH_TEMPLATE_RE) ?? []).map((match) => ({
@@ -67,7 +54,7 @@ function withPathTemplateParameters(
67
54
  }
68
55
  for (const parameter of pathTemplateParameters(location.path)) {
69
56
  const isDefined = result.some((candidate) => {
70
- const resolved = resolveParameter(candidate, context);
57
+ const resolved = resolveParameter(candidate, context.refs);
71
58
  return resolved?.in === "path" && resolved.name === parameter.name;
72
59
  });
73
60
  if (!isDefined) {
@@ -77,31 +64,6 @@ function withPathTemplateParameters(
77
64
  return result;
78
65
  }
79
66
 
80
- function isDeprecatedParameter(parameter: ParameterObject | undefined): boolean {
81
- const schema = parameter?.schema as SchemaObject | undefined;
82
- return Boolean(parameter?.deprecated || schema?.deprecated);
83
- }
84
-
85
- /** Resolved parameters, sorted for `--alphabetize`, without deprecated ones if excluded. */
86
- function parameterEntries(
87
- parameters: readonly ParameterOrReference[],
88
- context: TransformContext,
89
- ): ParameterEntry[] {
90
- const entries = parameters.map((original) => ({
91
- original,
92
- resolved: resolveParameter(original, context),
93
- }));
94
- if (context.options.alphabetize) {
95
- // Unlike map keys, the original sorts parameters with the default locale's `localeCompare`.
96
- entries.sort((left, right) =>
97
- (left.resolved?.name ?? "").localeCompare(right.resolved?.name ?? ""),
98
- );
99
- }
100
- return context.options.excludeDeprecated
101
- ? entries.filter(({ resolved }) => !isDeprecatedParameter(resolved))
102
- : entries;
103
- }
104
-
105
67
  /** The original quotes a name that is not text (a missing name prints as `"undefined"`). */
106
68
  function parameterName(name: unknown): IrPropertyName {
107
69
  return typeof name === "string" || typeof name === "number"
@@ -109,21 +71,14 @@ function parameterName(name: unknown): IrPropertyName {
109
71
  : { kind: "string", value: String(name) };
110
72
  }
111
73
 
112
- function referencedParameterType(ref: string, resolved: ParameterObject): IrType {
113
- // A `$ref` that resolves to another `$ref` is not a parameter object yet: index it as a path.
114
- const isParameter = !(resolved as { $ref?: unknown }).$ref;
115
- const parameter = isParameter ? { in: resolved.in, name: resolved.name } : null;
116
- return refType(ref, { parameter });
117
- }
118
-
119
74
  function entryType(
120
75
  { original, resolved }: ResolvedEntry,
121
76
  location: SchemaLocation,
122
77
  context: TransformContext,
123
78
  ): IrType {
124
- const path = createRef([location.path, "parameters", resolved.in, resolved.name]);
79
+ const path = appendPointer(location.path, ["parameters", resolved.in, resolved.name]);
125
80
  return "$ref" in original
126
- ? referencedParameterType(original.$ref, resolved)
81
+ ? referencedParameterType(original.$ref, resolved, context)
127
82
  : parameterType(resolved, { ...location, path }, context);
128
83
  }
129
84
 
@@ -166,7 +121,7 @@ function querystringMember(
166
121
  /** With `exploded-query-objects`, whether the parameter's object keys are keys of `query`. */
167
122
  function isExplodedEntry(entry: ResolvedEntry, context: TransformContext): boolean {
168
123
  return (
169
- context.options.fixes.has(OutputFix.EXPLODED_QUERY_OBJECTS) &&
124
+ context.options.fixes.has(FIX.EXPLODED_QUERY_OBJECTS) &&
170
125
  isExplodedQueryObject(entry.resolved, context.refs)
171
126
  );
172
127
  }
@@ -1,12 +1,8 @@
1
1
  import { irKeyword, irObject, irProperty } from "../../../domain/ir/constructors.js";
2
2
  import type { IrMember, IrPropertySignature, IrType } from "../../../domain/ir/nodes.js";
3
3
  import { toPropertyName } from "../../../domain/ir/property-name.js";
4
- import { createRef } from "../../../domain/openapi/json-pointer.js";
4
+ import { appendPointer, ROOT_POINTER } from "../../../domain/openapi/json-pointer.js";
5
5
  import type { OperationObject } from "../../../domain/openapi/operation-object.js";
6
- import type {
7
- ParameterObject,
8
- ParameterOrReference,
9
- } from "../../../domain/openapi/parameter-object.js";
10
6
  import {
11
7
  ADDITIONAL_OPERATIONS_KEY,
12
8
  HTTP_METHODS,
@@ -21,11 +17,17 @@ import type { SchemaLocation } from "../schema/schema-context.js";
21
17
  import type { TransformContext } from "../transform-context.js";
22
18
  import { documentMember } from "./document-member.js";
23
19
  import { operationMembers } from "./operation.js";
20
+ import { mergedParameters } from "./parameter-entries.js";
24
21
  import { parametersMember } from "./parameters.js";
25
22
 
26
23
  /** Redocly reads `#` in an operation ID as a pointer, so it is replaced (upstream issue #1542). */
27
24
  const HASH_RE = /#/g;
28
25
 
26
+ /** The `operations` key an `operationId` asks for, before a repeated one gets a number. */
27
+ export function operationKeyOf(operationId: string): string {
28
+ return operationId.replace(HASH_RE, "/");
29
+ }
30
+
29
31
  /** Whether the method has an operation, not removed by `--exclude-deprecated`. */
30
32
  function isIncluded(
31
33
  operation: OperationEntry | undefined,
@@ -41,26 +43,6 @@ function isIncluded(
41
43
  return !(context.options.excludeDeprecated && resolved?.deprecated);
42
44
  }
43
45
 
44
- /**
45
- * Path item parameters followed by the operation's, keyed by location and name, so an operation
46
- * parameter replaces the path item parameter it redefines (upstream issue #1798).
47
- */
48
- function mergedParameters(
49
- pathItem: PathItemObject,
50
- operation: OperationObject,
51
- context: TransformContext,
52
- ): ParameterOrReference[] {
53
- const byKey = new Map<string, ParameterOrReference>();
54
- for (const parameter of [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])]) {
55
- const resolved =
56
- "$ref" in parameter
57
- ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)
58
- : parameter;
59
- byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);
60
- }
61
- return [...byKey.values()];
62
- }
63
-
64
46
  /**
65
47
  * An operation with an `operationId` goes into the `operations` interface and is referenced from
66
48
  * the path item; others are written inline.
@@ -71,17 +53,17 @@ function operationType(
71
53
  location: SchemaLocation,
72
54
  context: TransformContext,
73
55
  ): IrType {
74
- const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context) };
56
+ const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context.refs) };
75
57
  if (!operation.operationId) {
76
58
  return irObject(operationMembers(merged, location, context));
77
59
  }
78
- const operationId = operation.operationId.replace(HASH_RE, "/");
60
+ const operationId = context.footer.operationKey(operationKeyOf(operation.operationId));
79
61
  context.footer.addOperation(() =>
80
62
  irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {
81
63
  isReadonly: context.options.immutable,
82
64
  }),
83
65
  );
84
- return refType(createRef(["operations", operationId]));
66
+ return refType(appendPointer(ROOT_POINTER, ["operations", operationId]));
85
67
  }
86
68
 
87
69
  /** An included operation, the member name it gets and its location below the path item. */
@@ -116,7 +98,7 @@ function methodMember(
116
98
  const isReadonly = context.options.immutable;
117
99
  return irProperty(toPropertyName(method), irKeyword("never"), { isOptional: true, isReadonly });
118
100
  }
119
- const path = createRef([location.path, method]);
101
+ const path = appendPointer(location.path, [method]);
120
102
  return operationMember({ name: method, operation, path }, pathItem, location, context);
121
103
  }
122
104
 
@@ -133,7 +115,7 @@ function additionalOperationsMember(
133
115
  const members = entries
134
116
  .filter(([, operation]) => isIncluded(operation, context))
135
117
  .map(([method, operation]) => {
136
- const path = createRef([location.path, ADDITIONAL_OPERATIONS_KEY, method]);
118
+ const path = appendPointer(location.path, [ADDITIONAL_OPERATIONS_KEY, method]);
137
119
  return operationMember({ name: method, operation, path }, pathItem, location, context);
138
120
  });
139
121
  return members.length > 0
@@ -152,7 +134,7 @@ export function pathItemType(
152
134
  location: SchemaLocation,
153
135
  context: TransformContext,
154
136
  ): IrType {
155
- const parametersLocation = { ...location, path: createRef([location.path, "parameters"]) };
137
+ const parametersLocation = { ...location, path: appendPointer(location.path, ["parameters"]) };
156
138
  const members: IrMember[] = [
157
139
  parametersMember(pathItem.parameters ?? [], parametersLocation, context),
158
140
  ...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context)),
@@ -15,7 +15,7 @@ import type { EnumMemberMetadata } from "../schema/schema-context.js";
15
15
  const PARAMETER_SEGMENT_RE = /^(?:{(.+)}|:(.+))$/;
16
16
  /** Characters not allowed in an enum key, or a `{param}` / `:param` part (first match only). */
17
17
  const INVALID_KEY_PART_RE = /{.*}|:.*|[^a-zA-Z\d_]+/;
18
- const API_PATHS_NAME = "ApiPaths";
18
+ export const API_PATHS_NAME = "ApiPaths";
19
19
  const METHODS: ReadonlySet<string> = new Set<PathItemMethod>([...HTTP_METHODS, QUERY_METHOD]);
20
20
 
21
21
  /** The members of the `ApiPaths` enum (`--make-paths-enum`). */
@@ -2,7 +2,7 @@ import { irIntersection, irObject, irProperty, irRaw } from "../../../domain/ir/
2
2
  import type { IrMember, IrType } from "../../../domain/ir/nodes.js";
3
3
  import { toPropertyName } from "../../../domain/ir/property-name.js";
4
4
  import { escapeTemplateText } from "../../../domain/ir/raw-text-escapes.js";
5
- import { createRef } from "../../../domain/openapi/json-pointer.js";
5
+ import { appendPointer, ROOT_POINTER } from "../../../domain/openapi/json-pointer.js";
6
6
  import type { OperationObject } from "../../../domain/openapi/operation-object.js";
7
7
  import type {
8
8
  ParameterObject,
@@ -14,7 +14,7 @@ import {
14
14
  pathItemOperations,
15
15
  } from "../../../domain/openapi/path-item-object.js";
16
16
  import type { ReferenceSchema, SchemaObject } from "../../../domain/openapi/schema-object.js";
17
- import { OutputFix } from "../../../domain/output-fixes.js";
17
+ import { FIX } from "../../../domain/output-fixes.js";
18
18
  import { documentEntries } from "../document-entries.js";
19
19
  import { refType } from "../ref-type.js";
20
20
  import type { TransformContext } from "../transform-context.js";
@@ -112,7 +112,7 @@ function pathTemplateParts(
112
112
  const schema = parameters.get(match.slice(1, -1))?.schema as SchemaObject | undefined;
113
113
  return { match, type: PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER };
114
114
  });
115
- return context.options.fixes.has(OutputFix.PATH_PARAM_TYPE_NAMES)
115
+ return context.options.fixes.has(FIX.PATH_PARAM_TYPE_NAMES)
116
116
  ? splitTemplateParts(url, matches)
117
117
  : replacedTemplateParts(url, matches);
118
118
  }
@@ -145,7 +145,11 @@ function pathItemMember(
145
145
  context: TransformContext,
146
146
  ): PathMember {
147
147
  const isReadonly = context.options.immutable;
148
- const type = pathItemType(pathItem, { path: createRef(["paths", url]) }, context);
148
+ const type = pathItemType(
149
+ pathItem,
150
+ { path: appendPointer(ROOT_POINTER, ["paths", url]) },
151
+ context,
152
+ );
149
153
  const parts =
150
154
  context.options.pathParamsAsTypes && url.includes("{")
151
155
  ? pathTemplateParts(url, pathItem, context)