openapi-typesafe 1.0.0-rc.4 → 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 (320) hide show
  1. package/CHANGELOG.md +141 -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-named-components.cjs +137 -0
  23. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  25. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +26 -14
  27. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +26 -14
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/ref-access.cjs +16 -3
  31. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/ref-access.mjs +16 -3
  33. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  35. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  37. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/remote-fetch.cjs +5 -3
  39. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/remote-fetch.mjs +5 -3
  41. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  43. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  45. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  47. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  49. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  50. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  51. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  52. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  53. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  54. package/dist/api/document-refs.cjs +16 -1
  55. package/dist/api/document-refs.cjs.map +1 -1
  56. package/dist/api/document-refs.mjs +16 -1
  57. package/dist/api/document-refs.mjs.map +1 -1
  58. package/dist/api/document-run.cjs +4 -10
  59. package/dist/api/document-run.cjs.map +1 -1
  60. package/dist/api/document-run.mjs +4 -10
  61. package/dist/api/document-run.mjs.map +1 -1
  62. package/dist/api/openapi-ts.cjs +1 -2
  63. package/dist/api/openapi-ts.cjs.map +1 -1
  64. package/dist/api/openapi-ts.mjs +2 -3
  65. package/dist/api/openapi-ts.mjs.map +1 -1
  66. package/dist/api/ref-limit-options.cjs +63 -0
  67. package/dist/api/ref-limit-options.cjs.map +1 -0
  68. package/dist/api/ref-limit-options.mjs +57 -0
  69. package/dist/api/ref-limit-options.mjs.map +1 -0
  70. package/dist/api/transform-schema.cjs +12 -5
  71. package/dist/api/transform-schema.cjs.map +1 -1
  72. package/dist/api/transform-schema.mjs +12 -5
  73. package/dist/api/transform-schema.mjs.map +1 -1
  74. package/dist/application/transform/declared-value-types.cjs +36 -0
  75. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  76. package/dist/application/transform/declared-value-types.mjs +34 -0
  77. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  78. package/dist/application/transform/document/document.cjs +3 -1
  79. package/dist/application/transform/document/document.cjs.map +1 -1
  80. package/dist/application/transform/document/document.mjs +3 -1
  81. package/dist/application/transform/document/document.mjs.map +1 -1
  82. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  83. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  84. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  85. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  86. package/dist/application/transform/document/header.cjs +11 -3
  87. package/dist/application/transform/document/header.cjs.map +1 -1
  88. package/dist/application/transform/document/header.mjs +10 -2
  89. package/dist/application/transform/document/header.mjs.map +1 -1
  90. package/dist/application/transform/document/parameter.cjs +1 -1
  91. package/dist/application/transform/document/parameter.cjs.map +1 -1
  92. package/dist/application/transform/document/parameter.mjs +1 -1
  93. package/dist/application/transform/document/parameter.mjs.map +1 -1
  94. package/dist/application/transform/document/parameters.cjs +23 -5
  95. package/dist/application/transform/document/parameters.cjs.map +1 -1
  96. package/dist/application/transform/document/parameters.mjs +23 -5
  97. package/dist/application/transform/document/parameters.mjs.map +1 -1
  98. package/dist/application/transform/document/path-item.cjs +4 -3
  99. package/dist/application/transform/document/path-item.cjs.map +1 -1
  100. package/dist/application/transform/document/path-item.mjs +4 -4
  101. package/dist/application/transform/document/path-item.mjs.map +1 -1
  102. package/dist/application/transform/document/path-template-key.cjs +84 -0
  103. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  104. package/dist/application/transform/document/path-template-key.mjs +79 -0
  105. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  106. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  107. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  108. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  109. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  110. package/dist/application/transform/document/paths-enum.cjs +7 -6
  111. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  112. package/dist/application/transform/document/paths-enum.mjs +7 -6
  113. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  114. package/dist/application/transform/document/paths.cjs +38 -66
  115. package/dist/application/transform/document/paths.cjs.map +1 -1
  116. package/dist/application/transform/document/paths.mjs +36 -66
  117. package/dist/application/transform/document/paths.mjs.map +1 -1
  118. package/dist/application/transform/document/webhooks.cjs +10 -3
  119. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  120. package/dist/application/transform/document/webhooks.mjs +9 -2
  121. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  122. package/dist/application/transform/footer/document-footer.cjs +6 -3
  123. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  124. package/dist/application/transform/footer/document-footer.mjs +6 -3
  125. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  126. package/dist/application/transform/helper-types.cjs +3 -3
  127. package/dist/application/transform/helper-types.cjs.map +1 -1
  128. package/dist/application/transform/helper-types.mjs +3 -3
  129. package/dist/application/transform/helper-types.mjs.map +1 -1
  130. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  131. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  132. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  133. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  134. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  135. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  136. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  137. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  138. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  139. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  140. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  141. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  142. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  143. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  144. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  145. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  146. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  147. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  148. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  149. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  150. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  151. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  152. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  153. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  155. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  157. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  159. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  160. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  161. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  162. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  163. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  165. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  166. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  167. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  168. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  169. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  170. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  171. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  172. package/dist/application/transform/schema/input-location.cjs +23 -0
  173. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  174. package/dist/application/transform/schema/input-location.mjs +21 -0
  175. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  176. package/dist/application/transform/schema/object-type.cjs +15 -5
  177. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  178. package/dist/application/transform/schema/object-type.mjs +15 -5
  179. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  180. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  181. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  182. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  183. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  184. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  185. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  186. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  187. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  188. package/dist/cli/api-logger.cjs +13 -0
  189. package/dist/cli/api-logger.cjs.map +1 -0
  190. package/dist/cli/api-logger.mjs +11 -0
  191. package/dist/cli/api-logger.mjs.map +1 -0
  192. package/dist/cli/api-settings.cjs +7 -15
  193. package/dist/cli/api-settings.cjs.map +1 -1
  194. package/dist/cli/api-settings.mjs +8 -16
  195. package/dist/cli/api-settings.mjs.map +1 -1
  196. package/dist/cli/cli-arguments.cjs +51 -11
  197. package/dist/cli/cli-arguments.cjs.map +1 -1
  198. package/dist/cli/cli-arguments.mjs +51 -11
  199. package/dist/cli/cli-arguments.mjs.map +1 -1
  200. package/dist/cli/cli-errors.cjs +17 -0
  201. package/dist/cli/cli-errors.cjs.map +1 -1
  202. package/dist/cli/cli-errors.mjs +17 -1
  203. package/dist/cli/cli-errors.mjs.map +1 -1
  204. package/dist/cli/cli-output.cjs +6 -4
  205. package/dist/cli/cli-output.cjs.map +1 -1
  206. package/dist/cli/cli-output.mjs +7 -5
  207. package/dist/cli/cli-output.mjs.map +1 -1
  208. package/dist/cli/main.cjs +10 -4
  209. package/dist/cli/main.cjs.map +1 -1
  210. package/dist/cli/main.mjs +10 -4
  211. package/dist/cli/main.mjs.map +1 -1
  212. package/dist/cli/redocly-apis.cjs +20 -9
  213. package/dist/cli/redocly-apis.cjs.map +1 -1
  214. package/dist/cli/redocly-apis.mjs +22 -11
  215. package/dist/cli/redocly-apis.mjs.map +1 -1
  216. package/dist/cli/ref-limits.cjs +15 -1
  217. package/dist/cli/ref-limits.cjs.map +1 -1
  218. package/dist/cli/ref-limits.mjs +15 -2
  219. package/dist/cli/ref-limits.mjs.map +1 -1
  220. package/dist/cli/run-cli.cjs +24 -7
  221. package/dist/cli/run-cli.cjs.map +1 -1
  222. package/dist/cli/run-cli.mjs +25 -8
  223. package/dist/cli/run-cli.mjs.map +1 -1
  224. package/dist/domain/cause-secrets.cjs +31 -16
  225. package/dist/domain/cause-secrets.cjs.map +1 -1
  226. package/dist/domain/cause-secrets.mjs +31 -16
  227. package/dist/domain/cause-secrets.mjs.map +1 -1
  228. package/dist/domain/errors.cjs +2 -0
  229. package/dist/domain/errors.cjs.map +1 -1
  230. package/dist/domain/errors.mjs +2 -0
  231. package/dist/domain/errors.mjs.map +1 -1
  232. package/dist/domain/location-text.cjs +9 -0
  233. package/dist/domain/location-text.cjs.map +1 -0
  234. package/dist/domain/location-text.mjs +7 -0
  235. package/dist/domain/location-text.mjs.map +1 -0
  236. package/dist/domain/openapi/document-places.cjs +55 -0
  237. package/dist/domain/openapi/document-places.cjs.map +1 -0
  238. package/dist/domain/openapi/document-places.mjs +53 -0
  239. package/dist/domain/openapi/document-places.mjs.map +1 -0
  240. package/dist/domain/output-fixes.cjs +8 -2
  241. package/dist/domain/output-fixes.cjs.map +1 -1
  242. package/dist/domain/output-fixes.mjs +8 -2
  243. package/dist/domain/output-fixes.mjs.map +1 -1
  244. package/dist/domain/terminal-text.cjs +31 -0
  245. package/dist/domain/terminal-text.cjs.map +1 -0
  246. package/dist/domain/terminal-text.mjs +29 -0
  247. package/dist/domain/terminal-text.mjs.map +1 -0
  248. package/dist/domain/warnings.cjs +1 -0
  249. package/dist/domain/warnings.cjs.map +1 -1
  250. package/dist/domain/warnings.mjs +1 -0
  251. package/dist/domain/warnings.mjs.map +1 -1
  252. package/dist/index.d.cts +26 -18
  253. package/dist/index.d.mts +26 -18
  254. package/dist/index.d.ts +26 -18
  255. package/package.json +1 -1
  256. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  257. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  258. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  259. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  260. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  261. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  262. package/src/adapters/redocly-loader/redocly-schema-loader.ts +46 -14
  263. package/src/adapters/redocly-loader/ref-access.ts +16 -3
  264. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  265. package/src/adapters/redocly-loader/remote-fetch.ts +11 -2
  266. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  267. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  268. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  269. package/src/api/document-refs.ts +29 -1
  270. package/src/api/document-run.ts +6 -16
  271. package/src/api/openapi-ts.ts +6 -3
  272. package/src/api/ref-limit-options.ts +76 -0
  273. package/src/api/transform-schema.ts +20 -5
  274. package/src/application/ports/file-system.ts +8 -0
  275. package/src/application/transform/declared-value-types.ts +42 -0
  276. package/src/application/transform/document/document.ts +4 -2
  277. package/src/application/transform/document/exploded-query-values.ts +88 -0
  278. package/src/application/transform/document/header.ts +25 -5
  279. package/src/application/transform/document/parameter.ts +4 -4
  280. package/src/application/transform/document/parameters.ts +45 -10
  281. package/src/application/transform/document/path-item.ts +3 -3
  282. package/src/application/transform/document/path-template-key.ts +152 -0
  283. package/src/application/transform/document/path-template-refs.ts +106 -0
  284. package/src/application/transform/document/paths-enum.ts +23 -9
  285. package/src/application/transform/document/paths.ts +53 -123
  286. package/src/application/transform/document/webhooks.ts +18 -5
  287. package/src/application/transform/footer/document-footer.ts +18 -8
  288. package/src/application/transform/helper-types.ts +4 -4
  289. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  290. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  291. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  292. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  293. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  294. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  295. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  296. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  297. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  298. package/src/application/transform/schema/access-flags.ts +5 -2
  299. package/src/application/transform/schema/index-signature-type.ts +31 -0
  300. package/src/application/transform/schema/input-location.ts +35 -0
  301. package/src/application/transform/schema/object-type.ts +18 -8
  302. package/src/application/transform/schema/schema-transform.ts +2 -1
  303. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  304. package/src/cli/api-logger.ts +17 -0
  305. package/src/cli/api-settings.ts +12 -20
  306. package/src/cli/cli-arguments.ts +90 -14
  307. package/src/cli/cli-dependencies.ts +7 -2
  308. package/src/cli/cli-errors.ts +22 -0
  309. package/src/cli/cli-output.ts +11 -10
  310. package/src/cli/main.ts +10 -4
  311. package/src/cli/redocly-apis.ts +37 -17
  312. package/src/cli/ref-limits.ts +21 -2
  313. package/src/cli/run-cli.ts +39 -7
  314. package/src/domain/cause-secrets.ts +59 -25
  315. package/src/domain/errors.ts +2 -0
  316. package/src/domain/location-text.ts +12 -0
  317. package/src/domain/openapi/document-places.ts +78 -0
  318. package/src/domain/output-fixes.ts +9 -2
  319. package/src/domain/terminal-text.ts +44 -0
  320. package/src/domain/warnings.ts +1 -0
