openapi-typesafe 1.0.0-rc.3 → 1.0.0-rc.5

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 (596) hide show
  1. package/CHANGELOG.md +1972 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  15. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  16. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  17. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +48 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  27. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  29. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  31. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  32. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  33. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  34. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  35. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  36. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  37. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  38. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  39. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  41. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
  43. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
  45. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
  47. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
  49. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  51. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/ref-holders.mjs +53 -12
  53. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  55. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  56. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  57. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  58. package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
  59. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
  61. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
  63. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  64. package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
  65. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  66. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  67. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  68. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  69. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  70. package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
  71. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  72. package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
  73. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  74. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  75. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  76. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  77. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  78. package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
  79. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  80. package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
  81. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  82. package/dist/api/default-ports.cjs +14 -2
  83. package/dist/api/default-ports.cjs.map +1 -1
  84. package/dist/api/default-ports.mjs +14 -2
  85. package/dist/api/default-ports.mjs.map +1 -1
  86. package/dist/api/discriminator-enum-parent.cjs +2 -2
  87. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  88. package/dist/api/discriminator-enum-parent.mjs +3 -3
  89. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  90. package/dist/api/discriminator-other-owners.cjs +5 -3
  91. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  92. package/dist/api/discriminator-other-owners.mjs +5 -3
  93. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  94. package/dist/api/discriminator-patch.cjs +5 -1
  95. package/dist/api/discriminator-patch.cjs.map +1 -1
  96. package/dist/api/discriminator-patch.mjs +5 -1
  97. package/dist/api/discriminator-patch.mjs.map +1 -1
  98. package/dist/api/discriminator-scan.cjs +15 -8
  99. package/dist/api/discriminator-scan.cjs.map +1 -1
  100. package/dist/api/discriminator-scan.mjs +15 -8
  101. package/dist/api/discriminator-scan.mjs.map +1 -1
  102. package/dist/api/document-refs.cjs +16 -1
  103. package/dist/api/document-refs.cjs.map +1 -1
  104. package/dist/api/document-refs.mjs +16 -1
  105. package/dist/api/document-refs.mjs.map +1 -1
  106. package/dist/api/document-run.cjs +6 -12
  107. package/dist/api/document-run.cjs.map +1 -1
  108. package/dist/api/document-run.mjs +6 -12
  109. package/dist/api/document-run.mjs.map +1 -1
  110. package/dist/api/legacy-utils.cjs.map +1 -1
  111. package/dist/api/legacy-utils.mjs.map +1 -1
  112. package/dist/api/openapi-ts.cjs +9 -6
  113. package/dist/api/openapi-ts.cjs.map +1 -1
  114. package/dist/api/openapi-ts.mjs +10 -8
  115. package/dist/api/openapi-ts.mjs.map +1 -1
  116. package/dist/api/ref-limit-options.cjs +63 -0
  117. package/dist/api/ref-limit-options.cjs.map +1 -0
  118. package/dist/api/ref-limit-options.mjs +57 -0
  119. package/dist/api/ref-limit-options.mjs.map +1 -0
  120. package/dist/api/schema-callbacks.cjs +36 -12
  121. package/dist/api/schema-callbacks.cjs.map +1 -1
  122. package/dist/api/schema-callbacks.mjs +36 -12
  123. package/dist/api/schema-callbacks.mjs.map +1 -1
  124. package/dist/api/transform-context.cjs +7 -3
  125. package/dist/api/transform-context.cjs.map +1 -1
  126. package/dist/api/transform-context.mjs +7 -3
  127. package/dist/api/transform-context.mjs.map +1 -1
  128. package/dist/api/transform-schema.cjs +47 -10
  129. package/dist/api/transform-schema.cjs.map +1 -1
  130. package/dist/api/transform-schema.mjs +48 -11
  131. package/dist/api/transform-schema.mjs.map +1 -1
  132. package/dist/application/print/text-writer.cjs +10 -3
  133. package/dist/application/print/text-writer.cjs.map +1 -1
  134. package/dist/application/print/text-writer.mjs +10 -3
  135. package/dist/application/print/text-writer.mjs.map +1 -1
  136. package/dist/application/stack-overflow.cjs +2 -1
  137. package/dist/application/stack-overflow.cjs.map +1 -1
  138. package/dist/application/stack-overflow.mjs +2 -1
  139. package/dist/application/stack-overflow.mjs.map +1 -1
  140. package/dist/application/transform/declared-value-types.cjs +36 -0
  141. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  142. package/dist/application/transform/declared-value-types.mjs +34 -0
  143. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  144. package/dist/application/transform/document/components.cjs +1 -1
  145. package/dist/application/transform/document/components.cjs.map +1 -1
  146. package/dist/application/transform/document/components.mjs +2 -2
  147. package/dist/application/transform/document/components.mjs.map +1 -1
  148. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  149. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  150. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  151. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  152. package/dist/application/transform/document/defs-root.cjs +1 -1
  153. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  154. package/dist/application/transform/document/defs-root.mjs +2 -2
  155. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  156. package/dist/application/transform/document/document.cjs +7 -2
  157. package/dist/application/transform/document/document.cjs.map +1 -1
  158. package/dist/application/transform/document/document.mjs +6 -3
  159. package/dist/application/transform/document/document.mjs.map +1 -1
  160. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  161. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  162. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  163. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  164. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  165. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  166. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  167. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  168. package/dist/application/transform/document/global-type-references.cjs +1 -0
  169. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  170. package/dist/application/transform/document/global-type-references.mjs +1 -1
  171. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  172. package/dist/application/transform/document/header.cjs +11 -3
  173. package/dist/application/transform/document/header.cjs.map +1 -1
  174. package/dist/application/transform/document/header.mjs +10 -2
  175. package/dist/application/transform/document/header.mjs.map +1 -1
  176. package/dist/application/transform/document/media-type.cjs +2 -2
  177. package/dist/application/transform/document/media-type.cjs.map +1 -1
  178. package/dist/application/transform/document/media-type.mjs +3 -3
  179. package/dist/application/transform/document/media-type.mjs.map +1 -1
  180. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  181. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  182. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  183. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  184. package/dist/application/transform/document/operation.cjs +1 -1
  185. package/dist/application/transform/document/operation.cjs.map +1 -1
  186. package/dist/application/transform/document/operation.mjs +2 -2
  187. package/dist/application/transform/document/operation.mjs.map +1 -1
  188. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  189. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  190. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  191. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  192. package/dist/application/transform/document/parameter.cjs +12 -4
  193. package/dist/application/transform/document/parameter.cjs.map +1 -1
  194. package/dist/application/transform/document/parameter.mjs +13 -5
  195. package/dist/application/transform/document/parameter.mjs.map +1 -1
  196. package/dist/application/transform/document/parameters.cjs +29 -34
  197. package/dist/application/transform/document/parameters.cjs.map +1 -1
  198. package/dist/application/transform/document/parameters.mjs +29 -34
  199. package/dist/application/transform/document/parameters.mjs.map +1 -1
  200. package/dist/application/transform/document/path-item.cjs +15 -17
  201. package/dist/application/transform/document/path-item.cjs.map +1 -1
  202. package/dist/application/transform/document/path-item.mjs +15 -19
  203. package/dist/application/transform/document/path-item.mjs.map +1 -1
  204. package/dist/application/transform/document/path-template-key.cjs +84 -0
  205. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  206. package/dist/application/transform/document/path-template-key.mjs +79 -0
  207. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  208. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  209. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  210. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  211. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  212. package/dist/application/transform/document/paths-enum.cjs +8 -6
  213. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  214. package/dist/application/transform/document/paths-enum.mjs +8 -7
  215. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  216. package/dist/application/transform/document/paths.cjs +43 -67
  217. package/dist/application/transform/document/paths.cjs.map +1 -1
  218. package/dist/application/transform/document/paths.mjs +42 -68
  219. package/dist/application/transform/document/paths.mjs.map +1 -1
  220. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  221. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  222. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  223. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  224. package/dist/application/transform/document/request-body.cjs +1 -1
  225. package/dist/application/transform/document/request-body.cjs.map +1 -1
  226. package/dist/application/transform/document/request-body.mjs +2 -2
  227. package/dist/application/transform/document/request-body.mjs.map +1 -1
  228. package/dist/application/transform/document/response.cjs +2 -2
  229. package/dist/application/transform/document/response.cjs.map +1 -1
  230. package/dist/application/transform/document/response.mjs +3 -3
  231. package/dist/application/transform/document/response.mjs.map +1 -1
  232. package/dist/application/transform/document/responses.cjs +1 -1
  233. package/dist/application/transform/document/responses.cjs.map +1 -1
  234. package/dist/application/transform/document/responses.mjs +2 -2
  235. package/dist/application/transform/document/responses.mjs.map +1 -1
  236. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  237. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  238. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  239. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  240. package/dist/application/transform/document/type-resolution.cjs +3 -1
  241. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  242. package/dist/application/transform/document/type-resolution.mjs +3 -1
  243. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  244. package/dist/application/transform/document/webhooks.cjs +10 -3
  245. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  246. package/dist/application/transform/document/webhooks.mjs +10 -3
  247. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  248. package/dist/application/transform/footer/document-footer.cjs +16 -5
  249. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  250. package/dist/application/transform/footer/document-footer.mjs +16 -5
  251. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  252. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  253. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  254. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  255. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  256. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  257. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  258. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  259. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  260. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  261. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  262. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  263. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  264. package/dist/application/transform/helper-types.cjs +3 -3
  265. package/dist/application/transform/helper-types.cjs.map +1 -1
  266. package/dist/application/transform/helper-types.mjs +3 -3
  267. package/dist/application/transform/helper-types.mjs.map +1 -1
  268. package/dist/application/transform/numbered-names.cjs +9 -0
  269. package/dist/application/transform/numbered-names.cjs.map +1 -1
  270. package/dist/application/transform/numbered-names.mjs +9 -1
  271. package/dist/application/transform/numbered-names.mjs.map +1 -1
  272. package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
  273. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  274. package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
  275. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  276. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  277. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  278. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  279. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  280. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  281. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  282. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  283. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  284. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  285. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  286. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  287. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  288. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  289. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  290. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  291. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  292. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  293. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  294. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  295. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  296. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  297. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  298. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  299. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  300. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  301. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  302. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  303. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  304. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  305. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  306. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  307. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  308. package/dist/application/transform/ref-type.cjs +2 -1
  309. package/dist/application/transform/ref-type.cjs.map +1 -1
  310. package/dist/application/transform/ref-type.mjs +2 -1
  311. package/dist/application/transform/ref-type.mjs.map +1 -1
  312. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  313. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  314. package/dist/application/transform/schema/composition-type.cjs +1 -1
  315. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  316. package/dist/application/transform/schema/composition-type.mjs +2 -2
  317. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  318. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  319. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  320. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  321. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  322. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  323. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  324. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  325. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  326. package/dist/application/transform/schema/input-location.cjs +23 -0
  327. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  328. package/dist/application/transform/schema/input-location.mjs +21 -0
  329. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  330. package/dist/application/transform/schema/object-type.cjs +18 -8
  331. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  332. package/dist/application/transform/schema/object-type.mjs +19 -9
  333. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  334. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  335. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  336. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  337. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  338. package/dist/application/transform/schema/schema-transform.cjs +6 -3
  339. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  340. package/dist/application/transform/schema/schema-transform.mjs +6 -3
  341. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  342. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  343. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  344. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  345. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  346. package/dist/application/transform/schema-comment.cjs +5 -1
  347. package/dist/application/transform/schema-comment.cjs.map +1 -1
  348. package/dist/application/transform/schema-comment.mjs +5 -1
  349. package/dist/application/transform/schema-comment.mjs.map +1 -1
  350. package/dist/cli/api-logger.cjs +13 -0
  351. package/dist/cli/api-logger.cjs.map +1 -0
  352. package/dist/cli/api-logger.mjs +11 -0
  353. package/dist/cli/api-logger.mjs.map +1 -0
  354. package/dist/cli/api-settings.cjs +57 -9
  355. package/dist/cli/api-settings.cjs.map +1 -1
  356. package/dist/cli/api-settings.mjs +56 -11
  357. package/dist/cli/api-settings.mjs.map +1 -1
  358. package/dist/cli/api-writes.cjs +72 -0
  359. package/dist/cli/api-writes.cjs.map +1 -0
  360. package/dist/cli/api-writes.mjs +69 -0
  361. package/dist/cli/api-writes.mjs.map +1 -0
  362. package/dist/cli/cli-arguments.cjs +51 -11
  363. package/dist/cli/cli-arguments.cjs.map +1 -1
  364. package/dist/cli/cli-arguments.mjs +51 -11
  365. package/dist/cli/cli-arguments.mjs.map +1 -1
  366. package/dist/cli/cli-errors.cjs +29 -1
  367. package/dist/cli/cli-errors.cjs.map +1 -1
  368. package/dist/cli/cli-errors.mjs +29 -2
  369. package/dist/cli/cli-errors.mjs.map +1 -1
  370. package/dist/cli/cli-output.cjs +111 -4
  371. package/dist/cli/cli-output.cjs.map +1 -1
  372. package/dist/cli/cli-output.mjs +104 -5
  373. package/dist/cli/cli-output.mjs.map +1 -1
  374. package/dist/cli/main.cjs +13 -3
  375. package/dist/cli/main.cjs.map +1 -1
  376. package/dist/cli/main.mjs +14 -4
  377. package/dist/cli/main.mjs.map +1 -1
  378. package/dist/cli/redocly-apis.cjs +94 -37
  379. package/dist/cli/redocly-apis.cjs.map +1 -1
  380. package/dist/cli/redocly-apis.mjs +99 -42
  381. package/dist/cli/redocly-apis.mjs.map +1 -1
  382. package/dist/cli/ref-limits.cjs +15 -1
  383. package/dist/cli/ref-limits.cjs.map +1 -1
  384. package/dist/cli/ref-limits.mjs +15 -2
  385. package/dist/cli/ref-limits.mjs.map +1 -1
  386. package/dist/cli/run-cli.cjs +37 -14
  387. package/dist/cli/run-cli.cjs.map +1 -1
  388. package/dist/cli/run-cli.mjs +39 -16
  389. package/dist/cli/run-cli.mjs.map +1 -1
  390. package/dist/domain/append-all.cjs +10 -0
  391. package/dist/domain/append-all.cjs.map +1 -0
  392. package/dist/domain/append-all.mjs +8 -0
  393. package/dist/domain/append-all.mjs.map +1 -0
  394. package/dist/domain/cause-secrets.cjs +52 -0
  395. package/dist/domain/cause-secrets.cjs.map +1 -0
  396. package/dist/domain/cause-secrets.mjs +50 -0
  397. package/dist/domain/cause-secrets.mjs.map +1 -0
  398. package/dist/domain/errors.cjs +11 -3
  399. package/dist/domain/errors.cjs.map +1 -1
  400. package/dist/domain/errors.mjs +11 -3
  401. package/dist/domain/errors.mjs.map +1 -1
  402. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  403. package/dist/domain/ir/identifier-text.mjs +1 -1
  404. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  405. package/dist/domain/ir/ir-shape.cjs +187 -0
  406. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  407. package/dist/domain/ir/ir-shape.mjs +184 -0
  408. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  409. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  410. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  411. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  412. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  413. package/dist/domain/location-text.cjs +9 -0
  414. package/dist/domain/location-text.cjs.map +1 -0
  415. package/dist/domain/location-text.mjs +7 -0
  416. package/dist/domain/location-text.mjs.map +1 -0
  417. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  418. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  419. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  420. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  421. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  422. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  423. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  424. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  425. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  426. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  427. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  428. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  429. package/dist/domain/openapi/document-places.cjs +55 -0
  430. package/dist/domain/openapi/document-places.cjs.map +1 -0
  431. package/dist/domain/openapi/document-places.mjs +53 -0
  432. package/dist/domain/openapi/document-places.mjs.map +1 -0
  433. package/dist/domain/openapi/json-pointer.cjs +43 -1
  434. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  435. package/dist/domain/openapi/json-pointer.mjs +40 -2
  436. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  437. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  438. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  439. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  440. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  441. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  442. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  443. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  444. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  445. package/dist/domain/output-fixes.cjs +20 -0
  446. package/dist/domain/output-fixes.cjs.map +1 -1
  447. package/dist/domain/output-fixes.mjs +20 -0
  448. package/dist/domain/output-fixes.mjs.map +1 -1
  449. package/dist/domain/terminal-text.cjs +31 -0
  450. package/dist/domain/terminal-text.cjs.map +1 -0
  451. package/dist/domain/terminal-text.mjs +29 -0
  452. package/dist/domain/terminal-text.mjs.map +1 -0
  453. package/dist/domain/url-secrets.cjs +48 -0
  454. package/dist/domain/url-secrets.cjs.map +1 -0
  455. package/dist/domain/url-secrets.mjs +45 -0
  456. package/dist/domain/url-secrets.mjs.map +1 -0
  457. package/dist/domain/warnings.cjs +1 -0
  458. package/dist/domain/warnings.cjs.map +1 -1
  459. package/dist/domain/warnings.mjs +1 -0
  460. package/dist/domain/warnings.mjs.map +1 -1
  461. package/dist/index.d.cts +46 -20
  462. package/dist/index.d.mts +46 -20
  463. package/dist/index.d.ts +46 -20
  464. package/package.json +4 -5
  465. package/src/adapters/node-file-system/file-claims.ts +138 -0
  466. package/src/adapters/node-file-system/file-identity.ts +137 -0
  467. package/src/adapters/node-file-system/node-file-system.ts +158 -18
  468. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  469. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
  470. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  471. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  472. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  473. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  474. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  475. package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
  476. package/src/adapters/redocly-loader/ref-access.ts +51 -4
  477. package/src/adapters/redocly-loader/ref-holders.ts +76 -15
  478. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  479. package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
  480. package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
  481. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  482. package/src/adapters/redocly-loader/schema-source.ts +35 -11
  483. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  484. package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
  485. package/src/api/default-ports.ts +33 -4
  486. package/src/api/discriminator-enum-parent.ts +3 -3
  487. package/src/api/discriminator-other-owners.ts +5 -3
  488. package/src/api/discriminator-patch.ts +5 -1
  489. package/src/api/discriminator-scan.ts +16 -8
  490. package/src/api/document-refs.ts +29 -1
  491. package/src/api/document-run.ts +10 -19
  492. package/src/api/legacy-utils.ts +5 -1
  493. package/src/api/openapi-ts.ts +26 -8
  494. package/src/api/ref-limit-options.ts +76 -0
  495. package/src/api/run-context.ts +3 -0
  496. package/src/api/schema-callbacks.ts +60 -17
  497. package/src/api/transform-context.ts +7 -3
  498. package/src/api/transform-schema.ts +79 -12
  499. package/src/application/ports/file-system.ts +47 -0
  500. package/src/application/ports/schema-loader.ts +11 -1
  501. package/src/application/print/text-writer.ts +10 -3
  502. package/src/application/stack-overflow.ts +9 -5
  503. package/src/application/transform/declared-value-types.ts +42 -0
  504. package/src/application/transform/document/components.ts +2 -2
  505. package/src/application/transform/document/declared-type-names.ts +36 -0
  506. package/src/application/transform/document/defs-root.ts +2 -2
  507. package/src/application/transform/document/document.ts +8 -5
  508. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  509. package/src/application/transform/document/exploded-query-values.ts +88 -0
  510. package/src/application/transform/document/global-type-references.ts +1 -1
  511. package/src/application/transform/document/header.ts +25 -5
  512. package/src/application/transform/document/media-type.ts +4 -3
  513. package/src/application/transform/document/operation-keys-written.ts +27 -0
  514. package/src/application/transform/document/operation.ts +2 -2
  515. package/src/application/transform/document/parameter-entries.ts +70 -0
  516. package/src/application/transform/document/parameter.ts +21 -9
  517. package/src/application/transform/document/parameters.ts +56 -66
  518. package/src/application/transform/document/path-item.ts +16 -34
  519. package/src/application/transform/document/path-template-key.ts +152 -0
  520. package/src/application/transform/document/path-template-refs.ts +106 -0
  521. package/src/application/transform/document/paths-enum.ts +24 -10
  522. package/src/application/transform/document/paths.ts +59 -125
  523. package/src/application/transform/document/referenced-parameter.ts +146 -0
  524. package/src/application/transform/document/request-body.ts +2 -2
  525. package/src/application/transform/document/response.ts +3 -3
  526. package/src/application/transform/document/responses.ts +2 -2
  527. package/src/application/transform/document/root-type-aliases.ts +17 -38
  528. package/src/application/transform/document/type-resolution.ts +2 -1
  529. package/src/application/transform/document/webhooks.ts +19 -6
  530. package/src/application/transform/footer/document-footer.ts +36 -9
  531. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  532. package/src/application/transform/footer/operation-keys.ts +28 -0
  533. package/src/application/transform/footer/type-evaluation.ts +4 -4
  534. package/src/application/transform/helper-types.ts +8 -7
  535. package/src/application/transform/numbered-names.ts +15 -0
  536. package/src/application/transform/ref-pointer/generated-location.ts +3 -3
  537. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  538. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  539. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  540. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  541. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  542. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  543. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  544. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  545. package/src/application/transform/ref-type.ts +2 -1
  546. package/src/application/transform/schema/access-flags.ts +5 -2
  547. package/src/application/transform/schema/composition-type.ts +2 -2
  548. package/src/application/transform/schema/enum-rule.ts +6 -2
  549. package/src/application/transform/schema/index-signature-type.ts +31 -0
  550. package/src/application/transform/schema/input-location.ts +35 -0
  551. package/src/application/transform/schema/object-type.ts +22 -12
  552. package/src/application/transform/schema/ref-siblings.ts +76 -0
  553. package/src/application/transform/schema/schema-context.ts +3 -0
  554. package/src/application/transform/schema/schema-transform.ts +6 -3
  555. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  556. package/src/application/transform/schema-comment.ts +5 -1
  557. package/src/application/transform/transform-context.ts +5 -0
  558. package/src/cli/api-logger.ts +17 -0
  559. package/src/cli/api-settings.ts +80 -13
  560. package/src/cli/api-writes.ts +117 -0
  561. package/src/cli/cli-arguments.ts +90 -14
  562. package/src/cli/cli-dependencies.ts +26 -4
  563. package/src/cli/cli-errors.ts +42 -1
  564. package/src/cli/cli-output.ts +195 -15
  565. package/src/cli/main.ts +14 -5
  566. package/src/cli/redocly-apis.ts +177 -52
  567. package/src/cli/ref-limits.ts +21 -2
  568. package/src/cli/run-cli.ts +76 -15
  569. package/src/domain/append-all.ts +10 -0
  570. package/src/domain/cause-secrets.ts +86 -0
  571. package/src/domain/errors.ts +16 -5
  572. package/src/domain/ir/identifier-text.ts +6 -5
  573. package/src/domain/ir/ir-shape.ts +299 -0
  574. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  575. package/src/domain/location-text.ts +12 -0
  576. package/src/domain/openapi/alias-expansion.ts +4 -1
  577. package/src/domain/openapi/discriminated-union.ts +6 -4
  578. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  579. package/src/domain/openapi/document-object.ts +2 -0
  580. package/src/domain/openapi/document-places.ts +78 -0
  581. package/src/domain/openapi/json-pointer.ts +96 -7
  582. package/src/domain/openapi/schema-dialect.ts +22 -0
  583. package/src/domain/openapi/unsupported-features.ts +2 -2
  584. package/src/domain/output-fixes.ts +28 -2
  585. package/src/domain/terminal-text.ts +44 -0
  586. package/src/domain/url-secrets.ts +72 -0
  587. package/src/domain/warnings.ts +1 -0
  588. package/src/types/generator-options.ts +1 -1
  589. package/dist/cli/main.d.cts +0 -2
  590. package/dist/cli/main.d.mts +0 -2
  591. package/dist/cli/main.d.ts +0 -2
  592. package/dist/domain/url-credentials.cjs +0 -10
  593. package/dist/domain/url-credentials.cjs.map +0 -1
  594. package/dist/domain/url-credentials.mjs +0 -8
  595. package/dist/domain/url-credentials.mjs.map +0 -1
  596. package/src/domain/url-credentials.ts +0 -18
