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

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 (513) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/redocly-loader/configured-headers.cjs +32 -0
  3. package/dist/adapters/redocly-loader/configured-headers.cjs.map +1 -0
  4. package/dist/adapters/redocly-loader/configured-headers.mjs +30 -0
  5. package/dist/adapters/redocly-loader/configured-headers.mjs.map +1 -0
  6. package/dist/adapters/redocly-loader/redocly-config-source.cjs +21 -2
  7. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  8. package/dist/adapters/redocly-loader/redocly-config-source.mjs +22 -3
  9. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  10. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +34 -11
  11. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +33 -10
  13. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/ref-access.cjs +37 -4
  15. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  16. package/dist/adapters/redocly-loader/ref-access.mjs +37 -4
  17. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/ref-resolution-check.cjs +191 -0
  19. package/dist/adapters/redocly-loader/ref-resolution-check.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/ref-resolution-check.mjs +189 -0
  21. package/dist/adapters/redocly-loader/ref-resolution-check.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs +73 -0
  23. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs +60 -0
  25. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/remote-fetch.cjs +41 -14
  27. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -14
  29. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/schema-load-errors.cjs +23 -5
  31. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/schema-load-errors.mjs +23 -5
  33. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/unsupported-keys.cjs +9 -1
  35. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/unsupported-keys.mjs +9 -1
  37. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  38. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  39. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  40. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  41. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  42. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +5 -1
  43. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -1
  44. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +5 -1
  45. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -1
  46. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -1
  47. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -1
  48. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +15 -9
  49. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -1
  50. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +15 -9
  51. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -1
  52. package/dist/api/default-ports.cjs +9 -0
  53. package/dist/api/default-ports.cjs.map +1 -1
  54. package/dist/api/default-ports.mjs +8 -1
  55. package/dist/api/default-ports.mjs.map +1 -1
  56. package/dist/api/discriminator-conflict-warnings.cjs +25 -0
  57. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
  58. package/dist/api/discriminator-conflict-warnings.mjs +23 -0
  59. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
  60. package/dist/api/discriminator-enum-names.cjs +19 -0
  61. package/dist/api/discriminator-enum-names.cjs.map +1 -0
  62. package/dist/api/discriminator-enum-names.mjs +17 -0
  63. package/dist/api/discriminator-enum-names.mjs.map +1 -0
  64. package/dist/api/discriminator-enum-parent.cjs +59 -0
  65. package/dist/api/discriminator-enum-parent.cjs.map +1 -0
  66. package/dist/api/discriminator-enum-parent.mjs +57 -0
  67. package/dist/api/discriminator-enum-parent.mjs.map +1 -0
  68. package/dist/api/discriminator-enum.cjs +25 -0
  69. package/dist/api/discriminator-enum.cjs.map +1 -1
  70. package/dist/api/discriminator-enum.mjs +25 -1
  71. package/dist/api/discriminator-enum.mjs.map +1 -1
  72. package/dist/api/discriminator-other-owners.cjs +67 -0
  73. package/dist/api/discriminator-other-owners.cjs.map +1 -0
  74. package/dist/api/discriminator-other-owners.mjs +64 -0
  75. package/dist/api/discriminator-other-owners.mjs.map +1 -0
  76. package/dist/api/discriminator-patch.cjs +92 -0
  77. package/dist/api/discriminator-patch.cjs.map +1 -0
  78. package/dist/api/discriminator-patch.mjs +86 -0
  79. package/dist/api/discriminator-patch.mjs.map +1 -0
  80. package/dist/api/discriminator-scan.cjs +50 -65
  81. package/dist/api/discriminator-scan.cjs.map +1 -1
  82. package/dist/api/discriminator-scan.mjs +44 -59
  83. package/dist/api/discriminator-scan.mjs.map +1 -1
  84. package/dist/api/document-refs.cjs +15 -12
  85. package/dist/api/document-refs.cjs.map +1 -1
  86. package/dist/api/document-refs.mjs +15 -12
  87. package/dist/api/document-refs.mjs.map +1 -1
  88. package/dist/api/document-run.cjs +21 -4
  89. package/dist/api/document-run.cjs.map +1 -1
  90. package/dist/api/document-run.mjs +22 -5
  91. package/dist/api/document-run.mjs.map +1 -1
  92. package/dist/api/enum-values-warnings.cjs +16 -0
  93. package/dist/api/enum-values-warnings.cjs.map +1 -0
  94. package/dist/api/enum-values-warnings.mjs +14 -0
  95. package/dist/api/enum-values-warnings.mjs.map +1 -0
  96. package/dist/api/footer-sink.cjs +25 -2
  97. package/dist/api/footer-sink.cjs.map +1 -1
  98. package/dist/api/footer-sink.mjs +25 -2
  99. package/dist/api/footer-sink.mjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.cjs +4 -1
  101. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  102. package/dist/api/legacy-callback-warning.mjs +4 -1
  103. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  104. package/dist/api/legacy-ts-helpers.cjs.map +1 -1
  105. package/dist/api/legacy-ts-helpers.mjs.map +1 -1
  106. package/dist/api/legacy-utils.cjs.map +1 -1
  107. package/dist/api/legacy-utils.mjs.map +1 -1
  108. package/dist/api/openapi-ts.cjs +2 -1
  109. package/dist/api/openapi-ts.cjs.map +1 -1
  110. package/dist/api/openapi-ts.mjs +3 -2
  111. package/dist/api/openapi-ts.mjs.map +1 -1
  112. package/dist/api/path-template-warnings.cjs +21 -0
  113. package/dist/api/path-template-warnings.cjs.map +1 -0
  114. package/dist/api/path-template-warnings.mjs +19 -0
  115. package/dist/api/path-template-warnings.mjs.map +1 -0
  116. package/dist/api/transform-context.cjs +4 -2
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +4 -2
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +52 -3
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +53 -4
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/api/unsupported-feature-warnings.cjs +6 -1
  125. package/dist/api/unsupported-feature-warnings.cjs.map +1 -1
  126. package/dist/api/unsupported-feature-warnings.mjs +6 -1
  127. package/dist/api/unsupported-feature-warnings.mjs.map +1 -1
  128. package/dist/application/print/type-printer.cjs +7 -1
  129. package/dist/application/print/type-printer.cjs.map +1 -1
  130. package/dist/application/print/type-printer.mjs +7 -1
  131. package/dist/application/print/type-printer.mjs.map +1 -1
  132. package/dist/application/transform/document/assignability.cjs +144 -0
  133. package/dist/application/transform/document/assignability.cjs.map +1 -0
  134. package/dist/application/transform/document/assignability.mjs +138 -0
  135. package/dist/application/transform/document/assignability.mjs.map +1 -0
  136. package/dist/application/transform/document/components.cjs +2 -2
  137. package/dist/application/transform/document/components.cjs.map +1 -1
  138. package/dist/application/transform/document/components.mjs +4 -4
  139. package/dist/application/transform/document/components.mjs.map +1 -1
  140. package/dist/application/transform/document/declared-types.cjs +66 -0
  141. package/dist/application/transform/document/declared-types.cjs.map +1 -0
  142. package/dist/application/transform/document/declared-types.mjs +63 -0
  143. package/dist/application/transform/document/declared-types.mjs.map +1 -0
  144. package/dist/application/transform/document/document.cjs +32 -9
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +34 -11
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/exploded-query.cjs +46 -0
  149. package/dist/application/transform/document/exploded-query.cjs.map +1 -0
  150. package/dist/application/transform/document/exploded-query.mjs +43 -0
  151. package/dist/application/transform/document/exploded-query.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +63 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -0
  154. package/dist/application/transform/document/global-type-references.mjs +61 -0
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -0
  156. package/dist/application/transform/document/list-assignability.cjs +54 -0
  157. package/dist/application/transform/document/list-assignability.cjs.map +1 -0
  158. package/dist/application/transform/document/list-assignability.mjs +52 -0
  159. package/dist/application/transform/document/list-assignability.mjs.map +1 -0
  160. package/dist/application/transform/document/parameters.cjs +41 -9
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +42 -10
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-key-overlaps.cjs +83 -33
  165. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -1
  166. package/dist/application/transform/document/path-key-overlaps.mjs +83 -33
  167. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -1
  168. package/dist/application/transform/document/path-template-replace.cjs +48 -0
  169. package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
  170. package/dist/application/transform/document/path-template-replace.mjs +45 -0
  171. package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
  172. package/dist/application/transform/document/paths.cjs +55 -29
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +54 -30
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/root-type-aliases.cjs +15 -14
  177. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  178. package/dist/application/transform/document/root-type-aliases.mjs +15 -13
  179. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  180. package/dist/application/transform/document/template-key-match.cjs +128 -0
  181. package/dist/application/transform/document/template-key-match.cjs.map +1 -0
  182. package/dist/application/transform/document/template-key-match.mjs +125 -0
  183. package/dist/application/transform/document/template-key-match.mjs.map +1 -0
  184. package/dist/application/transform/document/type-assignability.cjs +192 -0
  185. package/dist/application/transform/document/type-assignability.cjs.map +1 -0
  186. package/dist/application/transform/document/type-assignability.mjs +190 -0
  187. package/dist/application/transform/document/type-assignability.mjs.map +1 -0
  188. package/dist/application/transform/document/type-key.cjs +70 -0
  189. package/dist/application/transform/document/type-key.cjs.map +1 -0
  190. package/dist/application/transform/document/type-key.mjs +68 -0
  191. package/dist/application/transform/document/type-key.mjs.map +1 -0
  192. package/dist/application/transform/document/type-resolution.cjs +131 -0
  193. package/dist/application/transform/document/type-resolution.cjs.map +1 -0
  194. package/dist/application/transform/document/type-resolution.mjs +125 -0
  195. package/dist/application/transform/document/type-resolution.mjs.map +1 -0
  196. package/dist/application/transform/footer/document-footer.cjs +66 -4
  197. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  198. package/dist/application/transform/footer/document-footer.mjs +67 -5
  199. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  200. package/dist/application/transform/footer/enum-naming.cjs +17 -0
  201. package/dist/application/transform/footer/enum-naming.cjs.map +1 -1
  202. package/dist/application/transform/footer/enum-naming.mjs +17 -1
  203. package/dist/application/transform/footer/enum-naming.mjs.map +1 -1
  204. package/dist/application/transform/footer/enum-values-check.cjs +129 -0
  205. package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
  206. package/dist/application/transform/footer/enum-values-check.mjs +127 -0
  207. package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
  208. package/dist/application/transform/footer/evaluation.cjs +42 -0
  209. package/dist/application/transform/footer/evaluation.cjs.map +1 -0
  210. package/dist/application/transform/footer/evaluation.mjs +33 -0
  211. package/dist/application/transform/footer/evaluation.mjs.map +1 -0
  212. package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
  213. package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
  214. package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
  215. package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +138 -0
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
  218. package/dist/application/transform/footer/type-evaluation.mjs +136 -0
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
  220. package/dist/application/transform/footer/type-indexing.cjs +107 -0
  221. package/dist/application/transform/footer/type-indexing.cjs.map +1 -0
  222. package/dist/application/transform/footer/type-indexing.mjs +105 -0
  223. package/dist/application/transform/footer/type-indexing.mjs.map +1 -0
  224. package/dist/application/transform/footer/type-rules.cjs +172 -0
  225. package/dist/application/transform/footer/type-rules.cjs.map +1 -0
  226. package/dist/application/transform/footer/type-rules.mjs +166 -0
  227. package/dist/application/transform/footer/type-rules.mjs.map +1 -0
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
  232. package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
  233. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
  234. package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
  235. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
  236. package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
  237. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
  238. package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
  239. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
  240. package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
  241. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
  242. package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
  243. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
  244. package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
  245. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
  246. package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
  247. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
  248. package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
  249. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
  250. package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
  251. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
  252. package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
  253. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
  254. package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
  255. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
  256. package/dist/application/transform/ref-type.cjs +7 -2
  257. package/dist/application/transform/ref-type.cjs.map +1 -1
  258. package/dist/application/transform/ref-type.mjs +3 -2
  259. package/dist/application/transform/ref-type.mjs.map +1 -1
  260. package/dist/application/transform/schema/access-flags.cjs +38 -0
  261. package/dist/application/transform/schema/access-flags.cjs.map +1 -0
  262. package/dist/application/transform/schema/access-flags.mjs +36 -0
  263. package/dist/application/transform/schema/access-flags.mjs.map +1 -0
  264. package/dist/application/transform/schema/array-type.cjs +32 -1
  265. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/array-type.mjs +33 -2
  267. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/composition-type.cjs +50 -15
  269. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  270. package/dist/application/transform/schema/composition-type.mjs +50 -15
  271. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  272. package/dist/application/transform/schema/core-type.cjs +3 -1
  273. package/dist/application/transform/schema/core-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/core-type.mjs +3 -1
  275. package/dist/application/transform/schema/core-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/discriminated-union.cjs +30 -0
  277. package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
  278. package/dist/application/transform/schema/discriminated-union.mjs +27 -0
  279. package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
  280. package/dist/application/transform/schema/discriminator-property.cjs +3 -2
  281. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -1
  282. package/dist/application/transform/schema/discriminator-property.mjs +3 -2
  283. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -1
  284. package/dist/application/transform/schema/enum-rule.cjs +66 -10
  285. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  286. package/dist/application/transform/schema/enum-rule.mjs +67 -12
  287. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  288. package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
  289. package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
  290. package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
  291. package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
  292. package/dist/application/transform/schema/object-type.cjs +38 -25
  293. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  294. package/dist/application/transform/schema/object-type.mjs +39 -27
  295. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  296. package/dist/application/transform/schema/required-variants.cjs +45 -0
  297. package/dist/application/transform/schema/required-variants.cjs.map +1 -0
  298. package/dist/application/transform/schema/required-variants.mjs +42 -0
  299. package/dist/application/transform/schema/required-variants.mjs.map +1 -0
  300. package/dist/application/transform/schema/schema-transform.cjs +2 -2
  301. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  302. package/dist/application/transform/schema/schema-transform.mjs +2 -2
  303. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  304. package/dist/application/transform/schema-comment.cjs +51 -5
  305. package/dist/application/transform/schema-comment.cjs.map +1 -1
  306. package/dist/application/transform/schema-comment.mjs +50 -6
  307. package/dist/application/transform/schema-comment.mjs.map +1 -1
  308. package/dist/application/transform/type-combinators.mjs +1 -1
  309. package/dist/cli/api-settings.cjs +78 -0
  310. package/dist/cli/api-settings.cjs.map +1 -0
  311. package/dist/cli/api-settings.mjs +73 -0
  312. package/dist/cli/api-settings.mjs.map +1 -0
  313. package/dist/cli/cli-arguments.cjs +12 -3
  314. package/dist/cli/cli-arguments.cjs.map +1 -1
  315. package/dist/cli/cli-arguments.mjs +12 -4
  316. package/dist/cli/cli-arguments.mjs.map +1 -1
  317. package/dist/cli/cli-errors.cjs +3 -2
  318. package/dist/cli/cli-errors.cjs.map +1 -1
  319. package/dist/cli/cli-errors.mjs +3 -2
  320. package/dist/cli/cli-errors.mjs.map +1 -1
  321. package/dist/cli/cli-output.cjs +8 -3
  322. package/dist/cli/cli-output.cjs.map +1 -1
  323. package/dist/cli/cli-output.mjs +9 -4
  324. package/dist/cli/cli-output.mjs.map +1 -1
  325. package/dist/cli/help-text.cjs +3 -3
  326. package/dist/cli/help-text.cjs.map +1 -1
  327. package/dist/cli/help-text.mjs +3 -3
  328. package/dist/cli/help-text.mjs.map +1 -1
  329. package/dist/cli/main.cjs +5 -0
  330. package/dist/cli/main.cjs.map +1 -1
  331. package/dist/cli/main.mjs +5 -0
  332. package/dist/cli/main.mjs.map +1 -1
  333. package/dist/cli/redocly-apis.cjs +15 -7
  334. package/dist/cli/redocly-apis.cjs.map +1 -1
  335. package/dist/cli/redocly-apis.mjs +15 -7
  336. package/dist/cli/redocly-apis.mjs.map +1 -1
  337. package/dist/cli/ref-limits.cjs +1 -1
  338. package/dist/cli/ref-limits.cjs.map +1 -1
  339. package/dist/cli/ref-limits.mjs +2 -2
  340. package/dist/cli/ref-limits.mjs.map +1 -1
  341. package/dist/cli/run-cli.cjs +20 -3
  342. package/dist/cli/run-cli.cjs.map +1 -1
  343. package/dist/cli/run-cli.mjs +21 -4
  344. package/dist/cli/run-cli.mjs.map +1 -1
  345. package/dist/domain/errors.cjs +6 -1
  346. package/dist/domain/errors.cjs.map +1 -1
  347. package/dist/domain/errors.mjs +6 -1
  348. package/dist/domain/errors.mjs.map +1 -1
  349. package/dist/domain/ir/constructors.cjs +7 -1
  350. package/dist/domain/ir/constructors.cjs.map +1 -1
  351. package/dist/domain/ir/constructors.mjs +6 -2
  352. package/dist/domain/ir/constructors.mjs.map +1 -1
  353. package/dist/domain/openapi/admitted-values.cjs +75 -0
  354. package/dist/domain/openapi/admitted-values.cjs.map +1 -0
  355. package/dist/domain/openapi/admitted-values.mjs +72 -0
  356. package/dist/domain/openapi/admitted-values.mjs.map +1 -0
  357. package/dist/domain/openapi/discriminated-union.cjs +68 -0
  358. package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
  359. package/dist/domain/openapi/discriminated-union.mjs +62 -0
  360. package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
  361. package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
  362. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
  363. package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
  364. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
  365. package/dist/domain/openapi/parameter-object.cjs.map +1 -1
  366. package/dist/domain/openapi/parameter-object.mjs.map +1 -1
  367. package/dist/domain/openapi/path-templates.cjs +23 -0
  368. package/dist/domain/openapi/path-templates.cjs.map +1 -0
  369. package/dist/domain/openapi/path-templates.mjs +21 -0
  370. package/dist/domain/openapi/path-templates.mjs.map +1 -0
  371. package/dist/domain/output-fixes.cjs +36 -1
  372. package/dist/domain/output-fixes.cjs.map +1 -1
  373. package/dist/domain/output-fixes.mjs +36 -1
  374. package/dist/domain/output-fixes.mjs.map +1 -1
  375. package/dist/domain/url-credentials.cjs +10 -0
  376. package/dist/domain/url-credentials.cjs.map +1 -0
  377. package/dist/domain/url-credentials.mjs +8 -0
  378. package/dist/domain/url-credentials.mjs.map +1 -0
  379. package/dist/domain/warnings.cjs +23 -0
  380. package/dist/domain/warnings.cjs.map +1 -0
  381. package/dist/domain/warnings.mjs +20 -0
  382. package/dist/domain/warnings.mjs.map +1 -0
  383. package/dist/index.cjs +2 -0
  384. package/dist/index.cjs.map +1 -1
  385. package/dist/index.d.cts +1182 -46
  386. package/dist/index.d.mts +1182 -46
  387. package/dist/index.d.ts +1182 -46
  388. package/dist/index.mjs +1 -0
  389. package/dist/index.mjs.map +1 -1
  390. package/dist/transform/components-object.cjs +2 -1
  391. package/dist/transform/components-object.cjs.map +1 -1
  392. package/dist/transform/components-object.mjs +2 -1
  393. package/dist/transform/components-object.mjs.map +1 -1
  394. package/dist/transform/path-item-object.cjs.map +1 -1
  395. package/dist/transform/path-item-object.mjs.map +1 -1
  396. package/package.json +6 -5
  397. package/src/adapters/redocly-loader/configured-headers.ts +65 -0
  398. package/src/adapters/redocly-loader/redocly-config-source.ts +41 -6
  399. package/src/adapters/redocly-loader/redocly-schema-loader.ts +44 -13
  400. package/src/adapters/redocly-loader/ref-access.ts +60 -5
  401. package/src/adapters/redocly-loader/ref-resolution-check.ts +257 -0
  402. package/src/adapters/redocly-loader/ref-resolution-steps.ts +113 -0
  403. package/src/adapters/redocly-loader/remote-fetch.ts +77 -21
  404. package/src/adapters/redocly-loader/schema-load-errors.ts +33 -11
  405. package/src/adapters/redocly-loader/unsupported-keys.ts +17 -2
  406. package/src/adapters/terminal-logger/terminal-logger.ts +9 -5
  407. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +5 -1
  408. package/src/adapters/type-ast-bridge/print-typescript.ts +3 -1
  409. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +26 -12
  410. package/src/adapters/type-ast-bridge/typescript-types.ts +57 -5
  411. package/src/api/default-ports.ts +16 -0
  412. package/src/api/discriminator-conflict-warnings.ts +43 -0
  413. package/src/api/discriminator-enum-names.ts +26 -0
  414. package/src/api/discriminator-enum-parent.ts +129 -0
  415. package/src/api/discriminator-enum.ts +39 -0
  416. package/src/api/discriminator-other-owners.ts +97 -0
  417. package/src/api/discriminator-patch.ts +152 -0
  418. package/src/api/discriminator-scan.ts +78 -90
  419. package/src/api/document-refs.ts +19 -15
  420. package/src/api/document-run.ts +32 -11
  421. package/src/api/enum-values-warnings.ts +21 -0
  422. package/src/api/footer-sink.ts +34 -2
  423. package/src/api/legacy-callback-warning.ts +7 -3
  424. package/src/api/legacy-ts-helpers.ts +7 -5
  425. package/src/api/legacy-utils.ts +1 -1
  426. package/src/api/openapi-ts.ts +2 -0
  427. package/src/api/path-template-warnings.ts +27 -0
  428. package/src/api/run-context.ts +34 -0
  429. package/src/api/transform-context.ts +17 -9
  430. package/src/api/transform-schema.ts +90 -5
  431. package/src/api/unsupported-feature-warnings.ts +8 -1
  432. package/src/application/ports/redocly-config-source.ts +5 -1
  433. package/src/application/print/type-printer.ts +8 -1
  434. package/src/application/transform/document/assignability.ts +203 -0
  435. package/src/application/transform/document/components.ts +6 -6
  436. package/src/application/transform/document/declared-types.ts +93 -0
  437. package/src/application/transform/document/document.ts +71 -13
  438. package/src/application/transform/document/exploded-query.ts +91 -0
  439. package/src/application/transform/document/global-type-references.ts +78 -0
  440. package/src/application/transform/document/list-assignability.ts +87 -0
  441. package/src/application/transform/document/parameters.ts +78 -12
  442. package/src/application/transform/document/path-key-overlaps.ts +148 -59
  443. package/src/application/transform/document/path-template-replace.ts +90 -0
  444. package/src/application/transform/document/paths.ts +101 -38
  445. package/src/application/transform/document/root-type-aliases.ts +29 -28
  446. package/src/application/transform/document/template-key-match.ts +183 -0
  447. package/src/application/transform/document/type-assignability.ts +268 -0
  448. package/src/application/transform/document/type-key.ts +80 -0
  449. package/src/application/transform/document/type-resolution.ts +163 -0
  450. package/src/application/transform/footer/document-footer.ts +91 -6
  451. package/src/application/transform/footer/enum-naming.ts +29 -0
  452. package/src/application/transform/footer/enum-values-check.ts +171 -0
  453. package/src/application/transform/footer/evaluation.ts +57 -0
  454. package/src/application/transform/footer/shared-enum-names.ts +86 -0
  455. package/src/application/transform/footer/type-evaluation.ts +167 -0
  456. package/src/application/transform/footer/type-indexing.ts +152 -0
  457. package/src/application/transform/footer/type-rules.ts +269 -0
  458. package/src/application/transform/ref-pointer/generated-location.ts +211 -0
  459. package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
  460. package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
  461. package/src/application/transform/ref-pointer/original-index.ts +95 -0
  462. package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
  463. package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
  464. package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
  465. package/src/application/transform/ref-type.ts +11 -6
  466. package/src/application/transform/schema/access-flags.ts +63 -0
  467. package/src/application/transform/schema/array-type.ts +66 -5
  468. package/src/application/transform/schema/composition-type.ts +96 -24
  469. package/src/application/transform/schema/core-type.ts +8 -4
  470. package/src/application/transform/schema/discriminated-union.ts +58 -0
  471. package/src/application/transform/schema/discriminator-property.ts +8 -3
  472. package/src/application/transform/schema/enum-rule.ts +136 -13
  473. package/src/application/transform/schema/inherited-discriminator.ts +54 -0
  474. package/src/application/transform/schema/object-type.ts +51 -33
  475. package/src/application/transform/schema/required-variants.ts +88 -0
  476. package/src/application/transform/schema/schema-context.ts +26 -0
  477. package/src/application/transform/schema/schema-transform.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +84 -4
  479. package/src/cli/api-settings.ts +109 -0
  480. package/src/cli/cli-arguments.ts +18 -5
  481. package/src/cli/cli-dependencies.ts +5 -0
  482. package/src/cli/cli-errors.ts +4 -2
  483. package/src/cli/cli-output.ts +18 -4
  484. package/src/cli/help-text.ts +4 -4
  485. package/src/cli/main.ts +6 -0
  486. package/src/cli/redocly-apis.ts +21 -11
  487. package/src/cli/ref-limits.ts +2 -2
  488. package/src/cli/run-cli.ts +25 -4
  489. package/src/domain/errors.ts +10 -2
  490. package/src/domain/ir/constructors.ts +9 -1
  491. package/src/domain/ir/nodes.ts +11 -7
  492. package/src/domain/openapi/admitted-values.ts +113 -0
  493. package/src/domain/openapi/discriminated-union.ts +109 -0
  494. package/src/domain/openapi/discriminator-conflicts.ts +251 -0
  495. package/src/domain/openapi/parameter-object.ts +4 -0
  496. package/src/domain/openapi/path-templates.ts +32 -0
  497. package/src/domain/openapi/schema-object.ts +2 -0
  498. package/src/domain/output-fixes.ts +43 -2
  499. package/src/domain/url-credentials.ts +18 -0
  500. package/src/domain/warnings.ts +28 -0
  501. package/src/index.ts +1 -0
  502. package/src/transform/components-object.ts +3 -1
  503. package/src/transform/path-item-object.ts +6 -2
  504. package/src/types/generator-options.ts +12 -21
  505. package/src/types/openapi-common.ts +1 -0
  506. package/src/types/openapi-request.ts +3 -0
  507. package/src/types/openapi-schema.ts +2 -0
  508. package/src/types/openapi-security.ts +1 -0
  509. package/dist/application/transform/document/path-item-conflicts.cjs +0 -51
  510. package/dist/application/transform/document/path-item-conflicts.cjs.map +0 -1
  511. package/dist/application/transform/document/path-item-conflicts.mjs +0 -49
  512. package/dist/application/transform/document/path-item-conflicts.mjs.map +0 -1
  513. package/src/application/transform/document/path-item-conflicts.ts +0 -79