@@ -1,6 +1,7 @@
1
- import { OUTPUT_SETTING, unknownSettingWarnings, apiOutputOf, apiFixNames, apiRefLimitOptions, apiFlags } from './api-settings.mjs';
1
+ import { OUTPUT_SETTING, unknownSettingWarnings, apiOutputOf, apiFlags, apiFixNames, apiRefLimitOptions } from './api-settings.mjs';
2
2
  import { writeGeneratedApis } from './api-writes.mjs';
3
- import { cliError } from './cli-errors.mjs';
3
+ import { ineffectiveFlagNotices } from './cli-arguments.mjs';
4
+ import { ApiFailure, cliError } from './cli-errors.mjs';
4
5
  import { filesReadBy, parseLocationUrl, redoclyConfigFiles, resolveLocationUrl, outputFileOf, ensureOutputIsNotSchema, ensureOutputIsOwn } from './cli-output.mjs';
5
6
  import { MULTIPLE_SCHEMAS_DOCS_URL } from './docs-links.mjs';
6
7
  import { fixOption } from './fix-option.mjs';
@@ -41,21 +42,25 @@ function apiTarget(api, configRoot) {
41
42
  }
42
43
  return { name, root, settings, configRoot };
43
44
  }
44
- function apiOptions(run, redocly, target) {
45
+ function apiOptions(run, apiRun, target) {
45
46
  const { name, settings, configRoot } = target;
47
+ const flags = { ...run.args.generatorFlags, ...apiFlags(name, settings) };
48
+ for (const notice of ineffectiveFlagNotices(flags)) {
49
+ run.deps.console.notice(`API ${name}: ${notice}`);
50
+ }
46
51
  return {
47
- ...run.args.generatorFlags,
48
- ...apiFlags(name, settings),
49
- ...refLimitOptions(run.args, run.deps.cwd),
52
+ ...flags,
53
+ ...apiRun.refLimits,
50
54
  ...apiRefLimitOptions(name, settings, configRoot),
51
55
  ...fixOption(apiFixNames(name, settings) ?? run.args.fix),
52
- redocly
56
+ redocly: apiRun.redocly
53
57
  };
54
58
  }
55
59
  function otherOutputs(files, apiName) {
56
60
  return [...files.outputs].filter(([name]) => name !== apiName).map(([name, location]) => ({ name: `API ${name}`, location }));
57
61
  }
58
- async function generateApi(run, redocly, target, files) {
62
+ async function generateApi(run, apiRun, target) {
63
+ const { files } = apiRun;
59
64
  for (const warning of unknownSettingWarnings(target.name, target.settings)) {
60
65
  run.deps.logger.warn(warning);
61
66
  }
@@ -64,8 +69,13 @@ async function generateApi(run, redocly, target, files) {
64
69
  ensureOutputIsNotSchema(run, outputFile, files.schemas);
65
70
  ensureOutputIsOwn(run, outputFile, otherOutputs(files, target.name));
66
71
  const source = resolveLocationUrl(target.root, target.configRoot);
67
- const types = await run.deps.generate(source, apiOptions(run, redocly, target));
68
- return { name: target.name, outputFile, types };
72
+ const options = apiOptions(run, apiRun, target);
73
+ try {
74
+ const types = await run.deps.generate(source, options, target.name);
75
+ return { name: target.name, outputFile, types };
76
+ } catch (error) {
77
+ throw new ApiFailure(target.name, error);
78
+ }
69
79
  }
70
80
  function configFilesOf(run, redocly, apis) {
71
81
  const configRoot = configRootOf(redocly, run.deps.cwd);
@@ -98,9 +108,10 @@ async function settledInTurn(items, task) {
98
108
  async function generateRedoclyApis(run, redocly) {
99
109
  const apis = redoclyApisOf(redocly);
100
110
  const { configRoot, files } = configFilesOf(run, redocly, apis);
111
+ const apiRun = { redocly, files, refLimits: refLimitOptions(run.args, run.deps.cwd) };
101
112
  const results = await settledInTurn(
102
113
  apis,
103
- (api) => generateApi(run, redocly, apiTarget(api, configRoot), files)
114
+ (api) => generateApi(run, apiRun, apiTarget(api, configRoot))
104
115
  );
105
116
  const generated = results.flatMap(
106
117
  (result) => result.status === "fulfilled" ? [result.value] : []
@@ -1 +1 @@
1
- {"version":3,"file":"redocly-apis.mjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport {\n type ApiSettings,\n apiFixNames,\n apiFlags,\n apiOutputOf,\n apiRefLimitOptions,\n OUTPUT_SETTING,\n unknownSettingWarnings,\n} from \"./api-settings.js\";\nimport { type GeneratedApi, writeGeneratedApis } from \"./api-writes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n ensureOutputIsOwn,\n filesReadBy,\n type NamedFile,\n outputFileOf,\n parseLocationUrl,\n redoclyConfigFiles,\n resolveLocationUrl,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\n/** An API of the config as written: `root` and the settings are not checked yet. */\ninterface RedoclyApi {\n readonly name: string;\n readonly root: unknown;\n readonly settings: unknown;\n}\n\nfunction redoclyApisOf(redocly: RedoclyConfig): RedoclyApi[] {\n return Object.entries(redocly.apis ?? {}).map(([name, api]) => {\n const fields = api as Readonly<Record<string, unknown>>;\n return { name, root: fields.root, settings: fields[REDOCLY_CONFIG_KEY] };\n });\n}\n\nexport function hasRedoclyApis(redocly: RedoclyConfig): boolean {\n return Object.keys(redocly.apis ?? {}).length > 0;\n}\n\n/** Paths in the config are relative to the config file; without a file, to the working dir. */\nfunction configRootOf(redocly: RedoclyConfig, cwd: URL): URL {\n return redocly.configFile ? resolveLocationUrl(redocly.configFile, cwd) : cwd;\n}\n\n/** An API whose root and settings are usable, and the directory its paths are relative to. */\ninterface ApiTarget {\n readonly name: string;\n readonly root: string;\n readonly settings: ApiSettings;\n readonly configRoot: URL;\n}\n\nfunction isSettingsMap(value: unknown): value is ApiSettings {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The API with its settings. Fails with `CLI_CONFIG_OUTPUT_MISSING` when they name no output, and\n * with `CLI_CONFIG_INVALID` when they are no map or `root` is no path or URL; only this API then\n * fails, the others are still generated.\n */\nfunction apiTarget(api: RedoclyApi, configRoot: URL): ApiTarget {\n const { name, root, settings } = api;\n if (settings !== undefined && !isSettingsMap(settings)) {\n throw cliError(\"CLI_CONFIG_INVALID\", `API ${name}: \\`${REDOCLY_CONFIG_KEY}\\` must be a map`);\n }\n if (!settings?.[OUTPUT_SETTING]) {\n throw cliError(\n \"CLI_CONFIG_OUTPUT_MISSING\",\n `API ${name} is missing an \\`${REDOCLY_CONFIG_KEY}.output\\` key. ` +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (typeof root !== \"string\" || root === \"\") {\n throw cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${name}: \\`root\\` in redocly.yaml must be the path or URL of its schema`,\n );\n }\n return { name, root, settings, configRoot };\n}\n\n/** The generator options of one API: its own settings win over the CLI's flags. */\nfunction apiOptions(run: CliRun, redocly: RedoclyConfig, target: ApiTarget): GeneratorOptions {\n const { name, settings, configRoot } = target;\n return {\n ...run.args.generatorFlags,\n ...apiFlags(name, settings),\n ...refLimitOptions(run.args, run.deps.cwd),\n ...apiRefLimitOptions(name, settings, configRoot),\n ...fixOption(apiFixNames(name, settings) ?? run.args.fix),\n redocly,\n };\n}\n\n/** The schemas and outputs of every API of the config, keyed by API name for the outputs. */\ninterface ConfigFiles {\n readonly schemas: readonly NamedFile[];\n readonly outputs: ReadonlyMap<string, URL>;\n}\n\n/** The outputs of the other APIs, as `ensureOutputIsOwn` names them. */\nfunction otherOutputs(files: ConfigFiles, apiName: string): NamedFile[] {\n return [...files.outputs]\n .filter(([name]) => name !== apiName)\n .map(([name, location]) => ({ name: `API ${name}`, location }));\n}\n\n/**\n * Generate the types of one API. Its output must not be a file the run reads before any API is\n * loaded (the root of any API, the Redocly config) nor another API's output.\n */\nasync function generateApi(\n run: CliRun,\n redocly: RedoclyConfig,\n target: ApiTarget,\n files: ConfigFiles,\n): Promise<GeneratedApi> {\n for (const warning of unknownSettingWarnings(target.name, target.settings)) {\n run.deps.logger.warn(warning);\n }\n const output = apiOutputOf(target.name, target.settings);\n const outputFile = outputFileOf(run, { source: target.name, output }, target.configRoot);\n ensureOutputIsNotSchema(run, outputFile, files.schemas);\n ensureOutputIsOwn(run, outputFile, otherOutputs(files, target.name));\n const source = resolveLocationUrl(target.root, target.configRoot);\n const types = await run.deps.generate(source, apiOptions(run, redocly, target));\n return { name: target.name, outputFile, types };\n}\n\n/**\n * The schema and the output of every API, and the config file itself. A location that is no\n * text or no valid URL is left out: it is no file that an output could be, and its own API fails\n * on it, not every API.\n */\nfunction configFilesOf(run: CliRun, redocly: RedoclyConfig, apis: readonly RedoclyApi[]) {\n const configRoot = configRootOf(redocly, run.deps.cwd);\n const roots = apis.flatMap(({ name, root }) => {\n const location = typeof root === \"string\" ? parseLocationUrl(root, configRoot) : undefined;\n return location ? [{ name: `schema ${root} of API ${name}`, location }] : [];\n });\n const outputs = new Map<string, URL>();\n for (const api of apis) {\n const output = isSettingsMap(api.settings) ? api.settings[OUTPUT_SETTING] : undefined;\n const location = typeof output === \"string\" ? parseLocationUrl(output, configRoot) : undefined;\n if (location) {\n outputs.set(api.name, location);\n }\n }\n const schemas = [...roots, ...redoclyConfigFiles(run, redocly)];\n return { configRoot, files: { schemas, outputs } satisfies ConfigFiles };\n}\n\n/** What `task` gives for each item, run one after another: the next starts when one settles. */\nasync function settledInTurn<T, R>(\n items: readonly T[],\n task: (item: T) => Promise<R>,\n): Promise<PromiseSettledResult<R>[]> {\n const results: PromiseSettledResult<R>[] = [];\n for (const item of items) {\n try {\n results.push({ status: \"fulfilled\", value: await task(item) });\n } catch (reason) {\n results.push({ status: \"rejected\", reason });\n }\n }\n return results;\n}\n\n/**\n * Generate every API of the config, one after another in the order of the config, then write\n * them. One at a time, so a run takes the memory of its largest API, not the sum of all of them,\n * and the work of one API cannot hold up the fetches of another until their timeout ends them.\n * Nothing is written until every API is read and every output is claimed, so no output can\n * replace a file that another API still reads; an output that is a file any API read (a `$ref`'d\n * schema) fails with `CLI_OUTPUT_IS_INPUT`. Every API is generated or checked even when another\n * fails, so `--check` reports a stale output wherever it is; the failures are returned in the\n * order of the config.\n */\nexport async function generateRedoclyApis(run: CliRun, redocly: RedoclyConfig): Promise<unknown[]> {\n const apis = redoclyApisOf(redocly);\n const { configRoot, files } = configFilesOf(run, redocly, apis);\n const results = await settledInTurn(apis, (api) =>\n generateApi(run, redocly, apiTarget(api, configRoot), files),\n );\n const generated = results.flatMap((result) =>\n result.status === \"fulfilled\" ? [result.value] : [],\n );\n const readFiles = generated.flatMap(({ name, types }) => filesReadBy(run, types, `API ${name}`));\n const writeFailures = writeGeneratedApis(run, generated, readFiles);\n return results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : (writeFailures.get(result.value.name) ?? []),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redocly-apis.mjs","sources":["../../src/cli/redocly-apis.ts"],"sourcesContent":["import type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport type { GeneratorOptions } from \"../types.js\";\nimport {\n type ApiSettings,\n apiFixNames,\n apiFlags,\n apiOutputOf,\n apiRefLimitOptions,\n OUTPUT_SETTING,\n unknownSettingWarnings,\n} from \"./api-settings.js\";\nimport { type GeneratedApi, writeGeneratedApis } from \"./api-writes.js\";\nimport { ineffectiveFlagNotices } from \"./cli-arguments.js\";\nimport { ApiFailure, cliError } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n ensureOutputIsOwn,\n filesReadBy,\n type NamedFile,\n outputFileOf,\n parseLocationUrl,\n redoclyConfigFiles,\n resolveLocationUrl,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { type RefLimitOptions, refLimitOptions } from \"./ref-limits.js\";\n\n/** The `apis` of a Redocly config: each API is generated into its `x-openapi-ts.output`. */\n\n/** The key of an API's openapi-typesafe settings in `redocly.yaml`. */\nconst REDOCLY_CONFIG_KEY = \"x-openapi-ts\";\n\n/** An API of the config as written: `root` and the settings are not checked yet. */\ninterface RedoclyApi {\n readonly name: string;\n readonly root: unknown;\n readonly settings: unknown;\n}\n\nfunction redoclyApisOf(redocly: RedoclyConfig): RedoclyApi[] {\n return Object.entries(redocly.apis ?? {}).map(([name, api]) => {\n const fields = api as Readonly<Record<string, unknown>>;\n return { name, root: fields.root, settings: fields[REDOCLY_CONFIG_KEY] };\n });\n}\n\nexport function hasRedoclyApis(redocly: RedoclyConfig): boolean {\n return Object.keys(redocly.apis ?? {}).length > 0;\n}\n\n/** Paths in the config are relative to the config file; without a file, to the working dir. */\nfunction configRootOf(redocly: RedoclyConfig, cwd: URL): URL {\n return redocly.configFile ? resolveLocationUrl(redocly.configFile, cwd) : cwd;\n}\n\n/** An API whose root and settings are usable, and the directory its paths are relative to. */\ninterface ApiTarget {\n readonly name: string;\n readonly root: string;\n readonly settings: ApiSettings;\n readonly configRoot: URL;\n}\n\nfunction isSettingsMap(value: unknown): value is ApiSettings {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The API with its settings. Fails with `CLI_CONFIG_OUTPUT_MISSING` when they name no output, and\n * with `CLI_CONFIG_INVALID` when they are no map or `root` is no path or URL; only this API then\n * fails, the others are still generated.\n */\nfunction apiTarget(api: RedoclyApi, configRoot: URL): ApiTarget {\n const { name, root, settings } = api;\n if (settings !== undefined && !isSettingsMap(settings)) {\n throw cliError(\"CLI_CONFIG_INVALID\", `API ${name}: \\`${REDOCLY_CONFIG_KEY}\\` must be a map`);\n }\n if (!settings?.[OUTPUT_SETTING]) {\n throw cliError(\n \"CLI_CONFIG_OUTPUT_MISSING\",\n `API ${name} is missing an \\`${REDOCLY_CONFIG_KEY}.output\\` key. ` +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (typeof root !== \"string\" || root === \"\") {\n throw cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${name}: \\`root\\` in redocly.yaml must be the path or URL of its schema`,\n );\n }\n return { name, root, settings, configRoot };\n}\n\n/**\n * What every API of a run shares: the config, the files of all APIs, and the reference limits of\n * the command line, which are checked once before any API, so an invalid flag fails the run once.\n */\ninterface ApiRun {\n readonly redocly: RedoclyConfig;\n readonly files: ConfigFiles;\n readonly refLimits: RefLimitOptions;\n}\n\n/**\n * The generator options of one API: its own settings win over the CLI's flags. A flag that has\n * no effect with the merged flags is named for this API, since its settings may turn on the flag\n * that the command line lacks, or set one that has no effect themselves.\n */\nfunction apiOptions(run: CliRun, apiRun: ApiRun, target: ApiTarget): GeneratorOptions {\n const { name, settings, configRoot } = target;\n const flags = { ...run.args.generatorFlags, ...apiFlags(name, settings) };\n for (const notice of ineffectiveFlagNotices(flags)) {\n run.deps.console.notice(`API ${name}: ${notice}`);\n }\n return {\n ...flags,\n ...apiRun.refLimits,\n ...apiRefLimitOptions(name, settings, configRoot),\n ...fixOption(apiFixNames(name, settings) ?? run.args.fix),\n redocly: apiRun.redocly,\n };\n}\n\n/** The schemas and outputs of every API of the config, keyed by API name for the outputs. */\ninterface ConfigFiles {\n readonly schemas: readonly NamedFile[];\n readonly outputs: ReadonlyMap<string, URL>;\n}\n\n/** The outputs of the other APIs, as `ensureOutputIsOwn` names them. */\nfunction otherOutputs(files: ConfigFiles, apiName: string): NamedFile[] {\n return [...files.outputs]\n .filter(([name]) => name !== apiName)\n .map(([name, location]) => ({ name: `API ${name}`, location }));\n}\n\n/**\n * Generate the types of one API. Its output must not be a file the run reads before any API is\n * loaded (the root of any API, the Redocly config) nor another API's output.\n */\nasync function generateApi(run: CliRun, apiRun: ApiRun, target: ApiTarget): Promise<GeneratedApi> {\n const { files } = apiRun;\n for (const warning of unknownSettingWarnings(target.name, target.settings)) {\n run.deps.logger.warn(warning);\n }\n const output = apiOutputOf(target.name, target.settings);\n const outputFile = outputFileOf(run, { source: target.name, output }, target.configRoot);\n ensureOutputIsNotSchema(run, outputFile, files.schemas);\n ensureOutputIsOwn(run, outputFile, otherOutputs(files, target.name));\n const source = resolveLocationUrl(target.root, target.configRoot);\n const options = apiOptions(run, apiRun, target);\n try {\n const types = await run.deps.generate(source, options, target.name);\n return { name: target.name, outputFile, types };\n } catch (error) {\n throw new ApiFailure(target.name, error);\n }\n}\n\n/**\n * The schema and the output of every API, and the config file itself. A location that is no\n * text or no valid URL is left out: it is no file that an output could be, and its own API fails\n * on it, not every API.\n */\nfunction configFilesOf(run: CliRun, redocly: RedoclyConfig, apis: readonly RedoclyApi[]) {\n const configRoot = configRootOf(redocly, run.deps.cwd);\n const roots = apis.flatMap(({ name, root }) => {\n const location = typeof root === \"string\" ? parseLocationUrl(root, configRoot) : undefined;\n return location ? [{ name: `schema ${root} of API ${name}`, location }] : [];\n });\n const outputs = new Map<string, URL>();\n for (const api of apis) {\n const output = isSettingsMap(api.settings) ? api.settings[OUTPUT_SETTING] : undefined;\n const location = typeof output === \"string\" ? parseLocationUrl(output, configRoot) : undefined;\n if (location) {\n outputs.set(api.name, location);\n }\n }\n const schemas = [...roots, ...redoclyConfigFiles(run, redocly)];\n return { configRoot, files: { schemas, outputs } satisfies ConfigFiles };\n}\n\n/** What `task` gives for each item, run one after another: the next starts when one settles. */\nasync function settledInTurn<T, R>(\n items: readonly T[],\n task: (item: T) => Promise<R>,\n): Promise<PromiseSettledResult<R>[]> {\n const results: PromiseSettledResult<R>[] = [];\n for (const item of items) {\n try {\n results.push({ status: \"fulfilled\", value: await task(item) });\n } catch (reason) {\n results.push({ status: \"rejected\", reason });\n }\n }\n return results;\n}\n\n/**\n * Generate every API of the config, one after another in the order of the config, then write\n * them. One at a time, so a run takes the memory of its largest API, not the sum of all of them,\n * and the work of one API cannot hold up the fetches of another until their timeout ends them.\n * Nothing is written until every API is read and every output is claimed, so no output can\n * replace a file that another API still reads; an output that is a file any API read (a `$ref`'d\n * schema) fails with `CLI_OUTPUT_IS_INPUT`. Every API is generated or checked even when another\n * fails, so `--check` reports a stale output wherever it is; the failures are returned in the\n * order of the config.\n */\nexport async function generateRedoclyApis(run: CliRun, redocly: RedoclyConfig): Promise<unknown[]> {\n const apis = redoclyApisOf(redocly);\n const { configRoot, files } = configFilesOf(run, redocly, apis);\n const apiRun = { redocly, files, refLimits: refLimitOptions(run.args, run.deps.cwd) };\n const results = await settledInTurn(apis, (api) =>\n generateApi(run, apiRun, apiTarget(api, configRoot)),\n );\n const generated = results.flatMap((result) =>\n result.status === \"fulfilled\" ? [result.value] : [],\n );\n const readFiles = generated.flatMap(({ name, types }) => filesReadBy(run, types, `API ${name}`));\n const writeFailures = writeGeneratedApis(run, generated, readFiles);\n return results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : (writeFailures.get(result.value.name) ?? []),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,28 @@
1
1
  'use strict';
2
2
 
3
+ const cliErrors = require('./cli-errors.cjs');
3
4
  const cliOutput = require('./cli-output.cjs');
4
5
 
6
+ const FILE_PROTOCOL = "file:";
7
+ function localRootUrl(location, base) {
8
+ const url = cliOutput.resolveLocationUrl(location, base);
9
+ return url.protocol === FILE_PROTOCOL ? url : void 0;
10
+ }
5
11
  function refLimitOptions(args, cwd) {
6
12
  const { localRefRoot, remoteRefHosts } = args.refLimits;
13
+ const localRoot = localRefRoot === void 0 ? void 0 : localRootUrl(localRefRoot, cwd);
14
+ if (localRefRoot !== void 0 && localRoot === void 0) {
15
+ throw cliErrors.cliError(
16
+ "CLI_FLAG_INVALID",
17
+ `--local-ref-root ${localRefRoot}: a directory path or a file: URL.`
18
+ );
19
+ }
7
20
  return {
8
- ...localRefRoot === void 0 ? {} : { localRefRoot: cliOutput.resolveLocationUrl(localRefRoot, cwd) },
21
+ ...localRoot === void 0 ? {} : { localRefRoot: localRoot },
9
22
  ...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
10
23
  };
11
24
  }
12
25
 
26
+ exports.localRootUrl = localRootUrl;
13
27
  exports.refLimitOptions = refLimitOptions;
14
28
  //# sourceMappingURL=ref-limits.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ref-limits.cjs","sources":["../../src/cli/ref-limits.ts"],"sourcesContent":["import type { GeneratorOptions } from \"../types.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\n\n/** The `$ref` limits of the CLI flags as generator options (threat model R1, R2, ADR-017). */\n\nexport type RefLimitOptions = Pick<GeneratorOptions, \"localRefRoot\" | \"remoteRefHosts\">;\n\n/** `--local-ref-root` resolves against the working directory, like every other CLI path. */\nexport function refLimitOptions(args: CliArguments, cwd: URL): RefLimitOptions {\n const { localRefRoot, remoteRefHosts } = args.refLimits;\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot: resolveLocationUrl(localRefRoot, cwd) }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n"],"names":["resolveLocationUrl"],"mappings":";;;;AASO,SAAS,eAAA,CAAgB,MAAoB,GAAA,EAA2B;AAC7E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,IAAA,CAAK,SAAA;AAC9C,EAAA,OAAO;AAAA,IACL,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,YAAA,EAAcA,4BAAA,CAAmB,YAAA,EAAc,GAAG,CAAA,EAAE;AAAA,IAC5F,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA;AAAe,GAC3D;AACF;;"}
1
+ {"version":3,"file":"ref-limits.cjs","sources":["../../src/cli/ref-limits.ts"],"sourcesContent":["import type { GeneratorOptions } from \"../types.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\n\n/** The `$ref` limits of the CLI flags as generator options (threat model R1, R2, ADR-017). */\n\nexport type RefLimitOptions = Pick<GeneratorOptions, \"localRefRoot\" | \"remoteRefHosts\">;\n\nconst FILE_PROTOCOL = \"file:\";\n\n/** A local `$ref` root as a URL; undefined for a URL of another protocol, which names no folder. */\nexport function localRootUrl(location: string, base: URL): URL | undefined {\n const url = resolveLocationUrl(location, base);\n return url.protocol === FILE_PROTOCOL ? url : undefined;\n}\n\n/**\n * `--local-ref-root` resolves against the working directory, like every other CLI path. A URL of\n * another protocol (`https://…`) fails with `CLI_FLAG_INVALID`.\n */\nexport function refLimitOptions(args: CliArguments, cwd: URL): RefLimitOptions {\n const { localRefRoot, remoteRefHosts } = args.refLimits;\n const localRoot = localRefRoot === undefined ? undefined : localRootUrl(localRefRoot, cwd);\n if (localRefRoot !== undefined && localRoot === undefined) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `--local-ref-root ${localRefRoot}: a directory path or a file: URL.`,\n );\n }\n return {\n ...(localRoot === undefined ? {} : { localRefRoot: localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n"],"names":["resolveLocationUrl","cliError"],"mappings":";;;;;AASA,MAAM,aAAA,GAAgB,OAAA;AAGf,SAAS,YAAA,CAAa,UAAkB,IAAA,EAA4B;AACzE,EAAA,MAAM,GAAA,GAAMA,4BAAA,CAAmB,QAAA,EAAU,IAAI,CAAA;AAC7C,EAAA,OAAO,GAAA,CAAI,QAAA,KAAa,aAAA,GAAgB,GAAA,GAAM,MAAA;AAChD;AAMO,SAAS,eAAA,CAAgB,MAAoB,GAAA,EAA2B;AAC7E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,IAAA,CAAK,SAAA;AAC9C,EAAA,MAAM,YAAY,YAAA,KAAiB,MAAA,GAAY,MAAA,GAAY,YAAA,CAAa,cAAc,GAAG,CAAA;AACzF,EAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,SAAA,KAAc,MAAA,EAAW;AACzD,IAAA,MAAMC,kBAAA;AAAA,MACJ,kBAAA;AAAA,MACA,oBAAoB,YAAY,CAAA,kCAAA;AAAA,KAClC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,cAAc,SAAA,EAAU;AAAA,IAC7D,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA;AAAe,GAC3D;AACF;;;"}
@@ -1,12 +1,25 @@
1
+ import { cliError } from './cli-errors.mjs';
1
2
  import { resolveLocationUrl } from './cli-output.mjs';
2
3
 
4
+ const FILE_PROTOCOL = "file:";
5
+ function localRootUrl(location, base) {
6
+ const url = resolveLocationUrl(location, base);
7
+ return url.protocol === FILE_PROTOCOL ? url : void 0;
8
+ }
3
9
  function refLimitOptions(args, cwd) {
4
10
  const { localRefRoot, remoteRefHosts } = args.refLimits;
11
+ const localRoot = localRefRoot === void 0 ? void 0 : localRootUrl(localRefRoot, cwd);
12
+ if (localRefRoot !== void 0 && localRoot === void 0) {
13
+ throw cliError(
14
+ "CLI_FLAG_INVALID",
15
+ `--local-ref-root ${localRefRoot}: a directory path or a file: URL.`
16
+ );
17
+ }
5
18
  return {
6
- ...localRefRoot === void 0 ? {} : { localRefRoot: resolveLocationUrl(localRefRoot, cwd) },
19
+ ...localRoot === void 0 ? {} : { localRefRoot: localRoot },
7
20
  ...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
8
21
  };
9
22
  }
10
23
 
11
- export { refLimitOptions };
24
+ export { localRootUrl, refLimitOptions };
12
25
  //# sourceMappingURL=ref-limits.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ref-limits.mjs","sources":["../../src/cli/ref-limits.ts"],"sourcesContent":["import type { GeneratorOptions } from \"../types.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\n\n/** The `$ref` limits of the CLI flags as generator options (threat model R1, R2, ADR-017). */\n\nexport type RefLimitOptions = Pick<GeneratorOptions, \"localRefRoot\" | \"remoteRefHosts\">;\n\n/** `--local-ref-root` resolves against the working directory, like every other CLI path. */\nexport function refLimitOptions(args: CliArguments, cwd: URL): RefLimitOptions {\n const { localRefRoot, remoteRefHosts } = args.refLimits;\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot: resolveLocationUrl(localRefRoot, cwd) }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n"],"names":[],"mappings":";;AASO,SAAS,eAAA,CAAgB,MAAoB,GAAA,EAA2B;AAC7E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,IAAA,CAAK,SAAA;AAC9C,EAAA,OAAO;AAAA,IACL,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,YAAA,EAAc,kBAAA,CAAmB,YAAA,EAAc,GAAG,CAAA,EAAE;AAAA,IAC5F,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA;AAAe,GAC3D;AACF;;"}
1
+ {"version":3,"file":"ref-limits.mjs","sources":["../../src/cli/ref-limits.ts"],"sourcesContent":["import type { GeneratorOptions } from \"../types.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\n\n/** The `$ref` limits of the CLI flags as generator options (threat model R1, R2, ADR-017). */\n\nexport type RefLimitOptions = Pick<GeneratorOptions, \"localRefRoot\" | \"remoteRefHosts\">;\n\nconst FILE_PROTOCOL = \"file:\";\n\n/** A local `$ref` root as a URL; undefined for a URL of another protocol, which names no folder. */\nexport function localRootUrl(location: string, base: URL): URL | undefined {\n const url = resolveLocationUrl(location, base);\n return url.protocol === FILE_PROTOCOL ? url : undefined;\n}\n\n/**\n * `--local-ref-root` resolves against the working directory, like every other CLI path. A URL of\n * another protocol (`https://…`) fails with `CLI_FLAG_INVALID`.\n */\nexport function refLimitOptions(args: CliArguments, cwd: URL): RefLimitOptions {\n const { localRefRoot, remoteRefHosts } = args.refLimits;\n const localRoot = localRefRoot === undefined ? undefined : localRootUrl(localRefRoot, cwd);\n if (localRefRoot !== undefined && localRoot === undefined) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `--local-ref-root ${localRefRoot}: a directory path or a file: URL.`,\n );\n }\n return {\n ...(localRoot === undefined ? {} : { localRefRoot: localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n"],"names":[],"mappings":";;;AASA,MAAM,aAAA,GAAgB,OAAA;AAGf,SAAS,YAAA,CAAa,UAAkB,IAAA,EAA4B;AACzE,EAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,QAAA,EAAU,IAAI,CAAA;AAC7C,EAAA,OAAO,GAAA,CAAI,QAAA,KAAa,aAAA,GAAgB,GAAA,GAAM,MAAA;AAChD;AAMO,SAAS,eAAA,CAAgB,MAAoB,GAAA,EAA2B;AAC7E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,IAAA,CAAK,SAAA;AAC9C,EAAA,MAAM,YAAY,YAAA,KAAiB,MAAA,GAAY,MAAA,GAAY,YAAA,CAAa,cAAc,GAAG,CAAA;AACzF,EAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,SAAA,KAAc,MAAA,EAAW;AACzD,IAAA,MAAM,QAAA;AAAA,MACJ,kBAAA;AAAA,MACA,oBAAoB,YAAY,CAAA,kCAAA;AAAA,KAClC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,cAAc,SAAA,EAAU;AAAA,IAC7D,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA;AAAe,GAC3D;AACF;;"}
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ const locationText = require('../domain/location-text.cjs');
3
4
  const warnings = require('../domain/warnings.cjs');
4
5
  const cliArguments = require('./cli-arguments.cjs');
5
6
  const cliErrors = require('./cli-errors.cjs');
@@ -32,9 +33,13 @@ function schemaSource(run) {
32
33
  }
33
34
  return run.deps.stdin();
34
35
  }
36
+ const GLOB_WILDCARD = "*";
37
+ function isGlobPattern(run, input) {
38
+ return input.includes(GLOB_WILDCARD) && !locationText.hasUrlScheme(input) && !run.deps.files.isFile(cliOutput.resolveLocationUrl(input, run.deps.cwd));
39
+ }
35
40
  async function generateSingleSchema(run, redocly) {
36
41
  const { input, output } = run.args;
37
- if (input?.includes("*")) {
42
+ if (input !== void 0 && isGlobPattern(run, input)) {
38
43
  throw cliErrors.cliError(
39
44
  "CLI_GLOB_UNSUPPORTED",
40
45
  `Globbing has been deprecated in favor of redocly.yaml\u2019s \`apis\` keys. See ${docsLinks.MULTIPLE_SCHEMAS_DOCS_URL}`
@@ -46,6 +51,9 @@ async function generateSingleSchema(run, redocly) {
46
51
  "--check needs the generated file to compare with: add --output <file>."
47
52
  );
48
53
  }
54
+ for (const notice of cliArguments.ineffectiveFlagNotices(run.args.generatorFlags)) {
55
+ run.deps.console.notice(notice);
56
+ }
49
57
  const source = schemaSource(run);
50
58
  const outputFile = output ? singleOutputFile(run, output, source, redocly) : void 0;
51
59
  const options = {
@@ -74,21 +82,30 @@ async function generate(run) {
74
82
  await generateSingleSchema(run, redocly);
75
83
  return [];
76
84
  }
77
- if (run.args.input) {
78
- run.deps.logger.warn(
85
+ warnAboutIgnoredArguments(run);
86
+ return redoclyApis.generateRedoclyApis(run, redocly);
87
+ }
88
+ function warnAboutIgnoredArguments(run) {
89
+ const { args, deps } = run;
90
+ if (args.input) {
91
+ deps.logger.warn(
79
92
  warnings.warningText(
80
93
  "APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.",
81
94
  warnings.WARNING_CODES.CLI_INPUT_IGNORED
82
95
  )
83
96
  );
84
97
  }
85
- return redoclyApis.generateRedoclyApis(run, redocly);
98
+ if (args.output) {
99
+ deps.logger.warn(
100
+ warnings.warningText(
101
+ `APIs are specified in Redocly Config, so --output ${args.output} is ignored: each API is written to its x-openapi-ts.output.`,
102
+ warnings.WARNING_CODES.CLI_OUTPUT_IGNORED
103
+ )
104
+ );
105
+ }
86
106
  }
87
107
  async function runCommand(argv, deps) {
88
108
  const startedAt = deps.now();
89
- for (const notice of cliArguments.ineffectiveFlagNotices(argv)) {
90
- deps.console.notice(notice);
91
- }
92
109
  const args = cliArguments.parseCliArguments(argv);
93
110
  for (const flag of args.unknownFlags) {
94
111
  deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.cjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":["cliError","resolveLocationUrl","MULTIPLE_SCHEMAS_DOCS_URL","refLimitOptions","fixOption","writeOutput","filesReadBy","outputFileOf","ensureOutputIsNotSchema","redoclyConfigFiles","hasRedoclyApis","warningText","WARNING_CODES","generateRedoclyApis","ineffectiveFlagNotices","parseCliArguments","HELP_TEXT","describeCliFailure","EXIT_CODES"],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.cjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { hasUrlScheme } from \"../domain/location-text.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** The character that made the original CLI read a schema argument as a glob pattern. */\nconst GLOB_WILDCARD = \"*\";\n\n/**\n * Whether the schema argument is a glob pattern, which the CLI no longer expands: a path with a\n * `*` that names no file. A URL is no pattern (`?fields=*` is its query), nor a file whose name\n * has a `*`, which the CLI reads as any other file.\n */\nfunction isGlobPattern(run: CliRun, input: string): boolean {\n return (\n input.includes(GLOB_WILDCARD) &&\n !hasUrlScheme(input) &&\n !run.deps.files.isFile(resolveLocationUrl(input, run.deps.cwd))\n );\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input !== undefined && isGlobPattern(run, input)) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n for (const notice of ineffectiveFlagNotices(run.args.generatorFlags)) {\n run.deps.console.notice(notice);\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n warnAboutIgnoredArguments(run);\n return generateRedoclyApis(run, redocly);\n}\n\n/** With the APIs of a Redocly config, the input and the output of the command line are unused. */\nfunction warnAboutIgnoredArguments(run: CliRun): void {\n const { args, deps } = run;\n if (args.input) {\n deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n if (args.output) {\n deps.logger.warn(\n warningText(\n `APIs are specified in Redocly Config, so --output ${args.output} is ignored: ` +\n \"each API is written to its x-openapi-ts.output.\",\n WARNING_CODES.CLI_OUTPUT_IGNORED,\n ),\n );\n }\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":["cliError","resolveLocationUrl","hasUrlScheme","MULTIPLE_SCHEMAS_DOCS_URL","ineffectiveFlagNotices","refLimitOptions","fixOption","writeOutput","filesReadBy","outputFileOf","ensureOutputIsNotSchema","redoclyConfigFiles","hasRedoclyApis","generateRedoclyApis","warningText","WARNING_CODES","parseCliArguments","HELP_TEXT","describeCliFailure","EXIT_CODES"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
+ import { hasUrlScheme } from '../domain/location-text.mjs';
1
2
  import { warningText, WARNING_CODES } from '../domain/warnings.mjs';
2
- import { ineffectiveFlagNotices, parseCliArguments } from './cli-arguments.mjs';
3
+ import { parseCliArguments, ineffectiveFlagNotices } from './cli-arguments.mjs';
3
4
  import { describeCliFailure, EXIT_CODES, cliError } from './cli-errors.mjs';
4
5
  import { writeOutput, filesReadBy, resolveLocationUrl, outputFileOf, ensureOutputIsNotSchema, redoclyConfigFiles } from './cli-output.mjs';
5
6
  import { MULTIPLE_SCHEMAS_DOCS_URL } from './docs-links.mjs';
@@ -30,9 +31,13 @@ function schemaSource(run) {
30
31
  }
31
32
  return run.deps.stdin();
32
33
  }
34
+ const GLOB_WILDCARD = "*";
35
+ function isGlobPattern(run, input) {
36
+ return input.includes(GLOB_WILDCARD) && !hasUrlScheme(input) && !run.deps.files.isFile(resolveLocationUrl(input, run.deps.cwd));
37
+ }
33
38
  async function generateSingleSchema(run, redocly) {
34
39
  const { input, output } = run.args;
35
- if (input?.includes("*")) {
40
+ if (input !== void 0 && isGlobPattern(run, input)) {
36
41
  throw cliError(
37
42
  "CLI_GLOB_UNSUPPORTED",
38
43
  `Globbing has been deprecated in favor of redocly.yaml\u2019s \`apis\` keys. See ${MULTIPLE_SCHEMAS_DOCS_URL}`
@@ -44,6 +49,9 @@ async function generateSingleSchema(run, redocly) {
44
49
  "--check needs the generated file to compare with: add --output <file>."
45
50
  );
46
51
  }
52
+ for (const notice of ineffectiveFlagNotices(run.args.generatorFlags)) {
53
+ run.deps.console.notice(notice);
54
+ }
47
55
  const source = schemaSource(run);
48
56
  const outputFile = output ? singleOutputFile(run, output, source, redocly) : void 0;
49
57
  const options = {
@@ -72,21 +80,30 @@ async function generate(run) {
72
80
  await generateSingleSchema(run, redocly);
73
81
  return [];
74
82
  }
75
- if (run.args.input) {
76
- run.deps.logger.warn(
83
+ warnAboutIgnoredArguments(run);
84
+ return generateRedoclyApis(run, redocly);
85
+ }
86
+ function warnAboutIgnoredArguments(run) {
87
+ const { args, deps } = run;
88
+ if (args.input) {
89
+ deps.logger.warn(
77
90
  warningText(
78
91
  "APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.",
79
92
  WARNING_CODES.CLI_INPUT_IGNORED
80
93
  )
81
94
  );
82
95
  }
83
- return generateRedoclyApis(run, redocly);
96
+ if (args.output) {
97
+ deps.logger.warn(
98
+ warningText(
99
+ `APIs are specified in Redocly Config, so --output ${args.output} is ignored: each API is written to its x-openapi-ts.output.`,
100
+ WARNING_CODES.CLI_OUTPUT_IGNORED
101
+ )
102
+ );
103
+ }
84
104
  }
85
105
  async function runCommand(argv, deps) {
86
106
  const startedAt = deps.now();
87
- for (const notice of ineffectiveFlagNotices(argv)) {
88
- deps.console.notice(notice);
89
- }
90
107
  const args = parseCliArguments(argv);
91
108
  for (const flag of args.unknownFlags) {
92
109
  deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { hasUrlScheme } from \"../domain/location-text.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** The character that made the original CLI read a schema argument as a glob pattern. */\nconst GLOB_WILDCARD = \"*\";\n\n/**\n * Whether the schema argument is a glob pattern, which the CLI no longer expands: a path with a\n * `*` that names no file. A URL is no pattern (`?fields=*` is its query), nor a file whose name\n * has a `*`, which the CLI reads as any other file.\n */\nfunction isGlobPattern(run: CliRun, input: string): boolean {\n return (\n input.includes(GLOB_WILDCARD) &&\n !hasUrlScheme(input) &&\n !run.deps.files.isFile(resolveLocationUrl(input, run.deps.cwd))\n );\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input !== undefined && isGlobPattern(run, input)) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n for (const notice of ineffectiveFlagNotices(run.args.generatorFlags)) {\n run.deps.console.notice(notice);\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n warnAboutIgnoredArguments(run);\n return generateRedoclyApis(run, redocly);\n}\n\n/** With the APIs of a Redocly config, the input and the output of the command line are unused. */\nfunction warnAboutIgnoredArguments(run: CliRun): void {\n const { args, deps } = run;\n if (args.input) {\n deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n if (args.output) {\n deps.logger.warn(\n warningText(\n `APIs are specified in Redocly Config, so --output ${args.output} is ignored: ` +\n \"each API is written to its x-openapi-ts.output.\",\n WARNING_CODES.CLI_OUTPUT_IGNORED,\n ),\n );\n }\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
@@ -2,18 +2,24 @@
2
2
 
3
3
  const urlSecrets = require('./url-secrets.cjs');
4
4
 
5
- function redactedValue(value) {
6
- return typeof value === "string" ? urlSecrets.redactUrlSecrets(value) : value;
5
+ const MAX_CAUSE_DEPTH = 8;
6
+ function deeper(walk, value) {
7
+ return { path: /* @__PURE__ */ new Set([...walk.path, value]), depth: walk.depth + 1 };
7
8
  }
8
- function redactedError(error, seen) {
9
- const inner = /* @__PURE__ */ new Set([...seen, error]);
10
- const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error));
9
+ function redactedArray(array, walk) {
10
+ const inner = deeper(walk, array);
11
+ const items = array.map((item) => redactedValue(item, inner));
12
+ return items.every((item, index) => item === array[index]) ? array : items;
13
+ }
14
+ function redactedObject(value, walk) {
15
+ const inner = deeper(walk, value);
16
+ const copy = value instanceof Error ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value)) : Object.create(Object.getPrototypeOf(value));
11
17
  let isChanged = false;
12
- for (const key of Reflect.ownKeys(error)) {
13
- const value = Reflect.get(error, key);
14
- const shown = key === "cause" ? redactedCauseIn(value, inner) : redactedValue(value);
15
- isChanged ||= shown !== value;
16
- const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;
18
+ for (const key of Reflect.ownKeys(value)) {
19
+ const property = Reflect.get(value, key);
20
+ const shown = redactedValue(property, inner);
21
+ isChanged ||= shown !== property;
22
+ const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
17
23
  Object.defineProperty(copy, key, {
18
24
  value: shown,
19
25
  enumerable,
@@ -21,16 +27,25 @@ function redactedError(error, seen) {
21
27
  configurable: true
22
28
  });
23
29
  }
24
- return isChanged ? copy : error;
30
+ return isChanged ? copy : value;
31
+ }
32
+ function isOpaque(value) {
33
+ return typeof value === "function" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;
25
34
  }
26
- function redactedCauseIn(cause, seen) {
27
- if (!(cause instanceof Error)) {
28
- return redactedValue(cause);
35
+ function redactedValue(value, walk) {
36
+ if (typeof value === "string") {
37
+ return urlSecrets.redactUrlSecrets(value);
38
+ }
39
+ if (typeof value !== "object" || value === null || isOpaque(value)) {
40
+ return value;
41
+ }
42
+ if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {
43
+ return void 0;
29
44
  }
30
- return seen.has(cause) ? void 0 : redactedError(cause, seen);
45
+ return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);
31
46
  }
32
47
  function redactCauseSecrets(cause) {
33
- return redactedCauseIn(cause, /* @__PURE__ */ new Set());
48
+ return redactedValue(cause, { path: /* @__PURE__ */ new Set(), depth: 0 });
34
49
  }
35
50
 
36
51
  exports.redactCauseSecrets = redactCauseSecrets;
@@ -1 +1 @@
1
- {"version":3,"file":"cause-secrets.cjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), so the chain must\n * hide the same secrets as the message (url-secrets.ts).\n */\n\n/** A string with its URL secrets hidden; any other value as it is. */\nfunction redactedValue(value: unknown): unknown {\n return typeof value === \"string\" ? redactUrlSecrets(value) : value;\n}\n\n/**\n * A copy of `error` of the same class, its own properties (`message`, `stack`, `code`, `input`, a\n * nested `cause`) with URL secrets hidden, or `error` itself when none of them holds one. Each\n * property is read through its getter (V8 keeps `stack` behind one) and copied as a value.\n */\nfunction redactedError(error: Error, seen: ReadonlySet<Error>): Error {\n const inner = new Set([...seen, error]);\n // A real error with the class of `error`, so `util.inspect` and `util.types.isNativeError`\n // treat it as one.\n const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error)) as Error;\n let isChanged = false;\n for (const key of Reflect.ownKeys(error)) {\n const value: unknown = Reflect.get(error, key);\n const shown = key === \"cause\" ? redactedCauseIn(value, inner) : redactedValue(value);\n isChanged ||= shown !== value;\n const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : error;\n}\n\nfunction redactedCauseIn(cause: unknown, seen: ReadonlySet<Error>): unknown {\n if (!(cause instanceof Error)) {\n return redactedValue(cause);\n }\n // A chain that loops back is cut where it does, so the copy is finite.\n return seen.has(cause) ? undefined : redactedError(cause, seen);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedCauseIn(cause, new Set());\n}\n"],"names":["redactUrlSecrets"],"mappings":";;;;AAUA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAWA,2BAAA,CAAiB,KAAK,CAAA,GAAI,KAAA;AAC/D;AAOA,SAAS,aAAA,CAAc,OAAc,IAAA,EAAiC;AACpE,EAAA,MAAM,wBAAQ,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAA;AAGtC,EAAA,MAAM,IAAA,GAAO,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,eAAA,CAAgB,OAAO,KAAK,CAAA,GAAI,cAAc,KAAK,CAAA;AACnF,IAAA,SAAA,KAAc,KAAA,KAAU,KAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAEA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAAmC;AAC1E,EAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAK,GAAA,CAAI,KAAK,IAAI,MAAA,GAAY,aAAA,CAAc,OAAO,IAAI,CAAA;AAChE;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,eAAA,CAAgB,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AACzC;;"}
1
+ {"version":3,"file":"cause-secrets.cjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), and may keep it in\n * nested objects too (Redocly's parse error holds `originalError.mark.name` and\n * `source.absoluteRef`), so the chain must hide the same secrets as the message (url-secrets.ts)\n * at every depth.\n */\n\n/**\n * How deep the walk copies a cause. The data of a cause is shallow (Redocly's deepest URL is three\n * levels below the error); a value below this depth is dropped, so no secret is kept unread.\n */\nconst MAX_CAUSE_DEPTH = 8;\n\ninterface Walk {\n /** The objects on the way from the cause to the value, so a cycle is cut where it closes. */\n readonly path: ReadonlySet<object>;\n readonly depth: number;\n}\n\nfunction deeper(walk: Walk, value: object): Walk {\n return { path: new Set([...walk.path, value]), depth: walk.depth + 1 };\n}\n\n/** An array with each item hidden, or the array itself when no item holds a secret. */\nfunction redactedArray(array: readonly unknown[], walk: Walk): readonly unknown[] {\n const inner = deeper(walk, array);\n const items = array.map((item) => redactedValue(item, inner));\n return items.every((item, index) => item === array[index]) ? array : items;\n}\n\n/**\n * A copy of `value` with the same prototype, its own properties (`message`, `stack`, `code`,\n * `input`, a nested `cause` or object) with URL secrets hidden, or `value` itself when none of\n * them holds one. Each property is read through its getter (V8 keeps `stack` behind one) and\n * copied as a value.\n */\nfunction redactedObject(value: object, walk: Walk): object {\n const inner = deeper(walk, value);\n // An error is copied as a real error, so `util.inspect` and `util.types.isNativeError` treat\n // the copy as one.\n const copy: object =\n value instanceof Error\n ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value))\n : Object.create(Object.getPrototypeOf(value) as object | null);\n let isChanged = false;\n for (const key of Reflect.ownKeys(value)) {\n const property: unknown = Reflect.get(value, key);\n const shown = redactedValue(property, inner);\n isChanged ||= shown !== property;\n const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : value;\n}\n\n/** Binary data and functions hold no text to hide, so they are kept as they are. */\nfunction isOpaque(value: object): boolean {\n return typeof value === \"function\" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;\n}\n\nfunction redactedValue(value: unknown, walk: Walk): unknown {\n if (typeof value === \"string\") {\n return redactUrlSecrets(value);\n }\n if (typeof value !== \"object\" || value === null || isOpaque(value)) {\n return value;\n }\n if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {\n return undefined;\n }\n return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedValue(cause, { path: new Set(), depth: 0 });\n}\n"],"names":["redactUrlSecrets"],"mappings":";;;;AAeA,MAAM,eAAA,GAAkB,CAAA;AAQxB,SAAS,MAAA,CAAO,MAAY,KAAA,EAAqB;AAC/C,EAAA,OAAO,EAAE,IAAA,kBAAM,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAC,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAE;AACvE;AAGA,SAAS,aAAA,CAAc,OAA2B,IAAA,EAAgC;AAChF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,CAAC,SAAS,aAAA,CAAc,IAAA,EAAM,KAAK,CAAC,CAAA;AAC5D,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,SAAS,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,KAAA,GAAQ,KAAA;AACvE;AAQA,SAAS,cAAA,CAAe,OAAe,IAAA,EAAoB;AACzD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAGhC,EAAA,MAAM,OACJ,KAAA,YAAiB,KAAA,GACb,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA,GAC/D,MAAA,CAAO,OAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAkB,CAAA;AACjE,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,QAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,KAAK,CAAA;AAC3C,IAAA,SAAA,KAAc,KAAA,KAAU,QAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAGA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,IAAc,YAAY,MAAA,CAAO,KAAK,KAAK,KAAA,YAAiB,WAAA;AACtF;AAEA,SAAS,aAAA,CAAc,OAAgB,IAAA,EAAqB;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAOA,4BAAiB,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,SAAS,eAAA,EAAiB;AACzD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,aAAA,CAAc,OAAO,IAAI,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AACvF;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,aAAA,CAAc,OAAO,EAAE,IAAA,sBAAU,GAAA,EAAI,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAC3D;;"}