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":"discriminator-conflicts.cjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport { createRef, escapePointerSegment, parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return createRef(segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n stack.push(...childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n if (!members.has(member.ref)) {\n members.set(member.ref, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(([, target]) => typeof target === \"string\" && mappingTarget(target) === member)\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":["escapePointerSegment","createRef","resolveLocalRef","unionAt","isUnionMember","parseRefPointer","admittedPropertyValues"],"mappings":"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"}
1
+ {"version":3,"file":"discriminator-conflicts.cjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { appendAll } from \"../append-all.js\";\nimport { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport {\n appendPointer,\n canonicalRef,\n escapePointerSegment,\n parseRefPointer,\n ROOT_POINTER,\n} from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\n/** A mapping value as a canonical `$ref`: Redocly writes it percent-decoded (`canonicalRef`). */\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\")\n ? canonicalRef(target)\n : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return appendPointer(ROOT_POINTER, segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n appendAll(stack, childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n // A member may be listed by a `$ref` and found by its pointer: both name it canonically.\n const key = canonicalRef(member.ref);\n if (!members.has(key)) {\n members.set(key, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(\n ([, target]) => typeof target === \"string\" && mappingTarget(target) === canonicalRef(member),\n )\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":["canonicalRef","escapePointerSegment","appendPointer","ROOT_POINTER","appendAll","resolveLocalRef","unionAt","isUnionMember","parseRefPointer","admittedPropertyValues"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { appendAll } from '../append-all.mjs';
1
2
  import { resolveLocalRef, admittedPropertyValues } from './admitted-values.mjs';
2
3
  import { unionAt, isUnionMember } from './discriminated-union.mjs';
3
- import { escapePointerSegment, parseRefPointer, createRef } from './json-pointer.mjs';
4
+ import { escapePointerSegment, canonicalRef, parseRefPointer, appendPointer, ROOT_POINTER } from './json-pointer.mjs';
4
5
 
5
6
  const COMPONENT_SCHEMAS = "#/components/schemas/";
6
7
  function isObject(value) {
@@ -12,7 +13,7 @@ function refsOf(list) {
12
13
  );
13
14
  }
14
15
  function mappingTarget(target) {
15
- return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
16
+ return target.startsWith("#") ? canonicalRef(target) : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
16
17
  }
17
18
  function ownerAt(node, pointer) {
18
19
  const discriminator = node.discriminator;
@@ -29,7 +30,7 @@ function pointerOf(visit) {
29
30
  for (let current = visit; current?.key != null; current = current.parent) {
30
31
  segments.unshift(current.key);
31
32
  }
32
- return createRef(segments);
33
+ return appendPointer(ROOT_POINTER, segments);
33
34
  }
34
35
  function childrenOf(visit) {
35
36
  const { node } = visit;
@@ -44,7 +45,7 @@ function ownersIn(document) {
44
45
  if (owner !== null) {
45
46
  found.push(owner);
46
47
  }
47
- stack.push(...childrenOf(visit).reverse());
48
+ appendAll(stack, childrenOf(visit).reverse());
48
49
  }
49
50
  return found;
50
51
  }
@@ -97,14 +98,17 @@ function membersOf(owner, search) {
97
98
  const listed = owner.memberRefs.map((ref) => ({ ref, skipped: /* @__PURE__ */ new Set([owner.pointer]) }));
98
99
  const members = /* @__PURE__ */ new Map();
99
100
  for (const member of [...listed, ...inheritingMembers(owner, search)]) {
100
- if (!members.has(member.ref)) {
101
- members.set(member.ref, member);
101
+ const key = canonicalRef(member.ref);
102
+ if (!members.has(key)) {
103
+ members.set(key, member);
102
104
  }
103
105
  }
104
106
  return [...members.values()];
105
107
  }
106
108
  function memberValues(owner, member) {
107
- const values = Object.entries(owner.mapping).filter(([, target]) => typeof target === "string" && mappingTarget(target) === member).map(([key]) => key);
109
+ const values = Object.entries(owner.mapping).filter(
110
+ ([, target]) => typeof target === "string" && mappingTarget(target) === canonicalRef(member)
111
+ ).map(([key]) => key);
108
112
  const name = parseRefPointer(member).pop() ?? "";
109
113
  return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };
110
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"discriminator-conflicts.mjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport { createRef, escapePointerSegment, parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return createRef(segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n stack.push(...childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n if (!members.has(member.ref)) {\n members.set(member.ref, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(([, target]) => typeof target === \"string\" && mappingTarget(target) === member)\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discriminator-conflicts.mjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { appendAll } from \"../append-all.js\";\nimport { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport {\n appendPointer,\n canonicalRef,\n escapePointerSegment,\n parseRefPointer,\n ROOT_POINTER,\n} from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\n/** A mapping value as a canonical `$ref`: Redocly writes it percent-decoded (`canonicalRef`). */\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\")\n ? canonicalRef(target)\n : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return appendPointer(ROOT_POINTER, segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n appendAll(stack, childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n // A member may be listed by a `$ref` and found by its pointer: both name it canonically.\n const key = canonicalRef(member.ref);\n if (!members.has(key)) {\n members.set(key, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(\n ([, target]) => typeof target === \"string\" && mappingTarget(target) === canonicalRef(member),\n )\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ const pathItemObject = require('./path-item-object.cjs');
4
+
5
+ const OPERATION_KEYS = /* @__PURE__ */ new Set([...pathItemObject.HTTP_METHODS, pathItemObject.QUERY_METHOD]);
6
+ const FIELDS = {
7
+ root: {
8
+ paths: "namedPathItems",
9
+ webhooks: "namedPathItems",
10
+ components: "components",
11
+ $defs: "other"
12
+ },
13
+ components: {
14
+ parameters: "input",
15
+ requestBodies: "input",
16
+ pathItems: "namedPathItems",
17
+ callbacks: "namedCallbacks"
18
+ },
19
+ pathItem: { parameters: "input", [pathItemObject.ADDITIONAL_OPERATIONS_KEY]: "namedOperations" },
20
+ operation: { parameters: "input", requestBody: "input", callbacks: "namedCallbacks" }
21
+ };
22
+ const NAMED = {
23
+ namedPathItems: "pathItem",
24
+ namedCallbacks: "callback",
25
+ callback: "pathItem",
26
+ namedOperations: "operation"
27
+ };
28
+ function nextPlace(place, segment) {
29
+ const named = NAMED[place];
30
+ if (named !== void 0) {
31
+ return named;
32
+ }
33
+ if (place === "pathItem" && OPERATION_KEYS.has(segment)) {
34
+ return "operation";
35
+ }
36
+ const fields = FIELDS[place] ?? {};
37
+ if (Object.hasOwn(fields, segment)) {
38
+ return fields[segment];
39
+ }
40
+ return place === "root" ? "outside" : "other";
41
+ }
42
+ const TERMINAL_PLACES = /* @__PURE__ */ new Set(["outside", "input", "other"]);
43
+ function placeOf(segments) {
44
+ let place = "root";
45
+ for (const segment of segments) {
46
+ place = nextPlace(place, segment);
47
+ if (TERMINAL_PLACES.has(place)) {
48
+ return place;
49
+ }
50
+ }
51
+ return place;
52
+ }
53
+
54
+ exports.placeOf = placeOf;
55
+ //# sourceMappingURL=document-places.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-places.cjs","sources":["../../../src/domain/openapi/document-places.ts"],"sourcesContent":["import { ADDITIONAL_OPERATIONS_KEY, HTTP_METHODS, QUERY_METHOD } from \"./path-item-object.js\";\n\n/**\n * The places of an OpenAPI document that a JSON Pointer passes through, read from the document's\n * structure rather than from the words of the pointer. `named*` places and `callback` are maps\n * whose next segment is a name (a path, a component name, a callback expression). `outside` (a\n * root key that is no document key), `input` (a parameter or a request body) and `other` end the\n * walk.\n */\nexport type DocumentPlace =\n | \"root\"\n | \"outside\"\n | \"components\"\n | \"namedPathItems\"\n | \"namedCallbacks\"\n | \"callback\"\n | \"pathItem\"\n | \"namedOperations\"\n | \"operation\"\n | \"input\"\n | \"other\";\n\nconst OPERATION_KEYS: ReadonlySet<string> = new Set([...HTTP_METHODS, QUERY_METHOD]);\n\n/** The place each fixed field leads to; any other field leads to `other`. */\nconst FIELDS: Readonly<Partial<Record<DocumentPlace, Readonly<Record<string, DocumentPlace>>>>> = {\n root: {\n paths: \"namedPathItems\",\n webhooks: \"namedPathItems\",\n components: \"components\",\n $defs: \"other\",\n },\n components: {\n parameters: \"input\",\n requestBodies: \"input\",\n pathItems: \"namedPathItems\",\n callbacks: \"namedCallbacks\",\n },\n pathItem: { parameters: \"input\", [ADDITIONAL_OPERATIONS_KEY]: \"namedOperations\" },\n operation: { parameters: \"input\", requestBody: \"input\", callbacks: \"namedCallbacks\" },\n};\n\n/** Maps whose every key leads to the same place. */\nconst NAMED: Readonly<Partial<Record<DocumentPlace, DocumentPlace>>> = {\n namedPathItems: \"pathItem\",\n namedCallbacks: \"callback\",\n callback: \"pathItem\",\n namedOperations: \"operation\",\n};\n\nfunction nextPlace(place: DocumentPlace, segment: string): DocumentPlace {\n const named = NAMED[place];\n if (named !== undefined) {\n return named;\n }\n if (place === \"pathItem\" && OPERATION_KEYS.has(segment)) {\n return \"operation\";\n }\n const fields = FIELDS[place] ?? {};\n if (Object.hasOwn(fields, segment)) {\n return fields[segment] as DocumentPlace;\n }\n return place === \"root\" ? \"outside\" : \"other\";\n}\n\nconst TERMINAL_PLACES: ReadonlySet<DocumentPlace> = new Set([\"outside\", \"input\", \"other\"]);\n\n/** The place the segments of a pointer (after `#`) lead to; the walk stops at a terminal place. */\nexport function placeOf(segments: Iterable<string>): DocumentPlace {\n let place: DocumentPlace = \"root\";\n for (const segment of segments) {\n place = nextPlace(place, segment);\n if (TERMINAL_PLACES.has(place)) {\n return place;\n }\n }\n return place;\n}\n"],"names":["HTTP_METHODS","QUERY_METHOD","ADDITIONAL_OPERATIONS_KEY"],"mappings":";;;;AAsBA,MAAM,iCAAsC,IAAI,GAAA,CAAI,CAAC,GAAGA,2BAAA,EAAcC,2BAAY,CAAC,CAAA;AAGnF,MAAM,MAAA,GAA4F;AAAA,EAChG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,gBAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,gBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAU,EAAE,UAAA,EAAY,SAAS,CAACC,wCAAyB,GAAG,iBAAA,EAAkB;AAAA,EAChF,WAAW,EAAE,UAAA,EAAY,SAAS,WAAA,EAAa,OAAA,EAAS,WAAW,gBAAA;AACrE,CAAA;AAGA,MAAM,KAAA,GAAiE;AAAA,EACrE,cAAA,EAAgB,UAAA;AAAA,EAChB,cAAA,EAAgB,UAAA;AAAA,EAChB,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB;AACnB,CAAA;AAEA,SAAS,SAAA,CAAU,OAAsB,OAAA,EAAgC;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAK,CAAA,IAAK,EAAC;AACjC,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,KAAA,KAAU,SAAS,SAAA,GAAY,OAAA;AACxC;AAEA,MAAM,kCAA8C,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAGlF,SAAS,QAAQ,QAAA,EAA2C;AACjE,EAAA,IAAI,KAAA,GAAuB,MAAA;AAC3B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,GAAQ,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;"}
@@ -0,0 +1,53 @@
1
+ import { HTTP_METHODS, QUERY_METHOD, ADDITIONAL_OPERATIONS_KEY } from './path-item-object.mjs';
2
+
3
+ const OPERATION_KEYS = /* @__PURE__ */ new Set([...HTTP_METHODS, QUERY_METHOD]);
4
+ const FIELDS = {
5
+ root: {
6
+ paths: "namedPathItems",
7
+ webhooks: "namedPathItems",
8
+ components: "components",
9
+ $defs: "other"
10
+ },
11
+ components: {
12
+ parameters: "input",
13
+ requestBodies: "input",
14
+ pathItems: "namedPathItems",
15
+ callbacks: "namedCallbacks"
16
+ },
17
+ pathItem: { parameters: "input", [ADDITIONAL_OPERATIONS_KEY]: "namedOperations" },
18
+ operation: { parameters: "input", requestBody: "input", callbacks: "namedCallbacks" }
19
+ };
20
+ const NAMED = {
21
+ namedPathItems: "pathItem",
22
+ namedCallbacks: "callback",
23
+ callback: "pathItem",
24
+ namedOperations: "operation"
25
+ };
26
+ function nextPlace(place, segment) {
27
+ const named = NAMED[place];
28
+ if (named !== void 0) {
29
+ return named;
30
+ }
31
+ if (place === "pathItem" && OPERATION_KEYS.has(segment)) {
32
+ return "operation";
33
+ }
34
+ const fields = FIELDS[place] ?? {};
35
+ if (Object.hasOwn(fields, segment)) {
36
+ return fields[segment];
37
+ }
38
+ return place === "root" ? "outside" : "other";
39
+ }
40
+ const TERMINAL_PLACES = /* @__PURE__ */ new Set(["outside", "input", "other"]);
41
+ function placeOf(segments) {
42
+ let place = "root";
43
+ for (const segment of segments) {
44
+ place = nextPlace(place, segment);
45
+ if (TERMINAL_PLACES.has(place)) {
46
+ return place;
47
+ }
48
+ }
49
+ return place;
50
+ }
51
+
52
+ export { placeOf };
53
+ //# sourceMappingURL=document-places.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-places.mjs","sources":["../../../src/domain/openapi/document-places.ts"],"sourcesContent":["import { ADDITIONAL_OPERATIONS_KEY, HTTP_METHODS, QUERY_METHOD } from \"./path-item-object.js\";\n\n/**\n * The places of an OpenAPI document that a JSON Pointer passes through, read from the document's\n * structure rather than from the words of the pointer. `named*` places and `callback` are maps\n * whose next segment is a name (a path, a component name, a callback expression). `outside` (a\n * root key that is no document key), `input` (a parameter or a request body) and `other` end the\n * walk.\n */\nexport type DocumentPlace =\n | \"root\"\n | \"outside\"\n | \"components\"\n | \"namedPathItems\"\n | \"namedCallbacks\"\n | \"callback\"\n | \"pathItem\"\n | \"namedOperations\"\n | \"operation\"\n | \"input\"\n | \"other\";\n\nconst OPERATION_KEYS: ReadonlySet<string> = new Set([...HTTP_METHODS, QUERY_METHOD]);\n\n/** The place each fixed field leads to; any other field leads to `other`. */\nconst FIELDS: Readonly<Partial<Record<DocumentPlace, Readonly<Record<string, DocumentPlace>>>>> = {\n root: {\n paths: \"namedPathItems\",\n webhooks: \"namedPathItems\",\n components: \"components\",\n $defs: \"other\",\n },\n components: {\n parameters: \"input\",\n requestBodies: \"input\",\n pathItems: \"namedPathItems\",\n callbacks: \"namedCallbacks\",\n },\n pathItem: { parameters: \"input\", [ADDITIONAL_OPERATIONS_KEY]: \"namedOperations\" },\n operation: { parameters: \"input\", requestBody: \"input\", callbacks: \"namedCallbacks\" },\n};\n\n/** Maps whose every key leads to the same place. */\nconst NAMED: Readonly<Partial<Record<DocumentPlace, DocumentPlace>>> = {\n namedPathItems: \"pathItem\",\n namedCallbacks: \"callback\",\n callback: \"pathItem\",\n namedOperations: \"operation\",\n};\n\nfunction nextPlace(place: DocumentPlace, segment: string): DocumentPlace {\n const named = NAMED[place];\n if (named !== undefined) {\n return named;\n }\n if (place === \"pathItem\" && OPERATION_KEYS.has(segment)) {\n return \"operation\";\n }\n const fields = FIELDS[place] ?? {};\n if (Object.hasOwn(fields, segment)) {\n return fields[segment] as DocumentPlace;\n }\n return place === \"root\" ? \"outside\" : \"other\";\n}\n\nconst TERMINAL_PLACES: ReadonlySet<DocumentPlace> = new Set([\"outside\", \"input\", \"other\"]);\n\n/** The place the segments of a pointer (after `#`) lead to; the walk stops at a terminal place. */\nexport function placeOf(segments: Iterable<string>): DocumentPlace {\n let place: DocumentPlace = \"root\";\n for (const segment of segments) {\n place = nextPlace(place, segment);\n if (TERMINAL_PLACES.has(place)) {\n return place;\n }\n }\n return place;\n}\n"],"names":[],"mappings":";;AAsBA,MAAM,iCAAsC,IAAI,GAAA,CAAI,CAAC,GAAG,YAAA,EAAc,YAAY,CAAC,CAAA;AAGnF,MAAM,MAAA,GAA4F;AAAA,EAChG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,gBAAA;AAAA,IACP,QAAA,EAAU,gBAAA;AAAA,IACV,UAAA,EAAY,YAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACT;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,gBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAU,EAAE,UAAA,EAAY,SAAS,CAAC,yBAAyB,GAAG,iBAAA,EAAkB;AAAA,EAChF,WAAW,EAAE,UAAA,EAAY,SAAS,WAAA,EAAa,OAAA,EAAS,WAAW,gBAAA;AACrE,CAAA;AAGA,MAAM,KAAA,GAAiE;AAAA,EACrE,cAAA,EAAgB,UAAA;AAAA,EAChB,cAAA,EAAgB,UAAA;AAAA,EAChB,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB;AACnB,CAAA;AAEA,SAAS,SAAA,CAAU,OAAsB,OAAA,EAAgC;AACvE,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAK,CAAA,IAAK,EAAC;AACjC,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,KAAA,KAAU,SAAS,SAAA,GAAY,OAAA;AACxC;AAEA,MAAM,kCAA8C,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAGlF,SAAS,QAAQ,QAAA,EAA2C;AACjE,EAAA,IAAI,KAAA,GAAuB,MAAA;AAC3B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,GAAQ,SAAA,CAAU,OAAO,OAAO,CAAA;AAChC,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;;"}
@@ -8,7 +8,45 @@ function unescapePointerSegment(segment) {
8
8
  return decodeURIComponent(segment.replaceAll("~1", "/").replaceAll("~0", "~"));
9
9
  }
10
10
  function escapePointerSegment(segment) {
11
- return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25");
11
+ return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25").replaceAll("#", "%23");
12
+ }
13
+ const ROOT_POINTER = "#";
14
+ function appendPointer(base, segments) {
15
+ let pointer = pointerBase(base);
16
+ for (const segment of segments) {
17
+ if (segment !== void 0 && segment !== null && segment !== "") {
18
+ pointer = childPointer(pointer, String(segment));
19
+ }
20
+ }
21
+ return pointer;
22
+ }
23
+ function childPointer(pointer, key) {
24
+ return `${pointer}/${escapePointerSegment(key)}`;
25
+ }
26
+ function canonicalRef(ref) {
27
+ if (!ref.startsWith(`${ROOT_POINTER}/`)) {
28
+ return ref;
29
+ }
30
+ return appendPointer(ROOT_POINTER, refSegments(ref));
31
+ }
32
+ function refSegments(ref) {
33
+ try {
34
+ return parseRefPointer(ref);
35
+ } catch (error) {
36
+ if (!(error instanceof URIError)) {
37
+ throw error;
38
+ }
39
+ return writtenSegments(ref);
40
+ }
41
+ }
42
+ function writtenSegments(ref) {
43
+ return ref.slice(ROOT_POINTER.length + 1).split("/").filter((segment) => segment.length > 0).map((segment) => segment.replaceAll("~1", "/").replaceAll("~0", "~"));
44
+ }
45
+ function pointerBase(base) {
46
+ if (base === void 0 || base === "") {
47
+ return ROOT_POINTER;
48
+ }
49
+ return base === ROOT_POINTER || base.startsWith(`${ROOT_POINTER}/`) ? base : createRef([base]);
12
50
  }
13
51
  function createRef(parts) {
14
52
  let ref = "#";
@@ -25,6 +63,10 @@ function createRef(parts) {
25
63
  return ref;
26
64
  }
27
65
 
66
+ exports.ROOT_POINTER = ROOT_POINTER;
67
+ exports.appendPointer = appendPointer;
68
+ exports.canonicalRef = canonicalRef;
69
+ exports.childPointer = childPointer;
28
70
  exports.createRef = createRef;
29
71
  exports.escapePointerSegment = escapePointerSegment;
30
72
  exports.parseRefPointer = parseRefPointer;
@@ -1 +1 @@
1
- {"version":3,"file":"json-pointer.cjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0`, `/` → `~1`, and `%` →\n * `%25`, because reading a pointer back percent-decodes it. The original did not escape `%`, so a\n * name like `50%` threw URIError and `a%2Fb` read back as `a/b` (upstream #2251, #2828).\n */\nexport function escapePointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\").replaceAll(\"%\", \"%25\");\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`). Empty parts are skipped. A part that\n * is itself a `$ref` contributes its segments; any other part is one segment.\n */\nexport function createRef(parts: readonly (string | number | null | undefined)[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":";;AAOO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,MAAM,GAAG,OAAA,GAAU,EAAE,CAAA,GAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,EAAA,OAAO,OAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,sBAAsB,CAAA,CAC1B,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3C;AAEA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,kBAAA,CAAmB,QAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/E;AAOO,SAAS,qBAAqB,OAAA,EAAyB;AAC5D,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAClF;AAMO,SAAS,UAAU,KAAA,EAAgE;AACxF,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,IAAQ,SAAS,EAAA,EAAI;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA;AACrC,IAAA,KAAA,MAAW,WAAW,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,CAAC,IAAI,CAAA,EAAG;AAC7D,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;;"}
1
+ {"version":3,"file":"json-pointer.cjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0` and `/` → `~1` (RFC 6901),\n * then `%` → `%25` and `#` → `%23`, the two characters of a key that a URI fragment cannot hold as\n * written (RFC 6901 §6, RFC 3986). Reading a pointer back percent-decodes it, so the original's\n * unescaped `%` threw URIError for `50%` and read `a%2Fb` as `a/b` (upstream #2251, #2828), and\n * reading starts at the first `#/`, so an unescaped key `a#` cut the pointer short.\n */\nexport function escapePointerSegment(segment: string): string {\n return segment\n .replaceAll(\"~\", \"~0\")\n .replaceAll(\"/\", \"~1\")\n .replaceAll(\"%\", \"%25\")\n .replaceAll(\"#\", \"%23\");\n}\n\n/** The pointer of the document root. */\nexport const ROOT_POINTER = \"#\";\n\n/** A raw pointer segment; a missing one (`undefined`, `null` or empty) is skipped. */\nexport type PointerSegment = string | number | null | undefined;\n\n/**\n * Extend the pointer `base` with raw segments: document keys, such as a path, a property name or a\n * media type, and array indexes. Each segment is escaped and never read as a `$ref`, so a key like\n * `#/%41` stays one segment and reads back unchanged with {@link parseRefPointer}. A missing\n * segment, such as the absent `name` of a parameter, is skipped, as the original `createRef` did,\n * and an empty one too, because `parseRefPointer` drops it.\n */\nexport function appendPointer(\n base: string | undefined,\n segments: readonly PointerSegment[],\n): string {\n let pointer = pointerBase(base);\n for (const segment of segments) {\n if (segment !== undefined && segment !== null && segment !== \"\") {\n pointer = childPointer(pointer, String(segment));\n }\n }\n return pointer;\n}\n\n/**\n * The pointer of the child `key` of the node at `pointer`, with `key` escaped. Unlike\n * {@link appendPointer}, an empty key is a child too: a document walk names every key it visits.\n */\nexport function childPointer(pointer: string, key: string): string {\n return `${pointer}/${escapePointerSegment(key)}`;\n}\n\n/**\n * A local `$ref` or `mapping` value in the form {@link appendPointer} builds, so that pointers\n * compare as text whatever escapes the document chose: `.../a#b` and `.../a%23b` are both\n * `.../a%23b`. Redocly writes a bundled `mapping` value percent-decoded, which is no pointer for a\n * key with `%` (`.../50%`), so such a text is read as written. Any other text, such as an\n * external `$ref` or a bare schema name, is returned unchanged.\n */\nexport function canonicalRef(ref: string): string {\n if (!ref.startsWith(`${ROOT_POINTER}/`)) {\n return ref;\n }\n return appendPointer(ROOT_POINTER, refSegments(ref));\n}\n\nfunction refSegments(ref: string): string[] {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (!(error instanceof URIError)) {\n throw error;\n }\n return writtenSegments(ref);\n }\n}\n\n/** The segments of a pointer that is not percent-encoded: only `~1` and `~0` are escapes. */\nfunction writtenSegments(ref: string): string[] {\n return ref\n .slice(ROOT_POINTER.length + 1)\n .split(\"/\")\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * A pointer (`#` or `#/...`) is kept as written; a missing base is the root. Any other text is a\n * `path` given to the exported transformers, such as `/items/{id}` or `other.yaml#/a`, which the\n * original read as a `createRef` part, so it is read the same way here.\n */\nfunction pointerBase(base: string | undefined): string {\n if (base === undefined || base === \"\") {\n return ROOT_POINTER;\n }\n return base === ROOT_POINTER || base.startsWith(`${ROOT_POINTER}/`) ? base : createRef([base]);\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`, exported for 1.x by ADR-034). Empty\n * parts are skipped. A part that contains `#/` is parsed as a `$ref` and contributes its decoded\n * segments, so it throws URIError for a malformed percent escape; any other part is one segment.\n * Because of that parsing, the generator does not pass document keys here: it builds pointers\n * with {@link appendPointer}, which never parses a segment.\n */\nexport function createRef(parts: readonly PointerSegment[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,45 @@ function unescapePointerSegment(segment) {
6
6
  return decodeURIComponent(segment.replaceAll("~1", "/").replaceAll("~0", "~"));
7
7
  }
8
8
  function escapePointerSegment(segment) {
9
- return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25");
9
+ return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25").replaceAll("#", "%23");
10
+ }
11
+ const ROOT_POINTER = "#";
12
+ function appendPointer(base, segments) {
13
+ let pointer = pointerBase(base);
14
+ for (const segment of segments) {
15
+ if (segment !== void 0 && segment !== null && segment !== "") {
16
+ pointer = childPointer(pointer, String(segment));
17
+ }
18
+ }
19
+ return pointer;
20
+ }
21
+ function childPointer(pointer, key) {
22
+ return `${pointer}/${escapePointerSegment(key)}`;
23
+ }
24
+ function canonicalRef(ref) {
25
+ if (!ref.startsWith(`${ROOT_POINTER}/`)) {
26
+ return ref;
27
+ }
28
+ return appendPointer(ROOT_POINTER, refSegments(ref));
29
+ }
30
+ function refSegments(ref) {
31
+ try {
32
+ return parseRefPointer(ref);
33
+ } catch (error) {
34
+ if (!(error instanceof URIError)) {
35
+ throw error;
36
+ }
37
+ return writtenSegments(ref);
38
+ }
39
+ }
40
+ function writtenSegments(ref) {
41
+ return ref.slice(ROOT_POINTER.length + 1).split("/").filter((segment) => segment.length > 0).map((segment) => segment.replaceAll("~1", "/").replaceAll("~0", "~"));
42
+ }
43
+ function pointerBase(base) {
44
+ if (base === void 0 || base === "") {
45
+ return ROOT_POINTER;
46
+ }
47
+ return base === ROOT_POINTER || base.startsWith(`${ROOT_POINTER}/`) ? base : createRef([base]);
10
48
  }
11
49
  function createRef(parts) {
12
50
  let ref = "#";
@@ -23,5 +61,5 @@ function createRef(parts) {
23
61
  return ref;
24
62
  }
25
63
 
26
- export { createRef, escapePointerSegment, parseRefPointer };
64
+ export { ROOT_POINTER, appendPointer, canonicalRef, childPointer, createRef, escapePointerSegment, parseRefPointer };
27
65
  //# sourceMappingURL=json-pointer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-pointer.mjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0`, `/` → `~1`, and `%` →\n * `%25`, because reading a pointer back percent-decodes it. The original did not escape `%`, so a\n * name like `50%` threw URIError and `a%2Fb` read back as `a/b` (upstream #2251, #2828).\n */\nexport function escapePointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\").replaceAll(\"%\", \"%25\");\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`). Empty parts are skipped. A part that\n * is itself a `$ref` contributes its segments; any other part is one segment.\n */\nexport function createRef(parts: readonly (string | number | null | undefined)[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":"AAOO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,MAAM,GAAG,OAAA,GAAU,EAAE,CAAA,GAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,EAAA,OAAO,OAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,sBAAsB,CAAA,CAC1B,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3C;AAEA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,kBAAA,CAAmB,QAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/E;AAOO,SAAS,qBAAqB,OAAA,EAAyB;AAC5D,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAClF;AAMO,SAAS,UAAU,KAAA,EAAgE;AACxF,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,IAAQ,SAAS,EAAA,EAAI;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA;AACrC,IAAA,KAAA,MAAW,WAAW,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,CAAC,IAAI,CAAA,EAAG;AAC7D,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;"}
1
+ {"version":3,"file":"json-pointer.mjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0` and `/` → `~1` (RFC 6901),\n * then `%` → `%25` and `#` → `%23`, the two characters of a key that a URI fragment cannot hold as\n * written (RFC 6901 §6, RFC 3986). Reading a pointer back percent-decodes it, so the original's\n * unescaped `%` threw URIError for `50%` and read `a%2Fb` as `a/b` (upstream #2251, #2828), and\n * reading starts at the first `#/`, so an unescaped key `a#` cut the pointer short.\n */\nexport function escapePointerSegment(segment: string): string {\n return segment\n .replaceAll(\"~\", \"~0\")\n .replaceAll(\"/\", \"~1\")\n .replaceAll(\"%\", \"%25\")\n .replaceAll(\"#\", \"%23\");\n}\n\n/** The pointer of the document root. */\nexport const ROOT_POINTER = \"#\";\n\n/** A raw pointer segment; a missing one (`undefined`, `null` or empty) is skipped. */\nexport type PointerSegment = string | number | null | undefined;\n\n/**\n * Extend the pointer `base` with raw segments: document keys, such as a path, a property name or a\n * media type, and array indexes. Each segment is escaped and never read as a `$ref`, so a key like\n * `#/%41` stays one segment and reads back unchanged with {@link parseRefPointer}. A missing\n * segment, such as the absent `name` of a parameter, is skipped, as the original `createRef` did,\n * and an empty one too, because `parseRefPointer` drops it.\n */\nexport function appendPointer(\n base: string | undefined,\n segments: readonly PointerSegment[],\n): string {\n let pointer = pointerBase(base);\n for (const segment of segments) {\n if (segment !== undefined && segment !== null && segment !== \"\") {\n pointer = childPointer(pointer, String(segment));\n }\n }\n return pointer;\n}\n\n/**\n * The pointer of the child `key` of the node at `pointer`, with `key` escaped. Unlike\n * {@link appendPointer}, an empty key is a child too: a document walk names every key it visits.\n */\nexport function childPointer(pointer: string, key: string): string {\n return `${pointer}/${escapePointerSegment(key)}`;\n}\n\n/**\n * A local `$ref` or `mapping` value in the form {@link appendPointer} builds, so that pointers\n * compare as text whatever escapes the document chose: `.../a#b` and `.../a%23b` are both\n * `.../a%23b`. Redocly writes a bundled `mapping` value percent-decoded, which is no pointer for a\n * key with `%` (`.../50%`), so such a text is read as written. Any other text, such as an\n * external `$ref` or a bare schema name, is returned unchanged.\n */\nexport function canonicalRef(ref: string): string {\n if (!ref.startsWith(`${ROOT_POINTER}/`)) {\n return ref;\n }\n return appendPointer(ROOT_POINTER, refSegments(ref));\n}\n\nfunction refSegments(ref: string): string[] {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (!(error instanceof URIError)) {\n throw error;\n }\n return writtenSegments(ref);\n }\n}\n\n/** The segments of a pointer that is not percent-encoded: only `~1` and `~0` are escapes. */\nfunction writtenSegments(ref: string): string[] {\n return ref\n .slice(ROOT_POINTER.length + 1)\n .split(\"/\")\n .filter((segment) => segment.length > 0)\n .map((segment) => segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * A pointer (`#` or `#/...`) is kept as written; a missing base is the root. Any other text is a\n * `path` given to the exported transformers, such as `/items/{id}` or `other.yaml#/a`, which the\n * original read as a `createRef` part, so it is read the same way here.\n */\nfunction pointerBase(base: string | undefined): string {\n if (base === undefined || base === \"\") {\n return ROOT_POINTER;\n }\n return base === ROOT_POINTER || base.startsWith(`${ROOT_POINTER}/`) ? base : createRef([base]);\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`, exported for 1.x by ADR-034). Empty\n * parts are skipped. A part that contains `#/` is parsed as a `$ref` and contributes its decoded\n * segments, so it throws URIError for a malformed percent escape; any other part is one segment.\n * Because of that parsing, the generator does not pass document keys here: it builds pointers\n * with {@link appendPointer}, which never parses a segment.\n */\nexport function createRef(parts: readonly PointerSegment[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const SCHEMA_DIALECTS = {
4
+ OPENAPI_3_0: "openapi-3.0",
5
+ JSON_SCHEMA_2020_12: "json-schema-2020-12"
6
+ };
7
+ const OPENAPI_3_0_RE = /^3\.0(?:\.|$)/;
8
+ function schemaDialectOf(openapiVersion) {
9
+ const isOpenApi30 = typeof openapiVersion !== "string" || OPENAPI_3_0_RE.test(openapiVersion);
10
+ return isOpenApi30 ? SCHEMA_DIALECTS.OPENAPI_3_0 : SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;
11
+ }
12
+
13
+ exports.SCHEMA_DIALECTS = SCHEMA_DIALECTS;
14
+ exports.schemaDialectOf = schemaDialectOf;
15
+ //# sourceMappingURL=schema-dialect.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-dialect.cjs","sources":["../../../src/domain/openapi/schema-dialect.ts"],"sourcesContent":["/**\n * The schema dialect of a document. OpenAPI 3.0 Schema Objects ignore every keyword next to a\n * `$ref` (OpenAPI 3.0.3, Reference Object). OpenAPI 3.1 and 3.2 use JSON Schema 2020-12, where a\n * `$ref` is one keyword among the others, and all of them apply (JSON Schema Core §8.2.3.1).\n */\nexport const SCHEMA_DIALECTS = {\n OPENAPI_3_0: \"openapi-3.0\",\n JSON_SCHEMA_2020_12: \"json-schema-2020-12\",\n} as const;\n\nexport type SchemaDialect = (typeof SCHEMA_DIALECTS)[keyof typeof SCHEMA_DIALECTS];\n\nconst OPENAPI_3_0_RE = /^3\\.0(?:\\.|$)/;\n\n/**\n * The dialect of a document's `openapi` version. Without a version (a schema passed to a\n * transformer on its own) it is OpenAPI 3.0, which keeps the output the original gives.\n */\nexport function schemaDialectOf(openapiVersion: unknown): SchemaDialect {\n const isOpenApi30 = typeof openapiVersion !== \"string\" || OPENAPI_3_0_RE.test(openapiVersion);\n return isOpenApi30 ? SCHEMA_DIALECTS.OPENAPI_3_0 : SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;\n}\n"],"names":[],"mappings":";;AAKO,MAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,aAAA;AAAA,EACb,mBAAA,EAAqB;AACvB;AAIA,MAAM,cAAA,GAAiB,eAAA;AAMhB,SAAS,gBAAgB,cAAA,EAAwC;AACtE,EAAA,MAAM,cAAc,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,CAAe,KAAK,cAAc,CAAA;AAC5F,EAAA,OAAO,WAAA,GAAc,eAAA,CAAgB,WAAA,GAAc,eAAA,CAAgB,mBAAA;AACrE;;;"}
@@ -0,0 +1,12 @@
1
+ const SCHEMA_DIALECTS = {
2
+ OPENAPI_3_0: "openapi-3.0",
3
+ JSON_SCHEMA_2020_12: "json-schema-2020-12"
4
+ };
5
+ const OPENAPI_3_0_RE = /^3\.0(?:\.|$)/;
6
+ function schemaDialectOf(openapiVersion) {
7
+ const isOpenApi30 = typeof openapiVersion !== "string" || OPENAPI_3_0_RE.test(openapiVersion);
8
+ return isOpenApi30 ? SCHEMA_DIALECTS.OPENAPI_3_0 : SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;
9
+ }
10
+
11
+ export { SCHEMA_DIALECTS, schemaDialectOf };
12
+ //# sourceMappingURL=schema-dialect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-dialect.mjs","sources":["../../../src/domain/openapi/schema-dialect.ts"],"sourcesContent":["/**\n * The schema dialect of a document. OpenAPI 3.0 Schema Objects ignore every keyword next to a\n * `$ref` (OpenAPI 3.0.3, Reference Object). OpenAPI 3.1 and 3.2 use JSON Schema 2020-12, where a\n * `$ref` is one keyword among the others, and all of them apply (JSON Schema Core §8.2.3.1).\n */\nexport const SCHEMA_DIALECTS = {\n OPENAPI_3_0: \"openapi-3.0\",\n JSON_SCHEMA_2020_12: \"json-schema-2020-12\",\n} as const;\n\nexport type SchemaDialect = (typeof SCHEMA_DIALECTS)[keyof typeof SCHEMA_DIALECTS];\n\nconst OPENAPI_3_0_RE = /^3\\.0(?:\\.|$)/;\n\n/**\n * The dialect of a document's `openapi` version. Without a version (a schema passed to a\n * transformer on its own) it is OpenAPI 3.0, which keeps the output the original gives.\n */\nexport function schemaDialectOf(openapiVersion: unknown): SchemaDialect {\n const isOpenApi30 = typeof openapiVersion !== \"string\" || OPENAPI_3_0_RE.test(openapiVersion);\n return isOpenApi30 ? SCHEMA_DIALECTS.OPENAPI_3_0 : SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;\n}\n"],"names":[],"mappings":"AAKO,MAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,aAAA;AAAA,EACb,mBAAA,EAAqB;AACvB;AAIA,MAAM,cAAA,GAAiB,eAAA;AAMhB,SAAS,gBAAgB,cAAA,EAAwC;AACtE,EAAA,MAAM,cAAc,OAAO,cAAA,KAAmB,QAAA,IAAY,cAAA,CAAe,KAAK,cAAc,CAAA;AAC5F,EAAA,OAAO,WAAA,GAAc,eAAA,CAAgB,WAAA,GAAc,eAAA,CAAgB,mBAAA;AACrE;;"}
@@ -31,7 +31,7 @@ function locatedParameters(document, parameters, segments) {
31
31
  }
32
32
  return parameters.flatMap((entry, index) => {
33
33
  const parameter = resolveLocal(document, entry);
34
- const pointer = jsonPointer.createRef([...segments, String(index)]);
34
+ const pointer = jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, [...segments, index]);
35
35
  return isObject(parameter) ? [{ pointer, parameter }] : [];
36
36
  });
37
37
  }