@@ -1 +1 @@
1
- {"version":3,"file":"object-type.mjs","sources":["../../../../src/application/transform/schema/object-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport {\n irObject,\n irProperty,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport { withSchemaComment } from \"../schema-comment.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport { discriminatorProperty } from \"./discriminator-property.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/** Path parts where a default value cannot make a property required (inputs may omit it). */\nconst INPUT_PATH_PARTS = [\"parameters\", \"requestBody\", \"requestBodies\"] as const;\n\nexport class InvalidPropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, key: string, value: unknown) {\n const received = Array.isArray(value) ? \"Array\" : typeof value;\n super({\n code: ERROR_CODES.SCHEMA_PROPERTY_INVALID,\n message:\n `${path}: invalid property ${key}. ` + `Expected Schema Object or boolean, got ${received}`,\n details: { path, property: key, received },\n });\n this.name = \"InvalidPropertyError\";\n }\n}\n\n/** `--read-write-markers`: `$Read<T>` / `$Write<T>`, unless the property is both or neither. */\nfunction withReadWriteMarker(type: IrType, flags: AccessFlags, options: SchemaOptions): IrType {\n if (!options.readWriteMarkers || flags.isReadOnly === flags.isWriteOnly) {\n return type;\n }\n return irReference(flags.isReadOnly ? \"$Read\" : \"$Write\", [type]);\n}\n\ninterface AccessFlags {\n readonly isReadOnly: boolean;\n readonly isWriteOnly: boolean;\n}\n\n/** Apply `transformProperty`, then the schema's JSDoc. */\nfunction finishProperty(\n property: IrPropertySignature,\n schema: Schema,\n path: string,\n request: SchemaRequest,\n): IrPropertySignature {\n const location = { ...request.location, path };\n const transformed =\n request.context.callbacks.transformProperty(property, schema, location) ?? property;\n // The original adds the schema's comment after any comment the callback set.\n return withSchemaComment(transformed, schema);\n}\n\n/** What the property loop reads from a property schema, in the original order. */\ninterface PropertyFacts {\n readonly ref: string | undefined;\n readonly flags: AccessFlags;\n readonly hasDefault: boolean;\n}\n\nfunction propertyFacts(value: Schema): PropertyFacts {\n if (typeof value !== \"object\") {\n return { ref: undefined, flags: { isReadOnly: false, isWriteOnly: false }, hasDefault: false };\n }\n // `in` throws for a null value, as in the original (which also reads `$ref` first).\n const ref = \"$ref\" in value && value.$ref ? value.$ref : undefined;\n const flags = {\n isReadOnly: Boolean(\"readOnly\" in value && value.readOnly),\n isWriteOnly: Boolean(\"writeOnly\" in value && value.writeOnly),\n };\n return { ref, flags, hasDefault: \"default\" in value && value.default !== undefined };\n}\n\nfunction isOptionalProperty(\n key: string,\n facts: PropertyFacts,\n schema: SchemaObject,\n request: SchemaRequest,\n): boolean {\n const { options } = request.context;\n const path = request.location.path;\n const isDefaultRequired =\n facts.hasDefault &&\n options.defaultNonNullable &&\n !INPUT_PATH_PARTS.some((part) => path?.includes(part));\n const isRequired =\n schema.required?.includes(key) ||\n (schema.required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\nfunction isExcluded(value: Schema, facts: PropertyFacts, request: SchemaRequest): boolean {\n if (!request.context.options.excludeDeprecated) {\n return false;\n }\n const resolved = facts.ref ? request.context.refs.resolve(facts.ref) : value;\n return Boolean((resolved as SchemaObject | undefined)?.deprecated);\n}\n\n/** A type, and whether a callback forced the property optional (null: no override). */\ninterface CustomResult {\n readonly type: IrType;\n readonly isOptional: true | null;\n}\n\nfunction propertyType(\n key: string,\n value: Schema,\n facts: PropertyFacts,\n request: SchemaRequest,\n): CustomResult {\n const path = createRef([request.location.path, key]);\n const type = facts.ref\n ? refType(facts.ref)\n : request.transformNested(value, { ...request.location, path });\n const custom = request.context.callbacks.transform(value, request.location);\n return custom === null\n ? { type, isOptional: null }\n : { type: custom.type, isOptional: custom.isOptional || null };\n}\n\nfunction propertyMember(\n key: string,\n value: Schema,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrMember | null {\n if ((typeof value !== \"object\" && typeof value !== \"boolean\") || Array.isArray(value)) {\n throw new InvalidPropertyError(request.location.path, key, value);\n }\n const facts = propertyFacts(value);\n if (isExcluded(value, facts, request)) {\n return null;\n }\n const { options } = request.context;\n const isOptional = isOptionalProperty(key, facts, schema, request);\n const result = propertyType(key, value, facts, request);\n const property = irProperty(\n toPropertyName(key),\n withReadWriteMarker(result.type, facts.flags, options),\n {\n isOptional: result.isOptional ?? isOptional,\n isReadonly: options.immutable || (!options.readWriteMarkers && facts.flags.isReadOnly),\n },\n );\n return finishProperty(property, value, createRef([request.location.path, key]), request);\n}\n\nfunction propertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const members: IrMember[] = [];\n for (const [key, value] of documentEntries(schema.properties ?? {}, request.context.options)) {\n const member = propertyMember(key, value, schema, request);\n if (member !== null) {\n members.push(member);\n }\n }\n return members;\n}\n\n/**\n * `$defs` as a nested `$defs?: { … }` member, in document order (never alphabetized). It is\n * optional because `$defs` is a schema keyword, not data: the original made it required, so a\n * value of the type needed a `$defs` key (research/legacy-bugs.md, item 17, upstream #2664).\n */\nfunction defsMember(\n defs: Readonly<Record<string, SchemaObject>>,\n request: SchemaRequest,\n): IrMember {\n const { options } = request.context;\n const members = Object.entries(defs).map(([key, value]) => {\n const path = createRef([request.location.path, \"$defs\", key]);\n const flags = {\n isReadOnly: \"readOnly\" in value && !!value.readOnly,\n isWriteOnly: \"writeOnly\" in value && !!value.writeOnly,\n };\n const type = withReadWriteMarker(\n request.transformNested(value, { ...request.location, path }),\n flags,\n options,\n );\n const property = irProperty(toPropertyName(key), type, {\n isReadonly: options.immutable || (!options.readWriteMarkers && flags.isReadOnly),\n });\n return finishProperty(property, value, path, request);\n });\n return irProperty(toPropertyName(\"$defs\"), irObject(members), { isOptional: true });\n}\n\nfunction hasObjectKeywords(schema: SchemaObject): boolean {\n const hasProperties = Boolean(schema.properties && Object.keys(schema.properties).length);\n return (\n hasProperties ||\n Boolean(schema.additionalProperties || schema.patternProperties || schema.$defs)\n );\n}\n\n/** Value types of the `[key: string]` index signature, in the original order. */\nfunction indexValueTypes(schema: SchemaObject, request: SchemaRequest): IrType[] {\n const { additionalProperties } = schema;\n const isObject = typeof additionalProperties === \"object\";\n const hasExplicit = isObject && Object.keys(additionalProperties).length > 0;\n const hasImplicit =\n additionalProperties === true || (isObject && Object.keys(additionalProperties).length === 0);\n const types: IrType[] = [];\n if (hasExplicit) {\n types.push(request.transformNested(additionalProperties as Schema, request.location, true));\n }\n if (hasImplicit || (!additionalProperties && request.context.options.additionalProperties)) {\n types.push(UNKNOWN_TYPE);\n }\n const patterns = schema.patternProperties;\n if (typeof patterns === \"object\" && patterns !== null && Object.keys(patterns).length > 0) {\n for (const [, value] of documentEntries(patterns, request.context.options)) {\n types.push(request.transformNested(value, request.location));\n }\n }\n return types;\n}\n\n/** The discriminator property that a parent's mapping implies for this schema, if any. */\nfunction discriminatorMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n if (!schema.allOf && !schema.anyOf) {\n return [];\n }\n const path = request.location.path ?? \"\";\n const { discriminators, options } = request.context;\n // A schema does not get the discriminator it defines for its children, nor one added already.\n const discriminator =\n !schema.discriminator && !discriminators.isHandled(path) && discriminators.objectAt(path);\n return discriminator ? [discriminatorProperty(discriminator, path, options.immutable)] : [];\n}\n\n/**\n * Object keywords: discriminator, `properties`, `$defs`, and an index signature for\n * `additionalProperties` / `patternProperties` (or `--additional-properties`). Null when the schema\n * has none of them.\n */\nexport function objectType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const members = discriminatorMembers(schema, request);\n if (!hasObjectKeywords(schema)) {\n return members.length > 0 ? irObject(members) : null;\n }\n members.push(...propertyMembers(schema, request));\n // As in the original, a null `$defs` throws here (Object.keys) instead of being skipped.\n if (\n \"$defs\" in schema &&\n typeof schema.$defs === \"object\" &&\n Object.keys(schema.$defs).length > 0\n ) {\n members.push(defsMember(schema.$defs, request));\n }\n const valueTypes = indexValueTypes(schema, request);\n if (valueTypes.length === 0) {\n return members.length > 0 ? irObject(members) : null;\n }\n const index = irObject([\n irStringIndexSignature(\"key\", unionOf(valueTypes), request.context.options.immutable),\n ]);\n return intersectionOf([...(members.length > 0 ? [irObject(members)] : []), index]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object-type.mjs","sources":["../../../../src/application/transform/schema/object-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport {\n irObject,\n irProperty,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { schemaCommentOptionsOf, withSchemaComment } from \"../schema-comment.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport { type AccessFlags, propertyAccessFlags } from \"./access-flags.js\";\nimport { discriminatorMember, inheritedDiscriminator } from \"./inherited-discriminator.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/** Path parts where a default value cannot make a property required (inputs may omit it). */\nconst INPUT_PATH_PARTS = [\"parameters\", \"requestBody\", \"requestBodies\"] as const;\n\nexport class InvalidPropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, key: string, value: unknown) {\n const received = Array.isArray(value) ? \"Array\" : typeof value;\n super({\n code: ERROR_CODES.SCHEMA_PROPERTY_INVALID,\n message:\n `${path}: invalid property ${key}. ` + `Expected Schema Object or boolean, got ${received}`,\n details: { path, property: key, received },\n });\n this.name = \"InvalidPropertyError\";\n }\n}\n\n/** `--read-write-markers`: `$Read<T>` / `$Write<T>`, unless the property is both or neither. */\nfunction withReadWriteMarker(type: IrType, flags: AccessFlags, options: SchemaOptions): IrType {\n if (!options.readWriteMarkers || flags.isReadOnly === flags.isWriteOnly) {\n return type;\n }\n return irReference(flags.isReadOnly ? \"$Read\" : \"$Write\", [type]);\n}\n\n/** Apply `transformProperty`, then the schema's JSDoc. */\nfunction finishProperty(\n property: IrPropertySignature,\n schema: Schema,\n path: string,\n request: SchemaRequest,\n): IrPropertySignature {\n const location = { ...request.location, path };\n const transformed =\n request.context.callbacks.transformProperty(property, schema, location) ?? property;\n // The original adds the schema's comment after any comment the callback set.\n return withSchemaComment(\n transformed,\n schema,\n schemaCommentOptionsOf(request.context.options.fixes),\n );\n}\n\n/** What the property loop reads from a property schema, in the original order. */\ninterface PropertyFacts {\n readonly ref: string | undefined;\n readonly flags: AccessFlags;\n readonly hasDefault: boolean;\n}\n\nfunction propertyFacts(value: Schema, request: SchemaRequest): PropertyFacts {\n if (typeof value !== \"object\") {\n return { ref: undefined, flags: { isReadOnly: false, isWriteOnly: false }, hasDefault: false };\n }\n // `in` throws for a null value, as in the original (which also reads `$ref` first).\n const ref = \"$ref\" in value && value.$ref ? value.$ref : undefined;\n const flags = propertyAccessFlags(value, request.context);\n return { ref, flags, hasDefault: \"default\" in value && value.default !== undefined };\n}\n\nfunction isOptionalProperty(\n key: string,\n facts: PropertyFacts,\n schema: SchemaObject,\n request: SchemaRequest,\n): boolean {\n const { options } = request.context;\n const path = request.location.path;\n const isDefaultRequired =\n facts.hasDefault &&\n options.defaultNonNullable &&\n !INPUT_PATH_PARTS.some((part) => path?.includes(part));\n const isRequired =\n schema.required?.includes(key) ||\n (schema.required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\nfunction isExcluded(value: Schema, facts: PropertyFacts, request: SchemaRequest): boolean {\n if (!request.context.options.excludeDeprecated) {\n return false;\n }\n const resolved = facts.ref ? request.context.refs.resolve(facts.ref) : value;\n return Boolean((resolved as SchemaObject | undefined)?.deprecated);\n}\n\n/** A type, and whether a callback forced the property optional (null: no override). */\ninterface CustomResult {\n readonly type: IrType;\n readonly isOptional: true | null;\n}\n\nfunction propertyType(\n key: string,\n value: Schema,\n facts: PropertyFacts,\n request: SchemaRequest,\n): CustomResult {\n const path = createRef([request.location.path, key]);\n const type = facts.ref\n ? schemaRefType(facts.ref, request)\n : request.transformNested(value, { ...request.location, path });\n const custom = request.context.callbacks.transform(value, request.location);\n return custom === null\n ? { type, isOptional: null }\n : { type: custom.type, isOptional: custom.isOptional || null };\n}\n\nfunction propertyMember(\n key: string,\n value: Schema,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrMember | null {\n if ((typeof value !== \"object\" && typeof value !== \"boolean\") || Array.isArray(value)) {\n throw new InvalidPropertyError(request.location.path, key, value);\n }\n const facts = propertyFacts(value, request);\n if (isExcluded(value, facts, request)) {\n return null;\n }\n const { options } = request.context;\n const isOptional = isOptionalProperty(key, facts, schema, request);\n const result = propertyType(key, value, facts, request);\n const property = irProperty(\n toPropertyName(key),\n withReadWriteMarker(result.type, facts.flags, options),\n {\n isOptional: result.isOptional ?? isOptional,\n isReadonly: options.immutable || (!options.readWriteMarkers && facts.flags.isReadOnly),\n },\n );\n return finishProperty(property, value, createRef([request.location.path, key]), request);\n}\n\nfunction propertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const members: IrMember[] = [];\n for (const [key, value] of documentEntries(schema.properties ?? {}, request.context.options)) {\n const member = propertyMember(key, value, schema, request);\n if (member !== null) {\n members.push(member);\n }\n }\n return members;\n}\n\n/**\n * `$defs` as a nested `$defs?: { … }` member, in document order (never alphabetized). It is\n * optional because `$defs` is a schema keyword, not data: the original made it required, so a\n * value of the type needed a `$defs` key (research/legacy-bugs.md, item 17, upstream #2664).\n */\nfunction defsMember(\n defs: Readonly<Record<string, SchemaObject>>,\n request: SchemaRequest,\n): IrMember {\n const { options } = request.context;\n const members = Object.entries(defs).map(([key, value]) => {\n const path = createRef([request.location.path, \"$defs\", key]);\n const flags = propertyAccessFlags(value, request.context);\n const type = withReadWriteMarker(\n request.transformNested(value, { ...request.location, path }),\n flags,\n options,\n );\n const property = irProperty(toPropertyName(key), type, {\n isReadonly: options.immutable || (!options.readWriteMarkers && flags.isReadOnly),\n });\n return finishProperty(property, value, path, request);\n });\n return irProperty(toPropertyName(\"$defs\"), irObject(members), { isOptional: true });\n}\n\nfunction hasObjectKeywords(schema: SchemaObject): boolean {\n const hasProperties = Boolean(schema.properties && Object.keys(schema.properties).length);\n return (\n hasProperties ||\n Boolean(schema.additionalProperties || schema.patternProperties || schema.$defs)\n );\n}\n\n/** Value types of the `[key: string]` index signature, in the original order. */\nfunction indexValueTypes(schema: SchemaObject, request: SchemaRequest): IrType[] {\n const { additionalProperties } = schema;\n const isObject = typeof additionalProperties === \"object\";\n const hasExplicit = isObject && Object.keys(additionalProperties).length > 0;\n const hasImplicit =\n additionalProperties === true || (isObject && Object.keys(additionalProperties).length === 0);\n const types: IrType[] = [];\n if (hasExplicit) {\n types.push(request.transformNested(additionalProperties as Schema, request.location, true));\n }\n if (hasImplicit || (!additionalProperties && request.context.options.additionalProperties)) {\n types.push(UNKNOWN_TYPE);\n }\n const patterns = schema.patternProperties;\n if (typeof patterns === \"object\" && patterns !== null && Object.keys(patterns).length > 0) {\n for (const [, value] of documentEntries(patterns, request.context.options)) {\n types.push(request.transformNested(value, request.location));\n }\n }\n return types;\n}\n\n/**\n * Whether the schema declares property `key` and the type keeps it: `--exclude-deprecated` drops\n * a deprecated one.\n */\nexport function isKeptProperty(schema: SchemaObject, key: string, request: SchemaRequest): boolean {\n const properties = schema.properties ?? {};\n if (!Object.hasOwn(properties, key)) {\n return false;\n }\n const value = properties[key] as Schema;\n const isExcludable = request.context.options.excludeDeprecated && typeof value === \"object\";\n return !isExcludable || !isExcluded(value, propertyFacts(value, request), request);\n}\n\n/**\n * The members for the discriminator and `properties`. A schema that declares the discriminator\n * property itself keeps its own declaration, required as the discriminator needs: both in one\n * object type do not compile (TS2300, the Apple SiriKit Cloud Media API). A declaration that\n * `--exclude-deprecated` drops does not count, so the discriminator property stays.\n */\nfunction discriminatorAndPropertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const inherited = inheritedDiscriminator(schema, request);\n if (inherited === undefined) {\n return propertyMembers(schema, request);\n }\n const name = inherited.discriminator.propertyName;\n if (!isKeptProperty(schema, name, request)) {\n return [discriminatorMember(inherited, request), ...propertyMembers(schema, request)];\n }\n // Without `required`, `--properties-required-by-default` requires every property already; a\n // list of one would make the others optional.\n const isAllRequired =\n schema.required === undefined && request.context.options.propertiesRequiredByDefault;\n const required = isAllRequired ? undefined : [...(schema.required ?? []), name];\n return propertyMembers({ ...schema, required } as SchemaObject, request);\n}\n\n/**\n * Object keywords: discriminator, `properties`, `$defs`, and an index signature for\n * `additionalProperties` / `patternProperties` (or `--additional-properties`). Null when the schema\n * has none of them.\n */\nexport function objectType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n if (!hasObjectKeywords(schema)) {\n const inherited = inheritedDiscriminator(schema, request);\n return inherited ? irObject([discriminatorMember(inherited, request)]) : null;\n }\n const members = discriminatorAndPropertyMembers(schema, request);\n // As in the original, a null `$defs` throws here (Object.keys) instead of being skipped.\n if (\n \"$defs\" in schema &&\n typeof schema.$defs === \"object\" &&\n Object.keys(schema.$defs).length > 0\n ) {\n members.push(defsMember(schema.$defs, request));\n }\n const valueTypes = indexValueTypes(schema, request);\n if (valueTypes.length === 0) {\n return members.length > 0 ? irObject(members) : null;\n }\n const index = irObject([\n irStringIndexSignature(\"key\", unionOf(valueTypes), request.context.options.immutable),\n ]);\n return intersectionOf([...(members.length > 0 ? [irObject(members)] : []), index]);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ const outputFixes = require('../../../domain/output-fixes.cjs');
4
+ const typeCombinators = require('../type-combinators.cjs');
5
+ const objectType = require('./object-type.cjs');
6
+
7
+ const ANNOTATION_KEYS = /* @__PURE__ */ new Set(["required", "description", "title"]);
8
+ function requiredOnlyKeys(variant) {
9
+ if (typeof variant !== "object" || variant === null || "$ref" in variant) {
10
+ return null;
11
+ }
12
+ const { required } = variant;
13
+ const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));
14
+ return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;
15
+ }
16
+ function isObjectTyped(schema) {
17
+ const { type } = schema;
18
+ return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
19
+ }
20
+ function requiredKeyLists(schema, variants, request) {
21
+ const keyLists = variants.map(requiredOnlyKeys);
22
+ const isApplicable = keyLists.length > 0 && keyLists.every((keys) => keys?.every((key) => objectType.isKeptProperty(schema, key, request)) === true);
23
+ return isApplicable ? keyLists : null;
24
+ }
25
+ function hasRequiredVariants(schema, variants, request) {
26
+ return request.context.options.fixes.has(outputFixes.OutputFix.ANYOF_ONEOF_REQUIRED) && isObjectTyped(schema) && requiredKeyLists(schema, variants, request) !== null;
27
+ }
28
+ function requiredVariantsType(previous, schema, variants, request) {
29
+ if (!request.context.options.fixes.has(outputFixes.OutputFix.ANYOF_ONEOF_REQUIRED) || previous === null) {
30
+ return null;
31
+ }
32
+ const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;
33
+ if (keyLists === null) {
34
+ return null;
35
+ }
36
+ if (Array.isArray(schema.type)) {
37
+ return previous;
38
+ }
39
+ request.context.footer.requireWithRequired();
40
+ return typeCombinators.unionOf(keyLists.map((keys) => typeCombinators.withRequiredKeys(previous, keys)));
41
+ }
42
+
43
+ exports.hasRequiredVariants = hasRequiredVariants;
44
+ exports.requiredVariantsType = requiredVariantsType;
45
+ //# sourceMappingURL=required-variants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-variants.cjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { unionOf, withRequiredKeys } from \"../type-combinators.js\";\nimport { isKeptProperty } from \"./object-type.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `anyof-oneof-required` fix. `anyOf: [{ required: [a] }, { required: [b] }]` next to\n * `properties` says which of the properties must be there. Each such variant has no type of its\n * own (`unknown`), so the original gives `Props | unknown`, which is `unknown`. With the fix each\n * variant is the parent with its keys required:\n * `WithRequired<Props, \"a\"> | WithRequired<Props, \"b\">`.\n */\n\n/** Keywords that do not change a value's type: a variant of these and `required` counts. */\nconst ANNOTATION_KEYS: ReadonlySet<string> = new Set([\"required\", \"description\", \"title\"]);\n\n/** The `required` keys of a variant that has nothing else, or null for any other variant. */\nfunction requiredOnlyKeys(variant: Schema): readonly string[] | null {\n if (typeof variant !== \"object\" || variant === null || \"$ref\" in variant) {\n return null;\n }\n const { required } = variant as SchemaObject;\n const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));\n return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;\n}\n\n/** Whether the schema's type is an object: no `type`, `object`, or a list with `object`. */\nfunction isObjectTyped(schema: SchemaObject): boolean {\n const { type } = schema;\n return (\n type === undefined || type === \"object\" || (Array.isArray(type) && type.includes(\"object\"))\n );\n}\n\n/** The variants' key lists, or null unless each requires only properties the type keeps. */\nfunction requiredKeyLists(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): (readonly string[])[] | null {\n const keyLists = variants.map(requiredOnlyKeys);\n // A key of a property the type leaves out (`--exclude-deprecated`) is no key of `WithRequired`.\n const isApplicable =\n keyLists.length > 0 &&\n keyLists.every((keys) => keys?.every((key) => isKeptProperty(schema, key, request)) === true);\n return isApplicable ? (keyLists as (readonly string[])[]) : null;\n}\n\n/** Whether the fix gives `variants` of the schema their keys of its properties. */\nexport function hasRequiredVariants(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): boolean {\n return (\n request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) &&\n isObjectTyped(schema) &&\n requiredKeyLists(schema, variants, request) !== null\n );\n}\n\n/**\n * The union of the parent type with each variant's keys required, or null where the fix is off\n * or the variants are not all required-only ones over the parent's own, kept properties. Only an\n * object has the keys. For a `type` list, the `object` member has required them already\n * (`multipleTypes`), so the list is the whole type.\n */\nexport function requiredVariantsType(\n previous: IrType | null,\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): IrType | null {\n if (!request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) || previous === null) {\n return null;\n }\n const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;\n if (keyLists === null) {\n return null;\n }\n if (Array.isArray(schema.type)) {\n return previous;\n }\n request.context.footer.requireWithRequired();\n return unionOf(keyLists.map((keys) => withRequiredKeys(previous, keys)));\n}\n"],"names":["isKeptProperty","OutputFix","unionOf","withRequiredKeys"],"mappings":";;;;;;AAgBA,MAAM,kCAAuC,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAA,EAAe,OAAO,CAAC,CAAA;AAGzF,SAAS,iBAAiB,OAAA,EAA2C;AACnE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,UAAU,OAAA,EAAS;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AACnF,EAAA,OAAO,cAAA,IAAkB,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AACvF;AAGA,SAAS,cAAc,MAAA,EAA+B;AACpD,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,OACE,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,QAAA,IAAa,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAE7F;AAGA,SAAS,gBAAA,CACP,MAAA,EACA,QAAA,EACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAA;AAE9C,EAAA,MAAM,eACJ,QAAA,CAAS,MAAA,GAAS,KAClB,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,CAAC,QAAQA,yBAAA,CAAe,MAAA,EAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9F,EAAA,OAAO,eAAgB,QAAA,GAAqC,IAAA;AAC9D;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAIC,qBAAA,CAAU,oBAAoB,CAAA,IAChE,aAAA,CAAc,MAAM,CAAA,IACpB,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,KAAM,IAAA;AAEpD;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAIA,qBAAA,CAAU,oBAAoB,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA,GAAI,iBAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,GAAI,IAAA;AACvF,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,mBAAA,EAAoB;AAC3C,EAAA,OAAOC,uBAAA,CAAQ,SAAS,GAAA,CAAI,CAAC,SAASC,gCAAA,CAAiB,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AACzE;;;"}
@@ -0,0 +1,42 @@
1
+ import { OutputFix } from '../../../domain/output-fixes.mjs';
2
+ import { unionOf, withRequiredKeys } from '../type-combinators.mjs';
3
+ import { isKeptProperty } from './object-type.mjs';
4
+
5
+ const ANNOTATION_KEYS = /* @__PURE__ */ new Set(["required", "description", "title"]);
6
+ function requiredOnlyKeys(variant) {
7
+ if (typeof variant !== "object" || variant === null || "$ref" in variant) {
8
+ return null;
9
+ }
10
+ const { required } = variant;
11
+ const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));
12
+ return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;
13
+ }
14
+ function isObjectTyped(schema) {
15
+ const { type } = schema;
16
+ return type === void 0 || type === "object" || Array.isArray(type) && type.includes("object");
17
+ }
18
+ function requiredKeyLists(schema, variants, request) {
19
+ const keyLists = variants.map(requiredOnlyKeys);
20
+ const isApplicable = keyLists.length > 0 && keyLists.every((keys) => keys?.every((key) => isKeptProperty(schema, key, request)) === true);
21
+ return isApplicable ? keyLists : null;
22
+ }
23
+ function hasRequiredVariants(schema, variants, request) {
24
+ return request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) && isObjectTyped(schema) && requiredKeyLists(schema, variants, request) !== null;
25
+ }
26
+ function requiredVariantsType(previous, schema, variants, request) {
27
+ if (!request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) || previous === null) {
28
+ return null;
29
+ }
30
+ const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;
31
+ if (keyLists === null) {
32
+ return null;
33
+ }
34
+ if (Array.isArray(schema.type)) {
35
+ return previous;
36
+ }
37
+ request.context.footer.requireWithRequired();
38
+ return unionOf(keyLists.map((keys) => withRequiredKeys(previous, keys)));
39
+ }
40
+
41
+ export { hasRequiredVariants, requiredVariantsType };
42
+ //# sourceMappingURL=required-variants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-variants.mjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { unionOf, withRequiredKeys } from \"../type-combinators.js\";\nimport { isKeptProperty } from \"./object-type.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `anyof-oneof-required` fix. `anyOf: [{ required: [a] }, { required: [b] }]` next to\n * `properties` says which of the properties must be there. Each such variant has no type of its\n * own (`unknown`), so the original gives `Props | unknown`, which is `unknown`. With the fix each\n * variant is the parent with its keys required:\n * `WithRequired<Props, \"a\"> | WithRequired<Props, \"b\">`.\n */\n\n/** Keywords that do not change a value's type: a variant of these and `required` counts. */\nconst ANNOTATION_KEYS: ReadonlySet<string> = new Set([\"required\", \"description\", \"title\"]);\n\n/** The `required` keys of a variant that has nothing else, or null for any other variant. */\nfunction requiredOnlyKeys(variant: Schema): readonly string[] | null {\n if (typeof variant !== \"object\" || variant === null || \"$ref\" in variant) {\n return null;\n }\n const { required } = variant as SchemaObject;\n const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));\n return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;\n}\n\n/** Whether the schema's type is an object: no `type`, `object`, or a list with `object`. */\nfunction isObjectTyped(schema: SchemaObject): boolean {\n const { type } = schema;\n return (\n type === undefined || type === \"object\" || (Array.isArray(type) && type.includes(\"object\"))\n );\n}\n\n/** The variants' key lists, or null unless each requires only properties the type keeps. */\nfunction requiredKeyLists(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): (readonly string[])[] | null {\n const keyLists = variants.map(requiredOnlyKeys);\n // A key of a property the type leaves out (`--exclude-deprecated`) is no key of `WithRequired`.\n const isApplicable =\n keyLists.length > 0 &&\n keyLists.every((keys) => keys?.every((key) => isKeptProperty(schema, key, request)) === true);\n return isApplicable ? (keyLists as (readonly string[])[]) : null;\n}\n\n/** Whether the fix gives `variants` of the schema their keys of its properties. */\nexport function hasRequiredVariants(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): boolean {\n return (\n request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) &&\n isObjectTyped(schema) &&\n requiredKeyLists(schema, variants, request) !== null\n );\n}\n\n/**\n * The union of the parent type with each variant's keys required, or null where the fix is off\n * or the variants are not all required-only ones over the parent's own, kept properties. Only an\n * object has the keys. For a `type` list, the `object` member has required them already\n * (`multipleTypes`), so the list is the whole type.\n */\nexport function requiredVariantsType(\n previous: IrType | null,\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): IrType | null {\n if (!request.context.options.fixes.has(OutputFix.ANYOF_ONEOF_REQUIRED) || previous === null) {\n return null;\n }\n const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;\n if (keyLists === null) {\n return null;\n }\n if (Array.isArray(schema.type)) {\n return previous;\n }\n request.context.footer.requireWithRequired();\n return unionOf(keyLists.map((keys) => withRequiredKeys(previous, keys)));\n}\n"],"names":[],"mappings":";;;;AAgBA,MAAM,kCAAuC,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAA,EAAe,OAAO,CAAC,CAAA;AAGzF,SAAS,iBAAiB,OAAA,EAA2C;AACnE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,UAAU,OAAA,EAAS;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AACnF,EAAA,OAAO,cAAA,IAAkB,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AACvF;AAGA,SAAS,cAAc,MAAA,EAA+B;AACpD,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,OACE,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,QAAA,IAAa,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAE7F;AAGA,SAAS,gBAAA,CACP,MAAA,EACA,QAAA,EACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAA;AAE9C,EAAA,MAAM,eACJ,QAAA,CAAS,MAAA,GAAS,KAClB,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,CAAC,QAAQ,cAAA,CAAe,MAAA,EAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9F,EAAA,OAAO,eAAgB,QAAA,GAAqC,IAAA;AAC9D;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,SAAA,CAAU,oBAAoB,CAAA,IAChE,aAAA,CAAc,MAAM,CAAA,IACpB,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,KAAM,IAAA;AAEpD;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,SAAA,CAAU,oBAAoB,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AAC3F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA,GAAI,iBAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,GAAI,IAAA;AACvF,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,mBAAA,EAAoB;AAC3C,EAAA,OAAO,OAAA,CAAQ,SAAS,GAAA,CAAI,CAAC,SAAS,gBAAA,CAAiB,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AACzE;;"}
@@ -3,7 +3,7 @@
3
3
  const errors = require('../../../domain/errors.cjs');
