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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
  23. package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
  25. package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/query-named-components.cjs +129 -0
  27. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/query-named-components.mjs +126 -0
  29. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
  31. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
  33. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +39 -18
  35. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +40 -19
  37. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-access.cjs +25 -4
  39. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-access.mjs +26 -5
  41. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  43. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  45. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +20 -3
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +20 -4
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  59. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  60. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  61. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  62. package/dist/api/cwd-option.cjs +58 -0
  63. package/dist/api/cwd-option.cjs.map +1 -0
  64. package/dist/api/cwd-option.mjs +52 -0
  65. package/dist/api/cwd-option.mjs.map +1 -0
  66. package/dist/api/default-ports.cjs +15 -7
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -8
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/document-refs.cjs +16 -1
  71. package/dist/api/document-refs.cjs.map +1 -1
  72. package/dist/api/document-refs.mjs +16 -1
  73. package/dist/api/document-refs.mjs.map +1 -1
  74. package/dist/api/document-run.cjs +6 -26
  75. package/dist/api/document-run.cjs.map +1 -1
  76. package/dist/api/document-run.mjs +5 -21
  77. package/dist/api/document-run.mjs.map +1 -1
  78. package/dist/api/legacy-utils.cjs +1 -1
  79. package/dist/api/legacy-utils.cjs.map +1 -1
  80. package/dist/api/legacy-utils.mjs +1 -1
  81. package/dist/api/legacy-utils.mjs.map +1 -1
  82. package/dist/api/openapi-ts.cjs +1 -2
  83. package/dist/api/openapi-ts.cjs.map +1 -1
  84. package/dist/api/openapi-ts.mjs +2 -3
  85. package/dist/api/openapi-ts.mjs.map +1 -1
  86. package/dist/api/option-errors.cjs +24 -0
  87. package/dist/api/option-errors.cjs.map +1 -0
  88. package/dist/api/option-errors.mjs +21 -0
  89. package/dist/api/option-errors.mjs.map +1 -0
  90. package/dist/api/ref-limit-options.cjs +58 -0
  91. package/dist/api/ref-limit-options.cjs.map +1 -0
  92. package/dist/api/ref-limit-options.mjs +52 -0
  93. package/dist/api/ref-limit-options.mjs.map +1 -0
  94. package/dist/api/transform-schema.cjs +12 -5
  95. package/dist/api/transform-schema.cjs.map +1 -1
  96. package/dist/api/transform-schema.mjs +12 -5
  97. package/dist/api/transform-schema.mjs.map +1 -1
  98. package/dist/application/transform/declared-value-types.cjs +36 -0
  99. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  100. package/dist/application/transform/declared-value-types.mjs +34 -0
  101. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  102. package/dist/application/transform/document/document.cjs +3 -1
  103. package/dist/application/transform/document/document.cjs.map +1 -1
  104. package/dist/application/transform/document/document.mjs +3 -1
  105. package/dist/application/transform/document/document.mjs.map +1 -1
  106. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  107. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  108. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  109. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  110. package/dist/application/transform/document/header.cjs +11 -3
  111. package/dist/application/transform/document/header.cjs.map +1 -1
  112. package/dist/application/transform/document/header.mjs +10 -2
  113. package/dist/application/transform/document/header.mjs.map +1 -1
  114. package/dist/application/transform/document/parameter.cjs +1 -1
  115. package/dist/application/transform/document/parameter.cjs.map +1 -1
  116. package/dist/application/transform/document/parameter.mjs +1 -1
  117. package/dist/application/transform/document/parameter.mjs.map +1 -1
  118. package/dist/application/transform/document/parameters.cjs +23 -5
  119. package/dist/application/transform/document/parameters.cjs.map +1 -1
  120. package/dist/application/transform/document/parameters.mjs +23 -5
  121. package/dist/application/transform/document/parameters.mjs.map +1 -1
  122. package/dist/application/transform/document/path-item.cjs +4 -3
  123. package/dist/application/transform/document/path-item.cjs.map +1 -1
  124. package/dist/application/transform/document/path-item.mjs +4 -4
  125. package/dist/application/transform/document/path-item.mjs.map +1 -1
  126. package/dist/application/transform/document/path-template-key.cjs +84 -0
  127. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  128. package/dist/application/transform/document/path-template-key.mjs +79 -0
  129. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  130. package/dist/application/transform/document/path-template-refs.cjs +80 -0
  131. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  132. package/dist/application/transform/document/path-template-refs.mjs +77 -0
  133. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  134. package/dist/application/transform/document/paths-enum.cjs +7 -6
  135. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  136. package/dist/application/transform/document/paths-enum.mjs +7 -6
  137. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  138. package/dist/application/transform/document/paths.cjs +38 -66
  139. package/dist/application/transform/document/paths.cjs.map +1 -1
  140. package/dist/application/transform/document/paths.mjs +36 -66
  141. package/dist/application/transform/document/paths.mjs.map +1 -1
  142. package/dist/application/transform/document/webhooks.cjs +10 -3
  143. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  144. package/dist/application/transform/document/webhooks.mjs +9 -2
  145. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  146. package/dist/application/transform/footer/document-footer.cjs +6 -3
  147. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  148. package/dist/application/transform/footer/document-footer.mjs +6 -3
  149. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  150. package/dist/application/transform/helper-types.cjs +3 -3
  151. package/dist/application/transform/helper-types.cjs.map +1 -1
  152. package/dist/application/transform/helper-types.mjs +3 -3
  153. package/dist/application/transform/helper-types.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  155. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  157. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/generated-shape.cjs +63 -64
  159. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  160. package/dist/application/transform/ref-pointer/generated-shape.mjs +57 -53
  161. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  162. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  163. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  165. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  166. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  167. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  168. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  169. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  170. package/dist/application/transform/ref-pointer/original-index.cjs +69 -14
  171. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  172. package/dist/application/transform/ref-pointer/original-index.mjs +71 -16
  173. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  174. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  175. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  176. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  177. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  178. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  179. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  180. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  181. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  182. package/dist/application/transform/ref-pointer/property-shape.cjs +57 -0
  183. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  184. package/dist/application/transform/ref-pointer/property-shape.mjs +49 -0
  185. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  186. package/dist/application/transform/ref-pointer/typed-walk.cjs +90 -22
  187. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  188. package/dist/application/transform/ref-pointer/typed-walk.mjs +87 -19
  189. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  190. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  191. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  192. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  193. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  194. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  195. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  196. package/dist/application/transform/schema/input-location.cjs +23 -0
  197. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  198. package/dist/application/transform/schema/input-location.mjs +21 -0
  199. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  200. package/dist/application/transform/schema/object-type.cjs +15 -5
  201. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  202. package/dist/application/transform/schema/object-type.mjs +15 -5
  203. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  204. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  205. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  206. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  207. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  208. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  209. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  210. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  211. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  212. package/dist/cli/api-logger.cjs +13 -0
  213. package/dist/cli/api-logger.cjs.map +1 -0
  214. package/dist/cli/api-logger.mjs +11 -0
  215. package/dist/cli/api-logger.mjs.map +1 -0
  216. package/dist/cli/api-settings.cjs +10 -17
  217. package/dist/cli/api-settings.cjs.map +1 -1
  218. package/dist/cli/api-settings.mjs +10 -17
  219. package/dist/cli/api-settings.mjs.map +1 -1
  220. package/dist/cli/api-writes.cjs +7 -1
  221. package/dist/cli/api-writes.cjs.map +1 -1
  222. package/dist/cli/api-writes.mjs +7 -1
  223. package/dist/cli/api-writes.mjs.map +1 -1
  224. package/dist/cli/cli-arguments.cjs +32 -74
  225. package/dist/cli/cli-arguments.cjs.map +1 -1
  226. package/dist/cli/cli-arguments.mjs +28 -70
  227. package/dist/cli/cli-arguments.mjs.map +1 -1
  228. package/dist/cli/cli-errors.cjs +18 -0
  229. package/dist/cli/cli-errors.cjs.map +1 -1
  230. package/dist/cli/cli-errors.mjs +18 -1
  231. package/dist/cli/cli-errors.mjs.map +1 -1
  232. package/dist/cli/cli-flag-names.cjs +77 -0
  233. package/dist/cli/cli-flag-names.cjs.map +1 -0
  234. package/dist/cli/cli-flag-names.mjs +64 -0
  235. package/dist/cli/cli-flag-names.mjs.map +1 -0
  236. package/dist/cli/cli-output.cjs +13 -6
  237. package/dist/cli/cli-output.cjs.map +1 -1
  238. package/dist/cli/cli-output.mjs +14 -7
  239. package/dist/cli/cli-output.mjs.map +1 -1
  240. package/dist/cli/main.cjs +11 -5
  241. package/dist/cli/main.cjs.map +1 -1
  242. package/dist/cli/main.mjs +11 -5
  243. package/dist/cli/main.mjs.map +1 -1
  244. package/dist/cli/redocly-apis.cjs +33 -12
  245. package/dist/cli/redocly-apis.cjs.map +1 -1
  246. package/dist/cli/redocly-apis.mjs +35 -14
  247. package/dist/cli/redocly-apis.mjs.map +1 -1
  248. package/dist/cli/ref-limits.cjs +15 -1
  249. package/dist/cli/ref-limits.cjs.map +1 -1
  250. package/dist/cli/ref-limits.mjs +15 -2
  251. package/dist/cli/ref-limits.mjs.map +1 -1
  252. package/dist/cli/run-cli.cjs +24 -7
  253. package/dist/cli/run-cli.cjs.map +1 -1
  254. package/dist/cli/run-cli.mjs +25 -8
  255. package/dist/cli/run-cli.mjs.map +1 -1
  256. package/dist/cli/written-flags.cjs +83 -0
  257. package/dist/cli/written-flags.cjs.map +1 -0
  258. package/dist/cli/written-flags.mjs +77 -0
  259. package/dist/cli/written-flags.mjs.map +1 -0
  260. package/dist/domain/cause-secrets.cjs +31 -16
  261. package/dist/domain/cause-secrets.cjs.map +1 -1
  262. package/dist/domain/cause-secrets.mjs +31 -16
  263. package/dist/domain/cause-secrets.mjs.map +1 -1
  264. package/dist/domain/errors.cjs +3 -0
  265. package/dist/domain/errors.cjs.map +1 -1
  266. package/dist/domain/errors.mjs +3 -0
  267. package/dist/domain/errors.mjs.map +1 -1
  268. package/dist/domain/location-text.cjs +15 -0
  269. package/dist/domain/location-text.cjs.map +1 -0
  270. package/dist/domain/location-text.mjs +13 -0
  271. package/dist/domain/location-text.mjs.map +1 -0
  272. package/dist/domain/openapi/document-places.cjs +55 -0
  273. package/dist/domain/openapi/document-places.cjs.map +1 -0
  274. package/dist/domain/openapi/document-places.mjs +53 -0
  275. package/dist/domain/openapi/document-places.mjs.map +1 -0
  276. package/dist/domain/output-fixes.cjs +8 -2
  277. package/dist/domain/output-fixes.cjs.map +1 -1
  278. package/dist/domain/output-fixes.mjs +8 -2
  279. package/dist/domain/output-fixes.mjs.map +1 -1
  280. package/dist/domain/terminal-text.cjs +31 -0
  281. package/dist/domain/terminal-text.cjs.map +1 -0
  282. package/dist/domain/terminal-text.mjs +29 -0
  283. package/dist/domain/terminal-text.mjs.map +1 -0
  284. package/dist/domain/warnings.cjs +1 -0
  285. package/dist/domain/warnings.cjs.map +1 -1
  286. package/dist/domain/warnings.mjs +1 -0
  287. package/dist/domain/warnings.mjs.map +1 -1
  288. package/dist/index.d.cts +29 -18
  289. package/dist/index.d.mts +29 -18
  290. package/dist/index.d.ts +29 -18
  291. package/package.json +1 -1
  292. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  293. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  294. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  295. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  296. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  297. package/src/adapters/redocly-loader/query-document-names.ts +79 -0
  298. package/src/adapters/redocly-loader/query-named-components.ts +200 -0
  299. package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
  300. package/src/adapters/redocly-loader/redocly-schema-loader.ts +63 -17
  301. package/src/adapters/redocly-loader/ref-access.ts +32 -5
  302. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  303. package/src/adapters/redocly-loader/remote-fetch.ts +37 -2
  304. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  305. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  306. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  307. package/src/api/cwd-option.ts +76 -0
  308. package/src/api/default-ports.ts +33 -10
  309. package/src/api/document-refs.ts +29 -1
  310. package/src/api/document-run.ts +7 -32
  311. package/src/api/legacy-utils.ts +1 -1
  312. package/src/api/openapi-ts.ts +20 -4
  313. package/src/api/option-errors.ts +22 -0
  314. package/src/api/ref-limit-options.ts +69 -0
  315. package/src/api/transform-schema.ts +20 -5
  316. package/src/application/ports/file-system.ts +8 -0
  317. package/src/application/ports/redocly-config-source.ts +5 -0
  318. package/src/application/transform/declared-value-types.ts +42 -0
  319. package/src/application/transform/document/document.ts +4 -2
  320. package/src/application/transform/document/exploded-query-values.ts +88 -0
  321. package/src/application/transform/document/header.ts +25 -5
  322. package/src/application/transform/document/parameter.ts +4 -4
  323. package/src/application/transform/document/parameters.ts +45 -10
  324. package/src/application/transform/document/path-item.ts +3 -3
  325. package/src/application/transform/document/path-template-key.ts +152 -0
  326. package/src/application/transform/document/path-template-refs.ts +127 -0
  327. package/src/application/transform/document/paths-enum.ts +23 -9
  328. package/src/application/transform/document/paths.ts +53 -123
  329. package/src/application/transform/document/webhooks.ts +18 -5
  330. package/src/application/transform/footer/document-footer.ts +18 -8
  331. package/src/application/transform/helper-types.ts +4 -4
  332. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  333. package/src/application/transform/ref-pointer/generated-shape.ts +115 -83
  334. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  335. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  336. package/src/application/transform/ref-pointer/original-index.ts +106 -20
  337. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  338. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  339. package/src/application/transform/ref-pointer/property-shape.ts +106 -0
  340. package/src/application/transform/ref-pointer/typed-walk.ts +143 -29
  341. package/src/application/transform/schema/access-flags.ts +5 -2
  342. package/src/application/transform/schema/index-signature-type.ts +31 -0
  343. package/src/application/transform/schema/input-location.ts +35 -0
  344. package/src/application/transform/schema/object-type.ts +18 -8
  345. package/src/application/transform/schema/schema-transform.ts +2 -1
  346. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  347. package/src/cli/api-logger.ts +17 -0
  348. package/src/cli/api-settings.ts +12 -20
  349. package/src/cli/api-writes.ts +11 -3
  350. package/src/cli/cli-arguments.ts +57 -92
  351. package/src/cli/cli-dependencies.ts +7 -2
  352. package/src/cli/cli-errors.ts +23 -0
  353. package/src/cli/cli-flag-names.ts +99 -0
  354. package/src/cli/cli-output.ts +31 -16
  355. package/src/cli/main.ts +12 -5
  356. package/src/cli/redocly-apis.ts +56 -20
  357. package/src/cli/ref-limits.ts +21 -2
  358. package/src/cli/run-cli.ts +39 -7
  359. package/src/cli/written-flags.ts +131 -0
  360. package/src/domain/cause-secrets.ts +59 -25
  361. package/src/domain/errors.ts +3 -0
  362. package/src/domain/location-text.ts +27 -0
  363. package/src/domain/openapi/document-places.ts +78 -0
  364. package/src/domain/output-fixes.ts +9 -2
  365. package/src/domain/terminal-text.ts +44 -0
  366. package/src/domain/warnings.ts +1 -0