@@ -1 +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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"}
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 { generatedMember } from \"./generated-shape.js\";\nimport { childLocation, followLocated, isJsonObject } from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\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 /** The node's JSON Pointer (`LocatedNode`). */\n readonly location: string | undefined;\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, 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 =\n member.kind === \"property\" ? member.isOptional || member.isMarked : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node, location: member.location },\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 if (isExcludedOperation(input.pointer, index, walk.node, input)) {\n return { step: \"fails\" as Step, walk };\n }\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 = followLocated(\n {\n node: isJsonObject(walk.node) ? walk.node[segment] : undefined,\n location: childLocation(walk.location, segment),\n },\n input.refs,\n );\n return {\n step: (child.node === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, ...child },\n };\n}\n\n/** The schema of the first media type of a `content` map, `$ref`s followed. */\nfunction firstMediaTypeSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk | null {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (!isJsonObject(content)) {\n return null;\n }\n const [mediaType] = Object.keys(content);\n if (mediaType === undefined) {\n return null;\n }\n const location = childLocation(childLocation(walk.location, \"content\"), mediaType);\n const entry = followLocated({ node: content[mediaType], location }, refs);\n return ownSchema({ ...entry, isSchema: false }, refs);\n}\n\n/** The schema a header or parameter is typed by, `$ref`s followed. */\nfunction ownSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk {\n const schema = isJsonObject(walk.node) ? walk.node.schema : undefined;\n const location = childLocation(walk.location, \"schema\");\n return { ...followLocated({ node: schema, location }, refs), isSchema: true };\n}\n\n/** The schema whose type a header or parameter is, when not its media type members. */\nfunction contentSchema(\n walk: OriginalWalk,\n form: Exclude<ContentForm, \"media-type-members\">,\n refs: RefResolver,\n): OriginalWalk | null {\n switch (form) {\n case \"first-media-type\":\n return firstMediaTypeSchema(walk, refs);\n case \"schema\":\n return ownSchema(walk, refs);\n case \"string\":\n return null;\n }\n}\n\n/**\n * The original indexes the `content` of a header or parameter by name. The media type members\n * have no `content` unless a media type is named so, and `string` and `unknown` (no media type)\n * have none; the schema of the first media type, or the `schema` next to `content`, is walked on.\n */\nfunction contentStep(walk: OriginalWalk, form: ContentForm, isLast: boolean, input: WalkInput) {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (form === \"media-type-members\") {\n const hasMember = isJsonObject(content) && Object.hasOwn(content, \"content\");\n return { step: (hasMember ? \"compiles\" : \"fails\") as Step, walk };\n }\n const schema = contentSchema(walk, form, input.refs);\n return schema === null\n ? { step: \"fails\" as Step, walk }\n : schemaStep(schema, \"content\", isLast, input);\n}\n\n/**\n * A step outside a schema: a header's or parameter's `content`, a schema's container, or another.\n */\nfunction documentStep(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 form = headerParameterContentForm(input.pointer, index, walk.node, input.options);\n if (form !== null) {\n return contentStep(walk, form, isLast, input);\n }\n if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);\n }\n return containerStep(walk, index, input);\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 ...leadingLocated(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n const isLast = index === segments.length - 1;\n const result = walk.isSchema\n ? schemaStep(walk, segments[index] as string, isLast, input)\n : documentStep(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","isExcludedOperation","isOptionalRequestBody","isOptionalHeader","followLocated","isJsonObject","childLocation","headerParameterContentForm","isTypedAsSchema","leadingLocated","startsInSchema","leadingSegmentsOf","isParameterList"],"mappings":";;;;;;AAuCA,SAAS,UAAA,CAAW,IAAA,EAAoB,OAAA,EAAiB,MAAA,EAAiB,KAAA,EAAkB;AAC1F,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAoB,IAAA,EAAK;AAAA,EAC1C;AACA,EAAA,MAAM,SAASA,8BAAA,CAAgB,IAAA,EAAM,SAAS,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AACvE,EAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAoB,IAAA,EAAK;AAAA,EAC1C;AACA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,OAAO,IAAA,KAAS,MAAA;AACjE,EAAA,MAAM,WACJ,MAAA,CAAO,IAAA,KAAS,aAAa,MAAA,CAAO,UAAA,IAAc,OAAO,QAAA,GAAW,aAAA;AACtE,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,QAAA,IAAY,CAAC,MAAA,GAAS,OAAA,GAAU,UAAA;AAAA,IACvC,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,MAAM,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,MAAA,CAAO,QAAA;AAAS,GAChE;AACF;AAEA,SAAS,aAAA,CAAc,IAAA,EAAoB,KAAA,EAAe,KAAA,EAAkB;AAC1E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,MAAA,GAAS,CAAA;AACzD,EAAA,IAAIC,gCAAoB,KAAA,CAAM,OAAA,EAAS,OAAO,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA,EAAG;AAC/D,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,MAAM,UAAA,GACH,OAAA,KAAY,aAAA,IAAiBC,iCAAA,CAAsB,KAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,IACzEC,4BAAA,CAAiB,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,KAAK,IAAI,CAAA;AAClD,EAAA,IAAI,UAAA,IAAc,CAAC,MAAA,EAAQ;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,MAAM,KAAA,GAAQC,yBAAA;AAAA,IACZ;AAAA,MACE,IAAA,EAAMC,yBAAa,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,GAAI,MAAA;AAAA,MACrD,QAAA,EAAUC,yBAAA,CAAc,IAAA,CAAK,QAAA,EAAU,OAAO;AAAA,KAChD;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,KAAA,CAAM,IAAA,KAAS,MAAA,GAAY,UAAA,GAAa,UAAA;AAAA,IAC/C,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,GAAG,KAAA;AAAM,GAC5B;AACF;AAGA,SAAS,oBAAA,CAAqB,MAAoB,IAAA,EAAwC;AACxF,EAAA,MAAM,UAAUD,wBAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,OAAA,GAAU,MAAA;AAC9D,EAAA,IAAI,CAACA,wBAAA,CAAa,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,MAAA,CAAO,KAAK,OAAO,CAAA;AACvC,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAWC,yBAAA,CAAcA,yBAAA,CAAc,KAAK,QAAA,EAAU,SAAS,GAAG,SAAS,CAAA;AACjF,EAAA,MAAM,KAAA,GAAQF,0BAAc,EAAE,IAAA,EAAM,QAAQ,SAAS,CAAA,EAAG,QAAA,EAAS,EAAG,IAAI,CAAA;AACxE,EAAA,OAAO,UAAU,EAAE,GAAG,KAAuB,GAAG,IAAI,CAAA;AACtD;AAGA,SAAS,SAAA,CAAU,MAAoB,IAAA,EAAiC;AACtE,EAAA,MAAM,SAASC,wBAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,MAAA,GAAS,MAAA;AAC5D,EAAA,MAAM,QAAA,GAAWC,yBAAA,CAAc,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AACtD,EAAA,OAAO,EAAE,GAAGF,yBAAA,CAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAS,EAAG,IAAI,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AAC9E;AAGA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,IAAA,EACqB;AACrB,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,kBAAA;AACH,MAAA,OAAO,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAAA,IACxC,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,IAAA;AAAA;AAEb;AAOA,SAAS,WAAA,CAAY,IAAA,EAAoB,IAAA,EAAmB,MAAA,EAAiB,KAAA,EAAkB;AAC7F,EAAA,MAAM,UAAUC,wBAAA,CAAa,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,OAAA,GAAU,MAAA;AAC9D,EAAA,IAAI,SAAS,oBAAA,EAAsB;AACjC,IAAA,MAAM,YAAYA,wBAAA,CAAa,OAAO,KAAK,MAAA,CAAO,MAAA,CAAO,SAAS,SAAS,CAAA;AAC3E,IAAA,OAAO,EAAE,IAAA,EAAO,SAAA,GAAY,UAAA,GAAa,SAAkB,IAAA,EAAK;AAAA,EAClE;AACA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACnD,EAAA,OAAO,MAAA,KAAW,IAAA,GACd,EAAE,IAAA,EAAM,OAAA,EAAiB,IAAA,EAAK,GAC9B,UAAA,CAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,KAAK,CAAA;AACjD;AAKA,SAAS,YAAA,CAAa,IAAA,EAAoB,KAAA,EAAe,KAAA,EAAkB;AACzE,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,MAAA,GAAS,CAAA;AACzD,EAAA,MAAM,IAAA,GAAOE,uCAA2B,KAAA,CAAM,OAAA,EAAS,OAAO,IAAA,CAAK,IAAA,EAAM,MAAM,OAAO,CAAA;AACtF,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA,CAAY,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EAC9C;AACA,EAAA,IAAIC,2BAAA,CAAgB,MAAM,OAAA,EAAS,KAAK,KAAKH,wBAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAEpE,IAAA,OAAO,UAAA,CAAW,UAAU,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,EAAG,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,aAAA,CAAc,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AACzC;AAGO,SAAS,mBAAmB,KAAA,EAA2B;AAC5D,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,KAAA,CAAM,OAAA;AAC3B,EAAA,IAAI,IAAA,GAAqB;AAAA,IACvB,GAAGI,0BAAA,CAAe,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAAA,IAC3C,QAAA,EAAUC,0BAAA,CAAe,KAAA,CAAM,OAAO;AAAA,GACxC;AACA,EAAA,KAAA,IAAS,KAAA,GAAQC,8BAAkB,KAAA,CAAM,OAAO,GAAG,KAAA,GAAQ,QAAA,CAAS,QAAQ,KAAA,EAAA,EAAS;AACnF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAYC,4BAAgB,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,GAChB,UAAA,CAAW,MAAM,QAAA,CAAS,KAAK,CAAA,EAAa,MAAA,EAAQ,KAAK,CAAA,GACzD,YAAA,CAAa,IAAA,EAAM,OAAO,KAAK,CAAA;AACnC,IAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,OAAO,OAAO,IAAA,KAAS,OAAA;AAAA,IACzB;AACA,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,KAAA;AACT;;"}
@@ -1,11 +1,12 @@
1
- import { isJsonObject, followRefs, generatedMember } from './generated-shape.mjs';
2
- import { startsInSchema, leadingNode, leadingSegmentsOf, isParameterList, isTypedAsSchema, isOptionalRequestBody, isOptionalHeader } from './pointer-walk.mjs';
1
+ import { generatedMember } from './generated-shape.mjs';
2
+ import { isJsonObject, childLocation, followLocated } from './located-node.mjs';
3
+ import { startsInSchema, leadingLocated, leadingSegmentsOf, isParameterList, headerParameterContentForm, isTypedAsSchema, isExcludedOperation, isOptionalRequestBody, isOptionalHeader } from './pointer-walk.mjs';
3
4
 
