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,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ const appendAll = require('../domain/append-all.cjs');
3
4
  const outputFixes = require('../domain/output-fixes.cjs');
4
5
  const warnings = require('../domain/warnings.cjs');
5
6
  const discriminatorEnum = require('./discriminator-enum.cjs');
@@ -7,17 +8,17 @@ const discriminatorEnumParent = require('./discriminator-enum-parent.cjs');
7
8
  const documentRefs = require('./document-refs.cjs');
8
9
 
9
10
  function mergesValues(state) {
10
- return state.fixes.has(outputFixes.OutputFix.DISCRIMINATOR_VALUES);
11
+ return state.fixes.has(outputFixes.FIX.DISCRIMINATOR_VALUES);
11
12
  }
12
13
  function patchedSchema(state, patch) {
13
14
  const { silent, logger } = state;
14
15
  return documentRefs.resolveDocumentRef(state.schema, patch.ref, { silent, logger });
15
16
  }
16
17
  function isDeclared(state, patch) {
17
- return state.fixes.has(outputFixes.OutputFix.DISCRIMINATOR_VALUES) && discriminatorEnum.declaresValues(patchedSchema(state, patch), patch);
18
+ return state.fixes.has(outputFixes.FIX.DISCRIMINATOR_VALUES) && discriminatorEnum.declaresValues(patchedSchema(state, patch), patch);
18
19
  }