@@ -3,70 +3,27 @@
3
3
  const scule = require('scule');
4
4
  const parser = require('yargs-parser');
5
5
  const cliErrors = require('./cli-errors.cjs');
6
+ const cliFlagNames = require('./cli-flag-names.cjs');
7
+ const docsLinks = require('./docs-links.cjs');
6
8
  const fixOption = require('./fix-option.cjs');
9
+ const writtenFlags = require('./written-flags.cjs');
7
10
 
8
11
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
9
12
 
10
13
  const parser__default = /*#__PURE__*/_interopDefaultCompat(parser);
11
14
 
12
- const GENERATOR_FLAGS = [
13
- "additionalProperties",
14
- "alphabetize",
15
- "arrayLength",
16
- "binaryAsBlob",
17
- "conditionalEnums",
18
- "dedupeEnums",
19
- "defaultNonNullable",
20
- "emptyObjectsUnknown",
21
- "enum",
22
- "enumValues",
23
- "excludeDeprecated",
24
- "exportType",
25
- "generatePathParams",
26
- "immutable",
27
- "lint",
28
- "makePathsEnum",
29
- "pathParamsAsTypes",
30
- "propertiesRequiredByDefault",
31
- "readWriteMarkers",
32
- "rootTypes",
33
- "rootTypesKeepCasing",
34
- "rootTypesNoSchemaPrefix"
35
- ];
36
- const CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, "check", "contentNever", "help"];
37
- const BOOLEAN_FLAGS = [
38
- ...CAMEL_CASE_BOOLEAN_FLAGS,
39
- ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => scule.kebabCase(flag))
40
- ];
41
- const REMOVED_FLAGS = [
42
- ["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
43
- ["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
44
- [
45
- "--support-array-length",
46
- `The --support-array-length flag has been renamed to "--array-length".`
47
- ],
48
- ["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
49
- ["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
50
- ];
51
- const ROOT_TYPES_FLAGS = ["--root-types-no-schema-prefix", "--root-types-keep-casing"];
52
- function rejectRemovedFlags(argv) {
53
- for (const [flag, message] of REMOVED_FLAGS) {
54
- if (argv.includes(flag)) {
55
- throw cliErrors.cliError("CLI_FLAG_REMOVED", message);
56
- }
57
- }
58
- }
59
- function ineffectiveFlagNotices(argv) {
60
- if (argv.includes("--root-types")) {
15
+ const ROOT_TYPES_FLAGS = ["rootTypesNoSchemaPrefix", "rootTypesKeepCasing"];
16
+ function ineffectiveFlagNotices(flags) {
17
+ if (flags.rootTypes === true) {
61
18
  return [];
62
19
  }
63
- return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(
64
- (flag) => `${flag} has no effect without --root-types flag`
20
+ return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(
21
+ (flag) => `--${scule.kebabCase(flag)} has no effect without --root-types flag`
65
22
  );
66
23
  }
67
24
  function generatorFlagsOf(parsed) {
68
25
  const flags = {};
69
- for (const name of GENERATOR_FLAGS) {
26
+ for (const name of cliFlagNames.GENERATOR_FLAGS) {
70
27
  if (typeof parsed[name] === "boolean") {
71
28
  flags[name] = parsed[name];
72
29
  }
@@ -93,21 +50,8 @@ function refLimitsOf(parsed) {
93
50
  ...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
94
51
  };
95
52
  }
96
- const STRING_FLAGS = [
97
- "output",
98
- "redocly",
99
- "fix",
100
- ...["localRefRoot", "remoteRefHosts"].flatMap((flag) => [flag, scule.kebabCase(flag)])
101
- ];
102
- const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
103
- const KNOWN_FLAGS = /* @__PURE__ */ new Set([
104
- ...BOOLEAN_FLAGS,
105
- ...STRING_FLAGS,
106
- ...Object.values(ALIASES).flat(),
107
- "version"
108
- ]);
109
53
  function unknownFlagsOf(parsed, argv) {
110
- const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
54
+ const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !cliFlagNames.KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
111
55
  return [...new Set(names)];
112
56
  }
113
57
  function writtenFlagName(key, argv) {
@@ -118,17 +62,31 @@ function writtenFlagName(key, argv) {
118
62
  const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
119
63
  return isNegated ? negated : `--${scule.kebabCase(key)}`;
120
64
  }
65
+ function inputOf(positionals) {
66
+ if (positionals.length > 1) {
67
+ throw cliErrors.cliError(
68
+ "CLI_INPUT_EXTRA",
69
+ `Only one schema argument is allowed, but ${positionals.length} were given: ${positionals.join(" ")}. A shell expands an unquoted *; to generate several schemas, list them under \`apis\` in redocly.yaml. See ${docsLinks.MULTIPLE_SCHEMAS_DOCS_URL}`
70
+ );
71
+ }
72
+ return optionalString(positionals[0]);
73
+ }
121
74
  function parseCliArguments(argv) {
122
- rejectRemovedFlags(argv);
75
+ const flags = writtenFlags.writtenFlags(argv);
76
+ writtenFlags.rejectRemovedFlags(flags);
77
+ writtenFlags.rejectInvalidBooleans(flags);
78
+ writtenFlags.rejectNegatedValueFlags(flags);
123
79
  const parsed = parser__default([...argv], {
124
- boolean: BOOLEAN_FLAGS,
125
- string: STRING_FLAGS,
126
- alias: ALIASES
80
+ boolean: [...cliFlagNames.BOOLEAN_FLAGS, ...writtenFlags.unknownFlagNames(flags)],
81
+ string: cliFlagNames.STRING_FLAGS,
82
+ alias: cliFlagNames.ALIASES,
83
+ // A schema path is a file name: `1.10` is not the number 1.1.
84
+ configuration: { "parse-positional-numbers": false }
127
85
  });
128
86
  return {
129
- input: optionalString(parsed._[0]),
130
- output: optionalString(parsed.output),
131
- redocly: optionalString(parsed.redocly),
87
+ input: inputOf(parsed._),
88
+ output: lastString(parsed.output),
89
+ redocly: lastString(parsed.redocly),
132
90
  isCheck: parsed.check === true,
133
91
  isHelp: "help" in parsed,
134
92
  isVersion: "version" in parsed,
@@ -139,7 +97,7 @@ function parseCliArguments(argv) {
139
97
  };
140
98
  }
141
99
 
142
- exports.GENERATOR_FLAGS = GENERATOR_FLAGS;
100
+ exports.GENERATOR_FLAGS = cliFlagNames.GENERATOR_FLAGS;
143
101
  exports.hostList = hostList;
144
102
  exports.ineffectiveFlagNotices = ineffectiveFlagNotices;
145
103
  exports.parseCliArguments = parseCliArguments;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** Boolean flags that become generator options (camelCase; yargs also accepts kebab-case). */\nexport const GENERATOR_FLAGS = [\n \"additionalProperties\",\n \"alphabetize\",\n \"arrayLength\",\n \"binaryAsBlob\",\n \"conditionalEnums\",\n \"dedupeEnums\",\n \"defaultNonNullable\",\n \"emptyObjectsUnknown\",\n \"enum\",\n \"enumValues\",\n \"excludeDeprecated\",\n \"exportType\",\n \"generatePathParams\",\n \"immutable\",\n \"lint\",\n \"makePathsEnum\",\n \"pathParamsAsTypes\",\n \"propertiesRequiredByDefault\",\n \"readWriteMarkers\",\n \"rootTypes\",\n \"rootTypesKeepCasing\",\n \"rootTypesNoSchemaPrefix\",\n] as const;\n\nexport type GeneratorFlag = (typeof GENERATOR_FLAGS)[number];\n\nexport type GeneratorFlags = Readonly<Partial<Record<GeneratorFlag, boolean>>>;\n\n// `contentNever` was a boolean flag of the original CLI that no code reads; it stays in the list\n// so that `--content-never <input>` keeps parsing as a flag and an input.\nconst CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, \"check\", \"contentNever\", \"help\"];\n\n// yargs-parser matches the `boolean` list by the exact spelling of the flag: with camelCase names\n// only, `--root-types schema.yaml` took the path as the flag's value (upstream #2523). Both\n// spellings are listed.\nconst BOOLEAN_FLAGS = [\n ...CAMEL_CASE_BOOLEAN_FLAGS,\n ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag)),\n];\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags of older versions that were removed or renamed, with the message for each. */\nconst REMOVED_FLAGS: readonly (readonly [string, string])[] = [\n [\"-ap\", `The -ap alias has been deprecated. Use \"--additional-properties\" instead.`],\n [\"--immutable-types\", `The --immutable-types flag has been renamed to \"--immutable\".`],\n [\n \"--support-array-length\",\n `The --support-array-length flag has been renamed to \"--array-length\".`,\n ],\n [\"-it\", `The -it alias has been deprecated. Use \"--immutable\" instead.`],\n [\"--redoc\", `The --redoc config flag has been renamed to \"--redocly\" (or -c as shorthand).`],\n];\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"--root-types-no-schema-prefix\", \"--root-types-keep-casing\"] as const;\n\nfunction rejectRemovedFlags(argv: readonly string[]): void {\n for (const [flag, message] of REMOVED_FLAGS) {\n if (argv.includes(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(argv: readonly string[]): string[] {\n if (argv.includes(\"--root-types\")) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(\n (flag) => `${flag} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/** The last value of a flag that may be given more than once. */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** String flags, in both spellings, so that a value such as `8080` is not read as a number. */\nconst STRING_FLAGS = [\n \"output\",\n \"redocly\",\n \"fix\",\n ...[\"localRefRoot\", \"remoteRefHosts\"].flatMap((flag) => [flag, kebabCase(flag)]),\n];\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** Every name yargs-parser can return for a flag this CLI reads. */\nconst KNOWN_FLAGS = new Set<string>([\n ...BOOLEAN_FLAGS,\n ...STRING_FLAGS,\n ...Object.values(ALIASES).flat(),\n \"version\",\n]);\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n rejectRemovedFlags(argv);\n const parsed = parser([...argv], {\n boolean: BOOLEAN_FLAGS,\n string: STRING_FLAGS,\n alias: ALIASES,\n });\n return {\n input: optionalString(parsed._[0]),\n output: optionalString(parsed.output),\n redocly: optionalString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","cliError","parser","fixNamesOf"],"mappings":"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"}
1
+ {"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n ALIASES,\n BOOLEAN_FLAGS,\n GENERATOR_FLAGS,\n type GeneratorFlag,\n type GeneratorFlags,\n KNOWN_FLAGS,\n STRING_FLAGS,\n} from \"./cli-flag-names.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport {\n rejectInvalidBooleans,\n rejectNegatedValueFlags,\n rejectRemovedFlags,\n unknownFlagNames,\n writtenFlags,\n} from \"./written-flags.js\";\n\nexport { GENERATOR_FLAGS, type GeneratorFlag, type GeneratorFlags } from \"./cli-flag-names.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * The one schema argument. More than one fails with `CLI_INPUT_EXTRA`: the original CLI read the\n * first and dropped the rest, so a glob the shell expanded (`g/*.yaml`) generated one schema.\n */\nfunction inputOf(positionals: readonly (string | number)[]): string | undefined {\n if (positionals.length > 1) {\n throw cliError(\n \"CLI_INPUT_EXTRA\",\n `Only one schema argument is allowed, but ${positionals.length} were given: ` +\n `${positionals.join(\" \")}. A shell expands an unquoted *; to generate several ` +\n `schemas, list them under \\`apis\\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n return optionalString(positionals[0]);\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false or a `--no-` form\n * of a flag that takes a value, with `CLI_INPUT_EXTRA` for a second schema argument, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n rejectNegatedValueFlags(flags);\n const parsed = parser([...argv], {\n boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],\n string: STRING_FLAGS,\n alias: ALIASES,\n // A schema path is a file name: `1.10` is not the number 1.1.\n configuration: { \"parse-positional-numbers\": false },\n });\n return {\n input: inputOf(parsed._),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","GENERATOR_FLAGS","KNOWN_FLAGS","cliError","MULTIPLE_SCHEMAS_DOCS_URL","writtenFlags","rejectRemovedFlags","rejectInvalidBooleans","rejectNegatedValueFlags","parser","BOOLEAN_FLAGS","unknownFlagNames","STRING_FLAGS","ALIASES","fixNamesOf"],"mappings":"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"}
@@ -1,61 +1,18 @@
1
1
  import { kebabCase } from 'scule';
2
2
  import parser from 'yargs-parser';
3
3
  import { cliError } from './cli-errors.mjs';
4
+ import { ALIASES, STRING_FLAGS, BOOLEAN_FLAGS, KNOWN_FLAGS, GENERATOR_FLAGS } from './cli-flag-names.mjs';
5
+ import { MULTIPLE_SCHEMAS_DOCS_URL } from './docs-links.mjs';
4
6
  import { fixNamesOf } from './fix-option.mjs';
7
+ import { writtenFlags, rejectRemovedFlags, rejectInvalidBooleans, rejectNegatedValueFlags, unknownFlagNames } from './written-flags.mjs';
5
8
 
6
- const GENERATOR_FLAGS = [
7
- "additionalProperties",
8
- "alphabetize",
9
- "arrayLength",
10
- "binaryAsBlob",
11
- "conditionalEnums",
12
- "dedupeEnums",
13
- "defaultNonNullable",
14
- "emptyObjectsUnknown",
15
- "enum",
16
- "enumValues",
17
- "excludeDeprecated",
18
- "exportType",
19
- "generatePathParams",
20
- "immutable",
21
- "lint",
22
- "makePathsEnum",
23
- "pathParamsAsTypes",
24
- "propertiesRequiredByDefault",
25
- "readWriteMarkers",
26
- "rootTypes",
27
- "rootTypesKeepCasing",
28
- "rootTypesNoSchemaPrefix"
29
- ];
30
- const CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, "check", "contentNever", "help"];
31
- const BOOLEAN_FLAGS = [
32
- ...CAMEL_CASE_BOOLEAN_FLAGS,
33
- ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag))
34
- ];
35
- const REMOVED_FLAGS = [
36
- ["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
37
- ["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
38
- [
39
- "--support-array-length",
40
- `The --support-array-length flag has been renamed to "--array-length".`
41
- ],
42
- ["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
43
- ["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
44
- ];
45
- const ROOT_TYPES_FLAGS = ["--root-types-no-schema-prefix", "--root-types-keep-casing"];
46
- function rejectRemovedFlags(argv) {
47
- for (const [flag, message] of REMOVED_FLAGS) {
48
- if (argv.includes(flag)) {
49
- throw cliError("CLI_FLAG_REMOVED", message);
50
- }
51
- }
52
- }
53
- function ineffectiveFlagNotices(argv) {
54
- if (argv.includes("--root-types")) {
9
+ const ROOT_TYPES_FLAGS = ["rootTypesNoSchemaPrefix", "rootTypesKeepCasing"];
10
+ function ineffectiveFlagNotices(flags) {
11
+ if (flags.rootTypes === true) {
55
12
  return [];
56
13
  }
57
- return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(
58
- (flag) => `${flag} has no effect without --root-types flag`
14
+ return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(
15
+ (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`
59
16
  );
60
17
  }
61
18
  function generatorFlagsOf(parsed) {
@@ -87,19 +44,6 @@ function refLimitsOf(parsed) {
87
44
  ...remoteRefHosts === void 0 ? {} : { remoteRefHosts }
88
45
  };
89
46
  }
90
- const STRING_FLAGS = [
91
- "output",
92
- "redocly",
93
- "fix",
94
- ...["localRefRoot", "remoteRefHosts"].flatMap((flag) => [flag, kebabCase(flag)])
95
- ];
96
- const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
97
- const KNOWN_FLAGS = /* @__PURE__ */ new Set([
98
- ...BOOLEAN_FLAGS,
99
- ...STRING_FLAGS,
100
- ...Object.values(ALIASES).flat(),
101
- "version"
102
- ]);
103
47
  function unknownFlagsOf(parsed, argv) {
104
48
  const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
105
49
  return [...new Set(names)];
@@ -112,17 +56,31 @@ function writtenFlagName(key, argv) {
112
56
  const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
113
57
  return isNegated ? negated : `--${kebabCase(key)}`;
114
58
  }
59
+ function inputOf(positionals) {
60
+ if (positionals.length > 1) {
61
+ throw cliError(
62
+ "CLI_INPUT_EXTRA",
63
+ `Only one schema argument is allowed, but ${positionals.length} were given: ${positionals.join(" ")}. A shell expands an unquoted *; to generate several schemas, list them under \`apis\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`
64
+ );
65
+ }
66
+ return optionalString(positionals[0]);
67
+ }
115
68
  function parseCliArguments(argv) {
116
- rejectRemovedFlags(argv);
69
+ const flags = writtenFlags(argv);
70
+ rejectRemovedFlags(flags);
71
+ rejectInvalidBooleans(flags);
72
+ rejectNegatedValueFlags(flags);
117
73
  const parsed = parser([...argv], {
118
- boolean: BOOLEAN_FLAGS,
74
+ boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],
119
75
  string: STRING_FLAGS,
120
- alias: ALIASES
76
+ alias: ALIASES,
77
+ // A schema path is a file name: `1.10` is not the number 1.1.
78
+ configuration: { "parse-positional-numbers": false }
121
79
  });
122
80
  return {
123
- input: optionalString(parsed._[0]),
124
- output: optionalString(parsed.output),
125
- redocly: optionalString(parsed.redocly),
81
+ input: inputOf(parsed._),
82
+ output: lastString(parsed.output),
83
+ redocly: lastString(parsed.redocly),
126
84
  isCheck: parsed.check === true,
127
85
  isHelp: "help" in parsed,
128
86
  isVersion: "version" in parsed,
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.mjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** Boolean flags that become generator options (camelCase; yargs also accepts kebab-case). */\nexport const GENERATOR_FLAGS = [\n \"additionalProperties\",\n \"alphabetize\",\n \"arrayLength\",\n \"binaryAsBlob\",\n \"conditionalEnums\",\n \"dedupeEnums\",\n \"defaultNonNullable\",\n \"emptyObjectsUnknown\",\n \"enum\",\n \"enumValues\",\n \"excludeDeprecated\",\n \"exportType\",\n \"generatePathParams\",\n \"immutable\",\n \"lint\",\n \"makePathsEnum\",\n \"pathParamsAsTypes\",\n \"propertiesRequiredByDefault\",\n \"readWriteMarkers\",\n \"rootTypes\",\n \"rootTypesKeepCasing\",\n \"rootTypesNoSchemaPrefix\",\n] as const;\n\nexport type GeneratorFlag = (typeof GENERATOR_FLAGS)[number];\n\nexport type GeneratorFlags = Readonly<Partial<Record<GeneratorFlag, boolean>>>;\n\n// `contentNever` was a boolean flag of the original CLI that no code reads; it stays in the list\n// so that `--content-never <input>` keeps parsing as a flag and an input.\nconst CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, \"check\", \"contentNever\", \"help\"];\n\n// yargs-parser matches the `boolean` list by the exact spelling of the flag: with camelCase names\n// only, `--root-types schema.yaml` took the path as the flag's value (upstream #2523). Both\n// spellings are listed.\nconst BOOLEAN_FLAGS = [\n ...CAMEL_CASE_BOOLEAN_FLAGS,\n ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag)),\n];\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags of older versions that were removed or renamed, with the message for each. */\nconst REMOVED_FLAGS: readonly (readonly [string, string])[] = [\n [\"-ap\", `The -ap alias has been deprecated. Use \"--additional-properties\" instead.`],\n [\"--immutable-types\", `The --immutable-types flag has been renamed to \"--immutable\".`],\n [\n \"--support-array-length\",\n `The --support-array-length flag has been renamed to \"--array-length\".`,\n ],\n [\"-it\", `The -it alias has been deprecated. Use \"--immutable\" instead.`],\n [\"--redoc\", `The --redoc config flag has been renamed to \"--redocly\" (or -c as shorthand).`],\n];\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"--root-types-no-schema-prefix\", \"--root-types-keep-casing\"] as const;\n\nfunction rejectRemovedFlags(argv: readonly string[]): void {\n for (const [flag, message] of REMOVED_FLAGS) {\n if (argv.includes(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(argv: readonly string[]): string[] {\n if (argv.includes(\"--root-types\")) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(\n (flag) => `${flag} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/** The last value of a flag that may be given more than once. */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** String flags, in both spellings, so that a value such as `8080` is not read as a number. */\nconst STRING_FLAGS = [\n \"output\",\n \"redocly\",\n \"fix\",\n ...[\"localRefRoot\", \"remoteRefHosts\"].flatMap((flag) => [flag, kebabCase(flag)]),\n];\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** Every name yargs-parser can return for a flag this CLI reads. */\nconst KNOWN_FLAGS = new Set<string>([\n ...BOOLEAN_FLAGS,\n ...STRING_FLAGS,\n ...Object.values(ALIASES).flat(),\n \"version\",\n]);\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n rejectRemovedFlags(argv);\n const parsed = parser([...argv], {\n boolean: BOOLEAN_FLAGS,\n string: STRING_FLAGS,\n alias: ALIASES,\n });\n return {\n input: optionalString(parsed._[0]),\n output: optionalString(parsed.output),\n redocly: optionalString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-arguments.mjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n ALIASES,\n BOOLEAN_FLAGS,\n GENERATOR_FLAGS,\n type GeneratorFlag,\n type GeneratorFlags,\n KNOWN_FLAGS,\n STRING_FLAGS,\n} from \"./cli-flag-names.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport {\n rejectInvalidBooleans,\n rejectNegatedValueFlags,\n rejectRemovedFlags,\n unknownFlagNames,\n writtenFlags,\n} from \"./written-flags.js\";\n\nexport { GENERATOR_FLAGS, type GeneratorFlag, type GeneratorFlags } from \"./cli-flag-names.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * The one schema argument. More than one fails with `CLI_INPUT_EXTRA`: the original CLI read the\n * first and dropped the rest, so a glob the shell expanded (`g/*.yaml`) generated one schema.\n */\nfunction inputOf(positionals: readonly (string | number)[]): string | undefined {\n if (positionals.length > 1) {\n throw cliError(\n \"CLI_INPUT_EXTRA\",\n `Only one schema argument is allowed, but ${positionals.length} were given: ` +\n `${positionals.join(\" \")}. A shell expands an unquoted *; to generate several ` +\n `schemas, list them under \\`apis\\` in redocly.yaml. See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n return optionalString(positionals[0]);\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false or a `--no-` form\n * of a flag that takes a value, with `CLI_INPUT_EXTRA` for a second schema argument, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n rejectNegatedValueFlags(flags);\n const parsed = parser([...argv], {\n boolean: [...BOOLEAN_FLAGS, ...unknownFlagNames(flags)],\n string: STRING_FLAGS,\n alias: ALIASES,\n // A schema path is a file name: `1.10` is not the number 1.1.\n configuration: { \"parse-positional-numbers\": false },\n });\n return {\n input: inputOf(parsed._),\n output: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -57,14 +57,17 @@ const CLI_ERROR_REPORTS = {
57
57
  ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },
58
58
  CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },
59
59
  OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },
60
+ OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },
60
61
  TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
61
62
  CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },
63
+ CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },
62
64
  CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },
63
65
  CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
64
66
  CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },
65
67
  CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
66
68
  CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
67
69
  CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
70
+ CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },
68
71
  CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },
69
72
  CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },
70
73
  CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },
@@ -74,6 +77,10 @@ const CLI_ERROR_REPORTS = {
74
77
  OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT }
75
78
  };
76
79
  function describeCliFailure(error) {
80
+ if (error instanceof ApiFailure) {
81
+ const failure = describeCliFailure(error.cause);
82
+ return { ...failure, message: `API ${error.apiName}: ${failure.message}` };
83
+ }
77
84
  if (!errors.isOpenAPITypesafeError(error)) {
78
85
  const text = error instanceof Error ? error.stack ?? error.message : String(error);
79
86
  return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };
@@ -82,10 +89,21 @@ function describeCliFailure(error) {
82
89
  const message = report.message?.(error) ?? error.message;
83
90
  return { exitCode: report.exitCode, message: `${message} (${error.code})` };
84
91
  }
92
+ class ApiFailure extends Error {
93
+ name = "ApiFailure";
94
+ cause;
95
+ apiName;
96
+ constructor(apiName, cause) {
97
+ super(`API ${apiName} failed`, { cause });
98
+ this.apiName = apiName;
99
+ this.cause = cause;
100
+ }
101
+ }
85
102
  function cliError(code, message, cause) {
86
103
  return new errors.OpenAPITypesafeError({ code: errors.ERROR_CODES[code], message, cause });
87
104
  }
88
105
 
106
+ exports.ApiFailure = ApiFailure;
89
107
  exports.EXIT_CODES = EXIT_CODES;
90
108
  exports.cliError = cliError;
91
109
  exports.describeCliFailure = describeCliFailure;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-errors.cjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":["isOpenAPITypesafeError","OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;AAcO,MAAM,UAAA,GAAa;AAAA,EACxB,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,YAAA,EAAc,CAAA;AAAA;AAAA,EAEd,KAAA,EAAO,CAAA;AAAA;AAAA,EAEP,MAAA,EAAQ,CAAA;AAAA;AAAA,EAER,MAAA,EAAQ,CAAA;AAAA;AAAA,EAER,QAAA,EAAU;AACZ;AAWA,SAAS,qBAAqB,KAAA,EAAqC;AACjE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA;AACtF,EAAA,OAAO,4BAA4B,KAAK,CAAA,CAAA,EAAI,KAAA,KAAU,CAAA,GAAI,UAAU,QAAQ,CAAA,YAAA,CAAA;AAC9E;AAMA,SAAS,kBAAkB,KAAA,EAAqC;AAC9D,EAAA,MAAM,SAAS,KAAA,CAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,MAAM,KAAA,GAAQ,MAAA;AAClE,EAAA,IAAI,EAAE,kBAAkB,KAAA,CAAA,EAAQ;AAC9B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAEA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,CAAA;AAC7E;AAGA,MAAM,wBAAA,GAA2B,qCAAA;AAGjC,SAAS,mBAAmB,KAAA,EAAqC;AAC/D,EAAA,MAAM,QAAQ,wBAAA,CAAyB,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAC,CAAA;AAC9D,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OACE,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,gCAAA,EAAmC,KAAK,CAAA,sFAAA,CAAA;AAG5D;AAMA,SAAS,qBAAqB,KAAA,EAAqC;AACjE,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,KAAA,CAAM,OAAA;AACjC,EAAA,IAAI,QAAA,KAAa,QAAA,IAAY,OAAO,IAAA,KAAS,QAAA,EAAU;AACrD,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OACE,oCAAoC,IAAI,CAAA,sIAAA,CAAA;AAG5C;AAEA,MAAM,iBAAA,GAAiE;AAAA,EACrE,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACnD,uBAAuB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,oBAAA,EAAqB;AAAA,EACpF,oBAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,iBAAA,EAAkB;AAAA,EAC9E,qBAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,kBAAA,EAAmB;AAAA,EAChF,0BAAA,EAA4B,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC1D,gBAAgB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,oBAAA,EAAqB;AAAA,EAC7E,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAClD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACpD,qBAAA,EAAuB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACrD,uBAAA,EAAyB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACvD,eAAA,EAAiB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC/C,sBAAA,EAAwB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACtD,eAAA,EAAiB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC/C,0BAAA,EAA4B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACzD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,gBAAA,EAAkB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAC/C,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,yBAAA,EAA2B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACxD,wBAAA,EAA0B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACvD,iBAAA,EAAmB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAChD,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAClD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,YAAA,EAAc,EAAE,QAAA,EAAU,UAAA,CAAW,YAAA,EAAa;AAAA,EAClD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAClD,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA;AAC9C,CAAA;AAYO,SAAS,mBAAmB,KAAA,EAA4B;AAC7D,EAAA,IAAI,CAACA,6BAAA,CAAuB,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,iBAAiB,KAAA,GAAS,KAAA,CAAM,SAAS,KAAA,CAAM,OAAA,GAAW,OAAO,KAAK,CAAA;AACnF,IAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,UAAU,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA,EAAG;AAAA,EAC/E;AACA,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,GAAU,KAAK,KAAK,KAAA,CAAM,OAAA;AACjD,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,GAAG,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,EAAI;AAC5E;AAGO,SAAS,QAAA,CACd,IAAA,EACA,OAAA,EACA,KAAA,EACsB;AACtB,EAAA,OAAO,IAAIC,4BAAqB,EAAE,IAAA,EAAMC,mBAAY,IAAI,CAAA,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAC7E;;;;"}
1
+ {"version":3,"file":"cli-errors.cjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (error instanceof ApiFailure) {\n const failure = describeCliFailure(error.cause);\n return { ...failure, message: `API ${error.apiName}: ${failure.message}` };\n }\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/**\n * A failure of one API of a Redocly config. The CLI reports its cause with the API named first,\n * as the config errors of an API are; the cause keeps its code and so its exit code.\n */\nexport class ApiFailure extends Error {\n override readonly name = \"ApiFailure\";\n override readonly cause: unknown;\n readonly apiName: string;\n\n constructor(apiName: string, cause: unknown) {\n super(`API ${apiName} failed`, { cause });\n this.apiName = apiName;\n this.cause = cause;\n }\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":["isOpenAPITypesafeError","OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;AAcO,MAAM,UAAA,GAAa;AAAA,EACxB,OAAA,EAAS,CAAA;AAAA;AAAA,EAET,YAAA,EAAc,CAAA;AAAA;AAAA,EAEd,KAAA,EAAO,CAAA;AAAA;AAAA,EAEP,MAAA,EAAQ,CAAA;AAAA;AAAA,EAER,MAAA,EAAQ,CAAA;AAAA;AAAA,EAER,QAAA,EAAU;AACZ;AAWA,SAAS,qBAAqB,KAAA,EAAqC;AACjE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA;AACtF,EAAA,OAAO,4BAA4B,KAAK,CAAA,CAAA,EAAI,KAAA,KAAU,CAAA,GAAI,UAAU,QAAQ,CAAA,YAAA,CAAA;AAC9E;AAMA,SAAS,kBAAkB,KAAA,EAAqC;AAC9D,EAAA,MAAM,SAAS,KAAA,CAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,MAAM,KAAA,GAAQ,MAAA;AAClE,EAAA,IAAI,EAAE,kBAAkB,KAAA,CAAA,EAAQ;AAC9B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAEA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA,CAAA;AAC7E;AAGA,MAAM,wBAAA,GAA2B,qCAAA;AAGjC,SAAS,mBAAmB,KAAA,EAAqC;AAC/D,EAAA,MAAM,QAAQ,wBAAA,CAAyB,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAC,CAAA;AAC9D,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OACE,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,gCAAA,EAAmC,KAAK,CAAA,sFAAA,CAAA;AAG5D;AAMA,SAAS,qBAAqB,KAAA,EAAqC;AACjE,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,KAAA,CAAM,OAAA;AACjC,EAAA,IAAI,QAAA,KAAa,QAAA,IAAY,OAAO,IAAA,KAAS,QAAA,EAAU;AACrD,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OACE,oCAAoC,IAAI,CAAA,sIAAA,CAAA;AAG5C;AAEA,MAAM,iBAAA,GAAiE;AAAA,EACrE,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACnD,uBAAuB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,oBAAA,EAAqB;AAAA,EACpF,oBAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,iBAAA,EAAkB;AAAA,EAC9E,qBAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,kBAAA,EAAmB;AAAA,EAChF,0BAAA,EAA4B,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC1D,gBAAgB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,SAAS,oBAAA,EAAqB;AAAA,EAC7E,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAClD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACpD,qBAAA,EAAuB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACrD,uBAAA,EAAyB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACvD,eAAA,EAAiB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC/C,sBAAA,EAAwB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EACtD,eAAA,EAAiB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAC/C,0BAAA,EAA4B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACzD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,cAAA,EAAgB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAC7C,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,gBAAA,EAAkB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAC/C,gBAAA,EAAkB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAC/C,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,yBAAA,EAA2B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACxD,wBAAA,EAA0B,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACvD,iBAAA,EAAmB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAChD,eAAA,EAAiB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAC9C,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EAClD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACjD,oBAAA,EAAsB,EAAE,QAAA,EAAU,UAAA,CAAW,KAAA,EAAM;AAAA,EACnD,YAAA,EAAc,EAAE,QAAA,EAAU,UAAA,CAAW,YAAA,EAAa;AAAA,EAClD,kBAAA,EAAoB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA,EAAO;AAAA,EAClD,mBAAA,EAAqB,EAAE,QAAA,EAAU,UAAA,CAAW,MAAA;AAC9C,CAAA;AAYO,SAAS,mBAAmB,KAAA,EAA4B;AAC7D,EAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAA;AAC9C,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,CAAA,IAAA,EAAO,MAAM,OAAO,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAG;AAAA,EAC3E;AACA,EAAA,IAAI,CAACA,6BAAA,CAAuB,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,iBAAiB,KAAA,GAAS,KAAA,CAAM,SAAS,KAAA,CAAM,OAAA,GAAW,OAAO,KAAK,CAAA;AACnF,IAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,UAAU,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA,EAAG;AAAA,EAC/E;AACA,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,GAAU,KAAK,KAAK,KAAA,CAAM,OAAA;AACjD,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,GAAG,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA,EAAI;AAC5E;AAMO,MAAM,mBAAmB,KAAA,CAAM;AAAA,EAClB,IAAA,GAAO,YAAA;AAAA,EACP,KAAA;AAAA,EACT,OAAA;AAAA,EAET,WAAA,CAAY,SAAiB,KAAA,EAAgB;AAC3C,IAAA,KAAA,CAAM,CAAA,IAAA,EAAO,OAAO,CAAA,OAAA,CAAA,EAAW,EAAE,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAGO,SAAS,QAAA,CACd,IAAA,EACA,OAAA,EACA,KAAA,EACsB;AACtB,EAAA,OAAO,IAAIC,4BAAqB,EAAE,IAAA,EAAMC,mBAAY,IAAI,CAAA,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAC7E;;;;;"}
@@ -55,14 +55,17 @@ const CLI_ERROR_REPORTS = {
55
55
  ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },
56
56
  CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },
57
57
  OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },
58
+ OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },
58
59
  TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
59
60
  CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },
61
+ CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },
60
62
  CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },
61
63
  CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
62
64
  CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },
63
65
  CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
64
66
  CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
65
67
  CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
68
+ CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },
66
69
  CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },
67
70
  CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },
68
71
  CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },
@@ -72,6 +75,10 @@ const CLI_ERROR_REPORTS = {
72
75
  OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT }
73
76
  };
74
77
  function describeCliFailure(error) {
78
+ if (error instanceof ApiFailure) {
79
+ const failure = describeCliFailure(error.cause);
80
+ return { ...failure, message: `API ${error.apiName}: ${failure.message}` };
81
+ }
75
82
  if (!isOpenAPITypesafeError(error)) {
76
83
  const text = error instanceof Error ? error.stack ?? error.message : String(error);
77
84
  return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };
@@ -80,9 +87,19 @@ function describeCliFailure(error) {
80
87
  const message = report.message?.(error) ?? error.message;
81
88
  return { exitCode: report.exitCode, message: `${message} (${error.code})` };
82
89
  }
90
+ class ApiFailure extends Error {
91
+ name = "ApiFailure";
92
+ cause;
93
+ apiName;
94
+ constructor(apiName, cause) {
95
+ super(`API ${apiName} failed`, { cause });
96
+ this.apiName = apiName;
97
+ this.cause = cause;
98
+ }
99
+ }
83
100
  function cliError(code, message, cause) {
84
101
  return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });
