openapi-typesafe 1.0.0-rc.4 → 1.0.0-rc.6

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 (366) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
  23. package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
  25. package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/query-named-components.cjs +129 -0
  27. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/query-named-components.mjs +126 -0
  29. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
  31. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
  33. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +39 -18
  35. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +40 -19
  37. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-access.cjs +25 -4
  39. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-access.mjs +26 -5
  41. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  43. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  45. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +20 -3
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +20 -4
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  59. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  60. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  61. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  62. package/dist/api/cwd-option.cjs +58 -0
  63. package/dist/api/cwd-option.cjs.map +1 -0
  64. package/dist/api/cwd-option.mjs +52 -0
  65. package/dist/api/cwd-option.mjs.map +1 -0
  66. package/dist/api/default-ports.cjs +15 -7
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -8
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/document-refs.cjs +16 -1
  71. package/dist/api/document-refs.cjs.map +1 -1
  72. package/dist/api/document-refs.mjs +16 -1
  73. package/dist/api/document-refs.mjs.map +1 -1
  74. package/dist/api/document-run.cjs +6 -26
  75. package/dist/api/document-run.cjs.map +1 -1
  76. package/dist/api/document-run.mjs +5 -21
  77. package/dist/api/document-run.mjs.map +1 -1
  78. package/dist/api/legacy-utils.cjs +1 -1
  79. package/dist/api/legacy-utils.cjs.map +1 -1
  80. package/dist/api/legacy-utils.mjs +1 -1
  81. package/dist/api/legacy-utils.mjs.map +1 -1
  82. package/dist/api/openapi-ts.cjs +1 -2
  83. package/dist/api/openapi-ts.cjs.map +1 -1
  84. package/dist/api/openapi-ts.mjs +2 -3
  85. package/dist/api/openapi-ts.mjs.map +1 -1
  86. package/dist/api/option-errors.cjs +24 -0
  87. package/dist/api/option-errors.cjs.map +1 -0
  88. package/dist/api/option-errors.mjs +21 -0
  89. package/dist/api/option-errors.mjs.map +1 -0
  90. package/dist/api/ref-limit-options.cjs +58 -0
  91. package/dist/api/ref-limit-options.cjs.map +1 -0
  92. package/dist/api/ref-limit-options.mjs +52 -0
  93. package/dist/api/ref-limit-options.mjs.map +1 -0
  94. package/dist/api/transform-schema.cjs +12 -5
  95. package/dist/api/transform-schema.cjs.map +1 -1
  96. package/dist/api/transform-schema.mjs +12 -5
  97. package/dist/api/transform-schema.mjs.map +1 -1
  98. package/dist/application/transform/declared-value-types.cjs +36 -0
  99. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  100. package/dist/application/transform/declared-value-types.mjs +34 -0
  101. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  102. package/dist/application/transform/document/document.cjs +3 -1
  103. package/dist/application/transform/document/document.cjs.map +1 -1
  104. package/dist/application/transform/document/document.mjs +3 -1
  105. package/dist/application/transform/document/document.mjs.map +1 -1
  106. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  107. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  108. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  109. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  110. package/dist/application/transform/document/header.cjs +11 -3
  111. package/dist/application/transform/document/header.cjs.map +1 -1
  112. package/dist/application/transform/document/header.mjs +10 -2
  113. package/dist/application/transform/document/header.mjs.map +1 -1
  114. package/dist/application/transform/document/parameter.cjs +1 -1
  115. package/dist/application/transform/document/parameter.cjs.map +1 -1
  116. package/dist/application/transform/document/parameter.mjs +1 -1
  117. package/dist/application/transform/document/parameter.mjs.map +1 -1
  118. package/dist/application/transform/document/parameters.cjs +23 -5
  119. package/dist/application/transform/document/parameters.cjs.map +1 -1
  120. package/dist/application/transform/document/parameters.mjs +23 -5
  121. package/dist/application/transform/document/parameters.mjs.map +1 -1
  122. package/dist/application/transform/document/path-item.cjs +4 -3
  123. package/dist/application/transform/document/path-item.cjs.map +1 -1
  124. package/dist/application/transform/document/path-item.mjs +4 -4
  125. package/dist/application/transform/document/path-item.mjs.map +1 -1
  126. package/dist/application/transform/document/path-template-key.cjs +84 -0
  127. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  128. package/dist/application/transform/document/path-template-key.mjs +79 -0
  129. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  130. package/dist/application/transform/document/path-template-refs.cjs +80 -0
  131. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  132. package/dist/application/transform/document/path-template-refs.mjs +77 -0
  133. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  134. package/dist/application/transform/document/paths-enum.cjs +7 -6
  135. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  136. package/dist/application/transform/document/paths-enum.mjs +7 -6
  137. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  138. package/dist/application/transform/document/paths.cjs +38 -66
  139. package/dist/application/transform/document/paths.cjs.map +1 -1
  140. package/dist/application/transform/document/paths.mjs +36 -66
  141. package/dist/application/transform/document/paths.mjs.map +1 -1
  142. package/dist/application/transform/document/webhooks.cjs +10 -3
  143. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  144. package/dist/application/transform/document/webhooks.mjs +9 -2
  145. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  146. package/dist/application/transform/footer/document-footer.cjs +6 -3
  147. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  148. package/dist/application/transform/footer/document-footer.mjs +6 -3
  149. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  150. package/dist/application/transform/helper-types.cjs +3 -3
  151. package/dist/application/transform/helper-types.cjs.map +1 -1
  152. package/dist/application/transform/helper-types.mjs +3 -3
  153. package/dist/application/transform/helper-types.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  155. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  157. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/generated-shape.cjs +63 -64
  159. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  160. package/dist/application/transform/ref-pointer/generated-shape.mjs +57 -53
  161. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  162. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  163. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  165. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  166. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  167. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  168. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  169. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  170. package/dist/application/transform/ref-pointer/original-index.cjs +69 -14
  171. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  172. package/dist/application/transform/ref-pointer/original-index.mjs +71 -16
  173. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  174. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  175. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  176. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  177. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  178. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  179. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  180. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  181. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  182. package/dist/application/transform/ref-pointer/property-shape.cjs +57 -0
  183. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  184. package/dist/application/transform/ref-pointer/property-shape.mjs +49 -0
  185. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  186. package/dist/application/transform/ref-pointer/typed-walk.cjs +90 -22
  187. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  188. package/dist/application/transform/ref-pointer/typed-walk.mjs +87 -19
  189. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  190. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  191. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  192. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  193. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  194. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  195. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  196. package/dist/application/transform/schema/input-location.cjs +23 -0
  197. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  198. package/dist/application/transform/schema/input-location.mjs +21 -0
  199. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  200. package/dist/application/transform/schema/object-type.cjs +15 -5
  201. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  202. package/dist/application/transform/schema/object-type.mjs +15 -5
  203. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  204. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  205. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  206. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  207. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  208. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  209. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  210. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  211. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  212. package/dist/cli/api-logger.cjs +13 -0
  213. package/dist/cli/api-logger.cjs.map +1 -0
  214. package/dist/cli/api-logger.mjs +11 -0
  215. package/dist/cli/api-logger.mjs.map +1 -0
  216. package/dist/cli/api-settings.cjs +10 -17
  217. package/dist/cli/api-settings.cjs.map +1 -1
  218. package/dist/cli/api-settings.mjs +10 -17
  219. package/dist/cli/api-settings.mjs.map +1 -1
  220. package/dist/cli/api-writes.cjs +7 -1
  221. package/dist/cli/api-writes.cjs.map +1 -1
  222. package/dist/cli/api-writes.mjs +7 -1
  223. package/dist/cli/api-writes.mjs.map +1 -1
  224. package/dist/cli/cli-arguments.cjs +32 -74
  225. package/dist/cli/cli-arguments.cjs.map +1 -1
  226. package/dist/cli/cli-arguments.mjs +28 -70
  227. package/dist/cli/cli-arguments.mjs.map +1 -1
  228. package/dist/cli/cli-errors.cjs +18 -0
  229. package/dist/cli/cli-errors.cjs.map +1 -1
  230. package/dist/cli/cli-errors.mjs +18 -1
  231. package/dist/cli/cli-errors.mjs.map +1 -1
  232. package/dist/cli/cli-flag-names.cjs +77 -0
  233. package/dist/cli/cli-flag-names.cjs.map +1 -0
  234. package/dist/cli/cli-flag-names.mjs +64 -0
  235. package/dist/cli/cli-flag-names.mjs.map +1 -0
  236. package/dist/cli/cli-output.cjs +13 -6
  237. package/dist/cli/cli-output.cjs.map +1 -1
  238. package/dist/cli/cli-output.mjs +14 -7
  239. package/dist/cli/cli-output.mjs.map +1 -1
  240. package/dist/cli/main.cjs +11 -5
  241. package/dist/cli/main.cjs.map +1 -1
  242. package/dist/cli/main.mjs +11 -5
  243. package/dist/cli/main.mjs.map +1 -1
  244. package/dist/cli/redocly-apis.cjs +33 -12
  245. package/dist/cli/redocly-apis.cjs.map +1 -1
  246. package/dist/cli/redocly-apis.mjs +35 -14
  247. package/dist/cli/redocly-apis.mjs.map +1 -1
  248. package/dist/cli/ref-limits.cjs +15 -1
  249. package/dist/cli/ref-limits.cjs.map +1 -1
  250. package/dist/cli/ref-limits.mjs +15 -2
  251. package/dist/cli/ref-limits.mjs.map +1 -1
  252. package/dist/cli/run-cli.cjs +24 -7
  253. package/dist/cli/run-cli.cjs.map +1 -1
  254. package/dist/cli/run-cli.mjs +25 -8
  255. package/dist/cli/run-cli.mjs.map +1 -1
  256. package/dist/cli/written-flags.cjs +83 -0
  257. package/dist/cli/written-flags.cjs.map +1 -0
  258. package/dist/cli/written-flags.mjs +77 -0
  259. package/dist/cli/written-flags.mjs.map +1 -0
  260. package/dist/domain/cause-secrets.cjs +31 -16
  261. package/dist/domain/cause-secrets.cjs.map +1 -1
  262. package/dist/domain/cause-secrets.mjs +31 -16
  263. package/dist/domain/cause-secrets.mjs.map +1 -1
  264. package/dist/domain/errors.cjs +3 -0
  265. package/dist/domain/errors.cjs.map +1 -1
  266. package/dist/domain/errors.mjs +3 -0
  267. package/dist/domain/errors.mjs.map +1 -1
  268. package/dist/domain/location-text.cjs +15 -0
  269. package/dist/domain/location-text.cjs.map +1 -0
  270. package/dist/domain/location-text.mjs +13 -0
  271. package/dist/domain/location-text.mjs.map +1 -0
  272. package/dist/domain/openapi/document-places.cjs +55 -0
  273. package/dist/domain/openapi/document-places.cjs.map +1 -0
  274. package/dist/domain/openapi/document-places.mjs +53 -0
  275. package/dist/domain/openapi/document-places.mjs.map +1 -0
  276. package/dist/domain/output-fixes.cjs +8 -2
  277. package/dist/domain/output-fixes.cjs.map +1 -1
  278. package/dist/domain/output-fixes.mjs +8 -2
  279. package/dist/domain/output-fixes.mjs.map +1 -1
  280. package/dist/domain/terminal-text.cjs +31 -0
  281. package/dist/domain/terminal-text.cjs.map +1 -0
  282. package/dist/domain/terminal-text.mjs +29 -0
  283. package/dist/domain/terminal-text.mjs.map +1 -0
  284. package/dist/domain/warnings.cjs +1 -0
  285. package/dist/domain/warnings.cjs.map +1 -1
  286. package/dist/domain/warnings.mjs +1 -0
  287. package/dist/domain/warnings.mjs.map +1 -1
  288. package/dist/index.d.cts +29 -18
  289. package/dist/index.d.mts +29 -18
  290. package/dist/index.d.ts +29 -18
  291. package/package.json +1 -1
  292. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  293. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  294. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  295. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  296. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  297. package/src/adapters/redocly-loader/query-document-names.ts +79 -0
  298. package/src/adapters/redocly-loader/query-named-components.ts +200 -0
  299. package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
  300. package/src/adapters/redocly-loader/redocly-schema-loader.ts +63 -17
  301. package/src/adapters/redocly-loader/ref-access.ts +32 -5
  302. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  303. package/src/adapters/redocly-loader/remote-fetch.ts +37 -2
  304. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  305. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  306. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  307. package/src/api/cwd-option.ts +76 -0
  308. package/src/api/default-ports.ts +33 -10
  309. package/src/api/document-refs.ts +29 -1
  310. package/src/api/document-run.ts +7 -32
  311. package/src/api/legacy-utils.ts +1 -1
  312. package/src/api/openapi-ts.ts +20 -4
  313. package/src/api/option-errors.ts +22 -0
  314. package/src/api/ref-limit-options.ts +69 -0
  315. package/src/api/transform-schema.ts +20 -5
  316. package/src/application/ports/file-system.ts +8 -0
  317. package/src/application/ports/redocly-config-source.ts +5 -0
  318. package/src/application/transform/declared-value-types.ts +42 -0
  319. package/src/application/transform/document/document.ts +4 -2
  320. package/src/application/transform/document/exploded-query-values.ts +88 -0
  321. package/src/application/transform/document/header.ts +25 -5
  322. package/src/application/transform/document/parameter.ts +4 -4
  323. package/src/application/transform/document/parameters.ts +45 -10
  324. package/src/application/transform/document/path-item.ts +3 -3
  325. package/src/application/transform/document/path-template-key.ts +152 -0
  326. package/src/application/transform/document/path-template-refs.ts +127 -0
  327. package/src/application/transform/document/paths-enum.ts +23 -9
  328. package/src/application/transform/document/paths.ts +53 -123
  329. package/src/application/transform/document/webhooks.ts +18 -5
  330. package/src/application/transform/footer/document-footer.ts +18 -8
  331. package/src/application/transform/helper-types.ts +4 -4
  332. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  333. package/src/application/transform/ref-pointer/generated-shape.ts +115 -83
  334. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  335. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  336. package/src/application/transform/ref-pointer/original-index.ts +106 -20
  337. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  338. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  339. package/src/application/transform/ref-pointer/property-shape.ts +106 -0
  340. package/src/application/transform/ref-pointer/typed-walk.ts +143 -29
  341. package/src/application/transform/schema/access-flags.ts +5 -2
  342. package/src/application/transform/schema/index-signature-type.ts +31 -0
  343. package/src/application/transform/schema/input-location.ts +35 -0
  344. package/src/application/transform/schema/object-type.ts +18 -8
  345. package/src/application/transform/schema/schema-transform.ts +2 -1
  346. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  347. package/src/cli/api-logger.ts +17 -0
  348. package/src/cli/api-settings.ts +12 -20
  349. package/src/cli/api-writes.ts +11 -3
  350. package/src/cli/cli-arguments.ts +57 -92
  351. package/src/cli/cli-dependencies.ts +7 -2
  352. package/src/cli/cli-errors.ts +23 -0
  353. package/src/cli/cli-flag-names.ts +99 -0
  354. package/src/cli/cli-output.ts +31 -16
  355. package/src/cli/main.ts +12 -5
  356. package/src/cli/redocly-apis.ts +56 -20
  357. package/src/cli/ref-limits.ts +21 -2
  358. package/src/cli/run-cli.ts +39 -7
  359. package/src/cli/written-flags.ts +131 -0
  360. package/src/domain/cause-secrets.ts +59 -25
  361. package/src/domain/errors.ts +3 -0
  362. package/src/domain/location-text.ts +27 -0
  363. package/src/domain/openapi/document-places.ts +78 -0
  364. package/src/domain/output-fixes.ts +9 -2
  365. package/src/domain/terminal-text.ts +44 -0
  366. package/src/domain/warnings.ts +1 -0