4
5
  function schemaStep(walk, segment, isLast, input) {
5
6
  if (segment === "properties") {
6
7
  return { step: "continue", walk };
7
8
  }
8
- const member = generatedMember(walk.node, segment, input.options, input.refs);
9
+ const member = generatedMember(walk, segment, input.options, input.refs);
9
10
  if (member.kind === "missing") {
10
11
  return { step: "fails", walk };
11
12
  }
@@ -13,41 +14,95 @@ function schemaStep(walk, segment, isLast, input) {
13
14
  return { step: "compiles", walk };
14
15
  }
15
16
  const isAbsentValue = member.kind === "index" && member.node === void 0;
16
- const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
17
+ const isUnsafe = member.kind === "property" ? member.isOptional || member.isMarked : isAbsentValue;
17
18
  return {
18
19
  step: isUnsafe && !isLast ? "fails" : "continue",
19
- walk: { ...walk, node: member.node }
20
+ walk: { ...walk, node: member.node, location: member.location }
20
21
  };
21
22
  }
22
23
  function containerStep(walk, index, input) {
23
24
  const segment = input.pointer.segments[index];
24
25
  const isLast = index === input.pointer.segments.length - 1;
26
+ if (isExcludedOperation(input.pointer, index, walk.node, input)) {
27
+ return { step: "fails", walk };
28
+ }
25
29
  const isOptional = segment === "requestBody" && isOptionalRequestBody(walk.node, input.refs) || isOptionalHeader(input.pointer, index, walk.node);
26
30
  if (isOptional && !isLast) {
27
31
  return { step: "fails", walk };
28
32
  }
29
- const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : void 0;
33
+ const child = followLocated(
34
+ {
35
+ node: isJsonObject(walk.node) ? walk.node[segment] : void 0,
36
+ location: childLocation(walk.location, segment)
37
+ },
38
+ input.refs
39
+ );
30
40
  return {
31
- step: child === void 0 ? "compiles" : "continue",
32
- walk: { ...walk, node: child }
41
+ step: child.node === void 0 ? "compiles" : "continue",
42
+ walk: { ...walk, ...child }
33
43
  };
34
44
  }