85
102
  }
86
103
 
87
- export { EXIT_CODES, cliError, describeCliFailure };
104
+ export { ApiFailure, EXIT_CODES, cliError, describeCliFailure };
88
105
  //# sourceMappingURL=cli-errors.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-errors.mjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-errors.mjs","sources":["../../src/cli/cli-errors.ts"],"sourcesContent":["import {\n ERROR_CODES,\n type ErrorCode,\n isOpenAPITypesafeError,\n OpenAPITypesafeError,\n} from \"../domain/errors.js\";\n\n/**\n * How the CLI reports a failure (ENGINEERING_PLAN 4.6, ADR-011): each error code maps to a process\n * exit code and the line printed for it. The table is exhaustive, so a new error code does not\n * compile until the CLI handles it.\n */\n\n/** Process exit codes of the CLI, documented in docs/cli.md. */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n /** `--check` found output that differs from the generated types (as in the original CLI). */\n OUTPUT_STALE: 1,\n /** A flag, the Redocly config, the environment or a callback is wrong. */\n USAGE: 2,\n /** The OpenAPI document cannot be read, is invalid, or cannot be converted. */\n SCHEMA: 3,\n /** An output file cannot be read or written. */\n OUTPUT: 4,\n /** An unexpected failure: a bug in the generator (sysexits `EX_SOFTWARE`). */\n INTERNAL: 70,\n} as const;\n\nexport type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];\n\ninterface CliErrorReport {\n readonly exitCode: ExitCode;\n /** The printed text; the error's own message when absent. */\n readonly message?: (error: OpenAPITypesafeError) => string;\n}\n\n/** Problems are printed one by one while linting, so the summary only counts them. */\nfunction schemaInvalidMessage(error: OpenAPITypesafeError): string {\n const count = Array.isArray(error.details.problems) ? error.details.problems.length : 1;\n return `The OpenAPI document has ${count} ${count === 1 ? \"error\" : \"errors\"} (see above)`;\n}\n\n/**\n * Node's `fetch` fails with only \"fetch failed\"; the network reason (refused, DNS, TLS) is the\n * cause of that error. The Node API keeps the original message, so only the CLI adds it.\n */\nfunction loadFailedMessage(error: OpenAPITypesafeError): string {\n const reason = error.cause instanceof Error ? error.cause.cause : undefined;\n if (!(reason instanceof Error)) {\n return error.message;\n }\n // `loadFailedError`, the only source of this code, always sets the source.\n return `${error.message}: ${reason.message} (${String(error.details.source)})`;\n}\n\n/** The message js-yaml throws at its nesting limit (docs/security/threat-model.md T2). */\nconst YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \\((\\d+)\\)/;\n\n/** The parser's message says the limit, not how to stay under it. */\nfunction parseFailedMessage(error: OpenAPITypesafeError): string {\n const limit = YAML_DEPTH_LIMIT_MESSAGE.exec(error.message)?.[1];\n if (limit === undefined) {\n return error.message;\n }\n return (\n `${error.message}. The YAML parser reads at most ${limit} nested levels: ` +\n \"move nested schemas to `components` and reference them with `$ref`\"\n );\n}\n\n/**\n * Text piped into stdin that is only a YAML string (`echo api.yaml | openapi-typesafe`) gets the\n * CLI's advice, not the Node API's (`openapiTS(pathToFileURL(path))`).\n */\nfunction sourceInvalidMessage(error: OpenAPITypesafeError): string {\n const { received, text } = error.details;\n if (received !== \"stream\" || typeof text !== \"string\") {\n return error.message;\n }\n return (\n `stdin held only the YAML string \"${text}\", not an OpenAPI document. To read a file, pass ` +\n \"its path or URL as the first argument: openapi-typesafe ./openapi.yaml -o ./schema.ts\"\n );\n}\n\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: sourceInvalidMessage },\n SCHEMA_LOAD_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: loadFailedMessage },\n SCHEMA_PARSE_FAILED: { exitCode: EXIT_CODES.SCHEMA, message: parseFailedMessage },\n SCHEMA_VERSION_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_INVALID: { exitCode: EXIT_CODES.SCHEMA, message: schemaInvalidMessage },\n SCHEMA_REF_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_REF_FORBIDDEN: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_OBJECT_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_PROPERTY_INVALID: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_TOO_DEEP: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_KEY_UNSUPPORTED: { exitCode: EXIT_CODES.SCHEMA },\n ENUM_NAME_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n CALLBACK_RESULT_UNREADABLE: { exitCode: EXIT_CODES.USAGE },\n OPTION_FIX_UNKNOWN: { exitCode: EXIT_CODES.USAGE },\n OPTION_INVALID: { exitCode: EXIT_CODES.USAGE },\n TYPESCRIPT_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },\n CLI_FLAG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_INPUT_EXTRA: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_IS_INPUT: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_DUPLICATE: { exitCode: EXIT_CODES.USAGE },\n CLI_OUTPUT_INVALID: { exitCode: EXIT_CODES.USAGE },\n CLI_LOCATION_INVALID: { exitCode: EXIT_CODES.USAGE },\n OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },\n OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT },\n};\n\n/** What the CLI prints and returns for a thrown value. */\nexport interface CliFailure {\n readonly exitCode: ExitCode;\n readonly message: string;\n}\n\n/**\n * Map a thrown value to the CLI's output. A typed error prints one line with its code; anything\n * else is a bug and prints its stack, so it can be reported.\n */\nexport function describeCliFailure(error: unknown): CliFailure {\n if (error instanceof ApiFailure) {\n const failure = describeCliFailure(error.cause);\n return { ...failure, message: `API ${error.apiName}: ${failure.message}` };\n }\n if (!isOpenAPITypesafeError(error)) {\n const text = error instanceof Error ? (error.stack ?? error.message) : String(error);\n return { exitCode: EXIT_CODES.INTERNAL, message: `Unexpected error: ${text}` };\n }\n const report = CLI_ERROR_REPORTS[error.code];\n const message = report.message?.(error) ?? error.message;\n return { exitCode: report.exitCode, message: `${message} (${error.code})` };\n}\n\n/**\n * A failure of one API of a Redocly config. The CLI reports its cause with the API named first,\n * as the config errors of an API are; the cause keeps its code and so its exit code.\n */\nexport class ApiFailure extends Error {\n override readonly name = \"ApiFailure\";\n override readonly cause: unknown;\n readonly apiName: string;\n\n constructor(apiName: string, cause: unknown) {\n super(`API ${apiName} failed`, { cause });\n this.apiName = apiName;\n this.cause = cause;\n }\n}\n\n/** Errors of the CLI itself; its messages are the original CLI's messages. */\nexport function cliError(\n code: Extract<ErrorCode, `CLI_${string}` | `OUTPUT_${string}`>,\n message: string,\n cause?: unknown,\n): OpenAPITypesafeError {\n return new OpenAPITypesafeError({ code: ERROR_CODES[code], message, cause });\n}\n"],"names":[],"mappings":"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"}