@@ -0,0 +1,14 @@
1
+ import { childPointer, ROOT_POINTER } from '../../domain/openapi/json-pointer.mjs';
2
+
3
+ const SCHEMAS_POINTER = childPointer(childPointer(ROOT_POINTER, "components"), "schemas");
4
+ function isContainer(value) {
5
+ return typeof value === "object" && value !== null;
6
+ }
7
+ function componentSchemasOf(document) {
8
+ const components = isContainer(document) ? document.components : void 0;
9
+ const schemas = isContainer(components) ? components.schemas : void 0;
10
+ return isContainer(schemas) ? schemas : void 0;
11
+ }
12
+
13
+ export { SCHEMAS_POINTER, componentSchemasOf };
14
+ //# sourceMappingURL=component-schemas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-schemas.mjs","sources":["../../../src/adapters/redocly-loader/component-schemas.ts"],"sourcesContent":["import { childPointer, ROOT_POINTER } from \"../../domain/openapi/json-pointer.js\";\n\n/** `components.schemas` of a parsed document, which the loader repairs in place. */\n\nexport type ComponentSchemas = Record<string, unknown>;\n\n/** `#/components/schemas`. */\nexport const SCHEMAS_POINTER = childPointer(childPointer(ROOT_POINTER, \"components\"), \"schemas\");\n\nfunction isContainer(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** The `components.schemas` object of a document, when it has one. */\nexport function componentSchemasOf(document: unknown): ComponentSchemas | undefined {\n const components = isContainer(document) ? document.components : undefined;\n const schemas = isContainer(components) ? components.schemas : undefined;\n return isContainer(schemas) ? schemas : undefined;\n}\n"],"names":[],"mappings":";;AAOO,MAAM,kBAAkB,YAAA,CAAa,YAAA,CAAa,YAAA,EAAc,YAAY,GAAG,SAAS;AAE/F,SAAS,YAAY,KAAA,EAAkD;AACrE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAGO,SAAS,mBAAmB,QAAA,EAAiD;AAClF,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,QAAQ,CAAA,GAAI,SAAS,UAAA,GAAa,MAAA;AACjE,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,UAAU,CAAA,GAAI,WAAW,OAAA,GAAU,MAAA;AAC/D,EAAA,OAAO,WAAA,CAAY,OAAO,CAAA,GAAI,OAAA,GAAU,MAAA;AAC1C;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
4
+ const componentSchemas = require('./component-schemas.cjs');
5
+ const refHolders = require('./ref-holders.cjs');
6
+
7
+ function pointMappingNamesAtSchemas(document) {
8
+ const schemas = componentSchemas.componentSchemasOf(document);
9
+ if (schemas === void 0) {
10
+ return;
11
+ }
12
+ for (const mapping of refHolders.findMappings(document)) {
13
+ for (const [name, value] of Object.entries(mapping)) {
14
+ if (typeof value === "string" && Object.hasOwn(schemas, value)) {
15
+ mapping[name] = jsonPointer.childPointer(componentSchemas.SCHEMAS_POINTER, value);
16
+ }
17
+ }
18
+ }
19
+ }
20
+
21
+ exports.pointMappingNamesAtSchemas = pointMappingNamesAtSchemas;
22
+ //# sourceMappingURL=mapping-schema-names.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping-schema-names.cjs","sources":["../../../src/adapters/redocly-loader/mapping-schema-names.ts"],"sourcesContent":["import { childPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { componentSchemasOf, SCHEMAS_POINTER } from \"./component-schemas.js\";\nimport { findMappings } from \"./ref-holders.js\";\n\n/**\n * A discriminator `mapping` value may be a schema name (`cat: Cat`) or a URI reference. Redocly\n * reads every value as a `$ref`, so a name failed with \"Can't resolve $ref\". OpenAPI 3.1.1\n * (§4.8.25) leaves a value that is both to the implementation and recommends the schema name; a\n * relative URI is then written `./Cat`. So a value that is a key of the document's\n * `components.schemas` becomes the pointer to that schema, in place, before the `$ref`s are\n * resolved. Any other value stays a URI reference.\n */\nexport function pointMappingNamesAtSchemas(document: unknown): void {\n const schemas = componentSchemasOf(document);\n if (schemas === undefined) {\n return;\n }\n for (const mapping of findMappings(document)) {\n for (const [name, value] of Object.entries(mapping)) {\n if (typeof value === \"string\" && Object.hasOwn(schemas, value)) {\n mapping[name] = childPointer(SCHEMAS_POINTER, value);\n }\n }\n }\n}\n"],"names":["componentSchemasOf","findMappings","childPointer","SCHEMAS_POINTER"],"mappings":";;;;;;AAYO,SAAS,2BAA2B,QAAA,EAAyB;AAClE,EAAA,MAAM,OAAA,GAAUA,oCAAmB,QAAQ,CAAA;AAC3C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,OAAA,IAAWC,uBAAA,CAAa,QAAQ,CAAA,EAAG;AAC5C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,EAAG;AAC9D,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAIC,wBAAA,CAAaC,gCAAA,EAAiB,KAAK,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;;"}
@@ -0,0 +1,20 @@
1
+ import { childPointer } from '../../domain/openapi/json-pointer.mjs';
2
+ import { componentSchemasOf, SCHEMAS_POINTER } from './component-schemas.mjs';
3
+ import { findMappings } from './ref-holders.mjs';
4
+
5
+ function pointMappingNamesAtSchemas(document) {
6
+ const schemas = componentSchemasOf(document);
7
+ if (schemas === void 0) {
8
+ return;
9
+ }
10
+ for (const mapping of findMappings(document)) {
11
+ for (const [name, value] of Object.entries(mapping)) {
12
+ if (typeof value === "string" && Object.hasOwn(schemas, value)) {
13
+ mapping[name] = childPointer(SCHEMAS_POINTER, value);
14
+ }
15
+ }
16
+ }
17
+ }
18
+
19
+ export { pointMappingNamesAtSchemas };
20
+ //# sourceMappingURL=mapping-schema-names.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping-schema-names.mjs","sources":["../../../src/adapters/redocly-loader/mapping-schema-names.ts"],"sourcesContent":["import { childPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { componentSchemasOf, SCHEMAS_POINTER } from \"./component-schemas.js\";\nimport { findMappings } from \"./ref-holders.js\";\n\n/**\n * A discriminator `mapping` value may be a schema name (`cat: Cat`) or a URI reference. Redocly\n * reads every value as a `$ref`, so a name failed with \"Can't resolve $ref\". OpenAPI 3.1.1\n * (§4.8.25) leaves a value that is both to the implementation and recommends the schema name; a\n * relative URI is then written `./Cat`. So a value that is a key of the document's\n * `components.schemas` becomes the pointer to that schema, in place, before the `$ref`s are\n * resolved. Any other value stays a URI reference.\n */\nexport function pointMappingNamesAtSchemas(document: unknown): void {\n const schemas = componentSchemasOf(document);\n if (schemas === undefined) {\n return;\n }\n for (const mapping of findMappings(document)) {\n for (const [name, value] of Object.entries(mapping)) {\n if (typeof value === \"string\" && Object.hasOwn(schemas, value)) {\n mapping[name] = childPointer(SCHEMAS_POINTER, value);\n }\n }\n }\n}\n"],"names":[],"mappings":";;;;AAYO,SAAS,2BAA2B,QAAA,EAAyB;AAClE,EAAA,MAAM,OAAA,GAAU,mBAAmB,QAAQ,CAAA;AAC3C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA;AAAA,EACF;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,YAAA,CAAa,QAAQ,CAAA,EAAG;AAC5C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA,EAAG;AAC9D,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,YAAA,CAAa,eAAA,EAAiB,KAAK,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AACF;;"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const REMOTE_URL_RE = /^https?:\/\//;
4
+ const PATH_SEPARATOR_RE = /[/\\]/;
5
+ const EXTENSION_RE = /\.[^.]+$/;
6
+ function redoclyBaseName(ref) {
7
+ return (ref.split(PATH_SEPARATOR_RE).at(-1) ?? "").replace(EXTENSION_RE, "");
8
+ }
9
+ function queryFreeBaseName(url) {
10
+ const withoutQuery = new URL(url.pathname, url.origin).href;
11
+ return redoclyBaseName(withoutQuery) || url.hostname;
12
+ }
13
+ function documentNamesOf(ref) {
14
+ const url = REMOTE_URL_RE.test(ref) && URL.canParse(ref) ? new URL(ref) : void 0;
15
+ if (url === void 0 || url.search === "") {
16
+ return void 0;
17
+ }
18
+ const names = { named: redoclyBaseName(ref), clean: queryFreeBaseName(url) };
19
+ return names.named === names.clean ? void 0 : names;
20
+ }
21
+ function isNode(value) {
22
+ return typeof value === "object" && value !== null;
23
+ }
24
+ function nodesOf(parsed) {
25
+ const visited = /* @__PURE__ */ new Set();
26
+ const pending = isNode(parsed) ? [parsed] : [];
27
+ for (let node = pending.pop(); node !== void 0; node = pending.pop()) {
28
+ if (!visited.has(node)) {
29
+ visited.add(node);
30
+ pending.push(...Object.values(node).filter(isNode));
31
+ }
32
+ }
33
+ return [...visited];
34
+ }
35
+ function queryDocumentNames(documents) {
36
+ const byNode = /* @__PURE__ */ new Map();
37
+ for (const { source, parsed } of documents) {
38
+ const names = documentNamesOf(source);
39
+ if (names === void 0) {
40
+ continue;
41
+ }
42
+ for (const node of nodesOf(parsed)) {
43
+ byNode.set(node, names);
44
+ }
45
+ }
46
+ return byNode;
47
+ }
48
+
49
+ exports.queryDocumentNames = queryDocumentNames;
50
+ //# sourceMappingURL=query-document-names.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-document-names.cjs","sources":["../../../src/adapters/redocly-loader/query-document-names.ts"],"sourcesContent":["import type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Which loaded document with a query each node comes from, and the names Redocly and the loader\n * give that document. Redocly names a component after the text behind the last `/` of the URL,\n * query included, so `pet.json?ref=feature/new-api` and `owner.yaml?ref=feature/new-api` both give\n * `new-api`: the name alone cannot tell the documents apart, the node can.\n */\n\nconst REMOTE_URL_RE = /^https?:\\/\\//;\nconst PATH_SEPARATOR_RE = /[/\\\\]/;\nconst EXTENSION_RE = /\\.[^.]+$/;\n\n/** The base name Redocly gives a document and the one without the query. */\nexport interface DocumentNames {\n readonly named: string;\n readonly clean: string;\n}\n\n/** The base name Redocly 1.34 gives a document (`refBaseName`): the last segment, no extension. */\nfunction redoclyBaseName(ref: string): string {\n return (ref.split(PATH_SEPARATOR_RE).at(-1) ?? \"\").replace(EXTENSION_RE, \"\");\n}\n\n/**\n * The base name of the URL without its query and fragment. A URL with no last segment\n * (`https://host/?key=…`) is named after its host, so the name is never empty.\n */\nfunction queryFreeBaseName(url: URL): string {\n const withoutQuery = new URL(url.pathname, url.origin).href;\n return redoclyBaseName(withoutQuery) || url.hostname;\n}\n\n/** The names of a remote document with a query whose Redocly name keeps it; else undefined. */\nfunction documentNamesOf(ref: string): DocumentNames | undefined {\n const url = REMOTE_URL_RE.test(ref) && URL.canParse(ref) ? new URL(ref) : undefined;\n if (url === undefined || url.search === \"\") {\n return undefined;\n }\n const names = { named: redoclyBaseName(ref), clean: queryFreeBaseName(url) };\n return names.named === names.clean ? undefined : names;\n}\n\nfunction isNode(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Every object and array of a parsed document, each once (a YAML alias can repeat one). */\nfunction nodesOf(parsed: unknown): object[] {\n const visited = new Set<object>();\n const pending = isNode(parsed) ? [parsed] : [];\n for (let node = pending.pop(); node !== undefined; node = pending.pop()) {\n if (!visited.has(node)) {\n visited.add(node);\n pending.push(...Object.values(node).filter(isNode));\n }\n }\n return [...visited];\n}\n\n/**\n * The names of the document each node of a loaded document with a query belongs to. The bundle\n * keeps the nodes of the loaded documents as its components, so a component finds its document.\n */\nexport function queryDocumentNames(\n documents: readonly LoadedDocument[],\n): ReadonlyMap<object, DocumentNames> {\n const byNode = new Map<object, DocumentNames>();\n for (const { source, parsed } of documents) {\n const names = documentNamesOf(source);\n if (names === undefined) {\n continue;\n }\n for (const node of nodesOf(parsed)) {\n byNode.set(node, names);\n }\n }\n return byNode;\n}\n"],"names":[],"mappings":";;AASA,MAAM,aAAA,GAAgB,cAAA;AACtB,MAAM,iBAAA,GAAoB,OAAA;AAC1B,MAAM,YAAA,GAAe,UAAA;AASrB,SAAS,gBAAgB,GAAA,EAAqB;AAC5C,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,iBAAiB,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC7E;AAMA,SAAS,kBAAkB,GAAA,EAAkB;AAC3C,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,IAAI,QAAA,EAAU,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA;AACvD,EAAA,OAAO,eAAA,CAAgB,YAAY,CAAA,IAAK,GAAA,CAAI,QAAA;AAC9C;AAGA,SAAS,gBAAgB,GAAA,EAAwC;AAC/D,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AAC1E,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,EAAA,EAAI;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,eAAA,CAAgB,GAAG,CAAA,EAAG,KAAA,EAAO,iBAAA,CAAkB,GAAG,CAAA,EAAE;AAC3E,EAAA,OAAO,KAAA,CAAM,KAAA,KAAU,KAAA,CAAM,KAAA,GAAQ,MAAA,GAAY,KAAA;AACnD;AAEA,SAAS,OAAO,KAAA,EAAiC;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAGA,SAAS,QAAQ,MAAA,EAA2B;AAC1C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,UAAU,MAAA,CAAO,MAAM,IAAI,CAAC,MAAM,IAAI,EAAC;AAC7C,EAAA,KAAA,IAAS,IAAA,GAAO,QAAQ,GAAA,EAAI,EAAG,SAAS,MAAA,EAAW,IAAA,GAAO,OAAA,CAAQ,GAAA,EAAI,EAAG;AACvE,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AACpB;AAMO,SAAS,mBACd,SAAA,EACoC;AACpC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2B;AAC9C,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,MAAA,EAAO,IAAK,SAAA,EAAW;AAC1C,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;"}
@@ -0,0 +1,48 @@
1
+ const REMOTE_URL_RE = /^https?:\/\//;
2
+ const PATH_SEPARATOR_RE = /[/\\]/;
3
+ const EXTENSION_RE = /\.[^.]+$/;
4
+ function redoclyBaseName(ref) {
5
+ return (ref.split(PATH_SEPARATOR_RE).at(-1) ?? "").replace(EXTENSION_RE, "");
6
+ }
7
+ function queryFreeBaseName(url) {
8
+ const withoutQuery = new URL(url.pathname, url.origin).href;
9
+ return redoclyBaseName(withoutQuery) || url.hostname;
10
+ }
11
+ function documentNamesOf(ref) {
12
+ const url = REMOTE_URL_RE.test(ref) && URL.canParse(ref) ? new URL(ref) : void 0;
13
+ if (url === void 0 || url.search === "") {
14
+ return void 0;
15
+ }
16
+ const names = { named: redoclyBaseName(ref), clean: queryFreeBaseName(url) };
17
+ return names.named === names.clean ? void 0 : names;
18
+ }
19
+ function isNode(value) {
20
+ return typeof value === "object" && value !== null;
21
+ }
22
+ function nodesOf(parsed) {
23
+ const visited = /* @__PURE__ */ new Set();
24
+ const pending = isNode(parsed) ? [parsed] : [];
25
+ for (let node = pending.pop(); node !== void 0; node = pending.pop()) {
26
+ if (!visited.has(node)) {
27
+ visited.add(node);
28
+ pending.push(...Object.values(node).filter(isNode));
29
+ }
30
+ }
31
+ return [...visited];
32
+ }
33
+ function queryDocumentNames(documents) {
34
+ const byNode = /* @__PURE__ */ new Map();
35
+ for (const { source, parsed } of documents) {
36
+ const names = documentNamesOf(source);
37
+ if (names === void 0) {
38
+ continue;
39
+ }
40
+ for (const node of nodesOf(parsed)) {
41
+ byNode.set(node, names);
42
+ }
43
+ }
44
+ return byNode;
45
+ }
46
+
47
+ export { queryDocumentNames };
48
+ //# sourceMappingURL=query-document-names.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-document-names.mjs","sources":["../../../src/adapters/redocly-loader/query-document-names.ts"],"sourcesContent":["import type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Which loaded document with a query each node comes from, and the names Redocly and the loader\n * give that document. Redocly names a component after the text behind the last `/` of the URL,\n * query included, so `pet.json?ref=feature/new-api` and `owner.yaml?ref=feature/new-api` both give\n * `new-api`: the name alone cannot tell the documents apart, the node can.\n */\n\nconst REMOTE_URL_RE = /^https?:\\/\\//;\nconst PATH_SEPARATOR_RE = /[/\\\\]/;\nconst EXTENSION_RE = /\\.[^.]+$/;\n\n/** The base name Redocly gives a document and the one without the query. */\nexport interface DocumentNames {\n readonly named: string;\n readonly clean: string;\n}\n\n/** The base name Redocly 1.34 gives a document (`refBaseName`): the last segment, no extension. */\nfunction redoclyBaseName(ref: string): string {\n return (ref.split(PATH_SEPARATOR_RE).at(-1) ?? \"\").replace(EXTENSION_RE, \"\");\n}\n\n/**\n * The base name of the URL without its query and fragment. A URL with no last segment\n * (`https://host/?key=…`) is named after its host, so the name is never empty.\n */\nfunction queryFreeBaseName(url: URL): string {\n const withoutQuery = new URL(url.pathname, url.origin).href;\n return redoclyBaseName(withoutQuery) || url.hostname;\n}\n\n/** The names of a remote document with a query whose Redocly name keeps it; else undefined. */\nfunction documentNamesOf(ref: string): DocumentNames | undefined {\n const url = REMOTE_URL_RE.test(ref) && URL.canParse(ref) ? new URL(ref) : undefined;\n if (url === undefined || url.search === \"\") {\n return undefined;\n }\n const names = { named: redoclyBaseName(ref), clean: queryFreeBaseName(url) };\n return names.named === names.clean ? undefined : names;\n}\n\nfunction isNode(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Every object and array of a parsed document, each once (a YAML alias can repeat one). */\nfunction nodesOf(parsed: unknown): object[] {\n const visited = new Set<object>();\n const pending = isNode(parsed) ? [parsed] : [];\n for (let node = pending.pop(); node !== undefined; node = pending.pop()) {\n if (!visited.has(node)) {\n visited.add(node);\n pending.push(...Object.values(node).filter(isNode));\n }\n }\n return [...visited];\n}\n\n/**\n * The names of the document each node of a loaded document with a query belongs to. The bundle\n * keeps the nodes of the loaded documents as its components, so a component finds its document.\n */\nexport function queryDocumentNames(\n documents: readonly LoadedDocument[],\n): ReadonlyMap<object, DocumentNames> {\n const byNode = new Map<object, DocumentNames>();\n for (const { source, parsed } of documents) {\n const names = documentNamesOf(source);\n if (names === undefined) {\n continue;\n }\n for (const node of nodesOf(parsed)) {\n byNode.set(node, names);\n }\n }\n return byNode;\n}\n"],"names":[],"mappings":"AASA,MAAM,aAAA,GAAgB,cAAA;AACtB,MAAM,iBAAA,GAAoB,OAAA;AAC1B,MAAM,YAAA,GAAe,UAAA;AASrB,SAAS,gBAAgB,GAAA,EAAqB;AAC5C,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,iBAAiB,CAAA,CAAE,EAAA,CAAG,EAAE,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC7E;AAMA,SAAS,kBAAkB,GAAA,EAAkB;AAC3C,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,IAAI,QAAA,EAAU,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA;AACvD,EAAA,OAAO,eAAA,CAAgB,YAAY,CAAA,IAAK,GAAA,CAAI,QAAA;AAC9C;AAGA,SAAS,gBAAgB,GAAA,EAAwC;AAC/D,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AAC1E,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,KAAW,EAAA,EAAI;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,eAAA,CAAgB,GAAG,CAAA,EAAG,KAAA,EAAO,iBAAA,CAAkB,GAAG,CAAA,EAAE;AAC3E,EAAA,OAAO,KAAA,CAAM,KAAA,KAAU,KAAA,CAAM,KAAA,GAAQ,MAAA,GAAY,KAAA;AACnD;AAEA,SAAS,OAAO,KAAA,EAAiC;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAGA,SAAS,QAAQ,MAAA,EAA2B;AAC1C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,UAAU,MAAA,CAAO,MAAM,IAAI,CAAC,MAAM,IAAI,EAAC;AAC7C,EAAA,KAAA,IAAS,IAAA,GAAO,QAAQ,GAAA,EAAI,EAAG,SAAS,MAAA,EAAW,IAAA,GAAO,OAAA,CAAQ,GAAA,EAAI,EAAG;AACvE,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AACpB;AAMO,SAAS,mBACd,SAAA,EACoC;AACpC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2B;AAC9C,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,MAAA,EAAO,IAAK,SAAA,EAAW;AAC1C,IAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;"}
@@ -0,0 +1,129 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
4
+ const queryDocumentNames = require('./query-document-names.cjs');
5
+ const refHolders = require('./ref-holders.cjs');
6
+
7
+ const COMPONENTS_KEY = "components";
8
+ const NAME_SUFFIX_STARTS = ["_", "-"];
9
+ const FIRST_SERIAL = 2;
10
+ const REDOCLY_SERIAL_RE = /-\d+$/;
11
+ function isContainer(value) {
12
+ return typeof value === "object" && value !== null && !Array.isArray(value);
13
+ }
14
+ function componentsOf(document) {
15
+ const components = isContainer(document) ? document[COMPONENTS_KEY] : void 0;
16
+ if (!isContainer(components)) {
17
+ return {};
18
+ }
19
+ const groups = {};
20
+ for (const [group, entries] of Object.entries(components)) {
21
+ if (isContainer(entries)) {
22
+ groups[group] = entries;
23
+ }
24
+ }
25
+ return groups;
26
+ }
27
+ function componentKeysOf(document) {
28
+ const keys = /* @__PURE__ */ new Map();
29
+ for (const [group, entries] of Object.entries(componentsOf(document))) {
30
+ keys.set(group, new Set(Object.keys(entries)));
31
+ }
32
+ return keys;
33
+ }
34
+ function queryFreeName(key, names) {
35
+ if (names === void 0) {
36
+ return void 0;
37
+ }
38
+ const { named, clean } = names;
39
+ const hasBaseName = key === named || NAME_SUFFIX_STARTS.some((start) => key.startsWith(`${named}${start}`));
40
+ return hasBaseName ? `${clean}${key.slice(named.length).replace(REDOCLY_SERIAL_RE, "")}` : void 0;
41
+ }
42
+ function freeName(name, taken) {
43
+ let free = name;
44
+ for (let serial = FIRST_SERIAL; taken.has(free); serial += 1) {
45
+ free = `${name}-${serial}`;
46
+ }
47
+ return free;
48
+ }
49
+ function renameGroup(entries, keysBefore, documentNames) {
50
+ const renames = /* @__PURE__ */ new Map();
51
+ const taken = new Set(Object.keys(entries));
52
+ for (const key of Object.keys(entries)) {
53
+ const node = entries[key];
54
+ const names = typeof node === "object" && node !== null ? documentNames.get(node) : void 0;
55
+ const name = keysBefore.has(key) ? void 0 : queryFreeName(key, names);
56
+ if (name !== void 0) {
57
+ taken.delete(key);
58
+ const free = freeName(name, taken);
59
+ taken.add(free);
60
+ renames.set(key, free);
61
+ }
62
+ }
63
+ for (const [key, value] of Object.entries(entries)) {
64
+ delete entries[key];
65
+ entries[renames.get(key) ?? key] = value;
66
+ }
67
+ return renames;
68
+ }
69
+ const COLLISION_RE = /^Two schemas are referenced with the same name but different content\. Renamed (.+) to (.+)\.$/;
70
+ const SERIAL_RE = /^-\d+$/;
71
+ function resolvesCollision(message, renames) {
72
+ const [, first, second] = COLLISION_RE.exec(message) ?? [];
73
+ if (first === void 0 || second === void 0) {
74
+ return false;
75
+ }
76
+ const renamed = new Map([...renames.values()].flatMap((group) => [...group]));
77
+ const [newFirst, newSecond] = [renamed.get(first) ?? first, renamed.get(second) ?? second];
78
+ return !(newSecond.startsWith(newFirst) && SERIAL_RE.test(newSecond.slice(newFirst.length)));
79
+ }
80
+ function renamedPointer(pointer, renames) {
81
+ if (!pointer.startsWith(`${jsonPointer.ROOT_POINTER}/`)) {
82
+ return pointer;
83
+ }
84
+ const [components, group = "", name = "", ...rest] = jsonPointer.parseRefPointer(jsonPointer.canonicalRef(pointer));
85
+ const renamed = components === COMPONENTS_KEY ? renames.get(group)?.get(name) : void 0;
86
+ return renamed === void 0 ? pointer : jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, [COMPONENTS_KEY, group, renamed, ...rest]);
87
+ }
88
+ function renamedText(text, renames) {
89
+ const pairs = [...renames.values()].flatMap((group) => [...group]);
90
+ pairs.sort(([a], [b]) => b.length - a.length);
91
+ return pairs.reduce((shown, [old, renamed]) => shown.replaceAll(old, renamed), text);
92
+ }
93
+ function rewriteRefs(document, renaming) {
94
+ for (const { node } of refHolders.findRefHolders(document)) {
95
+ node.$ref = renaming.pointer(node.$ref);
96
+ }
97
+ for (const mapping of refHolders.findMappings(document)) {
98
+ for (const [name, value] of Object.entries(mapping)) {
99
+ if (typeof value === "string") {
100
+ mapping[name] = renaming.pointer(value);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ function renameQueryNamedComponents(bundled, keysBefore, documents) {
106
+ const documentNames = queryDocumentNames.queryDocumentNames(documents);
107
+ const renames = /* @__PURE__ */ new Map();
108
+ if (documentNames.size > 0) {
109
+ for (const [group, entries] of Object.entries(componentsOf(bundled))) {
110
+ const groupRenames = renameGroup(entries, keysBefore.get(group) ?? /* @__PURE__ */ new Set(), documentNames);
111
+ if (groupRenames.size > 0) {
112
+ renames.set(group, groupRenames);
113
+ }
114
+ }
115
+ }
116
+ const renaming = {
117
+ pointer: (pointer) => renamedPointer(pointer, renames),
118
+ text: (text) => renamedText(text, renames),
119
+ isResolvedCollision: (message) => resolvesCollision(message, renames)
120
+ };
121
+ if (renames.size > 0) {
122
+ rewriteRefs(bundled, renaming);
123
+ }
124
+ return renaming;
125
+ }
126
+
127
+ exports.componentKeysOf = componentKeysOf;
128
+ exports.renameQueryNamedComponents = renameQueryNamedComponents;
129
+ //# sourceMappingURL=query-named-components.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-named-components.cjs","sources":["../../../src/adapters/redocly-loader/query-named-components.ts"],"sourcesContent":["import {\n appendPointer,\n canonicalRef,\n parseRefPointer,\n ROOT_POINTER,\n} from \"../../domain/openapi/json-pointer.js\";\nimport { type DocumentNames, queryDocumentNames } from \"./query-document-names.js\";\nimport { findMappings, findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the last segment of the\n * document's URL, without its extension, when the pointer gives no free name (a `$ref` to a whole\n * document, or two targets with the same pointer). The query stays in that name, and a query holds\n * API keys and signatures, so `https://host/schemas/pet?token=…` became the component\n * `pet?token=…` in the generated file and in messages (threat model T4b). This renames such a\n * component after the URL without its query: `pet`, with a `-2` suffix when that name is taken.\n * Each component is matched to its document by its node, since two URLs can give one name.\n */\n\ntype Components = Record<string, Record<string, unknown>>;\n\n/** The keys of each `components` group before bundling: the bundle edits the document in place. */\nexport type ComponentKeys = ReadonlyMap<string, ReadonlySet<string>>;\n\n/** Old and new name of each renamed component, per `components` group. */\ntype Renames = Map<string, Map<string, string>>;\n\nconst COMPONENTS_KEY = \"components\";\n/** What Redocly puts between the base name and the rest of a component name. */\nconst NAME_SUFFIX_STARTS = [\"_\", \"-\"];\nconst FIRST_SERIAL = 2;\n/**\n * The serial Redocly adds when a name is taken (`pet-2`). Two URLs that differ only in the query\n * took one name; without the query they may not, so the serial is chosen again (`freeName`).\n */\nconst REDOCLY_SERIAL_RE = /-\\d+$/;\n\nfunction isContainer(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction componentsOf(document: unknown): Components {\n const components = isContainer(document) ? document[COMPONENTS_KEY] : undefined;\n if (!isContainer(components)) {\n return {};\n }\n const groups: Components = {};\n for (const [group, entries] of Object.entries(components)) {\n if (isContainer(entries)) {\n groups[group] = entries;\n }\n }\n return groups;\n}\n\n/** The keys of every `components` group of a document. */\nexport function componentKeysOf(document: unknown): ComponentKeys {\n const keys = new Map<string, ReadonlySet<string>>();\n for (const [group, entries] of Object.entries(componentsOf(document))) {\n keys.set(group, new Set(Object.keys(entries)));\n }\n return keys;\n}\n\n/** The name a component of a document with a query gets; undefined for any other component. */\nfunction queryFreeName(key: string, names: DocumentNames | undefined): string | undefined {\n if (names === undefined) {\n return undefined;\n }\n const { named, clean } = names;\n const hasBaseName =\n key === named || NAME_SUFFIX_STARTS.some((start) => key.startsWith(`${named}${start}`));\n return hasBaseName\n ? `${clean}${key.slice(named.length).replace(REDOCLY_SERIAL_RE, \"\")}`\n : undefined;\n}\n\nfunction freeName(name: string, taken: ReadonlySet<string>): string {\n let free = name;\n for (let serial = FIRST_SERIAL; taken.has(free); serial += 1) {\n free = `${name}-${serial}`;\n }\n return free;\n}\n\n/** Rename the bundled components of one group in place, keeping their order. */\nfunction renameGroup(\n entries: Record<string, unknown>,\n keysBefore: ReadonlySet<string>,\n documentNames: ReadonlyMap<object, DocumentNames>,\n): Map<string, string> {\n const renames = new Map<string, string>();\n const taken = new Set(Object.keys(entries));\n for (const key of Object.keys(entries)) {\n const node = entries[key];\n const names = typeof node === \"object\" && node !== null ? documentNames.get(node) : undefined;\n const name = keysBefore.has(key) ? undefined : queryFreeName(key, names);\n if (name !== undefined) {\n taken.delete(key);\n const free = freeName(name, taken);\n taken.add(free);\n renames.set(key, free);\n }\n }\n for (const [key, value] of Object.entries(entries)) {\n delete entries[key];\n entries[renames.get(key) ?? key] = value;\n }\n return renames;\n}\n\n/** Rewrites pointers and messages that name a renamed component. */\nexport interface ComponentRenaming {\n /** The pointer with a renamed component's new name; any other text as it is. */\n readonly pointer: (pointer: string) => string;\n /** The text with each renamed component's old name replaced by its new name. */\n readonly text: (text: string) => string;\n /**\n * Whether the problem is Redocly's report of two components with one name that the new names\n * tell apart: it renamed `new-api` to `new-api-2`, and the documents are now `pet` and `owner`.\n */\n readonly isResolvedCollision: (message: string) => boolean;\n}\n\n/** The warning Redocly 1.34 gives when it adds a serial to a component name. */\nconst COLLISION_RE =\n /^Two schemas are referenced with the same name but different content\\. Renamed (.+) to (.+)\\.$/;\nconst SERIAL_RE = /^-\\d+$/;\n\nfunction resolvesCollision(message: string, renames: Renames): boolean {\n const [, first, second] = COLLISION_RE.exec(message) ?? [];\n if (first === undefined || second === undefined) {\n return false;\n }\n const renamed = new Map([...renames.values()].flatMap((group) => [...group]));\n const [newFirst, newSecond] = [renamed.get(first) ?? first, renamed.get(second) ?? second];\n return !(newSecond.startsWith(newFirst) && SERIAL_RE.test(newSecond.slice(newFirst.length)));\n}\n\nfunction renamedPointer(pointer: string, renames: Renames): string {\n if (!pointer.startsWith(`${ROOT_POINTER}/`)) {\n return pointer;\n }\n const [components, group = \"\", name = \"\", ...rest] = parseRefPointer(canonicalRef(pointer));\n const renamed = components === COMPONENTS_KEY ? renames.get(group)?.get(name) : undefined;\n return renamed === undefined\n ? pointer\n : appendPointer(ROOT_POINTER, [COMPONENTS_KEY, group, renamed, ...rest]);\n}\n\nfunction renamedText(text: string, renames: Renames): string {\n const pairs = [...renames.values()].flatMap((group) => [...group]);\n // The longest old name first, so a name that starts another one does not split it.\n pairs.sort(([a], [b]) => b.length - a.length);\n return pairs.reduce((shown, [old, renamed]) => shown.replaceAll(old, renamed), text);\n}\n\nfunction rewriteRefs(document: unknown, renaming: ComponentRenaming): void {\n for (const { node } of findRefHolders(document)) {\n node.$ref = renaming.pointer(node.$ref);\n }\n for (const mapping of findMappings(document)) {\n for (const [name, value] of Object.entries(mapping)) {\n if (typeof value === \"string\") {\n mapping[name] = renaming.pointer(value);\n }\n }\n }\n}\n\n/**\n * Rename, in place, the components the bundle named after a URL with a query, and every local\n * `$ref` and `mapping` value that names them. `documents` are the documents the load read.\n */\nexport function renameQueryNamedComponents(\n bundled: unknown,\n keysBefore: ComponentKeys,\n documents: readonly LoadedDocument[],\n): ComponentRenaming {\n const documentNames = queryDocumentNames(documents);\n const renames: Renames = new Map();\n if (documentNames.size > 0) {\n for (const [group, entries] of Object.entries(componentsOf(bundled))) {\n const groupRenames = renameGroup(entries, keysBefore.get(group) ?? new Set(), documentNames);\n if (groupRenames.size > 0) {\n renames.set(group, groupRenames);\n }\n }\n }\n const renaming: ComponentRenaming = {\n pointer: (pointer) => renamedPointer(pointer, renames),\n text: (text) => renamedText(text, renames),\n isResolvedCollision: (message) => resolvesCollision(message, renames),\n };\n if (renames.size > 0) {\n rewriteRefs(bundled, renaming);\n }\n return renaming;\n}\n"],"names":["ROOT_POINTER","parseRefPointer","canonicalRef","appendPointer","findRefHolders","findMappings","queryDocumentNames"],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { ROOT_POINTER, parseRefPointer, canonicalRef, appendPointer } from '../../domain/openapi/json-pointer.mjs';
2
+ import { queryDocumentNames } from './query-document-names.mjs';
3
+ import { findRefHolders, findMappings } from './ref-holders.mjs';
4
+
5
+ const COMPONENTS_KEY = "components";
6
+ const NAME_SUFFIX_STARTS = ["_", "-"];
7
+ const FIRST_SERIAL = 2;
8
+ const REDOCLY_SERIAL_RE = /-\d+$/;
9
+ function isContainer(value) {
10
+ return typeof value === "object" && value !== null && !Array.isArray(value);
11
+ }
12
+ function componentsOf(document) {
13
+ const components = isContainer(document) ? document[COMPONENTS_KEY] : void 0;
14
+ if (!isContainer(components)) {
15
+ return {};
16
+ }
17
+ const groups = {};
18
+ for (const [group, entries] of Object.entries(components)) {
19
+ if (isContainer(entries)) {
20
+ groups[group] = entries;
21
+ }
22
+ }
23
+ return groups;
24
+ }
25
+ function componentKeysOf(document) {
26
+ const keys = /* @__PURE__ */ new Map();
27
+ for (const [group, entries] of Object.entries(componentsOf(document))) {
28
+ keys.set(group, new Set(Object.keys(entries)));
29
+ }
30
+ return keys;
31
+ }
32
+ function queryFreeName(key, names) {
33
+ if (names === void 0) {
34
+ return void 0;
35
+ }
36
+ const { named, clean } = names;
37
+ const hasBaseName = key === named || NAME_SUFFIX_STARTS.some((start) => key.startsWith(`${named}${start}`));
38
+ return hasBaseName ? `${clean}${key.slice(named.length).replace(REDOCLY_SERIAL_RE, "")}` : void 0;
39
+ }
40
+ function freeName(name, taken) {
41
+ let free = name;
42
+ for (let serial = FIRST_SERIAL; taken.has(free); serial += 1) {
43
+ free = `${name}-${serial}`;
44
+ }
45
+ return free;
46
+ }
47
+ function renameGroup(entries, keysBefore, documentNames) {
48
+ const renames = /* @__PURE__ */ new Map();
49
+ const taken = new Set(Object.keys(entries));
50
+ for (const key of Object.keys(entries)) {
51
+ const node = entries[key];
52
+ const names = typeof node === "object" && node !== null ? documentNames.get(node) : void 0;
53
+ const name = keysBefore.has(key) ? void 0 : queryFreeName(key, names);
54
+ if (name !== void 0) {
55
+ taken.delete(key);
56
+ const free = freeName(name, taken);
57
+ taken.add(free);
58
+ renames.set(key, free);
59
+ }
60
+ }
61
+ for (const [key, value] of Object.entries(entries)) {
62
+ delete entries[key];
63
+ entries[renames.get(key) ?? key] = value;
64
+ }
65
+ return renames;
66
+ }
67
+ const COLLISION_RE = /^Two schemas are referenced with the same name but different content\. Renamed (.+) to (.+)\.$/;
68
+ const SERIAL_RE = /^-\d+$/;
69
+ function resolvesCollision(message, renames) {
70
+ const [, first, second] = COLLISION_RE.exec(message) ?? [];
71
+ if (first === void 0 || second === void 0) {
72
+ return false;
73
+ }
74
+ const renamed = new Map([...renames.values()].flatMap((group) => [...group]));
75
+ const [newFirst, newSecond] = [renamed.get(first) ?? first, renamed.get(second) ?? second];
76
+ return !(newSecond.startsWith(newFirst) && SERIAL_RE.test(newSecond.slice(newFirst.length)));
77
+ }
78
+ function renamedPointer(pointer, renames) {
79
+ if (!pointer.startsWith(`${ROOT_POINTER}/`)) {
80
+ return pointer;
81
+ }
82
+ const [components, group = "", name = "", ...rest] = parseRefPointer(canonicalRef(pointer));
83
+ const renamed = components === COMPONENTS_KEY ? renames.get(group)?.get(name) : void 0;
84
+ return renamed === void 0 ? pointer : appendPointer(ROOT_POINTER, [COMPONENTS_KEY, group, renamed, ...rest]);
85
+ }
86
+ function renamedText(text, renames) {
87
+ const pairs = [...renames.values()].flatMap((group) => [...group]);
88
+ pairs.sort(([a], [b]) => b.length - a.length);
89
+ return pairs.reduce((shown, [old, renamed]) => shown.replaceAll(old, renamed), text);
90
+ }
91
+ function rewriteRefs(document, renaming) {
92
+ for (const { node } of findRefHolders(document)) {
93
+ node.$ref = renaming.pointer(node.$ref);
94
+ }
95
+ for (const mapping of findMappings(document)) {
96
+ for (const [name, value] of Object.entries(mapping)) {
97
+ if (typeof value === "string") {
98
+ mapping[name] = renaming.pointer(value);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ function renameQueryNamedComponents(bundled, keysBefore, documents) {
104
+ const documentNames = queryDocumentNames(documents);
105
+ const renames = /* @__PURE__ */ new Map();
106
+ if (documentNames.size > 0) {
107
+ for (const [group, entries] of Object.entries(componentsOf(bundled))) {
108
+ const groupRenames = renameGroup(entries, keysBefore.get(group) ?? /* @__PURE__ */ new Set(), documentNames);
109
+ if (groupRenames.size > 0) {
110
+ renames.set(group, groupRenames);
111
+ }
112
+ }
113
+ }
114
+ const renaming = {
115
+ pointer: (pointer) => renamedPointer(pointer, renames),
116
+ text: (text) => renamedText(text, renames),
117
+ isResolvedCollision: (message) => resolvesCollision(message, renames)
118
+ };
119
+ if (renames.size > 0) {
120
+ rewriteRefs(bundled, renaming);
121
+ }
122
+ return renaming;
123
+ }
124
+
125
+ export { componentKeysOf, renameQueryNamedComponents };
126
+ //# sourceMappingURL=query-named-components.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-named-components.mjs","sources":["../../../src/adapters/redocly-loader/query-named-components.ts"],"sourcesContent":["import {\n appendPointer,\n canonicalRef,\n parseRefPointer,\n ROOT_POINTER,\n} from \"../../domain/openapi/json-pointer.js\";\nimport { type DocumentNames, queryDocumentNames } from \"./query-document-names.js\";\nimport { findMappings, findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the last segment of the\n * document's URL, without its extension, when the pointer gives no free name (a `$ref` to a whole\n * document, or two targets with the same pointer). The query stays in that name, and a query holds\n * API keys and signatures, so `https://host/schemas/pet?token=…` became the component\n * `pet?token=…` in the generated file and in messages (threat model T4b). This renames such a\n * component after the URL without its query: `pet`, with a `-2` suffix when that name is taken.\n * Each component is matched to its document by its node, since two URLs can give one name.\n */\n\ntype Components = Record<string, Record<string, unknown>>;\n\n/** The keys of each `components` group before bundling: the bundle edits the document in place. */\nexport type ComponentKeys = ReadonlyMap<string, ReadonlySet<string>>;\n\n/** Old and new name of each renamed component, per `components` group. */\ntype Renames = Map<string, Map<string, string>>;\n\nconst COMPONENTS_KEY = \"components\";\n/** What Redocly puts between the base name and the rest of a component name. */\nconst NAME_SUFFIX_STARTS = [\"_\", \"-\"];\nconst FIRST_SERIAL = 2;\n/**\n * The serial Redocly adds when a name is taken (`pet-2`). Two URLs that differ only in the query\n * took one name; without the query they may not, so the serial is chosen again (`freeName`).\n */\nconst REDOCLY_SERIAL_RE = /-\\d+$/;\n\nfunction isContainer(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction componentsOf(document: unknown): Components {\n const components = isContainer(document) ? document[COMPONENTS_KEY] : undefined;\n if (!isContainer(components)) {\n return {};\n }\n const groups: Components = {};\n for (const [group, entries] of Object.entries(components)) {\n if (isContainer(entries)) {\n groups[group] = entries;\n }\n }\n return groups;\n}\n\n/** The keys of every `components` group of a document. */\nexport function componentKeysOf(document: unknown): ComponentKeys {\n const keys = new Map<string, ReadonlySet<string>>();\n for (const [group, entries] of Object.entries(componentsOf(document))) {\n keys.set(group, new Set(Object.keys(entries)));\n }\n return keys;\n}\n\n/** The name a component of a document with a query gets; undefined for any other component. */\nfunction queryFreeName(key: string, names: DocumentNames | undefined): string | undefined {\n if (names === undefined) {\n return undefined;\n }\n const { named, clean } = names;\n const hasBaseName =\n key === named || NAME_SUFFIX_STARTS.some((start) => key.startsWith(`${named}${start}`));\n return hasBaseName\n ? `${clean}${key.slice(named.length).replace(REDOCLY_SERIAL_RE, \"\")}`\n : undefined;\n}\n\nfunction freeName(name: string, taken: ReadonlySet<string>): string {\n let free = name;\n for (let serial = FIRST_SERIAL; taken.has(free); serial += 1) {\n free = `${name}-${serial}`;\n }\n return free;\n}\n\n/** Rename the bundled components of one group in place, keeping their order. */\nfunction renameGroup(\n entries: Record<string, unknown>,\n keysBefore: ReadonlySet<string>,\n documentNames: ReadonlyMap<object, DocumentNames>,\n): Map<string, string> {\n const renames = new Map<string, string>();\n const taken = new Set(Object.keys(entries));\n for (const key of Object.keys(entries)) {\n const node = entries[key];\n const names = typeof node === \"object\" && node !== null ? documentNames.get(node) : undefined;\n const name = keysBefore.has(key) ? undefined : queryFreeName(key, names);\n if (name !== undefined) {\n taken.delete(key);\n const free = freeName(name, taken);\n taken.add(free);\n renames.set(key, free);\n }\n }\n for (const [key, value] of Object.entries(entries)) {\n delete entries[key];\n entries[renames.get(key) ?? key] = value;\n }\n return renames;\n}\n\n/** Rewrites pointers and messages that name a renamed component. */\nexport interface ComponentRenaming {\n /** The pointer with a renamed component's new name; any other text as it is. */\n readonly pointer: (pointer: string) => string;\n /** The text with each renamed component's old name replaced by its new name. */\n readonly text: (text: string) => string;\n /**\n * Whether the problem is Redocly's report of two components with one name that the new names\n * tell apart: it renamed `new-api` to `new-api-2`, and the documents are now `pet` and `owner`.\n */\n readonly isResolvedCollision: (message: string) => boolean;\n}\n\n/** The warning Redocly 1.34 gives when it adds a serial to a component name. */\nconst COLLISION_RE =\n /^Two schemas are referenced with the same name but different content\\. Renamed (.+) to (.+)\\.$/;\nconst SERIAL_RE = /^-\\d+$/;\n\nfunction resolvesCollision(message: string, renames: Renames): boolean {\n const [, first, second] = COLLISION_RE.exec(message) ?? [];\n if (first === undefined || second === undefined) {\n return false;\n }\n const renamed = new Map([...renames.values()].flatMap((group) => [...group]));\n const [newFirst, newSecond] = [renamed.get(first) ?? first, renamed.get(second) ?? second];\n return !(newSecond.startsWith(newFirst) && SERIAL_RE.test(newSecond.slice(newFirst.length)));\n}\n\nfunction renamedPointer(pointer: string, renames: Renames): string {\n if (!pointer.startsWith(`${ROOT_POINTER}/`)) {\n return pointer;\n }\n const [components, group = \"\", name = \"\", ...rest] = parseRefPointer(canonicalRef(pointer));\n const renamed = components === COMPONENTS_KEY ? renames.get(group)?.get(name) : undefined;\n return renamed === undefined\n ? pointer\n : appendPointer(ROOT_POINTER, [COMPONENTS_KEY, group, renamed, ...rest]);\n}\n\nfunction renamedText(text: string, renames: Renames): string {\n const pairs = [...renames.values()].flatMap((group) => [...group]);\n // The longest old name first, so a name that starts another one does not split it.\n pairs.sort(([a], [b]) => b.length - a.length);\n return pairs.reduce((shown, [old, renamed]) => shown.replaceAll(old, renamed), text);\n}\n\nfunction rewriteRefs(document: unknown, renaming: ComponentRenaming): void {\n for (const { node } of findRefHolders(document)) {\n node.$ref = renaming.pointer(node.$ref);\n }\n for (const mapping of findMappings(document)) {\n for (const [name, value] of Object.entries(mapping)) {\n if (typeof value === \"string\") {\n mapping[name] = renaming.pointer(value);\n }\n }\n }\n}\n\n/**\n * Rename, in place, the components the bundle named after a URL with a query, and every local\n * `$ref` and `mapping` value that names them. `documents` are the documents the load read.\n */\nexport function renameQueryNamedComponents(\n bundled: unknown,\n keysBefore: ComponentKeys,\n documents: readonly LoadedDocument[],\n): ComponentRenaming {\n const documentNames = queryDocumentNames(documents);\n const renames: Renames = new Map();\n if (documentNames.size > 0) {\n for (const [group, entries] of Object.entries(componentsOf(bundled))) {\n const groupRenames = renameGroup(entries, keysBefore.get(group) ?? new Set(), documentNames);\n if (groupRenames.size > 0) {\n renames.set(group, groupRenames);\n }\n }\n }\n const renaming: ComponentRenaming = {\n pointer: (pointer) => renamedPointer(pointer, renames),\n text: (text) => renamedText(text, renames),\n isResolvedCollision: (message) => resolvesCollision(message, renames),\n };\n if (renames.size > 0) {\n rewriteRefs(bundled, renaming);\n }\n return renaming;\n}\n"],"names":[],"mappings":"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"}
@@ -52,6 +52,9 @@ class RedoclyConfigFiles {
52
52
  );
53
53
  return loadedConfig(create, void 0);
54
54
  }
55
+ forApi(config, apiName) {
56
+ return openapiCore.getMergedConfig(config, apiName);
57
+ }
55
58
  }
56
59
  function createRedoclyConfigSource(cwd) {
57
60
  return new RedoclyConfigFiles(cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"redocly-config-source.cjs","sources":["../../../src/adapters/redocly-loader/redocly-config-source.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createConfig, findConfig, IGNORE_FILE, loadConfig } from \"@redocly/openapi-core\";\nimport type {\n RedoclyConfig,\n RedoclyConfigSource,\n} from \"../../application/ports/redocly-config-source.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/**\n * The first line of a failure, with the error's name: a YAML error goes on with a snippet of the\n * file, and the name tells a YAML error from a file system one.\n */\nfunction reasonOf(error: unknown): string {\n return String(error).replace(/\\n[\\s\\S]*$/, \"\");\n}\n\n/**\n * The config, or `CLI_CONFIG_INVALID`. Redocly reads the config file and the lint-ignore file\n * next to it (or in the working directory); either can be malformed, and its error does not\n * always name the file, so the message names both.\n */\nasync function loadedConfig(\n load: () => Promise<RedoclyConfig>,\n configPath: string | undefined,\n): Promise<RedoclyConfig> {\n try {\n return await load();\n } catch (error) {\n const config =\n configPath === undefined ? \"the default Redocly config\" : `the Redocly config ${configPath}`;\n const where = configPath === undefined ? \"in the working directory\" : \"next to it\";\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.CLI_CONFIG_INVALID,\n message: `Cannot load ${config} or the ${IGNORE_FILE} ${where}: ${reasonOf(error)}`,\n details: { configPath },\n cause: error,\n });\n }\n}\n\n/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */\nclass RedoclyConfigFiles implements RedoclyConfigSource {\n readonly #cwd: string;\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n find(explicitPath: string | undefined): string | undefined {\n if (!explicitPath) {\n return findConfig(this.#cwd);\n }\n const resolved = path.resolve(this.#cwd, explicitPath);\n if (!fs.existsSync(resolved)) {\n return undefined;\n }\n return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;\n }\n\n load(configPath: string): Promise<RedoclyConfig> {\n return loadedConfig(() => loadConfig({ configPath }), configPath);\n }\n\n createDefault(): Promise<RedoclyConfig> {\n const create = () =>\n createConfig(\n { rules: { \"operation-operationId-unique\": { severity: \"warn\" } } },\n { extends: [\"minimal\"] },\n );\n return loadedConfig(create, undefined);\n }\n}\n\n/** Find and load `redocly.yaml` relative to the directory `cwd`. */\nexport function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {\n return new RedoclyConfigFiles(cwd);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","IGNORE_FILE","findConfig","path","fs","loadConfig","createConfig"],"mappings":";;;;;;;;;;;;AAaA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAC/C;AAOA,eAAe,YAAA,CACb,MACA,UAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,MAAA,GACJ,UAAA,KAAe,MAAA,GAAY,4BAAA,GAA+B,sBAAsB,UAAU,CAAA,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,0BAAA,GAA6B,YAAA;AACtE,IAAA,MAAM,IAAIA,2BAAA,CAAqB;AAAA,MAC7B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,EAAWC,uBAAW,IAAI,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MACjF,OAAA,EAAS,EAAE,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF;AAGA,MAAM,kBAAA,CAAkD;AAAA,EAC7C,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,KAAK,YAAA,EAAsD;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAOC,sBAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,QAAA,GAAWC,aAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,IAAA,IAAI,CAACC,WAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAOA,WAAA,CAAG,SAAS,QAAQ,CAAA,CAAE,aAAY,GAAIF,sBAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAAA,EACtE;AAAA,EAEA,KAAK,UAAA,EAA4C;AAC/C,IAAA,OAAO,aAAa,MAAMG,sBAAA,CAAW,EAAE,UAAA,EAAY,GAAG,UAAU,CAAA;AAAA,EAClE;AAAA,EAEA,aAAA,GAAwC;AACtC,IAAA,MAAM,SAAS,MACbC,wBAAA;AAAA,MACE,EAAE,OAAO,EAAE,8BAAA,EAAgC,EAAE,QAAA,EAAU,MAAA,IAAS,EAAE;AAAA,MAClE,EAAE,OAAA,EAAS,CAAC,SAAS,CAAA;AAAE,KACzB;AACF,IAAA,OAAO,YAAA,CAAa,QAAQ,MAAS,CAAA;AAAA,EACvC;AACF;AAGO,SAAS,0BAA0B,GAAA,EAAkC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,GAAG,CAAA;AACnC;;"}
1
+ {"version":3,"file":"redocly-config-source.cjs","sources":["../../../src/adapters/redocly-loader/redocly-config-source.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n createConfig,\n findConfig,\n getMergedConfig,\n IGNORE_FILE,\n loadConfig,\n} from \"@redocly/openapi-core\";\nimport type {\n RedoclyConfig,\n RedoclyConfigSource,\n} from \"../../application/ports/redocly-config-source.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/**\n * The first line of a failure, with the error's name: a YAML error goes on with a snippet of the\n * file, and the name tells a YAML error from a file system one.\n */\nfunction reasonOf(error: unknown): string {\n return String(error).replace(/\\n[\\s\\S]*$/, \"\");\n}\n\n/**\n * The config, or `CLI_CONFIG_INVALID`. Redocly reads the config file and the lint-ignore file\n * next to it (or in the working directory); either can be malformed, and its error does not\n * always name the file, so the message names both.\n */\nasync function loadedConfig(\n load: () => Promise<RedoclyConfig>,\n configPath: string | undefined,\n): Promise<RedoclyConfig> {\n try {\n return await load();\n } catch (error) {\n const config =\n configPath === undefined ? \"the default Redocly config\" : `the Redocly config ${configPath}`;\n const where = configPath === undefined ? \"in the working directory\" : \"next to it\";\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.CLI_CONFIG_INVALID,\n message: `Cannot load ${config} or the ${IGNORE_FILE} ${where}: ${reasonOf(error)}`,\n details: { configPath },\n cause: error,\n });\n }\n}\n\n/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */\nclass RedoclyConfigFiles implements RedoclyConfigSource {\n readonly #cwd: string;\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n find(explicitPath: string | undefined): string | undefined {\n if (!explicitPath) {\n return findConfig(this.#cwd);\n }\n const resolved = path.resolve(this.#cwd, explicitPath);\n if (!fs.existsSync(resolved)) {\n return undefined;\n }\n return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;\n }\n\n load(configPath: string): Promise<RedoclyConfig> {\n return loadedConfig(() => loadConfig({ configPath }), configPath);\n }\n\n createDefault(): Promise<RedoclyConfig> {\n const create = () =>\n createConfig(\n { rules: { \"operation-operationId-unique\": { severity: \"warn\" } } },\n { extends: [\"minimal\"] },\n );\n return loadedConfig(create, undefined);\n }\n\n forApi(config: RedoclyConfig, apiName: string): RedoclyConfig {\n return getMergedConfig(config, apiName);\n }\n}\n\n/** Find and load `redocly.yaml` relative to the directory `cwd`. */\nexport function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {\n return new RedoclyConfigFiles(cwd);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","IGNORE_FILE","findConfig","path","fs","loadConfig","createConfig","getMergedConfig"],"mappings":";;;;;;;;;;;;AAmBA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAC/C;AAOA,eAAe,YAAA,CACb,MACA,UAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,MAAA,GACJ,UAAA,KAAe,MAAA,GAAY,4BAAA,GAA+B,sBAAsB,UAAU,CAAA,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,0BAAA,GAA6B,YAAA;AACtE,IAAA,MAAM,IAAIA,2BAAA,CAAqB;AAAA,MAC7B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,EAAWC,uBAAW,IAAI,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MACjF,OAAA,EAAS,EAAE,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF;AAGA,MAAM,kBAAA,CAAkD;AAAA,EAC7C,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,KAAK,YAAA,EAAsD;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAOC,sBAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,QAAA,GAAWC,aAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,IAAA,IAAI,CAACC,WAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAOA,WAAA,CAAG,SAAS,QAAQ,CAAA,CAAE,aAAY,GAAIF,sBAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAAA,EACtE;AAAA,EAEA,KAAK,UAAA,EAA4C;AAC/C,IAAA,OAAO,aAAa,MAAMG,sBAAA,CAAW,EAAE,UAAA,EAAY,GAAG,UAAU,CAAA;AAAA,EAClE;AAAA,EAEA,aAAA,GAAwC;AACtC,IAAA,MAAM,SAAS,MACbC,wBAAA;AAAA,MACE,EAAE,OAAO,EAAE,8BAAA,EAAgC,EAAE,QAAA,EAAU,MAAA,IAAS,EAAE;AAAA,MAClE,EAAE,OAAA,EAAS,CAAC,SAAS,CAAA;AAAE,KACzB;AACF,IAAA,OAAO,YAAA,CAAa,QAAQ,MAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,CAAO,QAAuB,OAAA,EAAgC;AAC5D,IAAA,OAAOC,2BAAA,CAAgB,QAAQ,OAAO,CAAA;AAAA,EACxC;AACF;AAGO,SAAS,0BAA0B,GAAA,EAAkC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,GAAG,CAAA;AACnC;;"}
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { findConfig, IGNORE_FILE, loadConfig, createConfig } from '@redocly/openapi-core';
3
+ import { findConfig, getMergedConfig, IGNORE_FILE, loadConfig, createConfig } from '@redocly/openapi-core';
4
4
  import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
5
5
 
6
6
  function reasonOf(error) {
@@ -45,6 +45,9 @@ class RedoclyConfigFiles {
45
45
  );
46
46
  return loadedConfig(create, void 0);
47
47
  }
48
+ forApi(config, apiName) {
49
+ return getMergedConfig(config, apiName);
50
+ }
48
51
  }
49
52
  function createRedoclyConfigSource(cwd) {
50
53
  return new RedoclyConfigFiles(cwd);
@@ -1 +1 @@
1
- {"version":3,"file":"redocly-config-source.mjs","sources":["../../../src/adapters/redocly-loader/redocly-config-source.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createConfig, findConfig, IGNORE_FILE, loadConfig } from \"@redocly/openapi-core\";\nimport type {\n RedoclyConfig,\n RedoclyConfigSource,\n} from \"../../application/ports/redocly-config-source.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/**\n * The first line of a failure, with the error's name: a YAML error goes on with a snippet of the\n * file, and the name tells a YAML error from a file system one.\n */\nfunction reasonOf(error: unknown): string {\n return String(error).replace(/\\n[\\s\\S]*$/, \"\");\n}\n\n/**\n * The config, or `CLI_CONFIG_INVALID`. Redocly reads the config file and the lint-ignore file\n * next to it (or in the working directory); either can be malformed, and its error does not\n * always name the file, so the message names both.\n */\nasync function loadedConfig(\n load: () => Promise<RedoclyConfig>,\n configPath: string | undefined,\n): Promise<RedoclyConfig> {\n try {\n return await load();\n } catch (error) {\n const config =\n configPath === undefined ? \"the default Redocly config\" : `the Redocly config ${configPath}`;\n const where = configPath === undefined ? \"in the working directory\" : \"next to it\";\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.CLI_CONFIG_INVALID,\n message: `Cannot load ${config} or the ${IGNORE_FILE} ${where}: ${reasonOf(error)}`,\n details: { configPath },\n cause: error,\n });\n }\n}\n\n/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */\nclass RedoclyConfigFiles implements RedoclyConfigSource {\n readonly #cwd: string;\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n find(explicitPath: string | undefined): string | undefined {\n if (!explicitPath) {\n return findConfig(this.#cwd);\n }\n const resolved = path.resolve(this.#cwd, explicitPath);\n if (!fs.existsSync(resolved)) {\n return undefined;\n }\n return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;\n }\n\n load(configPath: string): Promise<RedoclyConfig> {\n return loadedConfig(() => loadConfig({ configPath }), configPath);\n }\n\n createDefault(): Promise<RedoclyConfig> {\n const create = () =>\n createConfig(\n { rules: { \"operation-operationId-unique\": { severity: \"warn\" } } },\n { extends: [\"minimal\"] },\n );\n return loadedConfig(create, undefined);\n }\n}\n\n/** Find and load `redocly.yaml` relative to the directory `cwd`. */\nexport function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {\n return new RedoclyConfigFiles(cwd);\n}\n"],"names":[],"mappings":";;;;;AAaA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAC/C;AAOA,eAAe,YAAA,CACb,MACA,UAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,MAAA,GACJ,UAAA,KAAe,MAAA,GAAY,4BAAA,GAA+B,sBAAsB,UAAU,CAAA,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,0BAAA,GAA6B,YAAA;AACtE,IAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,MAC7B,MAAM,WAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,EAAW,WAAW,IAAI,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MACjF,OAAA,EAAS,EAAE,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF;AAGA,MAAM,kBAAA,CAAkD;AAAA,EAC7C,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,KAAK,YAAA,EAAsD;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAA,CAAG,SAAS,QAAQ,CAAA,CAAE,aAAY,GAAI,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAAA,EACtE;AAAA,EAEA,KAAK,UAAA,EAA4C;AAC/C,IAAA,OAAO,aAAa,MAAM,UAAA,CAAW,EAAE,UAAA,EAAY,GAAG,UAAU,CAAA;AAAA,EAClE;AAAA,EAEA,aAAA,GAAwC;AACtC,IAAA,MAAM,SAAS,MACb,YAAA;AAAA,MACE,EAAE,OAAO,EAAE,8BAAA,EAAgC,EAAE,QAAA,EAAU,MAAA,IAAS,EAAE;AAAA,MAClE,EAAE,OAAA,EAAS,CAAC,SAAS,CAAA;AAAE,KACzB;AACF,IAAA,OAAO,YAAA,CAAa,QAAQ,MAAS,CAAA;AAAA,EACvC;AACF;AAGO,SAAS,0BAA0B,GAAA,EAAkC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,GAAG,CAAA;AACnC;;"}
1
+ {"version":3,"file":"redocly-config-source.mjs","sources":["../../../src/adapters/redocly-loader/redocly-config-source.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n createConfig,\n findConfig,\n getMergedConfig,\n IGNORE_FILE,\n loadConfig,\n} from \"@redocly/openapi-core\";\nimport type {\n RedoclyConfig,\n RedoclyConfigSource,\n} from \"../../application/ports/redocly-config-source.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/**\n * The first line of a failure, with the error's name: a YAML error goes on with a snippet of the\n * file, and the name tells a YAML error from a file system one.\n */\nfunction reasonOf(error: unknown): string {\n return String(error).replace(/\\n[\\s\\S]*$/, \"\");\n}\n\n/**\n * The config, or `CLI_CONFIG_INVALID`. Redocly reads the config file and the lint-ignore file\n * next to it (or in the working directory); either can be malformed, and its error does not\n * always name the file, so the message names both.\n */\nasync function loadedConfig(\n load: () => Promise<RedoclyConfig>,\n configPath: string | undefined,\n): Promise<RedoclyConfig> {\n try {\n return await load();\n } catch (error) {\n const config =\n configPath === undefined ? \"the default Redocly config\" : `the Redocly config ${configPath}`;\n const where = configPath === undefined ? \"in the working directory\" : \"next to it\";\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.CLI_CONFIG_INVALID,\n message: `Cannot load ${config} or the ${IGNORE_FILE} ${where}: ${reasonOf(error)}`,\n details: { configPath },\n cause: error,\n });\n }\n}\n\n/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */\nclass RedoclyConfigFiles implements RedoclyConfigSource {\n readonly #cwd: string;\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n find(explicitPath: string | undefined): string | undefined {\n if (!explicitPath) {\n return findConfig(this.#cwd);\n }\n const resolved = path.resolve(this.#cwd, explicitPath);\n if (!fs.existsSync(resolved)) {\n return undefined;\n }\n return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;\n }\n\n load(configPath: string): Promise<RedoclyConfig> {\n return loadedConfig(() => loadConfig({ configPath }), configPath);\n }\n\n createDefault(): Promise<RedoclyConfig> {\n const create = () =>\n createConfig(\n { rules: { \"operation-operationId-unique\": { severity: \"warn\" } } },\n { extends: [\"minimal\"] },\n );\n return loadedConfig(create, undefined);\n }\n\n forApi(config: RedoclyConfig, apiName: string): RedoclyConfig {\n return getMergedConfig(config, apiName);\n }\n}\n\n/** Find and load `redocly.yaml` relative to the directory `cwd`. */\nexport function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {\n return new RedoclyConfigFiles(cwd);\n}\n"],"names":[],"mappings":";;;;;AAmBA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAC/C;AAOA,eAAe,YAAA,CACb,MACA,UAAA,EACwB;AACxB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,MAAA,GACJ,UAAA,KAAe,MAAA,GAAY,4BAAA,GAA+B,sBAAsB,UAAU,CAAA,CAAA;AAC5F,IAAA,MAAM,KAAA,GAAQ,UAAA,KAAe,MAAA,GAAY,0BAAA,GAA6B,YAAA;AACtE,IAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,MAC7B,MAAM,WAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,EAAW,WAAW,IAAI,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MACjF,OAAA,EAAS,EAAE,UAAA,EAAW;AAAA,MACtB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACF;AAGA,MAAM,kBAAA,CAAkD;AAAA,EAC7C,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,KAAK,YAAA,EAAsD;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAA,CAAG,SAAS,QAAQ,CAAA,CAAE,aAAY,GAAI,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAAA,EACtE;AAAA,EAEA,KAAK,UAAA,EAA4C;AAC/C,IAAA,OAAO,aAAa,MAAM,UAAA,CAAW,EAAE,UAAA,EAAY,GAAG,UAAU,CAAA;AAAA,EAClE;AAAA,EAEA,aAAA,GAAwC;AACtC,IAAA,MAAM,SAAS,MACb,YAAA;AAAA,MACE,EAAE,OAAO,EAAE,8BAAA,EAAgC,EAAE,QAAA,EAAU,MAAA,IAAS,EAAE;AAAA,MAClE,EAAE,OAAA,EAAS,CAAC,SAAS,CAAA;AAAE,KACzB;AACF,IAAA,OAAO,YAAA,CAAa,QAAQ,MAAS,CAAA;AAAA,EACvC;AAAA,EAEA,MAAA,CAAO,QAAuB,OAAA,EAAgC;AAC5D,IAAA,OAAO,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAAA,EACxC;AACF;AAGO,SAAS,0BAA0B,GAAA,EAAkC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,GAAG,CAAA;AACnC;;"}