45
+ function firstMediaTypeSchema(walk, refs) {
46
+ const content = isJsonObject(walk.node) ? walk.node.content : void 0;
47
+ if (!isJsonObject(content)) {
48
+ return null;
49
+ }
50
+ const [mediaType] = Object.keys(content);
51
+ if (mediaType === void 0) {
52
+ return null;
53
+ }
54
+ const location = childLocation(childLocation(walk.location, "content"), mediaType);
55
+ const entry = followLocated({ node: content[mediaType], location }, refs);
56
+ return ownSchema({ ...entry}, refs);
57
+ }
58
+ function ownSchema(walk, refs) {
59
+ const schema = isJsonObject(walk.node) ? walk.node.schema : void 0;
60
+ const location = childLocation(walk.location, "schema");
61
+ return { ...followLocated({ node: schema, location }, refs), isSchema: true };
62
+ }
63
+ function contentSchema(walk, form, refs) {
64
+ switch (form) {
65
+ case "first-media-type":
66
+ return firstMediaTypeSchema(walk, refs);
67
+ case "schema":
68
+ return ownSchema(walk, refs);
69
+ case "string":
70
+ return null;
71
+ }
72
+ }
73
+ function contentStep(walk, form, isLast, input) {
74
+ const content = isJsonObject(walk.node) ? walk.node.content : void 0;
75
+ if (form === "media-type-members") {
76
+ const hasMember = isJsonObject(content) && Object.hasOwn(content, "content");
77
+ return { step: hasMember ? "compiles" : "fails", walk };
78
+ }
79
+ const schema = contentSchema(walk, form, input.refs);
80
+ return schema === null ? { step: "fails", walk } : schemaStep(schema, "content", isLast, input);
81
+ }
82
+ function documentStep(walk, index, input) {
83
+ const segment = input.pointer.segments[index];
84
+ const isLast = index === input.pointer.segments.length - 1;
85
+ const form = headerParameterContentForm(input.pointer, index, walk.node, input.options);
86
+ if (form !== null) {
87
+ return contentStep(walk, form, isLast, input);
88
+ }
89
+ if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {
90
+ return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);
91
+ }
92
+ return containerStep(walk, index, input);
93
+ }
35
94
  function originalIndexFails(input) {
36
95
  const { segments } = input.pointer;
37
96
  let walk = {
38
- node: leadingNode(input.pointer, input.refs),
97
+ ...leadingLocated(input.pointer, input.refs),
39
98
  isSchema: startsInSchema(input.pointer)
40
99
  };
41
100
  for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {
42
- const segment = segments[index];
43
- const isLast = index === segments.length - 1;
44
101
  if (!walk.isSchema && isParameterList(input.pointer, index)) {
45
102
  return true;
46
103
  }
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);
104
+ const isLast = index === segments.length - 1;
105
+ const result = walk.isSchema ? schemaStep(walk, segments[index], isLast, input) : documentStep(walk, index, input);
51
106
  if (result.step !== "continue") {
52
107
  return result.step === "fails";
53
108
  }
@@ -1 +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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"}
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 { generatedMember } from \"./generated-shape.js\";\nimport { childLocation, followLocated, isJsonObject } from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\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 /** The node's JSON Pointer (`LocatedNode`). */\n readonly location: string | undefined;\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, 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 =\n member.kind === \"property\" ? member.isOptional || member.isMarked : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node, location: member.location },\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 if (isExcludedOperation(input.pointer, index, walk.node, input)) {\n return { step: \"fails\" as Step, walk };\n }\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 = followLocated(\n {\n node: isJsonObject(walk.node) ? walk.node[segment] : undefined,\n location: childLocation(walk.location, segment),\n },\n input.refs,\n );\n return {\n step: (child.node === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, ...child },\n };\n}\n\n/** The schema of the first media type of a `content` map, `$ref`s followed. */\nfunction firstMediaTypeSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk | null {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (!isJsonObject(content)) {\n return null;\n }\n const [mediaType] = Object.keys(content);\n if (mediaType === undefined) {\n return null;\n }\n const location = childLocation(childLocation(walk.location, \"content\"), mediaType);\n const entry = followLocated({ node: content[mediaType], location }, refs);\n return ownSchema({ ...entry, isSchema: false }, refs);\n}\n\n/** The schema a header or parameter is typed by, `$ref`s followed. */\nfunction ownSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk {\n const schema = isJsonObject(walk.node) ? walk.node.schema : undefined;\n const location = childLocation(walk.location, \"schema\");\n return { ...followLocated({ node: schema, location }, refs), isSchema: true };\n}\n\n/** The schema whose type a header or parameter is, when not its media type members. */\nfunction contentSchema(\n walk: OriginalWalk,\n form: Exclude<ContentForm, \"media-type-members\">,\n refs: RefResolver,\n): OriginalWalk | null {\n switch (form) {\n case \"first-media-type\":\n return firstMediaTypeSchema(walk, refs);\n case \"schema\":\n return ownSchema(walk, refs);\n case \"string\":\n return null;\n }\n}\n\n/**\n * The original indexes the `content` of a header or parameter by name. The media type members\n * have no `content` unless a media type is named so, and `string` and `unknown` (no media type)\n * have none; the schema of the first media type, or the `schema` next to `content`, is walked on.\n */\nfunction contentStep(walk: OriginalWalk, form: ContentForm, isLast: boolean, input: WalkInput) {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (form === \"media-type-members\") {\n const hasMember = isJsonObject(content) && Object.hasOwn(content, \"content\");\n return { step: (hasMember ? \"compiles\" : \"fails\") as Step, walk };\n }\n const schema = contentSchema(walk, form, input.refs);\n return schema === null\n ? { step: \"fails\" as Step, walk }\n : schemaStep(schema, \"content\", isLast, input);\n}\n\n/**\n * A step outside a schema: a header's or parameter's `content`, a schema's container, or another.\n */\nfunction documentStep(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 form = headerParameterContentForm(input.pointer, index, walk.node, input.options);\n if (form !== null) {\n return contentStep(walk, form, isLast, input);\n }\n if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);\n }\n return containerStep(walk, index, input);\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 ...leadingLocated(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n const isLast = index === segments.length - 1;\n const result = walk.isSchema\n ? schemaStep(walk, segments[index] as string, isLast, input)\n : documentStep(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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"}
@@ -4,8 +4,8 @@ const constructors = require('../../../domain/ir/constructors.cjs');
4
4
  const outputFixes = require('../../../domain/output-fixes.cjs');