4
4
  const constructors = require('../../../domain/ir/constructors.cjs');
5
5
  const literalType = require('../literal-type.cjs');
6
- const refType = require('../ref-type.cjs');
6
+ const pointerType = require('../ref-pointer/pointer-type.cjs');
7
7
  const sharedTypes = require('../shared-types.cjs');
8
8
  const compositionType = require('./composition-type.cjs');
9
9
  const enumRule = require('./enum-rule.cjs');
@@ -23,7 +23,7 @@ const SHAPE_RULES = [
23
23
  {
24
24
  name: "$ref",
25
25
  matches: (schema) => "$ref" in schema,
26
- transform: (schema) => refType.refType(schema.$ref)
26
+ transform: (schema, request2) => pointerType.schemaRefType(schema.$ref, request2)
27
27
  },
28
28
  {
29
29
  name: "const",
@@ -1 +1 @@
1
- {"version":3,"file":"schema-transform.cjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema) => refType((schema as { $ref: string }).$ref),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","refType","literalType","enumRule","irKeyword","UNKNOWN_TYPE","compositionType"],"mappings":"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"}
1
+ {"version":3,"file":"schema-transform.cjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","request","schemaRefType","literalType","enumRule","irKeyword","UNKNOWN_TYPE","compositionType"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { OpenAPITypesafeError, ERROR_CODES } from '../../../domain/errors.mjs';
2
2
  import { irKeyword } from '../../../domain/ir/constructors.mjs';
3
3
  import { literalType } from '../literal-type.mjs';
4
- import { refType } from '../ref-type.mjs';
4
+ import { schemaRefType } from '../ref-pointer/pointer-type.mjs';
5
5
  import { UNKNOWN_TYPE } from '../shared-types.mjs';
6
6
  import { compositionType } from './composition-type.mjs';
7
7
  import { enumRule } from './enum-rule.mjs';
@@ -21,7 +21,7 @@ const SHAPE_RULES = [
21
21
  {
22
22
  name: "$ref",
23
23
  matches: (schema) => "$ref" in schema,
24
- transform: (schema) => refType(schema.$ref)
24
+ transform: (schema, request2) => schemaRefType(schema.$ref, request2)
25
25
  },
26
26
  {
27
27
  name: "const",
@@ -1 +1 @@
1
- {"version":3,"file":"schema-transform.mjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema) => refType((schema as { $ref: string }).$ref),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-transform.mjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(checked.schema));\n return rule ? rule.transform(checked.schema, current) : compositionType(checked.schema, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["request"],"mappings":"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"}
@@ -1,11 +1,22 @@
1
1
  'use strict';
2
2
 
3
+ const outputFixes = require('../../domain/output-fixes.cjs');
4
+
3
5
  const LINE_BREAK_RE = /\r?\n/g;
4
6
  const CONTINUATION = "\n * ";
5
7
  const COMMENT_END_RE = /\*\//g;
6
8
  const VALUE_TAGS = ["description", "default", "example"];
7
9
  const TAGS_KEEPING_EMPTY_STRING = /* @__PURE__ */ new Set(["default", "example"]);
8
10
  const JSON_INDENT = 2;
11
+ const MEMBER_LISTS = [
12
+ ["anyOf", "Any of:"],
13
+ ["oneOf", "One of:"]
14
+ ];
15
+ const BULLET_CONTINUATION = "\n ";
16
+ const ORIGINAL_SCHEMA_COMMENT = { hasMemberDescriptions: false };
17
+ function schemaCommentOptionsOf(fixes) {
18
+ return { hasMemberDescriptions: fixes.has(outputFixes.OutputFix.ANYOF_ONEOF_DESCRIPTIONS) };
19
+ }
9
20
  function formatValue(value) {
10
21
  const text = typeof value === "object" ? JSON.stringify(value, null, JSON_INDENT) : value;
11
22
  return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);
@@ -55,11 +66,44 @@ function constantAndEnumLines(schema) {
55
66
  }
56
67
  return lines;
57
68
  }
58
- function schemaComment(schema) {
59
- if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
69
+ function memberDescriptions(members) {
70
+ if (!Array.isArray(members)) {
71
+ return [];
72
+ }
73
+ return members.flatMap((member) => {
74
+ const description = isSchemaObject(member) ? member.description : void 0;
75
+ return typeof description === "string" && description.trim() !== "" ? [description.trim()] : [];
76
+ });
77
+ }
78
+ function memberDescriptionLists(schema) {
79
+ return MEMBER_LISTS.flatMap(([keyword, heading]) => {
80
+ const descriptions = memberDescriptions(schema[keyword]);
81
+ if (descriptions.length === 0) {
82
+ return [];
83
+ }
84
+ const bullets = descriptions.map(
85
+ (description) => `- ${description.replace(LINE_BREAK_RE, BULLET_CONTINUATION)}`
86
+ );
87
+ return [[heading, ...bullets].join("\n")];
88
+ });
89
+ }
90
+ function withMemberDescriptions(schema) {
91
+ const lists = memberDescriptionLists(schema);
92
+ const own = schema.description;
93
+ if (lists.length === 0 || own !== void 0 && typeof own !== "string") {
94
+ return schema;
95
+ }
96
+ const ownLines = typeof own === "string" && own.trim() !== "" ? [own.trim()] : [];
97
+ return { ...schema, description: [...ownLines, ...lists].join("\n") };
98
+ }
99
+ function isSchemaObject(value) {
100
+ return typeof value === "object" && value !== null && !Array.isArray(value);
101
+ }
102
+ function schemaComment(schema, options = ORIGINAL_SCHEMA_COMMENT) {
103
+ if (!isSchemaObject(schema)) {
60
104
  return null;
61
105
  }
62
- const annotated = schema;
106
+ const annotated = options.hasMemberDescriptions ? withMemberDescriptions(schema) : schema;
63
107
  const lines = [
64
108
  ...plainLines(annotated),
65
109
  ...valueTagLines(annotated),
@@ -74,11 +118,13 @@ function schemaComment(schema) {
74
118
  `;
75
119
  return { kind: "block", text: text.replace(COMMENT_END_RE, "*\\/") };
76
120
  }
77
- function withSchemaComment(property, schema) {
78
- const comment = schemaComment(schema);
121
+ function withSchemaComment(property, schema, options = ORIGINAL_SCHEMA_COMMENT) {
122
+ const comment = schemaComment(schema, options);
79
123
  return comment === null ? property : { ...property, comments: [...property.comments, comment] };
80
124
  }
81
125
 
126
+ exports.ORIGINAL_SCHEMA_COMMENT = ORIGINAL_SCHEMA_COMMENT;
82
127
  exports.schemaComment = schemaComment;
128
+ exports.schemaCommentOptionsOf = schemaCommentOptionsOf;
83
129
  exports.withSchemaComment = withSchemaComment;
84
130
  //# sourceMappingURL=schema-comment.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-comment.cjs","sources":["../../../src/application/transform/schema-comment.ts"],"sourcesContent":["import type { IrComment, IrPropertySignature } from \"../../domain/ir/nodes.js\";\n\n/** Schema fields that produce JSDoc lines (the original `AnnotatedSchemaObject`). */\nexport interface AnnotatedSchema {\n readonly const?: unknown;\n readonly default?: unknown;\n readonly deprecated?: boolean;\n readonly description?: string;\n readonly enum?: unknown[];\n readonly example?: unknown;\n readonly examples?: unknown;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly summary?: string;\n readonly title?: string;\n readonly type?: string | string[];\n}\n\nconst LINE_BREAK_RE = /\\r?\\n/g;\n/** Continuation lines of a multi-line value are indented under the tag. */\nconst CONTINUATION = \"\\n * \";\nconst COMMENT_END_RE = /\\*\\//g;\n/** Tags written as `@tag value`; an empty string is kept only where it is a meaningful value. */\nconst VALUE_TAGS = [\"description\", \"default\", \"example\"] as const;\nconst TAGS_KEEPING_EMPTY_STRING: ReadonlySet<string> = new Set([\"default\", \"example\"]);\nconst JSON_INDENT = 2;\n\nfunction formatValue(value: unknown): string {\n const text = typeof value === \"object\" ? JSON.stringify(value, null, JSON_INDENT) : value;\n return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);\n}\n\nfunction plainLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const text of [schema.title, schema.summary]) {\n // The document is not validated against the schema dialect: a property named `summary`\n // written without `properties:` makes `summary` an object (upstream #2349).\n if (typeof text === \"string\" && text) {\n lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));\n }\n }\n if (schema.format) {\n lines.push(`Format: ${schema.format}`);\n }\n if (schema.deprecated) {\n lines.push(\"@deprecated\");\n }\n return lines;\n}\n\nfunction valueTagLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const tag of VALUE_TAGS) {\n const value = schema[tag];\n if (value === undefined || (value === \"\" && !TAGS_KEEPING_EMPTY_STRING.has(tag))) {\n continue;\n }\n lines.push(`@${tag} ${formatValue(value)}`);\n }\n if (Array.isArray(schema.examples)) {\n lines.push(...schema.examples.map((example: unknown) => `@example ${formatValue(example)}`));\n }\n return lines;\n}\n\nfunction enumTypeName(schema: AnnotatedSchema): string {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\"|\");\n }\n return typeof schema.type === \"string\" ? schema.type : \"unknown\";\n}\n\nfunction constantAndEnumLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n if (\"const\" in schema) {\n lines.push(\"@constant\");\n }\n if (schema.enum) {\n lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? \"|null\" : \"\"}}`);\n }\n return lines;\n}\n\n/**\n * The JSDoc comment the original writes for a schema (`addJSDocComment`): title, summary and\n * format, then `@deprecated`, `@description`, `@default`, `@example`, `@constant` and `@enum`\n * tags. One short line stays on the `/**` line; anything else is a block. Returns null when there\n * is nothing to say, or when the value is not a schema object.\n */\nexport function schemaComment(schema: unknown): IrComment | null {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return null;\n }\n const annotated = schema as AnnotatedSchema;\n const lines = [\n ...plainLines(annotated),\n ...valueTagLines(annotated),\n ...constantAndEnumLines(annotated),\n ];\n if (lines.length === 0) {\n return null;\n }\n const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes(\"\\n\"));\n const text = isSingleLine ? `* ${lines.join(\"\\n\")} ` : `*\\n * ${lines.join(\"\\n * \")}\\n `;\n // A `*/` inside a value would end the comment early.\n return { kind: \"block\", text: text.replace(COMMENT_END_RE, \"*\\\\/\") };\n}\n\n/** The property with the schema's JSDoc added after the comments it already has. */\nexport function withSchemaComment(\n property: IrPropertySignature,\n schema: unknown,\n): IrPropertySignature {\n const comment = schemaComment(schema);\n return comment === null ? property : { ...property, comments: [...property.comments, comment] };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-comment.cjs","sources":["../../../src/application/transform/schema-comment.ts"],"sourcesContent":["import type { IrComment, IrPropertySignature } from \"../../domain/ir/nodes.js\";\nimport { OutputFix } from \"../../domain/output-fixes.js\";\n\n/** Schema fields that produce JSDoc lines (the original `AnnotatedSchemaObject`). */\nexport interface AnnotatedSchema {\n readonly const?: unknown;\n readonly default?: unknown;\n readonly deprecated?: boolean;\n readonly description?: string;\n readonly enum?: unknown[];\n readonly example?: unknown;\n readonly examples?: unknown;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly summary?: string;\n readonly title?: string;\n readonly type?: string | string[];\n}\n\nconst LINE_BREAK_RE = /\\r?\\n/g;\n/** Continuation lines of a multi-line value are indented under the tag. */\nconst CONTINUATION = \"\\n * \";\nconst COMMENT_END_RE = /\\*\\//g;\n/** Tags written as `@tag value`; an empty string is kept only where it is a meaningful value. */\nconst VALUE_TAGS = [\"description\", \"default\", \"example\"] as const;\nconst TAGS_KEEPING_EMPTY_STRING: ReadonlySet<string> = new Set([\"default\", \"example\"]);\nconst JSON_INDENT = 2;\n/** The member lists whose descriptions `anyof-oneof-descriptions` adds, with their headings. */\nconst MEMBER_LISTS = [\n [\"anyOf\", \"Any of:\"],\n [\"oneOf\", \"One of:\"],\n] as const;\n/** The later lines of a member's description are indented under its bullet. */\nconst BULLET_CONTINUATION = \"\\n \";\n\n/** How a schema's JSDoc is written. */\nexport interface SchemaCommentOptions {\n /** `anyof-oneof-descriptions`: the descriptions of `anyOf` and `oneOf` members are listed. */\n readonly hasMemberDescriptions: boolean;\n}\n\n/** The JSDoc the original writes. */\nexport const ORIGINAL_SCHEMA_COMMENT: SchemaCommentOptions = { hasMemberDescriptions: false };\n\n/** How the fixes turned on write a schema's JSDoc. */\nexport function schemaCommentOptionsOf(fixes: ReadonlySet<OutputFix>): SchemaCommentOptions {\n return { hasMemberDescriptions: fixes.has(OutputFix.ANYOF_ONEOF_DESCRIPTIONS) };\n}\n\nfunction formatValue(value: unknown): string {\n const text = typeof value === \"object\" ? JSON.stringify(value, null, JSON_INDENT) : value;\n return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);\n}\n\nfunction plainLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const text of [schema.title, schema.summary]) {\n // The document is not validated against the schema dialect: a property named `summary`\n // written without `properties:` makes `summary` an object (upstream #2349).\n if (typeof text === \"string\" && text) {\n lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));\n }\n }\n if (schema.format) {\n lines.push(`Format: ${schema.format}`);\n }\n if (schema.deprecated) {\n lines.push(\"@deprecated\");\n }\n return lines;\n}\n\nfunction valueTagLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const tag of VALUE_TAGS) {\n const value = schema[tag];\n if (value === undefined || (value === \"\" && !TAGS_KEEPING_EMPTY_STRING.has(tag))) {\n continue;\n }\n lines.push(`@${tag} ${formatValue(value)}`);\n }\n if (Array.isArray(schema.examples)) {\n lines.push(...schema.examples.map((example: unknown) => `@example ${formatValue(example)}`));\n }\n return lines;\n}\n\nfunction enumTypeName(schema: AnnotatedSchema): string {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\"|\");\n }\n return typeof schema.type === \"string\" ? schema.type : \"unknown\";\n}\n\nfunction constantAndEnumLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n if (\"const\" in schema) {\n lines.push(\"@constant\");\n }\n if (schema.enum) {\n lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? \"|null\" : \"\"}}`);\n }\n return lines;\n}\n\n/** The own, non-blank `description` of each member; a member without one is left out. */\nfunction memberDescriptions(members: unknown): string[] {\n if (!Array.isArray(members)) {\n return [];\n }\n return members.flatMap((member: unknown) => {\n const description = isSchemaObject(member) ? member.description : undefined;\n return typeof description === \"string\" && description.trim() !== \"\" ? [description.trim()] : [];\n });\n}\n\n/** Each member list with a described member, as a heading and one bullet per description. */\nfunction memberDescriptionLists(schema: SchemaRecord): string[] {\n return MEMBER_LISTS.flatMap(([keyword, heading]) => {\n const descriptions = memberDescriptions(schema[keyword]);\n if (descriptions.length === 0) {\n return [];\n }\n const bullets = descriptions.map(\n (description) => `- ${description.replace(LINE_BREAK_RE, BULLET_CONTINUATION)}`,\n );\n return [[heading, ...bullets].join(\"\\n\")];\n });\n}\n\n/**\n * The schema with the descriptions of its `anyOf` and `oneOf` members after its own description\n * (upstream #2142). A member's description holds only where that member applies, so each one is\n * listed under its keyword rather than merged into one sentence. A `description` that is not a\n * string is kept as it is.\n */\nfunction withMemberDescriptions(schema: SchemaRecord): AnnotatedSchema {\n const lists = memberDescriptionLists(schema);\n const own = schema.description;\n if (lists.length === 0 || (own !== undefined && typeof own !== \"string\")) {\n // As the original, the keywords are read as they are, without validating them.\n return schema as AnnotatedSchema;\n }\n const ownLines = typeof own === \"string\" && own.trim() !== \"\" ? [own.trim()] : [];\n return { ...(schema as AnnotatedSchema), description: [...ownLines, ...lists].join(\"\\n\") };\n}\n\n/** A schema object read without knowing its keywords. */\ninterface SchemaRecord {\n readonly description?: unknown;\n readonly [keyword: string]: unknown;\n}\n\nfunction isSchemaObject(value: unknown): value is SchemaRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The JSDoc comment the original writes for a schema (`addJSDocComment`): title, summary and\n * format, then `@deprecated`, `@description`, `@default`, `@example`, `@constant` and `@enum`\n * tags. One short line stays on the `/**` line; anything else is a block. Returns null when there\n * is nothing to say, or when the value is not a schema object.\n */\nexport function schemaComment(\n schema: unknown,\n options: SchemaCommentOptions = ORIGINAL_SCHEMA_COMMENT,\n): IrComment | null {\n if (!isSchemaObject(schema)) {\n return null;\n }\n const annotated = options.hasMemberDescriptions\n ? withMemberDescriptions(schema)\n : (schema as AnnotatedSchema);\n const lines = [\n ...plainLines(annotated),\n ...valueTagLines(annotated),\n ...constantAndEnumLines(annotated),\n ];\n if (lines.length === 0) {\n return null;\n }\n const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes(\"\\n\"));\n const text = isSingleLine ? `* ${lines.join(\"\\n\")} ` : `*\\n * ${lines.join(\"\\n * \")}\\n `;\n // A `*/` inside a value would end the comment early.\n return { kind: \"block\", text: text.replace(COMMENT_END_RE, \"*\\\\/\") };\n}\n\n/** The property with the schema's JSDoc added after the comments it already has. */\nexport function withSchemaComment(\n property: IrPropertySignature,\n schema: unknown,\n options: SchemaCommentOptions = ORIGINAL_SCHEMA_COMMENT,\n): IrPropertySignature {\n const comment = schemaComment(schema, options);\n return comment === null ? property : { ...property, comments: [...property.comments, comment] };\n}\n"],"names":["OutputFix"],"mappings":"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"}
@@ -1,9 +1,20 @@
1
+ import { OutputFix } from '../../domain/output-fixes.mjs';
2
+
1
3
  const LINE_BREAK_RE = /\r?\n/g;
2
4
  const CONTINUATION = "\n * ";
3
5
  const COMMENT_END_RE = /\*\//g;
4
6
  const VALUE_TAGS = ["description", "default", "example"];
5
7
  const TAGS_KEEPING_EMPTY_STRING = /* @__PURE__ */ new Set(["default", "example"]);
6
8
  const JSON_INDENT = 2;
9
+ const MEMBER_LISTS = [
10
+ ["anyOf", "Any of:"],
11
+ ["oneOf", "One of:"]
12
+ ];
13
+ const BULLET_CONTINUATION = "\n ";
14
+ const ORIGINAL_SCHEMA_COMMENT = { hasMemberDescriptions: false };
15
+ function schemaCommentOptionsOf(fixes) {
16
+ return { hasMemberDescriptions: fixes.has(OutputFix.ANYOF_ONEOF_DESCRIPTIONS) };
17
+ }
7
18
  function formatValue(value) {
8
19
  const text = typeof value === "object" ? JSON.stringify(value, null, JSON_INDENT) : value;
9
20
  return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);
@@ -53,11 +64,44 @@ function constantAndEnumLines(schema) {
53
64
  }
54
65
  return lines;
55
66
  }
56
- function schemaComment(schema) {
57
- if (!schema || typeof schema !== "object" || Array.isArray(schema)) {
67
+ function memberDescriptions(members) {
68
+ if (!Array.isArray(members)) {
69
+ return [];
70
+ }
71
+ return members.flatMap((member) => {
72
+ const description = isSchemaObject(member) ? member.description : void 0;
73
+ return typeof description === "string" && description.trim() !== "" ? [description.trim()] : [];
74
+ });
75
+ }
76
+ function memberDescriptionLists(schema) {
77
+ return MEMBER_LISTS.flatMap(([keyword, heading]) => {
78
+ const descriptions = memberDescriptions(schema[keyword]);
79
+ if (descriptions.length === 0) {
80
+ return [];
81
+ }
82
+ const bullets = descriptions.map(
83
+ (description) => `- ${description.replace(LINE_BREAK_RE, BULLET_CONTINUATION)}`
84
+ );
85
+ return [[heading, ...bullets].join("\n")];
86
+ });
87
+ }
88
+ function withMemberDescriptions(schema) {
89
+ const lists = memberDescriptionLists(schema);
90
+ const own = schema.description;
91
+ if (lists.length === 0 || own !== void 0 && typeof own !== "string") {
92
+ return schema;
93
+ }
94
+ const ownLines = typeof own === "string" && own.trim() !== "" ? [own.trim()] : [];
95
+ return { ...schema, description: [...ownLines, ...lists].join("\n") };
96
+ }
97
+ function isSchemaObject(value) {
98
+ return typeof value === "object" && value !== null && !Array.isArray(value);
99
+ }
100
+ function schemaComment(schema, options = ORIGINAL_SCHEMA_COMMENT) {
101
+ if (!isSchemaObject(schema)) {
58
102
  return null;
59
103
  }
60
- const annotated = schema;
104
+ const annotated = options.hasMemberDescriptions ? withMemberDescriptions(schema) : schema;
61
105
  const lines = [
62
106
  ...plainLines(annotated),
63
107
  ...valueTagLines(annotated),
@@ -72,10 +116,10 @@ function schemaComment(schema) {
72
116
  `;
73
117
  return { kind: "block", text: text.replace(COMMENT_END_RE, "*\\/") };
74
118
  }
75
- function withSchemaComment(property, schema) {
76
- const comment = schemaComment(schema);
119
+ function withSchemaComment(property, schema, options = ORIGINAL_SCHEMA_COMMENT) {
120
+ const comment = schemaComment(schema, options);
77
121
  return comment === null ? property : { ...property, comments: [...property.comments, comment] };
78
122
  }
79
123
 
80
- export { schemaComment, withSchemaComment };
124
+ export { ORIGINAL_SCHEMA_COMMENT, schemaComment, schemaCommentOptionsOf, withSchemaComment };
81
125
  //# sourceMappingURL=schema-comment.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-comment.mjs","sources":["../../../src/application/transform/schema-comment.ts"],"sourcesContent":["import type { IrComment, IrPropertySignature } from \"../../domain/ir/nodes.js\";\n\n/** Schema fields that produce JSDoc lines (the original `AnnotatedSchemaObject`). */\nexport interface AnnotatedSchema {\n readonly const?: unknown;\n readonly default?: unknown;\n readonly deprecated?: boolean;\n readonly description?: string;\n readonly enum?: unknown[];\n readonly example?: unknown;\n readonly examples?: unknown;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly summary?: string;\n readonly title?: string;\n readonly type?: string | string[];\n}\n\nconst LINE_BREAK_RE = /\\r?\\n/g;\n/** Continuation lines of a multi-line value are indented under the tag. */\nconst CONTINUATION = \"\\n * \";\nconst COMMENT_END_RE = /\\*\\//g;\n/** Tags written as `@tag value`; an empty string is kept only where it is a meaningful value. */\nconst VALUE_TAGS = [\"description\", \"default\", \"example\"] as const;\nconst TAGS_KEEPING_EMPTY_STRING: ReadonlySet<string> = new Set([\"default\", \"example\"]);\nconst JSON_INDENT = 2;\n\nfunction formatValue(value: unknown): string {\n const text = typeof value === \"object\" ? JSON.stringify(value, null, JSON_INDENT) : value;\n return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);\n}\n\nfunction plainLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const text of [schema.title, schema.summary]) {\n // The document is not validated against the schema dialect: a property named `summary`\n // written without `properties:` makes `summary` an object (upstream #2349).\n if (typeof text === \"string\" && text) {\n lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));\n }\n }\n if (schema.format) {\n lines.push(`Format: ${schema.format}`);\n }\n if (schema.deprecated) {\n lines.push(\"@deprecated\");\n }\n return lines;\n}\n\nfunction valueTagLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const tag of VALUE_TAGS) {\n const value = schema[tag];\n if (value === undefined || (value === \"\" && !TAGS_KEEPING_EMPTY_STRING.has(tag))) {\n continue;\n }\n lines.push(`@${tag} ${formatValue(value)}`);\n }\n if (Array.isArray(schema.examples)) {\n lines.push(...schema.examples.map((example: unknown) => `@example ${formatValue(example)}`));\n }\n return lines;\n}\n\nfunction enumTypeName(schema: AnnotatedSchema): string {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\"|\");\n }\n return typeof schema.type === \"string\" ? schema.type : \"unknown\";\n}\n\nfunction constantAndEnumLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n if (\"const\" in schema) {\n lines.push(\"@constant\");\n }\n if (schema.enum) {\n lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? \"|null\" : \"\"}}`);\n }\n return lines;\n}\n\n/**\n * The JSDoc comment the original writes for a schema (`addJSDocComment`): title, summary and\n * format, then `@deprecated`, `@description`, `@default`, `@example`, `@constant` and `@enum`\n * tags. One short line stays on the `/**` line; anything else is a block. Returns null when there\n * is nothing to say, or when the value is not a schema object.\n */\nexport function schemaComment(schema: unknown): IrComment | null {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n return null;\n }\n const annotated = schema as AnnotatedSchema;\n const lines = [\n ...plainLines(annotated),\n ...valueTagLines(annotated),\n ...constantAndEnumLines(annotated),\n ];\n if (lines.length === 0) {\n return null;\n }\n const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes(\"\\n\"));\n const text = isSingleLine ? `* ${lines.join(\"\\n\")} ` : `*\\n * ${lines.join(\"\\n * \")}\\n `;\n // A `*/` inside a value would end the comment early.\n return { kind: \"block\", text: text.replace(COMMENT_END_RE, \"*\\\\/\") };\n}\n\n/** The property with the schema's JSDoc added after the comments it already has. */\nexport function withSchemaComment(\n property: IrPropertySignature,\n schema: unknown,\n): IrPropertySignature {\n const comment = schemaComment(schema);\n return comment === null ? property : { ...property, comments: [...property.comments, comment] };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-comment.mjs","sources":["../../../src/application/transform/schema-comment.ts"],"sourcesContent":["import type { IrComment, IrPropertySignature } from \"../../domain/ir/nodes.js\";\nimport { OutputFix } from \"../../domain/output-fixes.js\";\n\n/** Schema fields that produce JSDoc lines (the original `AnnotatedSchemaObject`). */\nexport interface AnnotatedSchema {\n readonly const?: unknown;\n readonly default?: unknown;\n readonly deprecated?: boolean;\n readonly description?: string;\n readonly enum?: unknown[];\n readonly example?: unknown;\n readonly examples?: unknown;\n readonly format?: string;\n readonly nullable?: boolean;\n readonly summary?: string;\n readonly title?: string;\n readonly type?: string | string[];\n}\n\nconst LINE_BREAK_RE = /\\r?\\n/g;\n/** Continuation lines of a multi-line value are indented under the tag. */\nconst CONTINUATION = \"\\n * \";\nconst COMMENT_END_RE = /\\*\\//g;\n/** Tags written as `@tag value`; an empty string is kept only where it is a meaningful value. */\nconst VALUE_TAGS = [\"description\", \"default\", \"example\"] as const;\nconst TAGS_KEEPING_EMPTY_STRING: ReadonlySet<string> = new Set([\"default\", \"example\"]);\nconst JSON_INDENT = 2;\n/** The member lists whose descriptions `anyof-oneof-descriptions` adds, with their headings. */\nconst MEMBER_LISTS = [\n [\"anyOf\", \"Any of:\"],\n [\"oneOf\", \"One of:\"],\n] as const;\n/** The later lines of a member's description are indented under its bullet. */\nconst BULLET_CONTINUATION = \"\\n \";\n\n/** How a schema's JSDoc is written. */\nexport interface SchemaCommentOptions {\n /** `anyof-oneof-descriptions`: the descriptions of `anyOf` and `oneOf` members are listed. */\n readonly hasMemberDescriptions: boolean;\n}\n\n/** The JSDoc the original writes. */\nexport const ORIGINAL_SCHEMA_COMMENT: SchemaCommentOptions = { hasMemberDescriptions: false };\n\n/** How the fixes turned on write a schema's JSDoc. */\nexport function schemaCommentOptionsOf(fixes: ReadonlySet<OutputFix>): SchemaCommentOptions {\n return { hasMemberDescriptions: fixes.has(OutputFix.ANYOF_ONEOF_DESCRIPTIONS) };\n}\n\nfunction formatValue(value: unknown): string {\n const text = typeof value === \"object\" ? JSON.stringify(value, null, JSON_INDENT) : value;\n return String(text).trim().replace(LINE_BREAK_RE, CONTINUATION);\n}\n\nfunction plainLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const text of [schema.title, schema.summary]) {\n // The document is not validated against the schema dialect: a property named `summary`\n // written without `properties:` makes `summary` an object (upstream #2349).\n if (typeof text === \"string\" && text) {\n lines.push(text.trim().replace(LINE_BREAK_RE, CONTINUATION));\n }\n }\n if (schema.format) {\n lines.push(`Format: ${schema.format}`);\n }\n if (schema.deprecated) {\n lines.push(\"@deprecated\");\n }\n return lines;\n}\n\nfunction valueTagLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n for (const tag of VALUE_TAGS) {\n const value = schema[tag];\n if (value === undefined || (value === \"\" && !TAGS_KEEPING_EMPTY_STRING.has(tag))) {\n continue;\n }\n lines.push(`@${tag} ${formatValue(value)}`);\n }\n if (Array.isArray(schema.examples)) {\n lines.push(...schema.examples.map((example: unknown) => `@example ${formatValue(example)}`));\n }\n return lines;\n}\n\nfunction enumTypeName(schema: AnnotatedSchema): string {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\"|\");\n }\n return typeof schema.type === \"string\" ? schema.type : \"unknown\";\n}\n\nfunction constantAndEnumLines(schema: AnnotatedSchema): string[] {\n const lines: string[] = [];\n if (\"const\" in schema) {\n lines.push(\"@constant\");\n }\n if (schema.enum) {\n lines.push(`@enum {${enumTypeName(schema)}${schema.nullable ? \"|null\" : \"\"}}`);\n }\n return lines;\n}\n\n/** The own, non-blank `description` of each member; a member without one is left out. */\nfunction memberDescriptions(members: unknown): string[] {\n if (!Array.isArray(members)) {\n return [];\n }\n return members.flatMap((member: unknown) => {\n const description = isSchemaObject(member) ? member.description : undefined;\n return typeof description === \"string\" && description.trim() !== \"\" ? [description.trim()] : [];\n });\n}\n\n/** Each member list with a described member, as a heading and one bullet per description. */\nfunction memberDescriptionLists(schema: SchemaRecord): string[] {\n return MEMBER_LISTS.flatMap(([keyword, heading]) => {\n const descriptions = memberDescriptions(schema[keyword]);\n if (descriptions.length === 0) {\n return [];\n }\n const bullets = descriptions.map(\n (description) => `- ${description.replace(LINE_BREAK_RE, BULLET_CONTINUATION)}`,\n );\n return [[heading, ...bullets].join(\"\\n\")];\n });\n}\n\n/**\n * The schema with the descriptions of its `anyOf` and `oneOf` members after its own description\n * (upstream #2142). A member's description holds only where that member applies, so each one is\n * listed under its keyword rather than merged into one sentence. A `description` that is not a\n * string is kept as it is.\n */\nfunction withMemberDescriptions(schema: SchemaRecord): AnnotatedSchema {\n const lists = memberDescriptionLists(schema);\n const own = schema.description;\n if (lists.length === 0 || (own !== undefined && typeof own !== \"string\")) {\n // As the original, the keywords are read as they are, without validating them.\n return schema as AnnotatedSchema;\n }\n const ownLines = typeof own === \"string\" && own.trim() !== \"\" ? [own.trim()] : [];\n return { ...(schema as AnnotatedSchema), description: [...ownLines, ...lists].join(\"\\n\") };\n}\n\n/** A schema object read without knowing its keywords. */\ninterface SchemaRecord {\n readonly description?: unknown;\n readonly [keyword: string]: unknown;\n}\n\nfunction isSchemaObject(value: unknown): value is SchemaRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The JSDoc comment the original writes for a schema (`addJSDocComment`): title, summary and\n * format, then `@deprecated`, `@description`, `@default`, `@example`, `@constant` and `@enum`\n * tags. One short line stays on the `/**` line; anything else is a block. Returns null when there\n * is nothing to say, or when the value is not a schema object.\n */\nexport function schemaComment(\n schema: unknown,\n options: SchemaCommentOptions = ORIGINAL_SCHEMA_COMMENT,\n): IrComment | null {\n if (!isSchemaObject(schema)) {\n return null;\n }\n const annotated = options.hasMemberDescriptions\n ? withMemberDescriptions(schema)\n : (schema as AnnotatedSchema);\n const lines = [\n ...plainLines(annotated),\n ...valueTagLines(annotated),\n ...constantAndEnumLines(annotated),\n ];\n if (lines.length === 0) {\n return null;\n }\n const isSingleLine = lines.length === 1 && !lines.some((line) => line.includes(\"\\n\"));\n const text = isSingleLine ? `* ${lines.join(\"\\n\")} ` : `*\\n * ${lines.join(\"\\n * \")}\\n `;\n // A `*/` inside a value would end the comment early.\n return { kind: \"block\", text: text.replace(COMMENT_END_RE, \"*\\\\/\") };\n}\n\n/** The property with the schema's JSDoc added after the comments it already has. */\nexport function withSchemaComment(\n property: IrPropertySignature,\n schema: unknown,\n options: SchemaCommentOptions = ORIGINAL_SCHEMA_COMMENT,\n): IrPropertySignature {\n const comment = schemaComment(schema, options);\n return comment === null ? property : { ...property, comments: [...property.comments, comment] };\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { irUnion, irKeyword, irIntersection, irReference } from '../../domain/ir/constructors.mjs';
1
+ import { irKeyword, irUnion, irIntersection, irReference } from '../../domain/ir/constructors.mjs';
2
2
  import { dedupeTypes } from '../../domain/ir/normalize.mjs';
3
3
  import { literalType } from './literal-type.mjs';
4
4