19
20
  function recordEnumParent(state, owner, key) {
20
- if (!state.fixes.has(outputFixes.OutputFix.DISCRIMINATOR_VALUES)) {
21
+ if (!state.fixes.has(outputFixes.FIX.DISCRIMINATOR_VALUES)) {
21
22
  return;
22
23
  }
23
24
  const { silent, logger } = state;
@@ -48,7 +49,10 @@ function mergeIntoPatchedEnum(state, key, values) {
48
49
  return false;
49
50
  }
50
51
  const merged = patched.enum;
51
- merged.push(...values.filter((value) => !merged.includes(value)));
52
+ appendAll.appendAll(
53
+ merged,
54
+ values.filter((value) => !merged.includes(value))
55
+ );
52
56
  return true;
53
57
  }
54
58
  function patchDiscriminatorEnum(state, patch) {
@@ -1 +1 @@
1
- {"version":3,"file":"discriminator-patch.cjs","sources":["../../src/api/discriminator-patch.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { DiscriminatorObject, OpenAPI3, SchemaObject } from \"../types.js\";\nimport { addEnumProperty, declaresValues, type EnumPatch } from \"./discriminator-enum.js\";\nimport {\n type DiscriminatorOwner,\n type EnumParent,\n enumParentOf,\n} from \"./discriminator-enum-parent.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\n\n/**\n * The state of the discriminator pre-pass and the in-place patch of a mapped schema: the enum\n * property that the generated union narrows by. Two discriminators of one property may patch one\n * schema; how they combine is the `discriminator-values` fix (ADR-021, roadmap R12).\n */\n\n/** How to scan: the warnings, and the output fixes of the run (ADR-021). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixes: ReadonlySet<OutputFix>;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\nexport interface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n /** The schemas that define a discriminator themselves (pass 1), not by inheritance. */\n readonly owners: Set<string>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n /** With the fix: schema-name values of other properties (`inheritOtherOwners`). */\n readonly otherInferredPatches: EnumPatch[];\n /** With the fix: the other properties each schema got a value of (`inheritOtherOwners`). */\n readonly otherProperties: Record<string, string[]>;\n /** With `discriminator-values`: the enum keys that a schema declares itself. */\n readonly declaredKeys: Set<string>;\n /** With `discriminator-values`: the owner's enum of each added enum, by that enum. */\n readonly enumParents: Map<object, EnumParent>;\n}\n\n/** Whether `discriminator-values` is on: values of two discriminators merge into one enum. */\nexport function mergesValues(state: ScanState): boolean {\n return state.fixes.has(OutputFix.DISCRIMINATOR_VALUES);\n}\n\nfunction patchedSchema(state: ScanState, patch: EnumPatch): SchemaObject | undefined {\n const { silent, logger } = state;\n return resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n}\n\n/**\n * With `discriminator-values`: the schema at `patch.ref` requires the property with\n * exactly these values already, so a patch would only repeat it (#2124).\n */\nfunction isDeclared(state: ScanState, patch: EnumPatch): boolean {\n return (\n state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) &&\n declaresValues(patchedSchema(state, patch), patch)\n );\n}\n\n/**\n * With `discriminator-values`: the enum of the owner's property, for `key`: an enum the scan\n * added, or a discriminator object that a schema inherited.\n */\nexport function recordEnumParent(state: ScanState, owner: DiscriminatorOwner, key: object): void {\n if (!state.fixes.has(OutputFix.DISCRIMINATOR_VALUES)) {\n return;\n }\n const { silent, logger } = state;\n const parent = enumParentOf(owner, (ref) =>\n resolveDocumentRef(state.schema, ref, { silent, logger }),\n );\n if (parent !== undefined) {\n state.enumParents.set(key, parent);\n }\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const added = addEnumProperty(patchedSchema(state, patch), patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n } else {\n recordEnumParent(state, patch, added);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nexport function enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n merged.push(...values.filter((value) => !merged.includes(value)));\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nexport function patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (isDeclared(state, patch)) {\n state.declaredKeys.add(enumKey(patch));\n return true;\n }\n if (!mergesValues(state)) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nexport function markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n warningText(\n \"Discriminator mapping has an invalid schema \" +\n \"(neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n WARNING_CODES.DISCRIMINATOR_MAPPING_INVALID,\n ),\n );\n}\n"],"names":["OutputFix","resolveDocumentRef","declaresValues","enumParentOf","addEnumProperty","warningText","WARNING_CODES"],"mappings":"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"}
1
+ {"version":3,"file":"discriminator-patch.cjs","sources":["../../src/api/discriminator-patch.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { appendAll } from \"../domain/append-all.js\";\nimport { FIX, type OutputFix } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { DiscriminatorObject, OpenAPI3, SchemaObject } from \"../types.js\";\nimport { addEnumProperty, declaresValues, type EnumPatch } from \"./discriminator-enum.js\";\nimport {\n type DiscriminatorOwner,\n type EnumParent,\n enumParentOf,\n} from \"./discriminator-enum-parent.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\n\n/**\n * The state of the discriminator pre-pass and the in-place patch of a mapped schema: the enum\n * property that the generated union narrows by. Two discriminators of one property may patch one\n * schema; how they combine is the `discriminator-values` fix (ADR-021, roadmap R12).\n */\n\n/** How to scan: the warnings, and the output fixes of the run (ADR-021). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixes: ReadonlySet<OutputFix>;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\nexport interface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n /** The schemas that define a discriminator themselves (pass 1), not by inheritance. */\n readonly owners: Set<string>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n /** With the fix: schema-name values of other properties (`inheritOtherOwners`). */\n readonly otherInferredPatches: EnumPatch[];\n /** With the fix: the other properties each schema got a value of (`inheritOtherOwners`). */\n readonly otherProperties: Record<string, string[]>;\n /** With `discriminator-values`: the enum keys that a schema declares itself. */\n readonly declaredKeys: Set<string>;\n /** With `discriminator-values`: the owner's enum of each added enum, by that enum. */\n readonly enumParents: Map<object, EnumParent>;\n}\n\n/** Whether `discriminator-values` is on: values of two discriminators merge into one enum. */\nexport function mergesValues(state: ScanState): boolean {\n return state.fixes.has(FIX.DISCRIMINATOR_VALUES);\n}\n\nfunction patchedSchema(state: ScanState, patch: EnumPatch): SchemaObject | undefined {\n const { silent, logger } = state;\n return resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n}\n\n/**\n * With `discriminator-values`: the schema at `patch.ref` requires the property with\n * exactly these values already, so a patch would only repeat it (#2124).\n */\nfunction isDeclared(state: ScanState, patch: EnumPatch): boolean {\n return (\n state.fixes.has(FIX.DISCRIMINATOR_VALUES) && declaresValues(patchedSchema(state, patch), patch)\n );\n}\n\n/**\n * With `discriminator-values`: the enum of the owner's property, for `key`: an enum the scan\n * added, or a discriminator object that a schema inherited.\n */\nexport function recordEnumParent(state: ScanState, owner: DiscriminatorOwner, key: object): void {\n if (!state.fixes.has(FIX.DISCRIMINATOR_VALUES)) {\n return;\n }\n const { silent, logger } = state;\n const parent = enumParentOf(owner, (ref) =>\n resolveDocumentRef(state.schema, ref, { silent, logger }),\n );\n if (parent !== undefined) {\n state.enumParents.set(key, parent);\n }\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const added = addEnumProperty(patchedSchema(state, patch), patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n } else {\n recordEnumParent(state, patch, added);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nexport function enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n appendAll(\n merged,\n values.filter((value) => !merged.includes(value)),\n );\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nexport function patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (isDeclared(state, patch)) {\n state.declaredKeys.add(enumKey(patch));\n return true;\n }\n if (!mergesValues(state)) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nexport function markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n warningText(\n \"Discriminator mapping has an invalid schema \" +\n \"(neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n WARNING_CODES.DISCRIMINATOR_MAPPING_INVALID,\n ),\n );\n}\n"],"names":["FIX","resolveDocumentRef","declaresValues","enumParentOf","addEnumProperty","appendAll","warningText","WARNING_CODES"],"mappings":"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"}
@@ -1,21 +1,22 @@
1
- import { OutputFix } from '../domain/output-fixes.mjs';
1
+ import { appendAll } from '../domain/append-all.mjs';
2
+ import { FIX } from '../domain/output-fixes.mjs';
2
3
  import { warningText, WARNING_CODES } from '../domain/warnings.mjs';
3
4
  import { declaresValues, addEnumProperty } from './discriminator-enum.mjs';
4
5
  import { enumParentOf } from './discriminator-enum-parent.mjs';
5
6
  import { resolveDocumentRef } from './document-refs.mjs';
6
7
 
7
8
  function mergesValues(state) {
8
- return state.fixes.has(OutputFix.DISCRIMINATOR_VALUES);
9
+ return state.fixes.has(FIX.DISCRIMINATOR_VALUES);
9
10
  }
10
11
  function patchedSchema(state, patch) {
11
12
  const { silent, logger } = state;
12
13
  return resolveDocumentRef(state.schema, patch.ref, { silent, logger });
13
14
  }
14
15
  function isDeclared(state, patch) {
15
- return state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) && declaresValues(patchedSchema(state, patch), patch);
16
+ return state.fixes.has(FIX.DISCRIMINATOR_VALUES) && declaresValues(patchedSchema(state, patch), patch);
16
17
  }
17
18
  function recordEnumParent(state, owner, key) {
18
- if (!state.fixes.has(OutputFix.DISCRIMINATOR_VALUES)) {
19
+ if (!state.fixes.has(FIX.DISCRIMINATOR_VALUES)) {
19
20
  return;
20
21
  }
21
22
  const { silent, logger } = state;
@@ -46,7 +47,10 @@ function mergeIntoPatchedEnum(state, key, values) {
46
47
  return false;
47
48
  }
48
49
  const merged = patched.enum;
49
- merged.push(...values.filter((value) => !merged.includes(value)));
50
+ appendAll(
51
+ merged,
52
+ values.filter((value) => !merged.includes(value))
53
+ );
50
54
  return true;
51
55
  }
52
56
  function patchDiscriminatorEnum(state, patch) {
@@ -1 +1 @@
1
- {"version":3,"file":"discriminator-patch.mjs","sources":["../../src/api/discriminator-patch.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { DiscriminatorObject, OpenAPI3, SchemaObject } from \"../types.js\";\nimport { addEnumProperty, declaresValues, type EnumPatch } from \"./discriminator-enum.js\";\nimport {\n type DiscriminatorOwner,\n type EnumParent,\n enumParentOf,\n} from \"./discriminator-enum-parent.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\n\n/**\n * The state of the discriminator pre-pass and the in-place patch of a mapped schema: the enum\n * property that the generated union narrows by. Two discriminators of one property may patch one\n * schema; how they combine is the `discriminator-values` fix (ADR-021, roadmap R12).\n */\n\n/** How to scan: the warnings, and the output fixes of the run (ADR-021). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixes: ReadonlySet<OutputFix>;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\nexport interface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n /** The schemas that define a discriminator themselves (pass 1), not by inheritance. */\n readonly owners: Set<string>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n /** With the fix: schema-name values of other properties (`inheritOtherOwners`). */\n readonly otherInferredPatches: EnumPatch[];\n /** With the fix: the other properties each schema got a value of (`inheritOtherOwners`). */\n readonly otherProperties: Record<string, string[]>;\n /** With `discriminator-values`: the enum keys that a schema declares itself. */\n readonly declaredKeys: Set<string>;\n /** With `discriminator-values`: the owner's enum of each added enum, by that enum. */\n readonly enumParents: Map<object, EnumParent>;\n}\n\n/** Whether `discriminator-values` is on: values of two discriminators merge into one enum. */\nexport function mergesValues(state: ScanState): boolean {\n return state.fixes.has(OutputFix.DISCRIMINATOR_VALUES);\n}\n\nfunction patchedSchema(state: ScanState, patch: EnumPatch): SchemaObject | undefined {\n const { silent, logger } = state;\n return resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n}\n\n/**\n * With `discriminator-values`: the schema at `patch.ref` requires the property with\n * exactly these values already, so a patch would only repeat it (#2124).\n */\nfunction isDeclared(state: ScanState, patch: EnumPatch): boolean {\n return (\n state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) &&\n declaresValues(patchedSchema(state, patch), patch)\n );\n}\n\n/**\n * With `discriminator-values`: the enum of the owner's property, for `key`: an enum the scan\n * added, or a discriminator object that a schema inherited.\n */\nexport function recordEnumParent(state: ScanState, owner: DiscriminatorOwner, key: object): void {\n if (!state.fixes.has(OutputFix.DISCRIMINATOR_VALUES)) {\n return;\n }\n const { silent, logger } = state;\n const parent = enumParentOf(owner, (ref) =>\n resolveDocumentRef(state.schema, ref, { silent, logger }),\n );\n if (parent !== undefined) {\n state.enumParents.set(key, parent);\n }\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const added = addEnumProperty(patchedSchema(state, patch), patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n } else {\n recordEnumParent(state, patch, added);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nexport function enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n merged.push(...values.filter((value) => !merged.includes(value)));\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nexport function patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (isDeclared(state, patch)) {\n state.declaredKeys.add(enumKey(patch));\n return true;\n }\n if (!mergesValues(state)) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nexport function markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n warningText(\n \"Discriminator mapping has an invalid schema \" +\n \"(neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n WARNING_CODES.DISCRIMINATOR_MAPPING_INVALID,\n ),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discriminator-patch.mjs","sources":["../../src/api/discriminator-patch.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { appendAll } from \"../domain/append-all.js\";\nimport { FIX, type OutputFix } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { DiscriminatorObject, OpenAPI3, SchemaObject } from \"../types.js\";\nimport { addEnumProperty, declaresValues, type EnumPatch } from \"./discriminator-enum.js\";\nimport {\n type DiscriminatorOwner,\n type EnumParent,\n enumParentOf,\n} from \"./discriminator-enum-parent.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\n\n/**\n * The state of the discriminator pre-pass and the in-place patch of a mapped schema: the enum\n * property that the generated union narrows by. Two discriminators of one property may patch one\n * schema; how they combine is the `discriminator-values` fix (ADR-021, roadmap R12).\n */\n\n/** How to scan: the warnings, and the output fixes of the run (ADR-021). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixes: ReadonlySet<OutputFix>;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\nexport interface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n /** The schemas that define a discriminator themselves (pass 1), not by inheritance. */\n readonly owners: Set<string>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n /** With the fix: schema-name values of other properties (`inheritOtherOwners`). */\n readonly otherInferredPatches: EnumPatch[];\n /** With the fix: the other properties each schema got a value of (`inheritOtherOwners`). */\n readonly otherProperties: Record<string, string[]>;\n /** With `discriminator-values`: the enum keys that a schema declares itself. */\n readonly declaredKeys: Set<string>;\n /** With `discriminator-values`: the owner's enum of each added enum, by that enum. */\n readonly enumParents: Map<object, EnumParent>;\n}\n\n/** Whether `discriminator-values` is on: values of two discriminators merge into one enum. */\nexport function mergesValues(state: ScanState): boolean {\n return state.fixes.has(FIX.DISCRIMINATOR_VALUES);\n}\n\nfunction patchedSchema(state: ScanState, patch: EnumPatch): SchemaObject | undefined {\n const { silent, logger } = state;\n return resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n}\n\n/**\n * With `discriminator-values`: the schema at `patch.ref` requires the property with\n * exactly these values already, so a patch would only repeat it (#2124).\n */\nfunction isDeclared(state: ScanState, patch: EnumPatch): boolean {\n return (\n state.fixes.has(FIX.DISCRIMINATOR_VALUES) && declaresValues(patchedSchema(state, patch), patch)\n );\n}\n\n/**\n * With `discriminator-values`: the enum of the owner's property, for `key`: an enum the scan\n * added, or a discriminator object that a schema inherited.\n */\nexport function recordEnumParent(state: ScanState, owner: DiscriminatorOwner, key: object): void {\n if (!state.fixes.has(FIX.DISCRIMINATOR_VALUES)) {\n return;\n }\n const { silent, logger } = state;\n const parent = enumParentOf(owner, (ref) =>\n resolveDocumentRef(state.schema, ref, { silent, logger }),\n );\n if (parent !== undefined) {\n state.enumParents.set(key, parent);\n }\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const added = addEnumProperty(patchedSchema(state, patch), patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n } else {\n recordEnumParent(state, patch, added);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nexport function enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n appendAll(\n merged,\n values.filter((value) => !merged.includes(value)),\n );\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nexport function patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (isDeclared(state, patch)) {\n state.declaredKeys.add(enumKey(patch));\n return true;\n }\n if (!mergesValues(state)) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nexport function markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n warningText(\n \"Discriminator mapping has an invalid schema \" +\n \"(neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n WARNING_CODES.DISCRIMINATOR_MAPPING_INVALID,\n ),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  const discriminatedUnion = require('../domain/openapi/discriminated-union.cjs');
4
+ const jsonPointer = require('../domain/openapi/json-pointer.cjs');
4
5
  const outputFixes = require('../domain/output-fixes.cjs');
5
6
  const defaultPorts = require('./default-ports.cjs');
6
7
  const discriminatorOtherOwners = require('./discriminator-other-owners.cjs');
7
8
  const discriminatorPatch = require('./discriminator-patch.cjs');
8
9
  const documentRefs = require('./document-refs.cjs');
9
- const legacyUtils = require('./legacy-utils.cjs');
10
10
 
11
11
  function inferredMapping(oneOf) {
12
12
  const mapping = {};
@@ -15,17 +15,19 @@ function inferredMapping(oneOf) {
15
15
  continue;
16
16
  }
17
17
  const value = item.$ref.split("/").pop();
18
+ const ref = jsonPointer.canonicalRef(item.$ref);
18
19
  if (value) {
19
- mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };
20
+ mapping[ref] = { ...mapping[ref], inferred: value };
20
21
  }
21
22
  }
22
23
  return mapping;
23
24
  }
24
25
  function addDefinedMapping(mapping, defined) {
25
- for (const [mappedValue, mappedRef] of Object.entries(defined)) {
26
- if (!mappedRef) {
26
+ for (const [mappedValue, target] of Object.entries(defined)) {
27
+ if (!target) {
27
28
  continue;
28
29
  }
30
+ const mappedRef = jsonPointer.canonicalRef(target);
29
31
  if (!mapping[mappedRef]?.defined) {
30
32
  mapping[mappedRef] = { defined: [] };
31
33
  }
@@ -51,7 +53,7 @@ function collectDiscriminator(state, value, path) {
51
53
  if (!discriminator?.propertyName) {
52
54
  return;
53
55
  }
54
- const discriminatorRef = legacyUtils.createRef(path);
56
+ const discriminatorRef = jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, path);
55
57
  state.objects[discriminatorRef] = discriminator;
56
58
  state.owners.add(discriminatorRef);
57
59
  if (!Array.isArray(value.oneOf)) {
@@ -64,10 +66,10 @@ function collectDiscriminator(state, value, path) {
64
66
  patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });
65
67
  }
66
68
  function valuesMappedTo(discriminator, ref) {
67
- return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => mappedRef === ref).map(([mappedValue]) => mappedValue);
69
+ return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => jsonPointer.canonicalRef(mappedRef) === ref).map(([mappedValue]) => mappedValue);
68
70
  }
69
71
  function inheritsDiscriminator(state, parentRef, ref) {
70
- if (!state.fixes.has(outputFixes.OutputFix.ALLOF_DISCRIMINATED_UNION)) {
72
+ if (!state.fixes.has(outputFixes.FIX.ALLOF_DISCRIMINATED_UNION)) {
71
73
  return true;
72
74
  }
73
75
  const resolve = (target) => documentRefs.resolveDocumentRef(state.schema, target, state);
@@ -75,7 +77,7 @@ function inheritsDiscriminator(state, parentRef, ref) {
75
77
  return union === void 0 || discriminatedUnion.isUnionMember(union, ref, resolve);
76
78
  }
77
79
  function recordInherited(state, ref, discriminator, ownerRef) {
78
- if (state.fixes.has(outputFixes.OutputFix.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {
80
+ if (state.fixes.has(outputFixes.FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {
79
81
  return;
80
82
  }
81
83
  const inherited = { ...discriminator };
@@ -106,11 +108,16 @@ function inheritDiscriminators(state, value, path) {
106
108
  }
107
109
  for (const item of value.allOf) {
108
110
  if ("$ref" in item) {
109
- if (!inheritFromRef(state, item.$ref, legacyUtils.createRef(path))) {
111
+ if (!inheritFromRef(state, jsonPointer.canonicalRef(item.$ref), jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, path))) {
110
112
  return;
111
113
  }
112
114
  } else if (item.discriminator?.propertyName) {
113
- recordInherited(state, legacyUtils.createRef(path), item.discriminator, legacyUtils.createRef(path));
115
+ recordInherited(
116
+ state,
117
+ jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, path),
118
+ item.discriminator,
119
+ jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, path)
120
+ );
114
121
  }
115
122
  }
116
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discriminator-scan.cjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\nimport { createRef } from \"./legacy-utils.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n const value = item.$ref.split(\"/\").pop();\n if (value) {\n mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, mappedRef] of Object.entries(defined)) {\n if (!mappedRef) {\n continue;\n }\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = createRef(path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => mappedRef === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(OutputFix.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, item.$ref, createRef(path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(state, createRef(path), item.discriminator, createRef(path));\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":["mergesValues","patchDiscriminatorEnum","markHandled","createRef","OutputFix","resolveDocumentRef","unionAt","isUnionMember","recordEnumParent","inheritOtherOwners","enumKey","applyOtherInferredPatches","walkDocument","defaultLogger"],"mappings":"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"}
1
+ {"version":3,"file":"discriminator-scan.cjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { appendPointer, canonicalRef, ROOT_POINTER } from \"../domain/openapi/json-pointer.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n // The value is the name as the `$ref` writes it, as in the original.\n const value = item.$ref.split(\"/\").pop();\n const ref = canonicalRef(item.$ref);\n if (value) {\n mapping[ref] = { ...mapping[ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, target] of Object.entries(defined)) {\n if (!target) {\n continue;\n }\n const mappedRef = canonicalRef(target);\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = appendPointer(ROOT_POINTER, path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => canonicalRef(mappedRef) === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, canonicalRef(item.$ref), appendPointer(ROOT_POINTER, path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(\n state,\n appendPointer(ROOT_POINTER, path),\n item.discriminator,\n appendPointer(ROOT_POINTER, path),\n );\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":["canonicalRef","mergesValues","patchDiscriminatorEnum","markHandled","appendPointer","ROOT_POINTER","FIX","resolveDocumentRef","unionAt","isUnionMember","recordEnumParent","inheritOtherOwners","enumKey","applyOtherInferredPatches","walkDocument","defaultLogger"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { unionAt, isUnionMember } from '../domain/openapi/discriminated-union.mjs';
2
- import { OutputFix } from '../domain/output-fixes.mjs';
2
+ import { appendPointer, ROOT_POINTER, canonicalRef } from '../domain/openapi/json-pointer.mjs';
3
+ import { FIX } from '../domain/output-fixes.mjs';
3
4
  import { defaultLogger } from './default-ports.mjs';
4
5
  import { applyOtherInferredPatches, inheritOtherOwners } from './discriminator-other-owners.mjs';
5
6
  import { enumKey, patchDiscriminatorEnum, markHandled, mergesValues, recordEnumParent } from './discriminator-patch.mjs';
6
7
  import { walkDocument, resolveDocumentRef } from './document-refs.mjs';
7
- import { createRef } from './legacy-utils.mjs';
8
8
 
9
9
  function inferredMapping(oneOf) {
10
10
  const mapping = {};
@@ -13,17 +13,19 @@ function inferredMapping(oneOf) {
13
13
  continue;
14
14
  }
15
15
  const value = item.$ref.split("/").pop();
16
+ const ref = canonicalRef(item.$ref);
16
17
  if (value) {
17
- mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };
18
+ mapping[ref] = { ...mapping[ref], inferred: value };
18
19
  }
19
20
  }
20
21
  return mapping;
21
22
  }
22
23
  function addDefinedMapping(mapping, defined) {
23
- for (const [mappedValue, mappedRef] of Object.entries(defined)) {
24
- if (!mappedRef) {
24
+ for (const [mappedValue, target] of Object.entries(defined)) {
25
+ if (!target) {
25
26
  continue;
26
27
  }
28
+ const mappedRef = canonicalRef(target);
27
29
  if (!mapping[mappedRef]?.defined) {
28
30
  mapping[mappedRef] = { defined: [] };
29
31
  }
@@ -49,7 +51,7 @@ function collectDiscriminator(state, value, path) {
49
51
  if (!discriminator?.propertyName) {
50
52
  return;
51
53
  }
52
- const discriminatorRef = createRef(path);
54
+ const discriminatorRef = appendPointer(ROOT_POINTER, path);
53
55
  state.objects[discriminatorRef] = discriminator;
54
56
  state.owners.add(discriminatorRef);
55
57
  if (!Array.isArray(value.oneOf)) {
@@ -62,10 +64,10 @@ function collectDiscriminator(state, value, path) {
62
64
  patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });
63
65
  }
64
66
  function valuesMappedTo(discriminator, ref) {
65
- return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => mappedRef === ref).map(([mappedValue]) => mappedValue);
67
+ return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => canonicalRef(mappedRef) === ref).map(([mappedValue]) => mappedValue);
66
68
  }
67
69
  function inheritsDiscriminator(state, parentRef, ref) {
68
- if (!state.fixes.has(OutputFix.ALLOF_DISCRIMINATED_UNION)) {
70
+ if (!state.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION)) {
69
71
  return true;
70
72
  }
71
73
  const resolve = (target) => resolveDocumentRef(state.schema, target, state);
@@ -73,7 +75,7 @@ function inheritsDiscriminator(state, parentRef, ref) {
73
75
  return union === void 0 || isUnionMember(union, ref, resolve);
74
76
  }
75
77
  function recordInherited(state, ref, discriminator, ownerRef) {
76
- if (state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {
78
+ if (state.fixes.has(FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {
77
79
  return;
78
80
  }
79
81
  const inherited = { ...discriminator };
@@ -104,11 +106,16 @@ function inheritDiscriminators(state, value, path) {
104
106
  }
105
107
  for (const item of value.allOf) {
106
108
  if ("$ref" in item) {
107
- if (!inheritFromRef(state, item.$ref, createRef(path))) {
109
+ if (!inheritFromRef(state, canonicalRef(item.$ref), appendPointer(ROOT_POINTER, path))) {
108
110
  return;
109
111
  }
110
112
  } else if (item.discriminator?.propertyName) {
111
- recordInherited(state, createRef(path), item.discriminator, createRef(path));
113
+ recordInherited(
114
+ state,
115
+ appendPointer(ROOT_POINTER, path),
116
+ item.discriminator,
117
+ appendPointer(ROOT_POINTER, path)
118
+ );
112
119
  }
113
120
  }
114
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discriminator-scan.mjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { OutputFix } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\nimport { createRef } from \"./legacy-utils.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n const value = item.$ref.split(\"/\").pop();\n if (value) {\n mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, mappedRef] of Object.entries(defined)) {\n if (!mappedRef) {\n continue;\n }\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = createRef(path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => mappedRef === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(OutputFix.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(OutputFix.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, item.$ref, createRef(path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(state, createRef(path), item.discriminator, createRef(path));\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":[],"mappings":";;;;;;;;AAmCA,SAAS,gBAAgB,KAAA,EAAiE;AACxF,EAAA,MAAM,UAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,EAAE,UAAU,IAAA,CAAA,EAAO;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI;AACvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,EAAE,GAAG,QAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,EAAU,KAAA,EAAM;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,iBAAA,CACP,SACA,OAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC9D,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAS,CAAA,EAAG,OAAA,EAAS;AAChC,MAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,IACrC;AACA,IAAA,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,EAC9C;AACF;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,OAAA,EACA,aAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,QAAA,EAAU,OAAA,EAAS,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClE,IAAA,MAAM,SAAA,GAAY,CAAC,YAAA,CAAa,KAAK,KAAK,KAAA,CAAM,WAAA,CAAY,SAAS,GAAG,CAAA;AACxE,IAAA,IAAI,SAAA,IAAc,CAAC,QAAA,IAAY,CAAC,OAAA,EAAU;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,IAAW,CAAC,QAAkB,CAAA;AAC7C,IAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,OAAA,KAAY,MAAA,EAAW;AAEhD,MAAA,KAAA,CAAM,gBAAgB,IAAA,CAAK,EAAE,GAAG,aAAA,EAAe,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC9D,CAAA,MAAA,IAAW,uBAAuB,KAAA,EAAO,EAAE,GAAG,aAAA,EAAe,GAAA,EAAK,MAAA,EAAQ,CAAA,EAAG;AAC3E,MAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AACF;AAGA,SAAS,oBAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,EAAA,IAAI,CAAC,eAAe,YAAA,EAAc;AAChC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,gBAAA,GAAmB,UAAU,IAAI,CAAA;AACvC,EAAA,KAAA,CAAM,OAAA,CAAQ,gBAAgB,CAAA,GAAI,aAAA;AAClC,EAAA,KAAA,CAAM,MAAA,CAAO,IAAI,gBAAgB,CAAA;AACjC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC/B,IAAA;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA;AAC3C,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,iBAAA,CAAkB,OAAA,EAAS,cAAc,OAAO,CAAA;AAAA,EAClD;AACA,EAAA,kBAAA,CAAmB,KAAA,EAAO,OAAA,EAAS,EAAE,aAAA,EAAe,kBAAkB,CAAA;AACxE;AAGA,SAAS,cAAA,CAAe,eAAoC,GAAA,EAAuB;AACjF,EAAA,OAAO,MAAA,CAAO,QAAQ,aAAA,CAAc,OAAA,IAAW,EAAE,CAAA,CAC9C,OAAO,CAAC,GAAG,SAAS,CAAA,KAAM,cAAc,GAAG,CAAA,CAC3C,IAAI,CAAC,CAAC,WAAW,CAAA,KAAM,WAAW,CAAA;AACvC;AAQA,SAAS,qBAAA,CAAsB,KAAA,EAAkB,SAAA,EAAmB,GAAA,EAAsB;AACxF,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,yBAAyB,CAAA,EAAG;AACzD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,CAAC,MAAA,KAAmB,mBAAmB,KAAA,CAAM,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAClF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACxC,EAAA,OAAO,KAAA,KAAU,MAAA,IAAa,aAAA,CAAc,KAAA,EAAO,KAAK,OAAO,CAAA;AACjE;AAQA,SAAS,eAAA,CACP,KAAA,EACA,GAAA,EACA,aAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,oBAAoB,KAAK,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5E,IAAA;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,EAAE,GAAG,aAAA,EAAc;AACrC,EAAA,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,SAAA;AACrB,EAAA,gBAAA,CAAiB,OAAO,EAAE,aAAA,EAAe,gBAAA,EAAkB,QAAA,IAAY,SAAS,CAAA;AAClF;AAOA,SAAS,cAAA,CAAe,KAAA,EAAkB,SAAA,EAAmB,GAAA,EAAsB;AACjF,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,aAAA,EAAe,GAAG,CAAA;AAChD,EAAA,MAAM,QAAQ,EAAE,GAAA,EAAK,MAAA,EAAQ,aAAA,EAAe,kBAAkB,SAAA,EAAU;AACxE,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,sBAAA,CAAuB,KAAA,EAAO,KAAK,CAAA,EAAG;AAC7D,IAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,qBAAA,CAAsB,KAAA,EAAO,SAAA,EAAW,GAAG,CAAA,EAAG;AAChD,IAAA,eAAA,CAAgB,KAAA,EAAO,GAAA,EAAK,aAAA,EAAe,SAAS,CAAA;AACpD,IAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,MAAA,kBAAA,CAAmB,KAAA,EAAO,WAAW,GAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,qBAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC/B,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAA6C;AACpE,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,IAAI,CAAC,eAAe,KAAA,EAAO,IAAA,CAAK,MAAM,SAAA,CAAU,IAAI,CAAC,CAAA,EAAG;AACtD,QAAA;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,CAAK,aAAA,EAAe,YAAA,EAAc;AAE3C,MAAA,eAAA,CAAgB,KAAA,EAAO,UAAU,IAAI,CAAA,EAAG,KAAK,aAAA,EAAe,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IAC7E;AAAA,EACF;AACF;AAgBA,SAAS,qBAAqB,KAAA,EAAwB;AAEpD,EAAA,MAAM,MAAA,mBAAS,IAAI,GAAA,CAAI,CAAC,GAAG,KAAA,CAAM,YAAA,CAAa,IAAA,EAAK,EAAG,GAAG,KAAA,CAAM,YAAY,CAAC,CAAA;AAC5E,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,eAAA,EAAiB;AACzC,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAC,CAAA,IAAK,sBAAA,CAAuB,KAAA,EAAO,KAAK,CAAA,EAAG;AACvE,MAAA,WAAA,CAAY,KAAA,EAAO,MAAM,GAAG,CAAA;AAAA,IAC9B;AAAA,EACF;AACA,EAAA,yBAAA,CAA0B,OAAO,MAAM,CAAA;AACzC;AAGO,SAAS,kBAAA,CACd,QACA,OAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,GAAG,OAAA;AAAA,IACH,MAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,MAAA,sBAAY,GAAA,EAAI;AAAA,IAChB,aAAa,EAAC;AAAA,IACd,YAAA,sBAAkB,GAAA,EAAI;AAAA,IACtB,iBAAiB,EAAC;AAAA,IAClB,sBAAsB,EAAC;AAAA,IACvB,iBAAiB,EAAC;AAAA,IAClB,YAAA,sBAAkB,GAAA,EAAI;AAAA,IACtB,WAAA,sBAAiB,GAAA;AAAI,GACvB;AACA,EAAA,YAAA,CAAa,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,KAAS,qBAAqB,KAAA,EAAO,KAAA,EAAO,IAAI,CAAC,CAAA;AAE9E,EAAA,YAAA,CAAa,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,KAAS,sBAAsB,KAAA,EAAO,KAAA,EAAO,IAAI,CAAC,CAAA;AAC/E,EAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,iBAAgB,GAAI,KAAA;AAC/D,EAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,WAAA,EAAa,eAAA,EAAgB;AAC9D;AAOO,SAAS,kBAAA,CACd,QACA,OAAA,EACA,MAAA,GAAiB,cAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EACnC;AACnB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,OAAO,kBAAA,CAAmB,QAAQ,EAAE,MAAA,EAAQ,QAAQ,KAAA,kBAAO,IAAI,GAAA,EAAI,EAAG,CAAA;AACxE;;"}
1
+ {"version":3,"file":"discriminator-scan.mjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { appendPointer, canonicalRef, ROOT_POINTER } from \"../domain/openapi/json-pointer.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n // The value is the name as the `$ref` writes it, as in the original.\n const value = item.$ref.split(\"/\").pop();\n const ref = canonicalRef(item.$ref);\n if (value) {\n mapping[ref] = { ...mapping[ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, target] of Object.entries(defined)) {\n if (!target) {\n continue;\n }\n const mappedRef = canonicalRef(target);\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = appendPointer(ROOT_POINTER, path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => canonicalRef(mappedRef) === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, canonicalRef(item.$ref), appendPointer(ROOT_POINTER, path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(\n state,\n appendPointer(ROOT_POINTER, path),\n item.discriminator,\n appendPointer(ROOT_POINTER, path),\n );\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":[],"mappings":"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"}
@@ -92,7 +92,7 @@ async function createDocumentRun(source, options, ports) {
92
92
  const fix = outputFixesOf(options, logger);
93
93
  const silent = options.silent ?? false;
94
94
  const cwd = sourceCwd(options);
95
- const schema = await ports.loader.load({
95
+ const { document: schema, localFiles } = await ports.loader.load({
96
96
  source,
97
97
  cwd,
98
98
  shouldLint: options.lint ?? true,
@@ -115,9 +115,10 @@ async function createDocumentRun(source, options, ports) {
115
115
  injectFooter: [],
116
116
  redoc: ports.redoc,
117
117
  resolve: ($ref) => documentRefs.resolveDocumentRef(schema, $ref, { silent, logger }),
118
- logger
118
+ logger,
119
+ deprecations: ports.deprecations
119
120
  };
120
- return { schema, ctx };
121
+ return { schema, localFiles, ctx };
121
122
  }
122
123
 
123
124
  exports.createDocumentRun = createDocumentRun;
@@ -1 +1 @@
1
- {"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document and the context of one generator run. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const schema = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n };\n return { schema, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","fileURLToPath","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","findDiscriminators","resolveDocumentRef"],"mappings":"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"}
1
+ {"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","fileURLToPath","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","findDiscriminators","resolveDocumentRef"],"mappings":"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"}
@@ -86,7 +86,7 @@ async function createDocumentRun(source, options, ports) {
86
86
  const fix = outputFixesOf(options, logger);
87
87
  const silent = options.silent ?? false;
88
88
  const cwd = sourceCwd(options);
89
- const schema = await ports.loader.load({
89
+ const { document: schema, localFiles } = await ports.loader.load({
90
90
  source,
91
91
  cwd,
92
92
  shouldLint: options.lint ?? true,
@@ -109,9 +109,10 @@ async function createDocumentRun(source, options, ports) {
109
109
  injectFooter: [],
110
110
  redoc: ports.redoc,
111
111
  resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),
112
- logger
112
+ logger,
113
+ deprecations: ports.deprecations
113
114
  };
114
- return { schema, ctx };
115
+ return { schema, localFiles, ctx };
115
116
  }
116
117
 
117
118
  export { createDocumentRun };