5
5
  const refType = require('../ref-type.cjs');
6
6
  const generatedLocation = require('./generated-location.cjs');
7
- const generatedShape = require('./generated-shape.cjs');
8
7
  const inlineCycles = require('./inline-cycles.cjs');
8
+ const locatedNode = require('./located-node.cjs');
9
9
  const originalIndex = require('./original-index.cjs');
10
10
  const pointerWalk = require('./pointer-walk.cjs');
11
11
  const typedWalk = require('./typed-walk.cjs');
@@ -19,7 +19,7 @@ function pointerOf(ref) {
19
19
  }
20
20
  function targetType(ref, pointer, request, seen) {
21
21
  const target = pointerWalk.pointerNode(pointer, request.context.refs);
22
- if (generatedShape.isJsonObject(target) && typeof target.$ref === "string") {
22
+ if (locatedNode.isJsonObject(target) && typeof target.$ref === "string") {
23
23
  return seen.includes(target.$ref) ? null : schemaRefType(target.$ref, request, [...seen, ref]);
24
24
  }
25
25
  if (target === void 0 || inlineCycles.hasInlineCycle(ref, request.context.options, request.context.refs)) {
@@ -1 +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 { FIX } 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 options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\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","FIX","originalIndexFails","leadingSegmentsOf","refType","irReference"],"mappings":"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"}
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 { FIX } 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 { hasInlineCycle } from \"./inline-cycles.js\";\nimport { isJsonObject } from \"./located-node.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 options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\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","FIX","originalIndexFails","leadingSegmentsOf","refType","irReference"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { irReference } from '../../../domain/ir/constructors.mjs';
2
2
  import { FIX } from '../../../domain/output-fixes.mjs';
3
3
  import { refType, InvalidRefError } from '../ref-type.mjs';
4
4
  import { generatedLocationOf } from './generated-location.mjs';
5
- import { isJsonObject } from './generated-shape.mjs';
6
5
  import { hasInlineCycle } from './inline-cycles.mjs';
6
+ import { isJsonObject } from './located-node.mjs';
7
7
  import { originalIndexFails } from './original-index.mjs';
8
8
  import { leadingSegmentsOf, refPointerOf, pointerNode } from './pointer-walk.mjs';
9
9
  import { typedWalk } from './typed-walk.mjs';
@@ -1 +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 { FIX } 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 options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\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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"}
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 { FIX } 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 { hasInlineCycle } from \"./inline-cycles.js\";\nimport { isJsonObject } from \"./located-node.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 options.fixes.has(FIX.REF_POINTERS) || originalIndexFails({ pointer, options, refs });\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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"}
@@ -1,7 +1,10 @@
1
1
  'use strict';
2
2
 
3
+ const documentPlaces = require('../../../domain/openapi/document-places.cjs');
3
4
  const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
4
- const generatedShape = require('./generated-shape.cjs');
5
+ const parameterObject = require('../../../domain/openapi/parameter-object.cjs');
6
+ const outputFixes = require('../../../domain/output-fixes.cjs');
7
+ const locatedNode = require('./located-node.cjs');
5
8
 
6
9
  const NAMED_ROOTS = /* @__PURE__ */ new Set(["paths", "webhooks"]);
7
10
  function leadingSegmentsOf(pointer) {
@@ -11,18 +14,23 @@ function refPointerOf(ref) {
11
14
  const [rootSegment, ...segments] = jsonPointer.parseRefPointer(ref);
12
15
  return rootSegment === void 0 ? null : { rootSegment, segments };
13
16
  }
14
- function leadingNode(pointer, refs) {
15
- let node = refs.resolve(`#/${pointer.rootSegment}`);
17
+ function leadingLocated(pointer, refs) {
18
+ let located = {
19
+ node: refs.resolve(`#/${pointer.rootSegment}`),
20
+ location: locatedNode.childLocation(jsonPointer.ROOT_POINTER, pointer.rootSegment)
21
+ };
16
22
  for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {
17
- node = generatedShape.isJsonObject(node) ? generatedShape.followRefs(node[segment], refs) : void 0;
23
+ const { node, location } = located;
24
+ const child = locatedNode.isJsonObject(node) ? node[segment] : void 0;
25
+ located = locatedNode.followLocated({ node: child, location: locatedNode.childLocation(location, segment) }, refs);
18
26
  }
19
- return node;
27
+ return located;
20
28
  }
21
29
  function pointerNode(pointer, refs) {
22
30
  let node = refs.resolve(`#/${pointer.rootSegment}`);
23
31
  pointer.segments.forEach((segment, index) => {
24
- const child = generatedShape.isJsonObject(node) || Array.isArray(node) ? node[segment] : void 0;
25
- node = index === pointer.segments.length - 1 ? child : generatedShape.followRefs(child, refs);
32
+ const child = locatedNode.isJsonObject(node) || Array.isArray(node) ? node[segment] : void 0;
33
+ node = index === pointer.segments.length - 1 ? child : locatedNode.followRefs(child, refs);
26
34
  });
27
35
  return node;
28
36
  }
@@ -34,31 +42,64 @@ function isTypedAsSchema(pointer, index) {
34
42
  const isComponentParameter = pointer.rootSegment === "components" && index === 2 && owner === "parameters";
35
43
  return owner === "content" || owner === "headers" || isComponentParameter;
36
44
  }
45
+ function headerParameterContentForm(pointer, index, owner, options) {
46
+ const isHeader = pointer.segments[index - 2] === "headers";
47
+ const isComponentParameter = pointer.rootSegment === "components" && index === 2 && pointer.segments[0] === "parameters";
48
+ const isOwnContent = pointer.segments[index] === "content" && (isHeader || isComponentParameter);
49
+ if (!isOwnContent || !locatedNode.isJsonObject(owner)) {
50
+ return null;
51
+ }
52
+ const isFixed = options.fixes.has(outputFixes.FIX.PARAMETER_HEADER_CONTENT);
53
+ if (isHeader) {
54
+ if (owner.schema) {
55
+ return "schema";
56
+ }
57
+ return isFixed ? "first-media-type" : "media-type-members";
58
+ }
59
+ if (owner.in === parameterObject.QUERYSTRING_LOCATION) {
60
+ return "first-media-type";
61
+ }
62
+ if (owner.schema !== void 0) {
63
+ return "schema";
64
+ }
65
+ return isFixed ? "first-media-type" : "string";
66
+ }
37
67
  function isParameterList(pointer, index) {
38
68
  const next = pointer.segments[index + 1] ?? "";
39
69
  return pointer.segments[index] === "parameters" && /^\d+$/.test(next);
40
70
  }
41
71
  function isOptionalHeader(pointer, index, headers) {
42
72
  const isComponentHeader = pointer.rootSegment === "components" && index === 1;
43
- if (pointer.segments[index - 1] !== "headers" || isComponentHeader || !generatedShape.isJsonObject(headers)) {
73
+ if (pointer.segments[index - 1] !== "headers" || isComponentHeader || !locatedNode.isJsonObject(headers)) {
44
74
  return false;
45
75
  }
46
76
  const header = headers[pointer.segments[index]];
47
- return generatedShape.isJsonObject(header) && header.$ref === void 0 && header.required !== true;
77
+ return locatedNode.isJsonObject(header) && header.$ref === void 0 && header.required !== true;
78
+ }
79
+ function isExcludedOperation(pointer, index, pathItem, input) {
80
+ const segments = [pointer.rootSegment, ...pointer.segments.slice(0, index + 1)];
81
+ if (!input.options.excludeDeprecated || documentPlaces.placeOf(segments) !== "operation") {
82
+ return false;
83
+ }
84
+ const segment = pointer.segments[index];
85
+ const operation = locatedNode.isJsonObject(pathItem) ? locatedNode.followRefs(pathItem[segment], input.refs) : void 0;
86
+ return locatedNode.isJsonObject(operation) && Boolean(operation.deprecated);
48
87
  }
49
88
  function isOptionalRequestBody(container, refs) {
50
- if (!generatedShape.isJsonObject(container) || container.requestBody === void 0) {
89
+ if (!locatedNode.isJsonObject(container) || container.requestBody === void 0) {
51
90
  return false;
52
91
  }
53
- const body = generatedShape.followRefs(container.requestBody, refs);
54
- return !(generatedShape.isJsonObject(body) && body.required === true);
92
+ const body = locatedNode.followRefs(container.requestBody, refs);
93
+ return !(locatedNode.isJsonObject(body) && body.required === true);
55
94
  }
56
95
 
96
+ exports.headerParameterContentForm = headerParameterContentForm;
97
+ exports.isExcludedOperation = isExcludedOperation;
57
98
  exports.isOptionalHeader = isOptionalHeader;
58
99
  exports.isOptionalRequestBody = isOptionalRequestBody;
59
100
  exports.isParameterList = isParameterList;
60
101
  exports.isTypedAsSchema = isTypedAsSchema;
61
- exports.leadingNode = leadingNode;
102
+ exports.leadingLocated = leadingLocated;
62
103
  exports.leadingSegmentsOf = leadingSegmentsOf;
63
104
  exports.pointerNode = pointerNode;
64
105
  exports.refPointerOf = refPointerOf;
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-walk.cjs","sources":["../../../../src/application/transform/ref-pointer/pointer-walk.ts"],"sourcesContent":["import { parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { followRefs, isJsonObject } from \"./generated-shape.js\";\n\n/** The parts of a `$ref` pointer that both the original and the new types walk. */\n\nexport interface RefPointer {\n readonly rootSegment: string;\n /** The segments after the root: `#/components/schemas/A` gives `[\"schemas\", \"A\"]`. */\n readonly segments: readonly string[];\n}\n\n/** Roots whose generated type is keyed by one segment: the path or webhook name. */\nconst NAMED_ROOTS: ReadonlySet<string> = new Set([\"paths\", \"webhooks\"]);\n\n/**\n * How many segments after the root index the generated root type directly: one for `paths` and\n * `webhooks` (`paths[\"/a\"]`, so the path item's own `parameters/0` is walked), two otherwise\n * (`components[\"schemas\"][\"A\"]`).\n */\nexport function leadingSegmentsOf(pointer: RefPointer): number {\n return NAMED_ROOTS.has(pointer.rootSegment) ? 1 : 2;\n}\n\nexport function refPointerOf(ref: string): RefPointer | null {\n const [rootSegment, ...segments] = parseRefPointer(ref);\n return rootSegment === undefined ? null : { rootSegment, segments };\n}\n\n/** The document node at the end of the leading segments, `$ref`s followed. */\nexport function leadingNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {\n node = isJsonObject(node) ? followRefs(node[segment], refs) : undefined;\n }\n return node;\n}\n\n/** The node at the whole pointer, without following a `$ref` at its end. */\nexport function pointerNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n pointer.segments.forEach((segment, index) => {\n const child = isJsonObject(node) || Array.isArray(node) ? (node as never)[segment] : undefined;\n node = index === pointer.segments.length - 1 ? child : followRefs(child, refs);\n });\n return node;\n}\n\n/** Whether the leading segments name a component schema, so the walk starts inside a schema. */\nexport function startsInSchema(pointer: RefPointer): boolean {\n return pointer.rootSegment === \"components\" && pointer.segments[0] === \"schemas\";\n}\n\n/**\n * Whether the container at `index` is typed as its `schema`: a media type\n * (`content/<media type>`), a header (`headers/<name>`) or a component parameter.\n */\nexport function isTypedAsSchema(pointer: RefPointer, index: number): boolean {\n const owner = pointer.segments[index - 2];\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && owner === \"parameters\";\n return owner === \"content\" || owner === \"headers\" || isComponentParameter;\n}\n\n/**\n * Whether the segment at `index` is an operation's or path item's `parameters` list, indexed by\n * position next. The generated type groups parameters by `in` (`query`, `path`), so it has no\n * member `0`.\n */\nexport function isParameterList(pointer: RefPointer, index: number): boolean {\n const next = pointer.segments[index + 1] ?? \"\";\n return pointer.segments[index] === \"parameters\" && /^\\d+$/.test(next);\n}\n\n/**\n * Whether the segment at `index` names a response header that is an optional member: one the\n * response lists without `required: true`. A `$ref` header counts as required, as the generated\n * type has it; a component header (`components/headers/<name>`) is a member of its own.\n */\nexport function isOptionalHeader(pointer: RefPointer, index: number, headers: unknown): boolean {\n const isComponentHeader = pointer.rootSegment === \"components\" && index === 1;\n if (pointer.segments[index - 1] !== \"headers\" || isComponentHeader || !isJsonObject(headers)) {\n return false;\n }\n const header = headers[pointer.segments[index] as string];\n return isJsonObject(header) && header.$ref === undefined && header.required !== true;\n}\n\n/** A `requestBody` the operation does not mark `required` is an optional member. */\nexport function isOptionalRequestBody(container: unknown, refs: RefResolver): boolean {\n if (!isJsonObject(container) || container.requestBody === undefined) {\n return false;\n }\n const body = followRefs(container.requestBody, refs);\n return !(isJsonObject(body) && body.required === true);\n}\n"],"names":["parseRefPointer","isJsonObject","followRefs"],"mappings":"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"}
1
+ {"version":3,"file":"pointer-walk.cjs","sources":["../../../../src/application/transform/ref-pointer/pointer-walk.ts"],"sourcesContent":["import { placeOf } from \"../../../domain/openapi/document-places.js\";\nimport { parseRefPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"../../../domain/openapi/parameter-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n childLocation,\n followLocated,\n followRefs,\n isJsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\n\n/** The parts of a `$ref` pointer that both the original and the new types walk. */\n\nexport interface RefPointer {\n readonly rootSegment: string;\n /** The segments after the root: `#/components/schemas/A` gives `[\"schemas\", \"A\"]`. */\n readonly segments: readonly string[];\n}\n\n/** Roots whose generated type is keyed by one segment: the path or webhook name. */\nconst NAMED_ROOTS: ReadonlySet<string> = new Set([\"paths\", \"webhooks\"]);\n\n/**\n * How many segments after the root index the generated root type directly: one for `paths` and\n * `webhooks` (`paths[\"/a\"]`, so the path item's own `parameters/0` is walked), two otherwise\n * (`components[\"schemas\"][\"A\"]`).\n */\nexport function leadingSegmentsOf(pointer: RefPointer): number {\n return NAMED_ROOTS.has(pointer.rootSegment) ? 1 : 2;\n}\n\nexport function refPointerOf(ref: string): RefPointer | null {\n const [rootSegment, ...segments] = parseRefPointer(ref);\n return rootSegment === undefined ? null : { rootSegment, segments };\n}\n\n/** The document node at the end of the leading segments, `$ref`s followed, with its location. */\nexport function leadingLocated(pointer: RefPointer, refs: RefResolver): LocatedNode {\n let located: LocatedNode = {\n node: refs.resolve(`#/${pointer.rootSegment}`),\n location: childLocation(ROOT_POINTER, pointer.rootSegment),\n };\n for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {\n const { node, location } = located;\n const child = isJsonObject(node) ? node[segment] : undefined;\n located = followLocated({ node: child, location: childLocation(location, segment) }, refs);\n }\n return located;\n}\n\n/** The node at the whole pointer, without following a `$ref` at its end. */\nexport function pointerNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n pointer.segments.forEach((segment, index) => {\n const child = isJsonObject(node) || Array.isArray(node) ? (node as never)[segment] : undefined;\n node = index === pointer.segments.length - 1 ? child : followRefs(child, refs);\n });\n return node;\n}\n\n/** Whether the leading segments name a component schema, so the walk starts inside a schema. */\nexport function startsInSchema(pointer: RefPointer): boolean {\n return pointer.rootSegment === \"components\" && pointer.segments[0] === \"schemas\";\n}\n\n/**\n * Whether the container at `index` is typed as its `schema`: a media type\n * (`content/<media type>`), a header (`headers/<name>`) or a component parameter.\n */\nexport function isTypedAsSchema(pointer: RefPointer, index: number): boolean {\n const owner = pointer.segments[index - 2];\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && owner === \"parameters\";\n return owner === \"content\" || owner === \"headers\" || isComponentParameter;\n}\n\n/**\n * How the generated type of a header or component parameter holds its `content` (header.ts,\n * parameter.ts): one member per media type, the type of the first media type, `string` (a\n * parameter without the `parameter-header-content` fix), or not at all (a `schema` wins).\n */\nexport type ContentForm = \"media-type-members\" | \"first-media-type\" | \"string\" | \"schema\";\n\n/**\n * The form of the `content` at `index` when it belongs to a header or a component parameter; null\n * for any other segment. An `in: querystring` parameter is typed by its `content` even next to a\n * `schema`.\n */\nexport function headerParameterContentForm(\n pointer: RefPointer,\n index: number,\n owner: unknown,\n options: SchemaOptions,\n): ContentForm | null {\n const isHeader = pointer.segments[index - 2] === \"headers\";\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && pointer.segments[0] === \"parameters\";\n const isOwnContent = pointer.segments[index] === \"content\" && (isHeader || isComponentParameter);\n if (!isOwnContent || !isJsonObject(owner)) {\n return null;\n }\n const isFixed = options.fixes.has(FIX.PARAMETER_HEADER_CONTENT);\n if (isHeader) {\n if (owner.schema) {\n return \"schema\";\n }\n return isFixed ? \"first-media-type\" : \"media-type-members\";\n }\n if (owner.in === QUERYSTRING_LOCATION) {\n return \"first-media-type\";\n }\n if (owner.schema !== undefined) {\n return \"schema\";\n }\n return isFixed ? \"first-media-type\" : \"string\";\n}\n\n/**\n * Whether the segment at `index` is an operation's or path item's `parameters` list, indexed by\n * position next. The generated type groups parameters by `in` (`query`, `path`), so it has no\n * member `0`.\n */\nexport function isParameterList(pointer: RefPointer, index: number): boolean {\n const next = pointer.segments[index + 1] ?? \"\";\n return pointer.segments[index] === \"parameters\" && /^\\d+$/.test(next);\n}\n\n/**\n * Whether the segment at `index` names a response header that is an optional member: one the\n * response lists without `required: true`. A `$ref` header counts as required, as the generated\n * type has it; a component header (`components/headers/<name>`) is a member of its own.\n */\nexport function isOptionalHeader(pointer: RefPointer, index: number, headers: unknown): boolean {\n const isComponentHeader = pointer.rootSegment === \"components\" && index === 1;\n if (pointer.segments[index - 1] !== \"headers\" || isComponentHeader || !isJsonObject(headers)) {\n return false;\n }\n const header = headers[pointer.segments[index] as string];\n return isJsonObject(header) && header.$ref === undefined && header.required !== true;\n}\n\n/**\n * Whether the segment at `index` names an operation that `--exclude-deprecated` leaves out: the\n * path item types it `never`, which has no member to index (`isIncludedOperation`).\n */\nexport function isExcludedOperation(\n pointer: RefPointer,\n index: number,\n pathItem: unknown,\n input: { readonly options: SchemaOptions; readonly refs: RefResolver },\n): boolean {\n const segments = [pointer.rootSegment, ...pointer.segments.slice(0, index + 1)];\n if (!input.options.excludeDeprecated || placeOf(segments) !== \"operation\") {\n return false;\n }\n const segment = pointer.segments[index] as string;\n const operation = isJsonObject(pathItem) ? followRefs(pathItem[segment], input.refs) : undefined;\n return isJsonObject(operation) && Boolean(operation.deprecated);\n}\n\n/** A `requestBody` the operation does not mark `required` is an optional member. */\nexport function isOptionalRequestBody(container: unknown, refs: RefResolver): boolean {\n if (!isJsonObject(container) || container.requestBody === undefined) {\n return false;\n }\n const body = followRefs(container.requestBody, refs);\n return !(isJsonObject(body) && body.required === true);\n}\n"],"names":["parseRefPointer","childLocation","ROOT_POINTER","isJsonObject","followLocated","followRefs","FIX","QUERYSTRING_LOCATION","placeOf"],"mappings":"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"}
@@ -1,5 +1,8 @@
1
- import { parseRefPointer } from '../../../domain/openapi/json-pointer.mjs';
2
- import { isJsonObject, followRefs } from './generated-shape.mjs';
1
+ import { placeOf } from '../../../domain/openapi/document-places.mjs';
2
+ import { parseRefPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
3
+ import { QUERYSTRING_LOCATION } from '../../../domain/openapi/parameter-object.mjs';
4
+ import { FIX } from '../../../domain/output-fixes.mjs';
5
+ import { childLocation, isJsonObject, followLocated, followRefs } from './located-node.mjs';
3
6
 
4
7
  const NAMED_ROOTS = /* @__PURE__ */ new Set(["paths", "webhooks"]);
5
8
  function leadingSegmentsOf(pointer) {
@@ -9,12 +12,17 @@ function refPointerOf(ref) {
9
12
  const [rootSegment, ...segments] = parseRefPointer(ref);
10
13
  return rootSegment === void 0 ? null : { rootSegment, segments };
11
14
  }
12
- function leadingNode(pointer, refs) {
13
- let node = refs.resolve(`#/${pointer.rootSegment}`);
15
+ function leadingLocated(pointer, refs) {
16
+ let located = {
17
+ node: refs.resolve(`#/${pointer.rootSegment}`),
18
+ location: childLocation(ROOT_POINTER, pointer.rootSegment)
19
+ };
14
20
  for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {
15
- node = isJsonObject(node) ? followRefs(node[segment], refs) : void 0;
21
+ const { node, location } = located;
22
+ const child = isJsonObject(node) ? node[segment] : void 0;
23
+ located = followLocated({ node: child, location: childLocation(location, segment) }, refs);
16
24
  }
17
- return node;
25
+ return located;
18
26
  }
19
27
  function pointerNode(pointer, refs) {
20
28
  let node = refs.resolve(`#/${pointer.rootSegment}`);
@@ -32,6 +40,28 @@ function isTypedAsSchema(pointer, index) {
32
40
  const isComponentParameter = pointer.rootSegment === "components" && index === 2 && owner === "parameters";
33
41
  return owner === "content" || owner === "headers" || isComponentParameter;
34
42
  }
43
+ function headerParameterContentForm(pointer, index, owner, options) {
44
+ const isHeader = pointer.segments[index - 2] === "headers";
45
+ const isComponentParameter = pointer.rootSegment === "components" && index === 2 && pointer.segments[0] === "parameters";
46
+ const isOwnContent = pointer.segments[index] === "content" && (isHeader || isComponentParameter);
47
+ if (!isOwnContent || !isJsonObject(owner)) {
48
+ return null;
49
+ }
50
+ const isFixed = options.fixes.has(FIX.PARAMETER_HEADER_CONTENT);
51
+ if (isHeader) {
52
+ if (owner.schema) {
53
+ return "schema";
54
+ }
55
+ return isFixed ? "first-media-type" : "media-type-members";
56
+ }
57
+ if (owner.in === QUERYSTRING_LOCATION) {
58
+ return "first-media-type";
59
+ }
60
+ if (owner.schema !== void 0) {
61
+ return "schema";
62
+ }
63
+ return isFixed ? "first-media-type" : "string";
64
+ }
35
65
  function isParameterList(pointer, index) {
36
66
  const next = pointer.segments[index + 1] ?? "";
37
67
  return pointer.segments[index] === "parameters" && /^\d+$/.test(next);
@@ -44,6 +74,15 @@ function isOptionalHeader(pointer, index, headers) {
44
74
  const header = headers[pointer.segments[index]];
45
75
  return isJsonObject(header) && header.$ref === void 0 && header.required !== true;
46
76
  }
77
+ function isExcludedOperation(pointer, index, pathItem, input) {
78
+ const segments = [pointer.rootSegment, ...pointer.segments.slice(0, index + 1)];
79
+ if (!input.options.excludeDeprecated || placeOf(segments) !== "operation") {
80
+ return false;
81
+ }
82
+ const segment = pointer.segments[index];
83
+ const operation = isJsonObject(pathItem) ? followRefs(pathItem[segment], input.refs) : void 0;
84
+ return isJsonObject(operation) && Boolean(operation.deprecated);
85
+ }
47
86
  function isOptionalRequestBody(container, refs) {
48
87
  if (!isJsonObject(container) || container.requestBody === void 0) {
49
88
  return false;
@@ -52,5 +91,5 @@ function isOptionalRequestBody(container, refs) {
52
91
  return !(isJsonObject(body) && body.required === true);
53
92
  }
54
93
 
55
- export { isOptionalHeader, isOptionalRequestBody, isParameterList, isTypedAsSchema, leadingNode, leadingSegmentsOf, pointerNode, refPointerOf, startsInSchema };
94
+ export { headerParameterContentForm, isExcludedOperation, isOptionalHeader, isOptionalRequestBody, isParameterList, isTypedAsSchema, leadingLocated, leadingSegmentsOf, pointerNode, refPointerOf, startsInSchema };
56
95
  //# sourceMappingURL=pointer-walk.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-walk.mjs","sources":["../../../../src/application/transform/ref-pointer/pointer-walk.ts"],"sourcesContent":["import { parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { followRefs, isJsonObject } from \"./generated-shape.js\";\n\n/** The parts of a `$ref` pointer that both the original and the new types walk. */\n\nexport interface RefPointer {\n readonly rootSegment: string;\n /** The segments after the root: `#/components/schemas/A` gives `[\"schemas\", \"A\"]`. */\n readonly segments: readonly string[];\n}\n\n/** Roots whose generated type is keyed by one segment: the path or webhook name. */\nconst NAMED_ROOTS: ReadonlySet<string> = new Set([\"paths\", \"webhooks\"]);\n\n/**\n * How many segments after the root index the generated root type directly: one for `paths` and\n * `webhooks` (`paths[\"/a\"]`, so the path item's own `parameters/0` is walked), two otherwise\n * (`components[\"schemas\"][\"A\"]`).\n */\nexport function leadingSegmentsOf(pointer: RefPointer): number {\n return NAMED_ROOTS.has(pointer.rootSegment) ? 1 : 2;\n}\n\nexport function refPointerOf(ref: string): RefPointer | null {\n const [rootSegment, ...segments] = parseRefPointer(ref);\n return rootSegment === undefined ? null : { rootSegment, segments };\n}\n\n/** The document node at the end of the leading segments, `$ref`s followed. */\nexport function leadingNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {\n node = isJsonObject(node) ? followRefs(node[segment], refs) : undefined;\n }\n return node;\n}\n\n/** The node at the whole pointer, without following a `$ref` at its end. */\nexport function pointerNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n pointer.segments.forEach((segment, index) => {\n const child = isJsonObject(node) || Array.isArray(node) ? (node as never)[segment] : undefined;\n node = index === pointer.segments.length - 1 ? child : followRefs(child, refs);\n });\n return node;\n}\n\n/** Whether the leading segments name a component schema, so the walk starts inside a schema. */\nexport function startsInSchema(pointer: RefPointer): boolean {\n return pointer.rootSegment === \"components\" && pointer.segments[0] === \"schemas\";\n}\n\n/**\n * Whether the container at `index` is typed as its `schema`: a media type\n * (`content/<media type>`), a header (`headers/<name>`) or a component parameter.\n */\nexport function isTypedAsSchema(pointer: RefPointer, index: number): boolean {\n const owner = pointer.segments[index - 2];\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && owner === \"parameters\";\n return owner === \"content\" || owner === \"headers\" || isComponentParameter;\n}\n\n/**\n * Whether the segment at `index` is an operation's or path item's `parameters` list, indexed by\n * position next. The generated type groups parameters by `in` (`query`, `path`), so it has no\n * member `0`.\n */\nexport function isParameterList(pointer: RefPointer, index: number): boolean {\n const next = pointer.segments[index + 1] ?? \"\";\n return pointer.segments[index] === \"parameters\" && /^\\d+$/.test(next);\n}\n\n/**\n * Whether the segment at `index` names a response header that is an optional member: one the\n * response lists without `required: true`. A `$ref` header counts as required, as the generated\n * type has it; a component header (`components/headers/<name>`) is a member of its own.\n */\nexport function isOptionalHeader(pointer: RefPointer, index: number, headers: unknown): boolean {\n const isComponentHeader = pointer.rootSegment === \"components\" && index === 1;\n if (pointer.segments[index - 1] !== \"headers\" || isComponentHeader || !isJsonObject(headers)) {\n return false;\n }\n const header = headers[pointer.segments[index] as string];\n return isJsonObject(header) && header.$ref === undefined && header.required !== true;\n}\n\n/** A `requestBody` the operation does not mark `required` is an optional member. */\nexport function isOptionalRequestBody(container: unknown, refs: RefResolver): boolean {\n if (!isJsonObject(container) || container.requestBody === undefined) {\n return false;\n }\n const body = followRefs(container.requestBody, refs);\n return !(isJsonObject(body) && body.required === true);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pointer-walk.mjs","sources":["../../../../src/application/transform/ref-pointer/pointer-walk.ts"],"sourcesContent":["import { placeOf } from \"../../../domain/openapi/document-places.js\";\nimport { parseRefPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"../../../domain/openapi/parameter-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n childLocation,\n followLocated,\n followRefs,\n isJsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\n\n/** The parts of a `$ref` pointer that both the original and the new types walk. */\n\nexport interface RefPointer {\n readonly rootSegment: string;\n /** The segments after the root: `#/components/schemas/A` gives `[\"schemas\", \"A\"]`. */\n readonly segments: readonly string[];\n}\n\n/** Roots whose generated type is keyed by one segment: the path or webhook name. */\nconst NAMED_ROOTS: ReadonlySet<string> = new Set([\"paths\", \"webhooks\"]);\n\n/**\n * How many segments after the root index the generated root type directly: one for `paths` and\n * `webhooks` (`paths[\"/a\"]`, so the path item's own `parameters/0` is walked), two otherwise\n * (`components[\"schemas\"][\"A\"]`).\n */\nexport function leadingSegmentsOf(pointer: RefPointer): number {\n return NAMED_ROOTS.has(pointer.rootSegment) ? 1 : 2;\n}\n\nexport function refPointerOf(ref: string): RefPointer | null {\n const [rootSegment, ...segments] = parseRefPointer(ref);\n return rootSegment === undefined ? null : { rootSegment, segments };\n}\n\n/** The document node at the end of the leading segments, `$ref`s followed, with its location. */\nexport function leadingLocated(pointer: RefPointer, refs: RefResolver): LocatedNode {\n let located: LocatedNode = {\n node: refs.resolve(`#/${pointer.rootSegment}`),\n location: childLocation(ROOT_POINTER, pointer.rootSegment),\n };\n for (const segment of pointer.segments.slice(0, leadingSegmentsOf(pointer))) {\n const { node, location } = located;\n const child = isJsonObject(node) ? node[segment] : undefined;\n located = followLocated({ node: child, location: childLocation(location, segment) }, refs);\n }\n return located;\n}\n\n/** The node at the whole pointer, without following a `$ref` at its end. */\nexport function pointerNode(pointer: RefPointer, refs: RefResolver): unknown {\n let node = refs.resolve(`#/${pointer.rootSegment}`);\n pointer.segments.forEach((segment, index) => {\n const child = isJsonObject(node) || Array.isArray(node) ? (node as never)[segment] : undefined;\n node = index === pointer.segments.length - 1 ? child : followRefs(child, refs);\n });\n return node;\n}\n\n/** Whether the leading segments name a component schema, so the walk starts inside a schema. */\nexport function startsInSchema(pointer: RefPointer): boolean {\n return pointer.rootSegment === \"components\" && pointer.segments[0] === \"schemas\";\n}\n\n/**\n * Whether the container at `index` is typed as its `schema`: a media type\n * (`content/<media type>`), a header (`headers/<name>`) or a component parameter.\n */\nexport function isTypedAsSchema(pointer: RefPointer, index: number): boolean {\n const owner = pointer.segments[index - 2];\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && owner === \"parameters\";\n return owner === \"content\" || owner === \"headers\" || isComponentParameter;\n}\n\n/**\n * How the generated type of a header or component parameter holds its `content` (header.ts,\n * parameter.ts): one member per media type, the type of the first media type, `string` (a\n * parameter without the `parameter-header-content` fix), or not at all (a `schema` wins).\n */\nexport type ContentForm = \"media-type-members\" | \"first-media-type\" | \"string\" | \"schema\";\n\n/**\n * The form of the `content` at `index` when it belongs to a header or a component parameter; null\n * for any other segment. An `in: querystring` parameter is typed by its `content` even next to a\n * `schema`.\n */\nexport function headerParameterContentForm(\n pointer: RefPointer,\n index: number,\n owner: unknown,\n options: SchemaOptions,\n): ContentForm | null {\n const isHeader = pointer.segments[index - 2] === \"headers\";\n const isComponentParameter =\n pointer.rootSegment === \"components\" && index === 2 && pointer.segments[0] === \"parameters\";\n const isOwnContent = pointer.segments[index] === \"content\" && (isHeader || isComponentParameter);\n if (!isOwnContent || !isJsonObject(owner)) {\n return null;\n }\n const isFixed = options.fixes.has(FIX.PARAMETER_HEADER_CONTENT);\n if (isHeader) {\n if (owner.schema) {\n return \"schema\";\n }\n return isFixed ? \"first-media-type\" : \"media-type-members\";\n }\n if (owner.in === QUERYSTRING_LOCATION) {\n return \"first-media-type\";\n }\n if (owner.schema !== undefined) {\n return \"schema\";\n }\n return isFixed ? \"first-media-type\" : \"string\";\n}\n\n/**\n * Whether the segment at `index` is an operation's or path item's `parameters` list, indexed by\n * position next. The generated type groups parameters by `in` (`query`, `path`), so it has no\n * member `0`.\n */\nexport function isParameterList(pointer: RefPointer, index: number): boolean {\n const next = pointer.segments[index + 1] ?? \"\";\n return pointer.segments[index] === \"parameters\" && /^\\d+$/.test(next);\n}\n\n/**\n * Whether the segment at `index` names a response header that is an optional member: one the\n * response lists without `required: true`. A `$ref` header counts as required, as the generated\n * type has it; a component header (`components/headers/<name>`) is a member of its own.\n */\nexport function isOptionalHeader(pointer: RefPointer, index: number, headers: unknown): boolean {\n const isComponentHeader = pointer.rootSegment === \"components\" && index === 1;\n if (pointer.segments[index - 1] !== \"headers\" || isComponentHeader || !isJsonObject(headers)) {\n return false;\n }\n const header = headers[pointer.segments[index] as string];\n return isJsonObject(header) && header.$ref === undefined && header.required !== true;\n}\n\n/**\n * Whether the segment at `index` names an operation that `--exclude-deprecated` leaves out: the\n * path item types it `never`, which has no member to index (`isIncludedOperation`).\n */\nexport function isExcludedOperation(\n pointer: RefPointer,\n index: number,\n pathItem: unknown,\n input: { readonly options: SchemaOptions; readonly refs: RefResolver },\n): boolean {\n const segments = [pointer.rootSegment, ...pointer.segments.slice(0, index + 1)];\n if (!input.options.excludeDeprecated || placeOf(segments) !== \"operation\") {\n return false;\n }\n const segment = pointer.segments[index] as string;\n const operation = isJsonObject(pathItem) ? followRefs(pathItem[segment], input.refs) : undefined;\n return isJsonObject(operation) && Boolean(operation.deprecated);\n}\n\n/** A `requestBody` the operation does not mark `required` is an optional member. */\nexport function isOptionalRequestBody(container: unknown, refs: RefResolver): boolean {\n if (!isJsonObject(container) || container.requestBody === undefined) {\n return false;\n }\n const body = followRefs(container.requestBody, refs);\n return !(isJsonObject(body) && body.required === true);\n}\n"],"names":[],"mappings":"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"}