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
@@ -0,0 +1,162 @@
1
+ import { isRawBinarySchema } from '../../../domain/openapi/binary-content.mjs';
2
+
3
+ const OPAQUE_KEYS = ["not", "enum", "const", "$ref"];
4
+ const MAX_DEPTH = 8;
5
+ const INDEX_RE = /^\d+$/;
6
+ const MISSING = { kind: "missing" };
7
+ const OPAQUE = { kind: "opaque" };
8
+ function isJsonObject(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ function followRefs(node, refs) {
12
+ return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
13
+ }
14
+ function isNullableSchema(node) {
15
+ if (!isJsonObject(node)) {
16
+ return false;
17
+ }
18
+ return node.nullable === true || Array.isArray(node.type) && node.type.includes("null");
19
+ }
20
+ function typeNames(node) {
21
+ return Array.isArray(node.type) ? node.type : [node.type];
22
+ }
23
+ function isObjectShape(node) {
24
+ if (typeof node.type === "string") {
25
+ return node.type === "object";
26
+ }
27
+ return typeNames(node).includes("object") || "properties" in node || "additionalProperties" in node || "patternProperties" in node;
28
+ }
29
+ function isArrayShape(node) {
30
+ if (typeof node.type === "string") {
31
+ return node.type === "array";
32
+ }
33
+ return typeNames(node).includes("array") || "items" in node;
34
+ }
35
+ function hasObjectKeywords(node) {
36
+ const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;
37
+ return hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs);
38
+ }
39
+ function emptyObjectMember(node, options) {
40
+ return node.type !== void 0 && !options.emptyObjectsUnknown ? OPAQUE : MISSING;
41
+ }
42
+ function isBuiltInMember(key, prototype) {
43
+ return key in prototype;
44
+ }
45
+ function indexMember(node, options) {
46
+ const { additionalProperties: values, patternProperties: patterns } = node;
47
+ if (isJsonObject(patterns) && Object.keys(patterns).length > 0) {
48
+ return OPAQUE;
49
+ }
50
+ if (isJsonObject(values) && Object.keys(values).length > 0) {
51
+ return { kind: "index", node: values };
52
+ }
53
+ const isImplicit = values === true || isJsonObject(values) && Object.keys(values).length === 0;
54
+ return isImplicit || !values && options.additionalProperties ? { kind: "index", node: void 0 } : null;
55
+ }
56
+ function isOptionalProperty(node, key, options) {
57
+ const required = Array.isArray(node.required) ? node.required : void 0;
58
+ const property = node.properties[key];
59
+ const hasDefault = isJsonObject(property) && property.default !== void 0;
60
+ const isRequired = required?.includes(key) === true || required === void 0 && options.propertiesRequiredByDefault || hasDefault && options.defaultNonNullable;
61
+ return !isRequired;
62
+ }
63
+ function objectMember(node, key, options) {
64
+ const properties = isJsonObject(node.properties) ? node.properties : {};
65
+ if (Object.hasOwn(properties, key)) {
66
+ const property = properties[key];
67
+ const isExcluded = options.excludeDeprecated && isJsonObject(property) && property.deprecated;
68
+ return isExcluded || isJsonObject(node.discriminator) ? OPAQUE : { kind: "property", node: property, isOptional: isOptionalProperty(node, key, options) };
69
+ }
70
+ const isUnknownShape = isJsonObject(node.discriminator) || node.unevaluatedProperties !== void 0;
71
+ if (isBuiltInMember(key, {}) || key === "$defs" || isUnknownShape) {
72
+ return OPAQUE;
73
+ }
74
+ return hasObjectKeywords(node) ? indexMember(node, options) ?? MISSING : emptyObjectMember(node, options);
75
+ }
76
+ function schemaPresence(schema, refs) {
77
+ return isNullableSchema(followRefs(schema, refs)) ? "absent" : "present";
78
+ }
79
+ function propertyPresence(schema, key, options, refs) {
80
+ const node = followRefs(schema, refs);
81
+ const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};
82
+ if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {
83
+ return "unknown";
84
+ }
85
+ return isOptionalProperty(node, key, options) ? "absent" : schemaPresence(properties[key], refs);
86
+ }
87
+ function membersOf(node, keyword) {
88
+ const members = node[keyword];
89
+ return Array.isArray(members) ? members : [];
90
+ }
91
+ function withoutComposition(node) {
92
+ const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;
93
+ return own;
94
+ }
95
+ function hasOwnObjectType(own) {
96
+ return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));
97
+ }
98
+ function composedMember(node, key, input) {
99
+ const variants = [...membersOf(node, "anyOf"), ...membersOf(node, "oneOf")];
100
+ const own = withoutComposition(node);
101
+ const hasOwn = hasOwnObjectType(own);
102
+ if (variants.length > 0) {
103
+ const isAlone = membersOf(node, "allOf").length === 0 && !hasOwn;
104
+ const members = variants.map((variant) => memberAt(variant, key, input));
105
+ return isAlone && members.some((member) => member.kind === "missing") ? MISSING : OPAQUE;
106
+ }
107
+ const parts = [...membersOf(node, "allOf"), ...hasOwn ? [own] : []];
108
+ return intersectionMember(parts.map((part) => memberAt(part, key, input)));
109
+ }
110
+ function isUnknownIndex(member) {
111
+ return member.kind === "index" && member.node === void 0;
112
+ }
113
+ function intersectionMember(members) {
114
+ const found = members.filter((member) => member.kind !== "missing");
115
+ const typed = found.filter((member) => !isUnknownIndex(member));
116
+ const [only] = typed;
117
+ if (only === void 0) {
118
+ return found[0] ?? MISSING;
119
+ }
120
+ return typed.length === 1 && only.kind !== "opaque" ? only : OPAQUE;
121
+ }
122
+ function memberAt(schema, key, input) {
123
+ const node = followRefs(schema, input.refs);
124
+ if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {
125
+ return OPAQUE;
126
+ }
127
+ if (isNullableSchema(node)) {
128
+ return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;
129
+ }
130
+ if (input.options.readWriteMarkers) {
131
+ return OPAQUE;
132
+ }
133
+ if ("allOf" in node || "anyOf" in node || "oneOf" in node) {
134
+ return composedMember(node, key, { ...input, depth: input.depth + 1 });
135
+ }
136
+ if (isObjectShape(node)) {
137
+ return objectMember(node, key, input.options);
138
+ }
139
+ if (isArrayShape(node)) {
140
+ return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;
141
+ }
142
+ return input.options.binaryAsBlob && isRawBinarySchema(node) ? OPAQUE : primitiveMember(node, key);
143
+ }
144
+ const PRIMITIVE_PROTOTYPES = {
145
+ string: String.prototype,
146
+ number: Number.prototype,
147
+ integer: Number.prototype,
148
+ boolean: Boolean.prototype
149
+ };
150
+ function primitiveMember(node, key) {
151
+ if (node.type === void 0) {
152
+ return hasObjectKeywords(node) ? OPAQUE : MISSING;
153
+ }
154
+ const prototype = typeof node.type === "string" ? PRIMITIVE_PROTOTYPES[node.type] : void 0;
155
+ return prototype !== void 0 && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;
156
+ }
157
+ function generatedMember(schema, key, options, refs) {
158
+ return memberAt(schema, key, { options, refs, depth: 0 });
159
+ }
160
+
161
+ export { followRefs, generatedMember, isArrayShape, isJsonObject, isNullableSchema, isObjectShape, propertyPresence, schemaPresence };
162
+ //# sourceMappingURL=generated-shape.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated-shape.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-shape.ts"],"sourcesContent":["import { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\n\n/**\n * What the generated type of a schema has under a key, read from the schema itself. It answers the\n * question TypeScript answers when it checks `T[\"key\"]`, for the schema shapes where the answer is\n * sure; for every other shape it says `opaque`, so a caller never assumes an error that is not.\n */\n\nexport type GeneratedMember =\n | { readonly kind: \"property\"; readonly node: unknown; readonly isOptional: boolean }\n /** An index signature; `node` is undefined when its value type is `unknown`. */\n | { readonly kind: \"index\"; readonly node: unknown }\n | { readonly kind: \"missing\" }\n | { readonly kind: \"opaque\" };\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst OPAQUE_KEYS = [\"not\", \"enum\", \"const\", \"$ref\"] as const;\n/** How deep `allOf`/`anyOf`/`oneOf` members are read; deeper shapes count as opaque. */\nconst MAX_DEPTH = 8;\nconst INDEX_RE = /^\\d+$/;\nconst MISSING: GeneratedMember = { kind: \"missing\" };\nconst OPAQUE: GeneratedMember = { kind: \"opaque\" };\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `nullable: true` or a `type` list with `null`: the generated type includes `null`. */\nexport function isNullableSchema(node: unknown): boolean {\n if (!isJsonObject(node)) {\n return false;\n }\n return node.nullable === true || (Array.isArray(node.type) && node.type.includes(\"null\"));\n}\n\nfunction typeNames(node: JsonObject): readonly unknown[] {\n return Array.isArray(node.type) ? node.type : [node.type];\n}\n\n/**\n * Whether the generated type is an object. One `type` name decides alone: `type: string` with\n * `properties` or `items` is `string`, as `coreType` matches the `type` before the keywords.\n */\nexport function isObjectShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"object\";\n }\n return (\n typeNames(node).includes(\"object\") ||\n \"properties\" in node ||\n \"additionalProperties\" in node ||\n \"patternProperties\" in node\n );\n}\n\n/** Whether the generated type is an array; one `type` name decides alone (`isObjectShape`). */\nexport function isArrayShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"array\";\n }\n return typeNames(node).includes(\"array\") || \"items\" in node;\n}\n\n/** Whether `objectType` writes a type for the schema; the same test as there. */\nfunction hasObjectKeywords(node: JsonObject): boolean {\n const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;\n return (\n hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs)\n );\n}\n\n/**\n * A key of an object schema without object keywords. With a `type` it is `Record<string, never>`:\n * every key is `never`, and so is every key after it (or `unknown` with `--empty-objects-unknown`,\n * which has no key). Without a `type` it is `unknown`.\n */\nfunction emptyObjectMember(node: JsonObject, options: SchemaOptions): GeneratedMember {\n return node.type !== undefined && !options.emptyObjectsUnknown ? OPAQUE : MISSING;\n}\n\n/** Whether a key the object has no property for is still a member: `toString`, `length`, `0`. */\nfunction isBuiltInMember(key: string, prototype: object): boolean {\n return key in prototype;\n}\n\nfunction indexMember(node: JsonObject, options: SchemaOptions): GeneratedMember | null {\n const { additionalProperties: values, patternProperties: patterns } = node;\n if (isJsonObject(patterns) && Object.keys(patterns).length > 0) {\n return OPAQUE;\n }\n if (isJsonObject(values) && Object.keys(values).length > 0) {\n return { kind: \"index\", node: values };\n }\n const isImplicit = values === true || (isJsonObject(values) && Object.keys(values).length === 0);\n return isImplicit || (!values && options.additionalProperties)\n ? { kind: \"index\", node: undefined }\n : null;\n}\n\nfunction isOptionalProperty(node: JsonObject, key: string, options: SchemaOptions): boolean {\n const required = Array.isArray(node.required) ? node.required : undefined;\n const property = (node.properties as JsonObject)[key];\n const hasDefault = isJsonObject(property) && property.default !== undefined;\n const isRequired =\n required?.includes(key) === true ||\n (required === undefined && options.propertiesRequiredByDefault) ||\n (hasDefault && options.defaultNonNullable);\n return !isRequired;\n}\n\nfunction objectMember(node: JsonObject, key: string, options: SchemaOptions): GeneratedMember {\n const properties = isJsonObject(node.properties) ? node.properties : {};\n if (Object.hasOwn(properties, key)) {\n const property = properties[key];\n const isExcluded = options.excludeDeprecated && isJsonObject(property) && property.deprecated;\n return isExcluded || isJsonObject(node.discriminator)\n ? OPAQUE\n : { kind: \"property\", node: property, isOptional: isOptionalProperty(node, key, options) };\n }\n // `unevaluatedProperties` adds an index signature with its fix, so it counts as opaque too.\n const isUnknownShape =\n isJsonObject(node.discriminator) || node.unevaluatedProperties !== undefined;\n if (isBuiltInMember(key, {}) || key === \"$defs\" || isUnknownShape) {\n return OPAQUE;\n }\n return hasObjectKeywords(node)\n ? (indexMember(node, options) ?? MISSING)\n : emptyObjectMember(node, options);\n}\n\n/** Whether a value is there: `present`, `absent` (may be `undefined` or `null`) or `unknown`. */\nexport type Presence = \"present\" | \"absent\" | \"unknown\";\n\n/** The presence of a value of `schema` itself: `absent` when its type includes `null`. */\nexport function schemaPresence(schema: unknown, refs: RefResolver): Presence {\n return isNullableSchema(followRefs(schema, refs)) ? \"absent\" : \"present\";\n}\n\n/** The presence of property `key` of `schema`: optional or nullable is `absent`. */\nexport function propertyPresence(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): Presence {\n const node = followRefs(schema, refs);\n const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};\n if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {\n return \"unknown\";\n }\n return isOptionalProperty(node, key, options) ? \"absent\" : schemaPresence(properties[key], refs);\n}\n\nfunction membersOf(node: JsonObject, keyword: string): readonly unknown[] {\n const members = node[keyword];\n return Array.isArray(members) ? members : [];\n}\n\nfunction withoutComposition(node: JsonObject): JsonObject {\n const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;\n return own;\n}\n\n/** Own keywords without an object type of their own (`properties: {}`) add no part. */\nfunction hasOwnObjectType(own: JsonObject): boolean {\n return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));\n}\n\n/**\n * `allOf` with own keywords is an intersection (`intersectionMember`).\n * `anyOf` or `oneOf` alone is a union: a key is missing if one member misses it. A mix of both\n * is written in more than one way (`anyof-properties`), so it counts as opaque.\n */\nfunction composedMember(node: JsonObject, key: string, input: MemberInput): GeneratedMember {\n const variants = [...membersOf(node, \"anyOf\"), ...membersOf(node, \"oneOf\")];\n const own = withoutComposition(node);\n const hasOwn = hasOwnObjectType(own);\n if (variants.length > 0) {\n const isAlone = membersOf(node, \"allOf\").length === 0 && !hasOwn;\n const members = variants.map((variant) => memberAt(variant, key, input));\n return isAlone && members.some((member) => member.kind === \"missing\") ? MISSING : OPAQUE;\n }\n const parts = [...membersOf(node, \"allOf\"), ...(hasOwn ? [own] : [])];\n return intersectionMember(parts.map((part) => memberAt(part, key, input)));\n}\n\nfunction isUnknownIndex(member: GeneratedMember): boolean {\n return member.kind === \"index\" && member.node === undefined;\n}\n\n/**\n * A key of an intersection: missing if every part misses it; the part's member if only one part\n * has it (`A & B` where `B` has no such key and no index signature); else opaque. A part's\n * `[key: string]: unknown` adds nothing (`unknown & T` is `T`), and only such parts give `unknown`.\n */\nfunction intersectionMember(members: readonly GeneratedMember[]): GeneratedMember {\n const found = members.filter((member) => member.kind !== \"missing\");\n const typed = found.filter((member) => !isUnknownIndex(member));\n const [only] = typed;\n if (only === undefined) {\n return found[0] ?? MISSING;\n }\n return typed.length === 1 && only.kind !== \"opaque\" ? only : OPAQUE;\n}\n\ninterface MemberInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n readonly depth: number;\n}\n\nfunction memberAt(schema: unknown, key: string, input: MemberInput): GeneratedMember {\n const node = followRefs(schema, input.refs);\n if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {\n return OPAQUE;\n }\n if (isNullableSchema(node)) {\n // Every key of `T | null` is an error, unless `T` is unknown (then the type is `unknown`).\n return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;\n }\n if (input.options.readWriteMarkers) {\n return OPAQUE;\n }\n if (\"allOf\" in node || \"anyOf\" in node || \"oneOf\" in node) {\n return composedMember(node, key, { ...input, depth: input.depth + 1 });\n }\n if (isObjectShape(node)) {\n return objectMember(node, key, input.options);\n }\n if (isArrayShape(node)) {\n return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;\n }\n // `--binary-as-blob` types raw binary strings as `Blob`, which has members of its own.\n return input.options.binaryAsBlob && isRawBinarySchema(node as never)\n ? OPAQUE\n : primitiveMember(node, key);\n}\n\n/** The JavaScript value whose members a primitive `type` has: `\"\".length`, `(0).toFixed`. */\nconst PRIMITIVE_PROTOTYPES: Readonly<Record<string, object>> = {\n string: String.prototype,\n number: Number.prototype,\n integer: Number.prototype,\n boolean: Boolean.prototype,\n};\n\n/**\n * A key of a schema with one primitive `type`: missing unless the primitive has it. Object and\n * array keywords next to that `type` do not change the type (`isObjectShape`). Without a `type`\n * and object keywords the schema is `unknown` (`objectType` writes nothing), which has no keys.\n */\nfunction primitiveMember(node: JsonObject, key: string): GeneratedMember {\n if (node.type === undefined) {\n return hasObjectKeywords(node) ? OPAQUE : MISSING;\n }\n const prototype = typeof node.type === \"string\" ? PRIMITIVE_PROTOTYPES[node.type] : undefined;\n return prototype !== undefined && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;\n}\n\n/** The member `key` of the type generated for `schema` (a `$ref` is followed first). */\nexport function generatedMember(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): GeneratedMember {\n return memberAt(schema, key, { options, refs, depth: 0 });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ const generatedShape = require('./generated-shape.cjs');
4
+ const pointerWalk = require('./pointer-walk.cjs');
5
+ const typedWalk = require('./typed-walk.cjs');
6
+
7
+ function refsIn(node, found = []) {
8
+ if (Array.isArray(node)) {
9
+ for (const item of node) {
10
+ refsIn(item, found);
11
+ }
12
+ } else if (generatedShape.isJsonObject(node)) {
13
+ if (typeof node.$ref === "string") {
14
+ found.push(node.$ref);
15
+ }
16
+ for (const value of Object.values(node)) {
17
+ refsIn(value, found);
18
+ }
19
+ }
20
+ return found;
21
+ }
22
+ function isWrittenInline(ref, input) {
23
+ const pointer = pointerWalk.refPointerOf(ref);
24
+ return pointer !== null && typedWalk.typedWalk({ pointer, ...input }).kind === "untyped";
25
+ }
26
+ function reachesOpenRef(ref, open, input) {
27
+ if (open.has(ref)) {
28
+ return open.get(ref) === true;
29
+ }
30
+ open.set(ref, true);
31
+ const pointer = pointerWalk.refPointerOf(ref);
32
+ const target = pointer === null ? void 0 : pointerWalk.pointerNode(pointer, input.refs);
33
+ const isCycle = refsIn(target).some(
34
+ (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input)
35
+ );
36
+ open.set(ref, false);
37
+ return isCycle;
38
+ }
39
+ function hasInlineCycle(ref, options, refs) {
40
+ return reachesOpenRef(ref, /* @__PURE__ */ new Map(), { options, refs });
41
+ }
42
+
43
+ exports.hasInlineCycle = hasInlineCycle;
44
+ //# sourceMappingURL=inline-cycles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-cycles.cjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":["isJsonObject","refPointerOf","typedWalk","pointerNode"],"mappings":";;;;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAWA,2BAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAUC,yBAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQC,mBAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAUD,yBAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAYE,uBAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
@@ -0,0 +1,42 @@
1
+ import { isJsonObject } from './generated-shape.mjs';
2
+ import { refPointerOf, pointerNode } from './pointer-walk.mjs';
3
+ import { typedWalk } from './typed-walk.mjs';
4
+
5
+ function refsIn(node, found = []) {
6
+ if (Array.isArray(node)) {
7
+ for (const item of node) {
8
+ refsIn(item, found);
9
+ }
10
+ } else if (isJsonObject(node)) {
11
+ if (typeof node.$ref === "string") {
12
+ found.push(node.$ref);
13
+ }
14
+ for (const value of Object.values(node)) {
15
+ refsIn(value, found);
16
+ }
17
+ }
18
+ return found;
19
+ }
20
+ function isWrittenInline(ref, input) {
21
+ const pointer = refPointerOf(ref);
22
+ return pointer !== null && typedWalk({ pointer, ...input }).kind === "untyped";
23
+ }
24
+ function reachesOpenRef(ref, open, input) {
25
+ if (open.has(ref)) {
26
+ return open.get(ref) === true;
27
+ }
28
+ open.set(ref, true);
29
+ const pointer = refPointerOf(ref);
30
+ const target = pointer === null ? void 0 : pointerNode(pointer, input.refs);
31
+ const isCycle = refsIn(target).some(
32
+ (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input)
33
+ );
34
+ open.set(ref, false);
35
+ return isCycle;
36
+ }
37
+ function hasInlineCycle(ref, options, refs) {
38
+ return reachesOpenRef(ref, /* @__PURE__ */ new Map(), { options, refs });
39
+ }
40
+
41
+ export { hasInlineCycle };
42
+ //# sourceMappingURL=inline-cycles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-cycles.mjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":[],"mappings":";;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAW,YAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQ,SAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAY,WAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ const generatedShape = require('./generated-shape.cjs');
4
+ const pointerWalk = require('./pointer-walk.cjs');
5
+
6
+ function schemaStep(walk, segment, isLast, input) {
7
+ if (segment === "properties") {
8
+ return { step: "continue", walk };
9
+ }
10
+ const member = generatedShape.generatedMember(walk.node, segment, input.options, input.refs);
11
+ if (member.kind === "missing") {
12
+ return { step: "fails", walk };
13
+ }
14
+ if (member.kind === "opaque") {
15
+ return { step: "compiles", walk };
16
+ }
17
+ const isAbsentValue = member.kind === "index" && member.node === void 0;
18
+ const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
19
+ return {
20
+ step: isUnsafe && !isLast ? "fails" : "continue",
21
+ walk: { ...walk, node: member.node }
22
+ };
23
+ }
24
+ function containerStep(walk, index, input) {
25
+ const segment = input.pointer.segments[index];
26
+ const isLast = index === input.pointer.segments.length - 1;
27
+ const isOptional = segment === "requestBody" && pointerWalk.isOptionalRequestBody(walk.node, input.refs) || pointerWalk.isOptionalHeader(input.pointer, index, walk.node);
28
+ if (isOptional && !isLast) {
29
+ return { step: "fails", walk };
30
+ }
31
+ const child = generatedShape.isJsonObject(walk.node) ? generatedShape.followRefs(walk.node[segment], input.refs) : void 0;
32
+ return {
33
+ step: child === void 0 ? "compiles" : "continue",
34
+ walk: { ...walk, node: child }
35
+ };
36
+ }
37
+ function originalIndexFails(input) {
38
+ const { segments } = input.pointer;
39
+ let walk = {
40
+ node: pointerWalk.leadingNode(input.pointer, input.refs),
41
+ isSchema: pointerWalk.startsInSchema(input.pointer)
42
+ };
43
+ for (let index = pointerWalk.leadingSegmentsOf(input.pointer); index < segments.length; index++) {
44
+ const segment = segments[index];
45
+ const isLast = index === segments.length - 1;
46
+ if (!walk.isSchema && pointerWalk.isParameterList(input.pointer, index)) {
47
+ return true;
48
+ }
49
+ if (!walk.isSchema && pointerWalk.isTypedAsSchema(input.pointer, index) && generatedShape.isJsonObject(walk.node)) {
50
+ walk = { node: generatedShape.followRefs(walk.node.schema, input.refs), isSchema: true };
51
+ }
52
+ const result = walk.isSchema ? schemaStep(walk, segment, isLast, input) : containerStep(walk, index, input);
53
+ if (result.step !== "continue") {
54
+ return result.step === "fails";
55
+ }
56
+ walk = result.walk;
57
+ }
58
+ return false;
59
+ }
60
+
61
+ exports.originalIndexFails = originalIndexFails;
62
+ //# sourceMappingURL=original-index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"original-index.cjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { followRefs, generatedMember, isJsonObject } from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk.node, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe = member.kind === \"property\" ? member.isOptional : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : undefined;\n return {\n step: (child === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, node: child },\n };\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n node: leadingNode(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };\n }\n const result = walk.isSchema\n ? schemaStep(walk, segment, isLast, input)\n : containerStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":["generatedMember","isOptionalRequestBody","isOptionalHeader","isJsonObject","followRefs","leadingNode","startsInSchema","leadingSegmentsOf","isParameterList","isTypedAsSchema"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { isJsonObject, followRefs, generatedMember } from './generated-shape.mjs';
2
+ import { startsInSchema, leadingNode, leadingSegmentsOf, isParameterList, isTypedAsSchema, isOptionalRequestBody, isOptionalHeader } from './pointer-walk.mjs';
3
+
4
+ function schemaStep(walk, segment, isLast, input) {
5
+ if (segment === "properties") {
6
+ return { step: "continue", walk };
7
+ }
8
+ const member = generatedMember(walk.node, segment, input.options, input.refs);
9
+ if (member.kind === "missing") {
10
+ return { step: "fails", walk };
11
+ }
12
+ if (member.kind === "opaque") {
13
+ return { step: "compiles", walk };
14
+ }
15
+ const isAbsentValue = member.kind === "index" && member.node === void 0;
16
+ const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
17
+ return {
18
+ step: isUnsafe && !isLast ? "fails" : "continue",
19
+ walk: { ...walk, node: member.node }
20
+ };
21
+ }
22
+ function containerStep(walk, index, input) {
23
+ const segment = input.pointer.segments[index];
24
+ const isLast = index === input.pointer.segments.length - 1;
25
+ const isOptional = segment === "requestBody" && isOptionalRequestBody(walk.node, input.refs) || isOptionalHeader(input.pointer, index, walk.node);
26
+ if (isOptional && !isLast) {
27
+ return { step: "fails", walk };
28
+ }
29
+ const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : void 0;
30
+ return {
31
+ step: child === void 0 ? "compiles" : "continue",
32
+ walk: { ...walk, node: child }
33
+ };
34
+ }
35
+ function originalIndexFails(input) {
36
+ const { segments } = input.pointer;
37
+ let walk = {
38
+ node: leadingNode(input.pointer, input.refs),
39
+ isSchema: startsInSchema(input.pointer)
40
+ };
41
+ for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {
42
+ const segment = segments[index];
43
+ const isLast = index === segments.length - 1;
44
+ if (!walk.isSchema && isParameterList(input.pointer, index)) {
45
+ return true;
46
+ }
47
+ if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {
48
+ walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };
49
+ }
50
+ const result = walk.isSchema ? schemaStep(walk, segment, isLast, input) : containerStep(walk, index, input);
51
+ if (result.step !== "continue") {
52
+ return result.step === "fails";
53
+ }
54
+ walk = result.walk;
55
+ }
56
+ return false;
57
+ }
58
+
59
+ export { originalIndexFails };
60
+ //# sourceMappingURL=original-index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"original-index.mjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { followRefs, generatedMember, isJsonObject } from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk.node, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe = member.kind === \"property\" ? member.isOptional : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : undefined;\n return {\n step: (child === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, node: child },\n };\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n node: leadingNode(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };\n }\n const result = walk.isSchema\n ? schemaStep(walk, segment, isLast, input)\n : containerStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const outputFixes = require('../../../domain/output-fixes.cjs');
5
+ const refType = require('../ref-type.cjs');
6
+ const generatedLocation = require('./generated-location.cjs');
7
+ const generatedShape = require('./generated-shape.cjs');
8
+ const inlineCycles = require('./inline-cycles.cjs');
9
+ const originalIndex = require('./original-index.cjs');
10
+ const pointerWalk = require('./pointer-walk.cjs');
11
+ const typedWalk = require('./typed-walk.cjs');
12
+
13
+ function pointerOf(ref) {
14
+ const pointer = pointerWalk.refPointerOf(ref);
15
+ if (pointer === null) {
16
+ throw new refType.InvalidRefError(ref);
17
+ }
18
+ return pointer;
19
+ }
20
+ function targetType(ref, pointer, request, seen) {
21
+ const target = pointerWalk.pointerNode(pointer, request.context.refs);
22
+ if (generatedShape.isJsonObject(target) && typeof target.$ref === "string") {
23
+ return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);
24
+ }
25
+ if (target === void 0 || inlineCycles.hasInlineCycle(ref, request.context.options, request.context.refs)) {
26
+ return null;
27
+ }
28
+ const location = generatedLocation.generatedLocationOf(ref, request.context.refs);
29
+ return request.transformNested(
30
+ target,
31
+ { path: location.path, schema: target },
32
+ location.isFromAdditionalProperties
33
+ );
34
+ }
35
+ function correctedType(ref, pointer, request, seen) {
36
+ const { options, refs } = request.context;
37
+ const result = typedWalk.typedWalk({ pointer, options, refs });
38
+ return result.kind === "typed" ? result.walk.type : targetType(ref, pointer, request, seen);
39
+ }
40
+ function isCorrected(pointer, request) {
41
+ const { options, refs } = request.context;
42
+ return options.fixes.has(outputFixes.OutputFix.REF_POINTERS) || originalIndex.originalIndexFails({ pointer, options, refs });
43
+ }
44
+ function schemaRefType(ref, request, seen = []) {
45
+ const pointer = pointerOf(ref);
46
+ if (pointer.segments.length <= pointerWalk.leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {
47
+ return refType.refType(ref);
48
+ }
49
+ return correctedType(ref, pointer, request, seen) ?? refType.refType(ref);
50
+ }
51
+ function requirableRefType(ref, type, request) {
52
+ const { options, refs } = request.context;
53
+ const result = typedWalk.typedWalk({ pointer: pointerOf(ref), options, refs });
54
+ const isAbsent = result.kind === "typed" && result.walk.presence === "absent";
55
+ return isAbsent ? constructors.irReference("NonNullable", [type]) : type;
56
+ }
57
+
58
+ exports.requirableRefType = requirableRefType;
59
+ exports.schemaRefType = schemaRefType;
60
+ //# sourceMappingURL=pointer-type.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer-type.cjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { hasInlineCycle } from \"./inline-cycles.js\";\nimport { originalIndexFails } from \"./original-index.js\";\nimport { leadingSegmentsOf, pointerNode, type RefPointer, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * The type of a schema `$ref` (ADR-026). The original indexed every segment of the pointer by\n * name (`refType`), also schema keywords the generated types do not have (`[\"schema\"]`,\n * `[\"items\"]`, `[\"allOf\"][\"0\"]`), and did not look through optional or nullable values. Where that\n * type does not compile, the `$ref` now gets the type of what it points at; where it compiles\n * (through an index signature), it stays, and the `ref-pointers` fix gives the right type there.\n */\n\nfunction pointerOf(ref: string): RefPointer {\n const pointer = refPointerOf(ref);\n if (pointer === null) {\n throw new InvalidRefError(ref);\n }\n return pointer;\n}\n\n/** The target of a pointer that crosses a segment with no type: its `$ref`, or its own type. */\nfunction targetType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const target = pointerNode(pointer, request.context.refs);\n if (isJsonObject(target) && typeof target.$ref === \"string\") {\n return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);\n }\n if (target === undefined || hasInlineCycle(ref, request.context.options, request.context.refs)) {\n return null;\n }\n // Typed where the generator types the node, so it shares the node's enum (`--enum`).\n const location = generatedLocationOf(ref, request.context.refs);\n return request.transformNested(\n target as never,\n { path: location.path, schema: target },\n location.isFromAdditionalProperties,\n );\n}\n\nfunction correctedType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer, options, refs });\n return result.kind === \"typed\" ? result.walk.type : targetType(ref, pointer, request, seen);\n}\n\nfunction isCorrected(pointer: RefPointer, request: SchemaRequest): boolean {\n const { options, refs } = request.context;\n return (\n options.fixes.has(OutputFix.REF_POINTERS) || originalIndexFails({ pointer, options, refs })\n );\n}\n\n/** The type of a schema `$ref`. Throws InvalidRefError when the `$ref` has no pointer. */\nexport function schemaRefType(\n ref: string,\n request: SchemaRequest,\n seen: readonly string[] = [],\n): IrType {\n const pointer = pointerOf(ref);\n if (pointer.segments.length <= leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {\n return refType(ref);\n }\n return correctedType(ref, pointer, request, seen) ?? refType(ref);\n}\n\n/**\n * The type of a `$ref` that `WithRequired` takes. A `$ref` to an optional or nullable value has\n * no keys (`keyof (T | undefined)` is `never`), so it is wrapped in `NonNullable` (TS2344).\n */\nexport function requirableRefType(ref: string, type: IrType, request: SchemaRequest): IrType {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer: pointerOf(ref), options, refs });\n const isAbsent = result.kind === \"typed\" && result.walk.presence === \"absent\";\n return isAbsent ? irReference(\"NonNullable\", [type]) : type;\n}\n"],"names":["refPointerOf","InvalidRefError","pointerNode","isJsonObject","hasInlineCycle","generatedLocationOf","typedWalk","OutputFix","originalIndexFails","leadingSegmentsOf","refType","irReference"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { irReference } from '../../../domain/ir/constructors.mjs';
2
+ import { OutputFix } from '../../../domain/output-fixes.mjs';
3
+ import { refType, InvalidRefError } from '../ref-type.mjs';
4
+ import { generatedLocationOf } from './generated-location.mjs';
5
+ import { isJsonObject } from './generated-shape.mjs';
6
+ import { hasInlineCycle } from './inline-cycles.mjs';
7
+ import { originalIndexFails } from './original-index.mjs';
8
+ import { leadingSegmentsOf, refPointerOf, pointerNode } from './pointer-walk.mjs';
9
+ import { typedWalk } from './typed-walk.mjs';
10
+
11
+ function pointerOf(ref) {
12
+ const pointer = refPointerOf(ref);
13
+ if (pointer === null) {
14
+ throw new InvalidRefError(ref);
15
+ }
16
+ return pointer;
17
+ }
18
+ function targetType(ref, pointer, request, seen) {
19
+ const target = pointerNode(pointer, request.context.refs);
20
+ if (isJsonObject(target) && typeof target.$ref === "string") {
21
+ return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);
22
+ }
23
+ if (target === void 0 || hasInlineCycle(ref, request.context.options, request.context.refs)) {
24
+ return null;
25
+ }
26
+ const location = generatedLocationOf(ref, request.context.refs);
27
+ return request.transformNested(
28
+ target,
29
+ { path: location.path, schema: target },
30
+ location.isFromAdditionalProperties
31
+ );
32
+ }
33
+ function correctedType(ref, pointer, request, seen) {
34
+ const { options, refs } = request.context;
35
+ const result = typedWalk({ pointer, options, refs });
36
+ return result.kind === "typed" ? result.walk.type : targetType(ref, pointer, request, seen);
37
+ }
38
+ function isCorrected(pointer, request) {
39
+ const { options, refs } = request.context;
40
+ return options.fixes.has(OutputFix.REF_POINTERS) || originalIndexFails({ pointer, options, refs });
41
+ }
42
+ function schemaRefType(ref, request, seen = []) {
43
+ const pointer = pointerOf(ref);
44
+ if (pointer.segments.length <= leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {
45
+ return refType(ref);
46
+ }
47
+ return correctedType(ref, pointer, request, seen) ?? refType(ref);
48
+ }
49
+ function requirableRefType(ref, type, request) {
50
+ const { options, refs } = request.context;
51
+ const result = typedWalk({ pointer: pointerOf(ref), options, refs });
52
+ const isAbsent = result.kind === "typed" && result.walk.presence === "absent";
53
+ return isAbsent ? irReference("NonNullable", [type]) : type;
54
+ }
55
+
56
+ export { requirableRefType, schemaRefType };
57
+ //# sourceMappingURL=pointer-type.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer-type.mjs","sources":["../../../../src/application/transform/ref-pointer/pointer-type.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { InvalidRefError, refType } from \"../ref-type.js\";\nimport type { SchemaRequest } from \"../schema/schema-rule.js\";\nimport { generatedLocationOf } from \"./generated-location.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { hasInlineCycle } from \"./inline-cycles.js\";\nimport { originalIndexFails } from \"./original-index.js\";\nimport { leadingSegmentsOf, pointerNode, type RefPointer, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * The type of a schema `$ref` (ADR-026). The original indexed every segment of the pointer by\n * name (`refType`), also schema keywords the generated types do not have (`[\"schema\"]`,\n * `[\"items\"]`, `[\"allOf\"][\"0\"]`), and did not look through optional or nullable values. Where that\n * type does not compile, the `$ref` now gets the type of what it points at; where it compiles\n * (through an index signature), it stays, and the `ref-pointers` fix gives the right type there.\n */\n\nfunction pointerOf(ref: string): RefPointer {\n const pointer = refPointerOf(ref);\n if (pointer === null) {\n throw new InvalidRefError(ref);\n }\n return pointer;\n}\n\n/** The target of a pointer that crosses a segment with no type: its `$ref`, or its own type. */\nfunction targetType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const target = pointerNode(pointer, request.context.refs);\n if (isJsonObject(target) && typeof target.$ref === \"string\") {\n return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);\n }\n if (target === undefined || hasInlineCycle(ref, request.context.options, request.context.refs)) {\n return null;\n }\n // Typed where the generator types the node, so it shares the node's enum (`--enum`).\n const location = generatedLocationOf(ref, request.context.refs);\n return request.transformNested(\n target as never,\n { path: location.path, schema: target },\n location.isFromAdditionalProperties,\n );\n}\n\nfunction correctedType(\n ref: string,\n pointer: RefPointer,\n request: SchemaRequest,\n seen: readonly string[],\n) {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer, options, refs });\n return result.kind === \"typed\" ? result.walk.type : targetType(ref, pointer, request, seen);\n}\n\nfunction isCorrected(pointer: RefPointer, request: SchemaRequest): boolean {\n const { options, refs } = request.context;\n return (\n options.fixes.has(OutputFix.REF_POINTERS) || originalIndexFails({ pointer, options, refs })\n );\n}\n\n/** The type of a schema `$ref`. Throws InvalidRefError when the `$ref` has no pointer. */\nexport function schemaRefType(\n ref: string,\n request: SchemaRequest,\n seen: readonly string[] = [],\n): IrType {\n const pointer = pointerOf(ref);\n if (pointer.segments.length <= leadingSegmentsOf(pointer) || !isCorrected(pointer, request)) {\n return refType(ref);\n }\n return correctedType(ref, pointer, request, seen) ?? refType(ref);\n}\n\n/**\n * The type of a `$ref` that `WithRequired` takes. A `$ref` to an optional or nullable value has\n * no keys (`keyof (T | undefined)` is `never`), so it is wrapped in `NonNullable` (TS2344).\n */\nexport function requirableRefType(ref: string, type: IrType, request: SchemaRequest): IrType {\n const { options, refs } = request.context;\n const result = typedWalk({ pointer: pointerOf(ref), options, refs });\n const isAbsent = result.kind === \"typed\" && result.walk.presence === \"absent\";\n return isAbsent ? irReference(\"NonNullable\", [type]) : type;\n}\n"],"names":[],"mappings":"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"}