openapi-typesafe 1.0.0-rc.0 → 1.0.0-rc.2

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 (513) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/redocly-loader/configured-headers.cjs +32 -0
  3. package/dist/adapters/redocly-loader/configured-headers.cjs.map +1 -0
  4. package/dist/adapters/redocly-loader/configured-headers.mjs +30 -0
  5. package/dist/adapters/redocly-loader/configured-headers.mjs.map +1 -0
  6. package/dist/adapters/redocly-loader/redocly-config-source.cjs +21 -2
  7. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  8. package/dist/adapters/redocly-loader/redocly-config-source.mjs +22 -3
  9. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  10. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +34 -11
  11. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +33 -10
  13. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/ref-access.cjs +37 -4
  15. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  16. package/dist/adapters/redocly-loader/ref-access.mjs +37 -4
  17. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/ref-resolution-check.cjs +191 -0
  19. package/dist/adapters/redocly-loader/ref-resolution-check.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/ref-resolution-check.mjs +189 -0
  21. package/dist/adapters/redocly-loader/ref-resolution-check.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs +73 -0
  23. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs +60 -0
  25. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/remote-fetch.cjs +41 -14
  27. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -14
  29. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/schema-load-errors.cjs +23 -5
  31. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/schema-load-errors.mjs +23 -5
  33. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/unsupported-keys.cjs +9 -1
  35. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/unsupported-keys.mjs +9 -1
  37. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  38. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  39. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  40. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  41. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  42. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +5 -1
  43. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -1
  44. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +5 -1
  45. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -1
  46. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -1
  47. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -1
  48. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +15 -9
  49. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -1
  50. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +15 -9
  51. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -1
  52. package/dist/api/default-ports.cjs +9 -0
  53. package/dist/api/default-ports.cjs.map +1 -1
  54. package/dist/api/default-ports.mjs +8 -1
  55. package/dist/api/default-ports.mjs.map +1 -1
  56. package/dist/api/discriminator-conflict-warnings.cjs +25 -0
  57. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
  58. package/dist/api/discriminator-conflict-warnings.mjs +23 -0
  59. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
  60. package/dist/api/discriminator-enum-names.cjs +19 -0
  61. package/dist/api/discriminator-enum-names.cjs.map +1 -0
  62. package/dist/api/discriminator-enum-names.mjs +17 -0
  63. package/dist/api/discriminator-enum-names.mjs.map +1 -0
  64. package/dist/api/discriminator-enum-parent.cjs +59 -0
  65. package/dist/api/discriminator-enum-parent.cjs.map +1 -0
  66. package/dist/api/discriminator-enum-parent.mjs +57 -0
  67. package/dist/api/discriminator-enum-parent.mjs.map +1 -0
  68. package/dist/api/discriminator-enum.cjs +25 -0
  69. package/dist/api/discriminator-enum.cjs.map +1 -1
  70. package/dist/api/discriminator-enum.mjs +25 -1
  71. package/dist/api/discriminator-enum.mjs.map +1 -1
  72. package/dist/api/discriminator-other-owners.cjs +67 -0
  73. package/dist/api/discriminator-other-owners.cjs.map +1 -0
  74. package/dist/api/discriminator-other-owners.mjs +64 -0
  75. package/dist/api/discriminator-other-owners.mjs.map +1 -0
  76. package/dist/api/discriminator-patch.cjs +92 -0
  77. package/dist/api/discriminator-patch.cjs.map +1 -0
  78. package/dist/api/discriminator-patch.mjs +86 -0
  79. package/dist/api/discriminator-patch.mjs.map +1 -0
  80. package/dist/api/discriminator-scan.cjs +50 -65
  81. package/dist/api/discriminator-scan.cjs.map +1 -1
  82. package/dist/api/discriminator-scan.mjs +44 -59
  83. package/dist/api/discriminator-scan.mjs.map +1 -1
  84. package/dist/api/document-refs.cjs +15 -12
  85. package/dist/api/document-refs.cjs.map +1 -1
  86. package/dist/api/document-refs.mjs +15 -12
  87. package/dist/api/document-refs.mjs.map +1 -1
  88. package/dist/api/document-run.cjs +21 -4
  89. package/dist/api/document-run.cjs.map +1 -1
  90. package/dist/api/document-run.mjs +22 -5
  91. package/dist/api/document-run.mjs.map +1 -1
  92. package/dist/api/enum-values-warnings.cjs +16 -0
  93. package/dist/api/enum-values-warnings.cjs.map +1 -0
  94. package/dist/api/enum-values-warnings.mjs +14 -0
  95. package/dist/api/enum-values-warnings.mjs.map +1 -0
  96. package/dist/api/footer-sink.cjs +25 -2
  97. package/dist/api/footer-sink.cjs.map +1 -1
  98. package/dist/api/footer-sink.mjs +25 -2
  99. package/dist/api/footer-sink.mjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.cjs +4 -1
  101. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  102. package/dist/api/legacy-callback-warning.mjs +4 -1
  103. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  104. package/dist/api/legacy-ts-helpers.cjs.map +1 -1
  105. package/dist/api/legacy-ts-helpers.mjs.map +1 -1
  106. package/dist/api/legacy-utils.cjs.map +1 -1
  107. package/dist/api/legacy-utils.mjs.map +1 -1
  108. package/dist/api/openapi-ts.cjs +2 -1
  109. package/dist/api/openapi-ts.cjs.map +1 -1
  110. package/dist/api/openapi-ts.mjs +3 -2
  111. package/dist/api/openapi-ts.mjs.map +1 -1
  112. package/dist/api/path-template-warnings.cjs +21 -0
  113. package/dist/api/path-template-warnings.cjs.map +1 -0
  114. package/dist/api/path-template-warnings.mjs +19 -0
  115. package/dist/api/path-template-warnings.mjs.map +1 -0
  116. package/dist/api/transform-context.cjs +4 -2
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +4 -2
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +52 -3
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +53 -4
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/api/unsupported-feature-warnings.cjs +6 -1
  125. package/dist/api/unsupported-feature-warnings.cjs.map +1 -1
  126. package/dist/api/unsupported-feature-warnings.mjs +6 -1
  127. package/dist/api/unsupported-feature-warnings.mjs.map +1 -1
  128. package/dist/application/print/type-printer.cjs +7 -1
  129. package/dist/application/print/type-printer.cjs.map +1 -1
  130. package/dist/application/print/type-printer.mjs +7 -1
  131. package/dist/application/print/type-printer.mjs.map +1 -1
  132. package/dist/application/transform/document/assignability.cjs +144 -0
  133. package/dist/application/transform/document/assignability.cjs.map +1 -0
  134. package/dist/application/transform/document/assignability.mjs +138 -0
  135. package/dist/application/transform/document/assignability.mjs.map +1 -0
  136. package/dist/application/transform/document/components.cjs +2 -2
  137. package/dist/application/transform/document/components.cjs.map +1 -1
  138. package/dist/application/transform/document/components.mjs +4 -4
  139. package/dist/application/transform/document/components.mjs.map +1 -1
  140. package/dist/application/transform/document/declared-types.cjs +66 -0
  141. package/dist/application/transform/document/declared-types.cjs.map +1 -0
  142. package/dist/application/transform/document/declared-types.mjs +63 -0
  143. package/dist/application/transform/document/declared-types.mjs.map +1 -0
  144. package/dist/application/transform/document/document.cjs +32 -9
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +34 -11
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/exploded-query.cjs +46 -0
  149. package/dist/application/transform/document/exploded-query.cjs.map +1 -0
  150. package/dist/application/transform/document/exploded-query.mjs +43 -0
  151. package/dist/application/transform/document/exploded-query.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +63 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -0
  154. package/dist/application/transform/document/global-type-references.mjs +61 -0
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -0
  156. package/dist/application/transform/document/list-assignability.cjs +54 -0
  157. package/dist/application/transform/document/list-assignability.cjs.map +1 -0
  158. package/dist/application/transform/document/list-assignability.mjs +52 -0
  159. package/dist/application/transform/document/list-assignability.mjs.map +1 -0
  160. package/dist/application/transform/document/parameters.cjs +41 -9
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +42 -10
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-key-overlaps.cjs +83 -33
  165. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -1
  166. package/dist/application/transform/document/path-key-overlaps.mjs +83 -33
  167. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -1
  168. package/dist/application/transform/document/path-template-replace.cjs +48 -0
  169. package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
  170. package/dist/application/transform/document/path-template-replace.mjs +45 -0
  171. package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
  172. package/dist/application/transform/document/paths.cjs +55 -29
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +54 -30
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/root-type-aliases.cjs +15 -14
  177. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  178. package/dist/application/transform/document/root-type-aliases.mjs +15 -13
  179. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  180. package/dist/application/transform/document/template-key-match.cjs +128 -0
  181. package/dist/application/transform/document/template-key-match.cjs.map +1 -0
  182. package/dist/application/transform/document/template-key-match.mjs +125 -0
  183. package/dist/application/transform/document/template-key-match.mjs.map +1 -0
  184. package/dist/application/transform/document/type-assignability.cjs +192 -0
  185. package/dist/application/transform/document/type-assignability.cjs.map +1 -0
  186. package/dist/application/transform/document/type-assignability.mjs +190 -0
  187. package/dist/application/transform/document/type-assignability.mjs.map +1 -0
  188. package/dist/application/transform/document/type-key.cjs +70 -0
  189. package/dist/application/transform/document/type-key.cjs.map +1 -0
  190. package/dist/application/transform/document/type-key.mjs +68 -0
  191. package/dist/application/transform/document/type-key.mjs.map +1 -0
  192. package/dist/application/transform/document/type-resolution.cjs +131 -0
  193. package/dist/application/transform/document/type-resolution.cjs.map +1 -0
  194. package/dist/application/transform/document/type-resolution.mjs +125 -0
  195. package/dist/application/transform/document/type-resolution.mjs.map +1 -0
  196. package/dist/application/transform/footer/document-footer.cjs +66 -4
  197. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  198. package/dist/application/transform/footer/document-footer.mjs +67 -5
  199. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  200. package/dist/application/transform/footer/enum-naming.cjs +17 -0
  201. package/dist/application/transform/footer/enum-naming.cjs.map +1 -1
  202. package/dist/application/transform/footer/enum-naming.mjs +17 -1
  203. package/dist/application/transform/footer/enum-naming.mjs.map +1 -1
  204. package/dist/application/transform/footer/enum-values-check.cjs +129 -0
  205. package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
  206. package/dist/application/transform/footer/enum-values-check.mjs +127 -0
  207. package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
  208. package/dist/application/transform/footer/evaluation.cjs +42 -0
  209. package/dist/application/transform/footer/evaluation.cjs.map +1 -0
  210. package/dist/application/transform/footer/evaluation.mjs +33 -0
  211. package/dist/application/transform/footer/evaluation.mjs.map +1 -0
  212. package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
  213. package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
  214. package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
  215. package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +138 -0
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
  218. package/dist/application/transform/footer/type-evaluation.mjs +136 -0
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
  220. package/dist/application/transform/footer/type-indexing.cjs +107 -0
  221. package/dist/application/transform/footer/type-indexing.cjs.map +1 -0
  222. package/dist/application/transform/footer/type-indexing.mjs +105 -0
  223. package/dist/application/transform/footer/type-indexing.mjs.map +1 -0
  224. package/dist/application/transform/footer/type-rules.cjs +172 -0
  225. package/dist/application/transform/footer/type-rules.cjs.map +1 -0
  226. package/dist/application/transform/footer/type-rules.mjs +166 -0
  227. package/dist/application/transform/footer/type-rules.mjs.map +1 -0
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
  232. package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
  233. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
  234. package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
  235. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
  236. package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
  237. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
  238. package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
  239. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
  240. package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
  241. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
  242. package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
  243. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
  244. package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
  245. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
  246. package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
  247. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
  248. package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
  249. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
  250. package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
  251. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
  252. package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
  253. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
  254. package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
  255. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
  256. package/dist/application/transform/ref-type.cjs +7 -2
  257. package/dist/application/transform/ref-type.cjs.map +1 -1
  258. package/dist/application/transform/ref-type.mjs +3 -2
  259. package/dist/application/transform/ref-type.mjs.map +1 -1
  260. package/dist/application/transform/schema/access-flags.cjs +38 -0
  261. package/dist/application/transform/schema/access-flags.cjs.map +1 -0
  262. package/dist/application/transform/schema/access-flags.mjs +36 -0
  263. package/dist/application/transform/schema/access-flags.mjs.map +1 -0
  264. package/dist/application/transform/schema/array-type.cjs +32 -1
  265. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/array-type.mjs +33 -2
  267. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/composition-type.cjs +50 -15
  269. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  270. package/dist/application/transform/schema/composition-type.mjs +50 -15
  271. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  272. package/dist/application/transform/schema/core-type.cjs +3 -1
  273. package/dist/application/transform/schema/core-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/core-type.mjs +3 -1
  275. package/dist/application/transform/schema/core-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/discriminated-union.cjs +30 -0
  277. package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
  278. package/dist/application/transform/schema/discriminated-union.mjs +27 -0
  279. package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
  280. package/dist/application/transform/schema/discriminator-property.cjs +3 -2
  281. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -1
  282. package/dist/application/transform/schema/discriminator-property.mjs +3 -2
  283. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -1
  284. package/dist/application/transform/schema/enum-rule.cjs +66 -10
  285. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  286. package/dist/application/transform/schema/enum-rule.mjs +67 -12
  287. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  288. package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
  289. package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
  290. package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
  291. package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
  292. package/dist/application/transform/schema/object-type.cjs +38 -25
  293. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  294. package/dist/application/transform/schema/object-type.mjs +39 -27
  295. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  296. package/dist/application/transform/schema/required-variants.cjs +45 -0
  297. package/dist/application/transform/schema/required-variants.cjs.map +1 -0
  298. package/dist/application/transform/schema/required-variants.mjs +42 -0
  299. package/dist/application/transform/schema/required-variants.mjs.map +1 -0
  300. package/dist/application/transform/schema/schema-transform.cjs +2 -2
  301. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  302. package/dist/application/transform/schema/schema-transform.mjs +2 -2
  303. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  304. package/dist/application/transform/schema-comment.cjs +51 -5
  305. package/dist/application/transform/schema-comment.cjs.map +1 -1
  306. package/dist/application/transform/schema-comment.mjs +50 -6
  307. package/dist/application/transform/schema-comment.mjs.map +1 -1
  308. package/dist/application/transform/type-combinators.mjs +1 -1
  309. package/dist/cli/api-settings.cjs +78 -0
  310. package/dist/cli/api-settings.cjs.map +1 -0
  311. package/dist/cli/api-settings.mjs +73 -0
  312. package/dist/cli/api-settings.mjs.map +1 -0
  313. package/dist/cli/cli-arguments.cjs +12 -3
  314. package/dist/cli/cli-arguments.cjs.map +1 -1
  315. package/dist/cli/cli-arguments.mjs +12 -4
  316. package/dist/cli/cli-arguments.mjs.map +1 -1
  317. package/dist/cli/cli-errors.cjs +3 -2
  318. package/dist/cli/cli-errors.cjs.map +1 -1
  319. package/dist/cli/cli-errors.mjs +3 -2
  320. package/dist/cli/cli-errors.mjs.map +1 -1
  321. package/dist/cli/cli-output.cjs +8 -3
  322. package/dist/cli/cli-output.cjs.map +1 -1
  323. package/dist/cli/cli-output.mjs +9 -4
  324. package/dist/cli/cli-output.mjs.map +1 -1
  325. package/dist/cli/help-text.cjs +3 -3
  326. package/dist/cli/help-text.cjs.map +1 -1
  327. package/dist/cli/help-text.mjs +3 -3
  328. package/dist/cli/help-text.mjs.map +1 -1
  329. package/dist/cli/main.cjs +5 -0
  330. package/dist/cli/main.cjs.map +1 -1
  331. package/dist/cli/main.mjs +5 -0
  332. package/dist/cli/main.mjs.map +1 -1
  333. package/dist/cli/redocly-apis.cjs +15 -7
  334. package/dist/cli/redocly-apis.cjs.map +1 -1
  335. package/dist/cli/redocly-apis.mjs +15 -7
  336. package/dist/cli/redocly-apis.mjs.map +1 -1
  337. package/dist/cli/ref-limits.cjs +1 -1
  338. package/dist/cli/ref-limits.cjs.map +1 -1
  339. package/dist/cli/ref-limits.mjs +2 -2
  340. package/dist/cli/ref-limits.mjs.map +1 -1
  341. package/dist/cli/run-cli.cjs +20 -3
  342. package/dist/cli/run-cli.cjs.map +1 -1
  343. package/dist/cli/run-cli.mjs +21 -4
  344. package/dist/cli/run-cli.mjs.map +1 -1
  345. package/dist/domain/errors.cjs +6 -1
  346. package/dist/domain/errors.cjs.map +1 -1
  347. package/dist/domain/errors.mjs +6 -1
  348. package/dist/domain/errors.mjs.map +1 -1
  349. package/dist/domain/ir/constructors.cjs +7 -1
  350. package/dist/domain/ir/constructors.cjs.map +1 -1
  351. package/dist/domain/ir/constructors.mjs +6 -2
  352. package/dist/domain/ir/constructors.mjs.map +1 -1
  353. package/dist/domain/openapi/admitted-values.cjs +75 -0
  354. package/dist/domain/openapi/admitted-values.cjs.map +1 -0
  355. package/dist/domain/openapi/admitted-values.mjs +72 -0
  356. package/dist/domain/openapi/admitted-values.mjs.map +1 -0
  357. package/dist/domain/openapi/discriminated-union.cjs +68 -0
  358. package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
  359. package/dist/domain/openapi/discriminated-union.mjs +62 -0
  360. package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
  361. package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
  362. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
  363. package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
  364. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
  365. package/dist/domain/openapi/parameter-object.cjs.map +1 -1
  366. package/dist/domain/openapi/parameter-object.mjs.map +1 -1
  367. package/dist/domain/openapi/path-templates.cjs +23 -0
  368. package/dist/domain/openapi/path-templates.cjs.map +1 -0
  369. package/dist/domain/openapi/path-templates.mjs +21 -0
  370. package/dist/domain/openapi/path-templates.mjs.map +1 -0
  371. package/dist/domain/output-fixes.cjs +36 -1
  372. package/dist/domain/output-fixes.cjs.map +1 -1
  373. package/dist/domain/output-fixes.mjs +36 -1
  374. package/dist/domain/output-fixes.mjs.map +1 -1
  375. package/dist/domain/url-credentials.cjs +10 -0
  376. package/dist/domain/url-credentials.cjs.map +1 -0
  377. package/dist/domain/url-credentials.mjs +8 -0
  378. package/dist/domain/url-credentials.mjs.map +1 -0
  379. package/dist/domain/warnings.cjs +23 -0
  380. package/dist/domain/warnings.cjs.map +1 -0
  381. package/dist/domain/warnings.mjs +20 -0
  382. package/dist/domain/warnings.mjs.map +1 -0
  383. package/dist/index.cjs +2 -0
  384. package/dist/index.cjs.map +1 -1
  385. package/dist/index.d.cts +1182 -46
  386. package/dist/index.d.mts +1182 -46
  387. package/dist/index.d.ts +1182 -46
  388. package/dist/index.mjs +1 -0
  389. package/dist/index.mjs.map +1 -1
  390. package/dist/transform/components-object.cjs +2 -1
  391. package/dist/transform/components-object.cjs.map +1 -1
  392. package/dist/transform/components-object.mjs +2 -1
  393. package/dist/transform/components-object.mjs.map +1 -1
  394. package/dist/transform/path-item-object.cjs.map +1 -1
  395. package/dist/transform/path-item-object.mjs.map +1 -1
  396. package/package.json +6 -5
  397. package/src/adapters/redocly-loader/configured-headers.ts +65 -0
  398. package/src/adapters/redocly-loader/redocly-config-source.ts +41 -6
  399. package/src/adapters/redocly-loader/redocly-schema-loader.ts +44 -13
  400. package/src/adapters/redocly-loader/ref-access.ts +60 -5
  401. package/src/adapters/redocly-loader/ref-resolution-check.ts +257 -0
  402. package/src/adapters/redocly-loader/ref-resolution-steps.ts +113 -0
  403. package/src/adapters/redocly-loader/remote-fetch.ts +77 -21
  404. package/src/adapters/redocly-loader/schema-load-errors.ts +33 -11
  405. package/src/adapters/redocly-loader/unsupported-keys.ts +17 -2
  406. package/src/adapters/terminal-logger/terminal-logger.ts +9 -5
  407. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +5 -1
  408. package/src/adapters/type-ast-bridge/print-typescript.ts +3 -1
  409. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +26 -12
  410. package/src/adapters/type-ast-bridge/typescript-types.ts +57 -5
  411. package/src/api/default-ports.ts +16 -0
  412. package/src/api/discriminator-conflict-warnings.ts +43 -0
  413. package/src/api/discriminator-enum-names.ts +26 -0
  414. package/src/api/discriminator-enum-parent.ts +129 -0
  415. package/src/api/discriminator-enum.ts +39 -0
  416. package/src/api/discriminator-other-owners.ts +97 -0
  417. package/src/api/discriminator-patch.ts +152 -0
  418. package/src/api/discriminator-scan.ts +78 -90
  419. package/src/api/document-refs.ts +19 -15
  420. package/src/api/document-run.ts +32 -11
  421. package/src/api/enum-values-warnings.ts +21 -0
  422. package/src/api/footer-sink.ts +34 -2
  423. package/src/api/legacy-callback-warning.ts +7 -3
  424. package/src/api/legacy-ts-helpers.ts +7 -5
  425. package/src/api/legacy-utils.ts +1 -1
  426. package/src/api/openapi-ts.ts +2 -0
  427. package/src/api/path-template-warnings.ts +27 -0
  428. package/src/api/run-context.ts +34 -0
  429. package/src/api/transform-context.ts +17 -9
  430. package/src/api/transform-schema.ts +90 -5
  431. package/src/api/unsupported-feature-warnings.ts +8 -1
  432. package/src/application/ports/redocly-config-source.ts +5 -1
  433. package/src/application/print/type-printer.ts +8 -1
  434. package/src/application/transform/document/assignability.ts +203 -0
  435. package/src/application/transform/document/components.ts +6 -6
  436. package/src/application/transform/document/declared-types.ts +93 -0
  437. package/src/application/transform/document/document.ts +71 -13
  438. package/src/application/transform/document/exploded-query.ts +91 -0
  439. package/src/application/transform/document/global-type-references.ts +78 -0
  440. package/src/application/transform/document/list-assignability.ts +87 -0
  441. package/src/application/transform/document/parameters.ts +78 -12
  442. package/src/application/transform/document/path-key-overlaps.ts +148 -59
  443. package/src/application/transform/document/path-template-replace.ts +90 -0
  444. package/src/application/transform/document/paths.ts +101 -38
  445. package/src/application/transform/document/root-type-aliases.ts +29 -28
  446. package/src/application/transform/document/template-key-match.ts +183 -0
  447. package/src/application/transform/document/type-assignability.ts +268 -0
  448. package/src/application/transform/document/type-key.ts +80 -0
  449. package/src/application/transform/document/type-resolution.ts +163 -0
  450. package/src/application/transform/footer/document-footer.ts +91 -6
  451. package/src/application/transform/footer/enum-naming.ts +29 -0
  452. package/src/application/transform/footer/enum-values-check.ts +171 -0
  453. package/src/application/transform/footer/evaluation.ts +57 -0
  454. package/src/application/transform/footer/shared-enum-names.ts +86 -0
  455. package/src/application/transform/footer/type-evaluation.ts +167 -0
  456. package/src/application/transform/footer/type-indexing.ts +152 -0
  457. package/src/application/transform/footer/type-rules.ts +269 -0
  458. package/src/application/transform/ref-pointer/generated-location.ts +211 -0
  459. package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
  460. package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
  461. package/src/application/transform/ref-pointer/original-index.ts +95 -0
  462. package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
  463. package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
  464. package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
  465. package/src/application/transform/ref-type.ts +11 -6
  466. package/src/application/transform/schema/access-flags.ts +63 -0
  467. package/src/application/transform/schema/array-type.ts +66 -5
  468. package/src/application/transform/schema/composition-type.ts +96 -24
  469. package/src/application/transform/schema/core-type.ts +8 -4
  470. package/src/application/transform/schema/discriminated-union.ts +58 -0
  471. package/src/application/transform/schema/discriminator-property.ts +8 -3
  472. package/src/application/transform/schema/enum-rule.ts +136 -13
  473. package/src/application/transform/schema/inherited-discriminator.ts +54 -0
  474. package/src/application/transform/schema/object-type.ts +51 -33
  475. package/src/application/transform/schema/required-variants.ts +88 -0
  476. package/src/application/transform/schema/schema-context.ts +26 -0
  477. package/src/application/transform/schema/schema-transform.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +84 -4
  479. package/src/cli/api-settings.ts +109 -0
  480. package/src/cli/cli-arguments.ts +18 -5
  481. package/src/cli/cli-dependencies.ts +5 -0
  482. package/src/cli/cli-errors.ts +4 -2
  483. package/src/cli/cli-output.ts +18 -4
  484. package/src/cli/help-text.ts +4 -4
  485. package/src/cli/main.ts +6 -0
  486. package/src/cli/redocly-apis.ts +21 -11
  487. package/src/cli/ref-limits.ts +2 -2
  488. package/src/cli/run-cli.ts +25 -4
  489. package/src/domain/errors.ts +10 -2
  490. package/src/domain/ir/constructors.ts +9 -1
  491. package/src/domain/ir/nodes.ts +11 -7
  492. package/src/domain/openapi/admitted-values.ts +113 -0
  493. package/src/domain/openapi/discriminated-union.ts +109 -0
  494. package/src/domain/openapi/discriminator-conflicts.ts +251 -0
  495. package/src/domain/openapi/parameter-object.ts +4 -0
  496. package/src/domain/openapi/path-templates.ts +32 -0
  497. package/src/domain/openapi/schema-object.ts +2 -0
  498. package/src/domain/output-fixes.ts +43 -2
  499. package/src/domain/url-credentials.ts +18 -0
  500. package/src/domain/warnings.ts +28 -0
  501. package/src/index.ts +1 -0
  502. package/src/transform/components-object.ts +3 -1
  503. package/src/transform/path-item-object.ts +6 -2
  504. package/src/types/generator-options.ts +12 -21
  505. package/src/types/openapi-common.ts +1 -0
  506. package/src/types/openapi-request.ts +3 -0
  507. package/src/types/openapi-schema.ts +2 -0
  508. package/src/types/openapi-security.ts +1 -0
  509. package/dist/application/transform/document/path-item-conflicts.cjs +0 -51
  510. package/dist/application/transform/document/path-item-conflicts.cjs.map +0 -1
  511. package/dist/application/transform/document/path-item-conflicts.mjs +0 -49
  512. package/dist/application/transform/document/path-item-conflicts.mjs.map +0 -1
  513. package/src/application/transform/document/path-item-conflicts.ts +0 -79
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ const scule = require('scule');
4
+ const warnings = require('../domain/warnings.cjs');
5
+ const cliArguments = require('./cli-arguments.cjs');
6
+ const cliErrors = require('./cli-errors.cjs');
7
+ const cliOutput = require('./cli-output.cjs');
8
+
9
+ const OUTPUT_SETTING = "output";
10
+ const FIX_SETTING = "fix";
11
+ const LOCAL_REF_ROOT_SETTING = "localRefRoot";
12
+ const REMOTE_REF_HOSTS_SETTING = "remoteRefHosts";
13
+ const IGNORED_SETTINGS = ["contentNever"];
14
+ const CAMEL_CASE_SETTINGS = [
15
+ OUTPUT_SETTING,
16
+ FIX_SETTING,
17
+ LOCAL_REF_ROOT_SETTING,
18
+ REMOTE_REF_HOSTS_SETTING,
19
+ ...cliArguments.GENERATOR_FLAGS,
20
+ ...IGNORED_SETTINGS
21
+ ];
22
+ const KNOWN_SETTINGS = /* @__PURE__ */ new Set([
23
+ ...CAMEL_CASE_SETTINGS,
24
+ ...CAMEL_CASE_SETTINGS.map((name) => scule.kebabCase(name))
25
+ ]);
26
+ function unknownSettingWarnings(apiName, settings) {
27
+ return Object.keys(settings).filter((key) => !KNOWN_SETTINGS.has(key)).map(
28
+ (key) => warnings.warningText(
29
+ `API ${apiName}: the setting \`${key}\` is not an openapi-typesafe option and is ignored`,
30
+ warnings.WARNING_CODES.CONFIG_SETTING_UNKNOWN
31
+ )
32
+ );
33
+ }
34
+ function settingValue(settings, name) {
35
+ return name in settings ? settings[name] : settings[scule.kebabCase(name)];
36
+ }
37
+ function hasSetting(settings, name) {
38
+ return name in settings || scule.kebabCase(name) in settings;
39
+ }
40
+ function invalidSetting(apiName, name, expected) {
41
+ return cliErrors.cliError(
42
+ "CLI_CONFIG_INVALID",
43
+ `API ${apiName}: \`${scule.kebabCase(name)}\` in x-openapi-ts must be ${expected}`
44
+ );
45
+ }
46
+ function localRefRootOf(apiName, settings, configRoot) {
47
+ if (!hasSetting(settings, LOCAL_REF_ROOT_SETTING)) {
48
+ return {};
49
+ }
50
+ const value = settingValue(settings, LOCAL_REF_ROOT_SETTING) ?? "";
51
+ if (typeof value !== "string") {
52
+ throw invalidSetting(apiName, LOCAL_REF_ROOT_SETTING, "a directory path");
53
+ }
54
+ return { localRefRoot: cliOutput.resolveLocationUrl(value === "" ? "." : value, configRoot) };
55
+ }
56
+ function remoteRefHostsOf(apiName, settings) {
57
+ if (!hasSetting(settings, REMOTE_REF_HOSTS_SETTING)) {
58
+ return {};
59
+ }
60
+ const value = settingValue(settings, REMOTE_REF_HOSTS_SETTING) ?? [];
61
+ const entries = [value].flat();
62
+ if (entries.some((entry) => typeof entry !== "string")) {
63
+ throw invalidSetting(apiName, REMOTE_REF_HOSTS_SETTING, "a host list");
64
+ }
65
+ return { remoteRefHosts: cliArguments.hostList(entries) ?? [] };
66
+ }
67
+ function apiRefLimitOptions(apiName, settings, configRoot) {
68
+ return {
69
+ ...localRefRootOf(apiName, settings, configRoot),
70
+ ...remoteRefHostsOf(apiName, settings)
71
+ };
72
+ }
73
+
74
+ exports.FIX_SETTING = FIX_SETTING;
75
+ exports.OUTPUT_SETTING = OUTPUT_SETTING;
76
+ exports.apiRefLimitOptions = apiRefLimitOptions;
77
+ exports.unknownSettingWarnings = unknownSettingWarnings;
78
+ //# sourceMappingURL=api-settings.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-settings.cjs","sources":["../../src/cli/api-settings.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { GENERATOR_FLAGS, hostList } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\nimport type { RefLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The settings of one API in `redocly.yaml` (`apis.<name>.x-openapi-ts`). A setting has the name\n * of its CLI flag, in kebab-case or camelCase (ADR-021, decision 1); a setting the CLI does not\n * read gets a warning, as an unknown flag gets a notice.\n */\n\nexport type ApiSettings = Readonly<Record<string, unknown>>;\n\n/** The setting that names the output file. */\nexport const OUTPUT_SETTING = \"output\";\n\n/** The setting that lists the API's output fixes. */\nexport const FIX_SETTING = \"fix\";\n\nconst LOCAL_REF_ROOT_SETTING = \"localRefRoot\";\nconst REMOTE_REF_HOSTS_SETTING = \"remoteRefHosts\";\n\n/** `--content-never` is accepted and has no effect, as on the command line. */\nconst IGNORED_SETTINGS = [\"contentNever\"] as const;\n\nconst CAMEL_CASE_SETTINGS = [\n OUTPUT_SETTING,\n FIX_SETTING,\n LOCAL_REF_ROOT_SETTING,\n REMOTE_REF_HOSTS_SETTING,\n ...GENERATOR_FLAGS,\n ...IGNORED_SETTINGS,\n];\n\nconst KNOWN_SETTINGS = new Set<string>([\n ...CAMEL_CASE_SETTINGS,\n ...CAMEL_CASE_SETTINGS.map((name) => kebabCase(name)),\n]);\n\n/** The warning for each setting of an API that no code reads. */\nexport function unknownSettingWarnings(apiName: string, settings: ApiSettings): string[] {\n return Object.keys(settings)\n .filter((key) => !KNOWN_SETTINGS.has(key))\n .map((key) =>\n warningText(\n `API ${apiName}: the setting \\`${key}\\` is not an openapi-typesafe option and is ignored`,\n WARNING_CODES.CONFIG_SETTING_UNKNOWN,\n ),\n );\n}\n\n/** The value of a setting in camelCase, else in kebab-case; `undefined` when it is absent. */\nfunction settingValue(settings: ApiSettings, name: string): unknown {\n return name in settings ? settings[name] : settings[kebabCase(name)];\n}\n\nfunction hasSetting(settings: ApiSettings, name: string): boolean {\n return name in settings || kebabCase(name) in settings;\n}\n\nfunction invalidSetting(apiName: string, name: string, expected: string): Error {\n return cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${apiName}: \\`${kebabCase(name)}\\` in x-openapi-ts must be ${expected}`,\n );\n}\n\n/** `local-ref-root: dir`, relative to the config file; empty means the config file's directory. */\nfunction localRefRootOf(apiName: string, settings: ApiSettings, configRoot: URL): RefLimitOptions {\n if (!hasSetting(settings, LOCAL_REF_ROOT_SETTING)) {\n return {};\n }\n const value = settingValue(settings, LOCAL_REF_ROOT_SETTING) ?? \"\";\n if (typeof value !== \"string\") {\n throw invalidSetting(apiName, LOCAL_REF_ROOT_SETTING, \"a directory path\");\n }\n return { localRefRoot: resolveLocationUrl(value === \"\" ? \".\" : value, configRoot) };\n}\n\n/** `remote-ref-hosts: [a, b]` or `a,b`; an empty list or value allows no host. */\nfunction remoteRefHostsOf(apiName: string, settings: ApiSettings): RefLimitOptions {\n if (!hasSetting(settings, REMOTE_REF_HOSTS_SETTING)) {\n return {};\n }\n const value = settingValue(settings, REMOTE_REF_HOSTS_SETTING) ?? [];\n const entries = [value].flat();\n if (entries.some((entry) => typeof entry !== \"string\")) {\n throw invalidSetting(apiName, REMOTE_REF_HOSTS_SETTING, \"a host list\");\n }\n return { remoteRefHosts: hostList(entries) ?? [] };\n}\n\n/**\n * The `$ref` limits an API sets (threat model R1, R2). Each one replaces the CLI flag of the same\n * name for this API, as its boolean settings and `fix` do; fails with `CLI_CONFIG_INVALID` for a\n * value of another type.\n */\nexport function apiRefLimitOptions(\n apiName: string,\n settings: ApiSettings,\n configRoot: URL,\n): RefLimitOptions {\n return {\n ...localRefRootOf(apiName, settings, configRoot),\n ...remoteRefHostsOf(apiName, settings),\n };\n}\n"],"names":["GENERATOR_FLAGS","kebabCase","warningText","WARNING_CODES","cliError","resolveLocationUrl","hostList"],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { kebabCase } from 'scule';
2
+ import { warningText, WARNING_CODES } from '../domain/warnings.mjs';
3
+ import { GENERATOR_FLAGS, hostList } from './cli-arguments.mjs';
4
+ import { cliError } from './cli-errors.mjs';
5
+ import { resolveLocationUrl } from './cli-output.mjs';
6
+
7
+ const OUTPUT_SETTING = "output";
8
+ const FIX_SETTING = "fix";
9
+ const LOCAL_REF_ROOT_SETTING = "localRefRoot";
10
+ const REMOTE_REF_HOSTS_SETTING = "remoteRefHosts";
11
+ const IGNORED_SETTINGS = ["contentNever"];
12
+ const CAMEL_CASE_SETTINGS = [
13
+ OUTPUT_SETTING,
14
+ FIX_SETTING,
15
+ LOCAL_REF_ROOT_SETTING,
16
+ REMOTE_REF_HOSTS_SETTING,
17
+ ...GENERATOR_FLAGS,
18
+ ...IGNORED_SETTINGS
19
+ ];
20
+ const KNOWN_SETTINGS = /* @__PURE__ */ new Set([
21
+ ...CAMEL_CASE_SETTINGS,
22
+ ...CAMEL_CASE_SETTINGS.map((name) => kebabCase(name))
23
+ ]);
24
+ function unknownSettingWarnings(apiName, settings) {
25
+ return Object.keys(settings).filter((key) => !KNOWN_SETTINGS.has(key)).map(
26
+ (key) => warningText(
27
+ `API ${apiName}: the setting \`${key}\` is not an openapi-typesafe option and is ignored`,
28
+ WARNING_CODES.CONFIG_SETTING_UNKNOWN
29
+ )
30
+ );
31
+ }
32
+ function settingValue(settings, name) {
33
+ return name in settings ? settings[name] : settings[kebabCase(name)];
34
+ }
35
+ function hasSetting(settings, name) {
36
+ return name in settings || kebabCase(name) in settings;
37
+ }
38
+ function invalidSetting(apiName, name, expected) {
39
+ return cliError(
40
+ "CLI_CONFIG_INVALID",
41
+ `API ${apiName}: \`${kebabCase(name)}\` in x-openapi-ts must be ${expected}`
42
+ );
43
+ }
44
+ function localRefRootOf(apiName, settings, configRoot) {
45
+ if (!hasSetting(settings, LOCAL_REF_ROOT_SETTING)) {
46
+ return {};
47
+ }
48
+ const value = settingValue(settings, LOCAL_REF_ROOT_SETTING) ?? "";
49
+ if (typeof value !== "string") {
50
+ throw invalidSetting(apiName, LOCAL_REF_ROOT_SETTING, "a directory path");
51
+ }
52
+ return { localRefRoot: resolveLocationUrl(value === "" ? "." : value, configRoot) };
53
+ }
54
+ function remoteRefHostsOf(apiName, settings) {
55
+ if (!hasSetting(settings, REMOTE_REF_HOSTS_SETTING)) {
56
+ return {};
57
+ }
58
+ const value = settingValue(settings, REMOTE_REF_HOSTS_SETTING) ?? [];
59
+ const entries = [value].flat();
60
+ if (entries.some((entry) => typeof entry !== "string")) {
61
+ throw invalidSetting(apiName, REMOTE_REF_HOSTS_SETTING, "a host list");
62
+ }
63
+ return { remoteRefHosts: hostList(entries) ?? [] };
64
+ }
65
+ function apiRefLimitOptions(apiName, settings, configRoot) {
66
+ return {
67
+ ...localRefRootOf(apiName, settings, configRoot),
68
+ ...remoteRefHostsOf(apiName, settings)
69
+ };
70
+ }
71
+
72
+ export { FIX_SETTING, OUTPUT_SETTING, apiRefLimitOptions, unknownSettingWarnings };
73
+ //# sourceMappingURL=api-settings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-settings.mjs","sources":["../../src/cli/api-settings.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { GENERATOR_FLAGS, hostList } from \"./cli-arguments.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { resolveLocationUrl } from \"./cli-output.js\";\nimport type { RefLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The settings of one API in `redocly.yaml` (`apis.<name>.x-openapi-ts`). A setting has the name\n * of its CLI flag, in kebab-case or camelCase (ADR-021, decision 1); a setting the CLI does not\n * read gets a warning, as an unknown flag gets a notice.\n */\n\nexport type ApiSettings = Readonly<Record<string, unknown>>;\n\n/** The setting that names the output file. */\nexport const OUTPUT_SETTING = \"output\";\n\n/** The setting that lists the API's output fixes. */\nexport const FIX_SETTING = \"fix\";\n\nconst LOCAL_REF_ROOT_SETTING = \"localRefRoot\";\nconst REMOTE_REF_HOSTS_SETTING = \"remoteRefHosts\";\n\n/** `--content-never` is accepted and has no effect, as on the command line. */\nconst IGNORED_SETTINGS = [\"contentNever\"] as const;\n\nconst CAMEL_CASE_SETTINGS = [\n OUTPUT_SETTING,\n FIX_SETTING,\n LOCAL_REF_ROOT_SETTING,\n REMOTE_REF_HOSTS_SETTING,\n ...GENERATOR_FLAGS,\n ...IGNORED_SETTINGS,\n];\n\nconst KNOWN_SETTINGS = new Set<string>([\n ...CAMEL_CASE_SETTINGS,\n ...CAMEL_CASE_SETTINGS.map((name) => kebabCase(name)),\n]);\n\n/** The warning for each setting of an API that no code reads. */\nexport function unknownSettingWarnings(apiName: string, settings: ApiSettings): string[] {\n return Object.keys(settings)\n .filter((key) => !KNOWN_SETTINGS.has(key))\n .map((key) =>\n warningText(\n `API ${apiName}: the setting \\`${key}\\` is not an openapi-typesafe option and is ignored`,\n WARNING_CODES.CONFIG_SETTING_UNKNOWN,\n ),\n );\n}\n\n/** The value of a setting in camelCase, else in kebab-case; `undefined` when it is absent. */\nfunction settingValue(settings: ApiSettings, name: string): unknown {\n return name in settings ? settings[name] : settings[kebabCase(name)];\n}\n\nfunction hasSetting(settings: ApiSettings, name: string): boolean {\n return name in settings || kebabCase(name) in settings;\n}\n\nfunction invalidSetting(apiName: string, name: string, expected: string): Error {\n return cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${apiName}: \\`${kebabCase(name)}\\` in x-openapi-ts must be ${expected}`,\n );\n}\n\n/** `local-ref-root: dir`, relative to the config file; empty means the config file's directory. */\nfunction localRefRootOf(apiName: string, settings: ApiSettings, configRoot: URL): RefLimitOptions {\n if (!hasSetting(settings, LOCAL_REF_ROOT_SETTING)) {\n return {};\n }\n const value = settingValue(settings, LOCAL_REF_ROOT_SETTING) ?? \"\";\n if (typeof value !== \"string\") {\n throw invalidSetting(apiName, LOCAL_REF_ROOT_SETTING, \"a directory path\");\n }\n return { localRefRoot: resolveLocationUrl(value === \"\" ? \".\" : value, configRoot) };\n}\n\n/** `remote-ref-hosts: [a, b]` or `a,b`; an empty list or value allows no host. */\nfunction remoteRefHostsOf(apiName: string, settings: ApiSettings): RefLimitOptions {\n if (!hasSetting(settings, REMOTE_REF_HOSTS_SETTING)) {\n return {};\n }\n const value = settingValue(settings, REMOTE_REF_HOSTS_SETTING) ?? [];\n const entries = [value].flat();\n if (entries.some((entry) => typeof entry !== \"string\")) {\n throw invalidSetting(apiName, REMOTE_REF_HOSTS_SETTING, \"a host list\");\n }\n return { remoteRefHosts: hostList(entries) ?? [] };\n}\n\n/**\n * The `$ref` limits an API sets (threat model R1, R2). Each one replaces the CLI flag of the same\n * name for this API, as its boolean settings and `fix` do; fails with `CLI_CONFIG_INVALID` for a\n * value of another type.\n */\nexport function apiRefLimitOptions(\n apiName: string,\n settings: ApiSettings,\n configRoot: URL,\n): RefLimitOptions {\n return {\n ...localRefRootOf(apiName, settings, configRoot),\n ...remoteRefHostsOf(apiName, settings),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -106,10 +106,18 @@ const KNOWN_FLAGS = /* @__PURE__ */ new Set([
106
106
  ...Object.values(ALIASES).flat(),
107
107
  "version"
108
108
  ]);
109
- function unknownFlagsOf(parsed) {
110
- const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => key.length === 1 ? `-${key}` : `--${scule.kebabCase(key)}`);
109
+ function unknownFlagsOf(parsed, argv) {
110
+ const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
111
111
  return [...new Set(names)];
112
112
  }
113
+ function writtenFlagName(key, argv) {
114
+ if (key.length === 1) {
115
+ return `-${key}`;
116
+ }
117
+ const negated = `--no-${scule.kebabCase(key)}`;
118
+ const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
119
+ return isNegated ? negated : `--${scule.kebabCase(key)}`;
120
+ }
113
121
  function parseCliArguments(argv) {
114
122
  rejectRemovedFlags(argv);
115
123
  const parsed = parser__default([...argv], {
@@ -127,11 +135,12 @@ function parseCliArguments(argv) {
127
135
  generatorFlags: generatorFlagsOf(parsed),
128
136
  refLimits: refLimitsOf(parsed),
129
137
  fix: fixOption.fixNamesOf(parsed.fix),
130
- unknownFlags: unknownFlagsOf(parsed)
138
+ unknownFlags: unknownFlagsOf(parsed, argv)
131
139
  };
132
140
  }
133
141
 
134
142
  exports.GENERATOR_FLAGS = GENERATOR_FLAGS;
143
+ exports.hostList = hostList;
135
144
  exports.ineffectiveFlagNotices = ineffectiveFlagNotices;
136
145
  exports.parseCliArguments = parseCliArguments;
137
146
  //# sourceMappingURL=cli-arguments.cjs.map
@@ -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/** `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. */\nfunction 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): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => (key.length === 1 ? `-${key}` : `--${kebabCase(key)}`));\n return [...new Set(names)];\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),\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 { 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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"}
@@ -100,10 +100,18 @@ const KNOWN_FLAGS = /* @__PURE__ */ new Set([
100
100
  ...Object.values(ALIASES).flat(),
101
101
  "version"
102
102
  ]);
103
- function unknownFlagsOf(parsed) {
104
- const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => key.length === 1 ? `-${key}` : `--${kebabCase(key)}`);
103
+ function unknownFlagsOf(parsed, argv) {
104
+ const names = Object.keys(parsed).filter((key) => key !== "_" && key !== "--" && !KNOWN_FLAGS.has(key)).map((key) => writtenFlagName(key, argv));
105
105
  return [...new Set(names)];
106
106
  }
107
+ function writtenFlagName(key, argv) {
108
+ if (key.length === 1) {
109
+ return `-${key}`;
110
+ }
111
+ const negated = `--no-${kebabCase(key)}`;
112
+ const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));
113
+ return isNegated ? negated : `--${kebabCase(key)}`;
114
+ }
107
115
  function parseCliArguments(argv) {
108
116
  rejectRemovedFlags(argv);
109
117
  const parsed = parser([...argv], {
@@ -121,9 +129,9 @@ function parseCliArguments(argv) {
121
129
  generatorFlags: generatorFlagsOf(parsed),
122
130
  refLimits: refLimitsOf(parsed),
123
131
  fix: fixNamesOf(parsed.fix),
124
- unknownFlags: unknownFlagsOf(parsed)
132
+ unknownFlags: unknownFlagsOf(parsed, argv)
125
133
  };
126
134
  }
127
135
 
128
- export { GENERATOR_FLAGS, ineffectiveFlagNotices, parseCliArguments };
136
+ export { GENERATOR_FLAGS, hostList, ineffectiveFlagNotices, parseCliArguments };
129
137
  //# sourceMappingURL=cli-arguments.mjs.map
@@ -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/** `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. */\nfunction 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): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => (key.length === 1 ? `-${key}` : `--${kebabCase(key)}`));\n return [...new Set(names)];\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),\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 { 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":";;;;;AASO,MAAM,eAAA,GAAkB;AAAA,EAC7B,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,6BAAA;AAAA,EACA,kBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF;AAQA,MAAM,2BAA2B,CAAC,GAAG,eAAA,EAAiB,OAAA,EAAS,gBAAgB,MAAM,CAAA;AAKrF,MAAM,aAAA,GAAgB;AAAA,EACpB,GAAG,wBAAA;AAAA,EACH,GAAG,wBAAA,CAAyB,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC;AAC3D,CAAA;AAyBA,MAAM,aAAA,GAAwD;AAAA,EAC5D,CAAC,OAAO,CAAA,yEAAA,CAA2E,CAAA;AAAA,EACnF,CAAC,qBAAqB,CAAA,6DAAA,CAA+D,CAAA;AAAA,EACrF;AAAA,IACE,wBAAA;AAAA,IACA,CAAA,qEAAA;AAAA,GACF;AAAA,EACA,CAAC,OAAO,CAAA,6DAAA,CAA+D,CAAA;AAAA,EACvE,CAAC,WAAW,CAAA,6EAAA,CAA+E;AAC7F,CAAA;AAGA,MAAM,gBAAA,GAAmB,CAAC,+BAAA,EAAiC,0BAA0B,CAAA;AAErF,SAAS,mBAAmB,IAAA,EAA+B;AACzD,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,OAAO,CAAA,IAAK,aAAA,EAAe;AAC3C,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvB,MAAA,MAAM,QAAA,CAAS,oBAAoB,OAAO,CAAA;AAAA,IAC5C;AAAA,EACF;AACF;AAGO,SAAS,uBAAuB,IAAA,EAAmC;AACxE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AACjC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,gBAAA,CAAiB,OAAO,CAAC,IAAA,KAAS,KAAK,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,GAAA;AAAA,IAC5D,CAAC,IAAA,KAAS,CAAA,EAAG,IAAI,CAAA,wCAAA;AAAA,GACnB;AACF;AAEA,SAAS,iBAAiB,MAAA,EAA0C;AAClE,EAAA,MAAM,QAAiD,EAAC;AACxD,EAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,IAAI,OAAO,MAAA,CAAO,IAAI,CAAA,KAAM,SAAA,EAAW;AACrC,MAAA,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,OAAO,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,MAAA,CAAO,KAAK,CAAA;AACvD;AAGA,SAAS,WAAW,KAAA,EAAoC;AACtD,EAAA,OAAO,cAAA,CAAe,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,GAAI,KAAK,CAAA;AACnE;AAMO,SAAS,SAAS,KAAA,EAAsC;AAC7D,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAC,KAAK,CAAA,CACV,IAAA,EAAK,CACL,OAAA,CAAQ,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,EAAE,CAAA;AACjC;AAEA,SAAS,YAAY,MAAA,EAAwC;AAC3D,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA;AACrD,EAAA,OAAO;AAAA,IACL,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,YAAA,EAAa;AAAA,IACrD,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,cAAA;AAAe,GAC3D;AACF;AAGA,MAAM,YAAA,GAAe;AAAA,EACnB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG,CAAC,cAAA,EAAgB,gBAAgB,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,IAAA,EAAM,SAAA,CAAU,IAAI,CAAC,CAAC;AACjF,CAAA;AAEA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,CAAC,GAAG,CAAA,EAAG,UAAA,EAAY,CAAC,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,GAAG,CAAA,EAAE;AAGnE,MAAM,WAAA,uBAAkB,GAAA,CAAY;AAAA,EAClC,GAAG,aAAA;AAAA,EACH,GAAG,YAAA;AAAA,EACH,GAAG,MAAA,CAAO,MAAA,CAAO,OAAO,EAAE,IAAA,EAAK;AAAA,EAC/B;AACF,CAAC,CAAA;AAMD,SAAS,cAAA,CAAe,QAA0B,IAAA,EAAmC;AACnF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAC7B,OAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,GAAA,IAAO,GAAA,KAAQ,IAAA,IAAQ,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAC,CAAA,CACpE,GAAA,CAAI,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,EAAK,IAAI,CAAC,CAAA;AAC1C,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3B;AAGA,SAAS,eAAA,CAAgB,KAAa,IAAA,EAAiC;AACrE,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,IAAA,OAAO,IAAI,GAAG,CAAA,CAAA;AAAA,EAChB;AACA,EAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,KAAQ,OAAA,IAAW,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,OAAO,CAAA,CAAA,CAAG,CAAC,CAAA;AACrF,EAAA,OAAO,SAAA,GAAY,OAAA,GAAU,CAAA,EAAA,EAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAClD;AAMO,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,EAAG;AAAA,IAC/B,OAAA,EAAS,aAAA;AAAA,IACT,MAAA,EAAQ,YAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACR,CAAA;AACD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,cAAA,CAAe,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACjC,MAAA,EAAQ,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAAA,IACpC,OAAA,EAAS,cAAA,CAAe,MAAA,CAAO,OAAO,CAAA;AAAA,IACtC,OAAA,EAAS,OAAO,KAAA,KAAU,IAAA;AAAA,IAC1B,QAAQ,MAAA,IAAU,MAAA;AAAA,IAClB,WAAW,SAAA,IAAa,MAAA;AAAA,IACxB,cAAA,EAAgB,iBAAiB,MAAM,CAAA;AAAA,IACvC,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA,IAC7B,GAAA,EAAK,UAAA,CAAW,MAAA,CAAO,GAAG,CAAA;AAAA,IAC1B,YAAA,EAAc,cAAA,CAAe,MAAA,EAAQ,IAAI;AAAA,GAC3C;AACF;;"}
@@ -24,8 +24,7 @@ function loadFailedMessage(error) {
24
24
  if (!(reason instanceof Error)) {
25
25
  return error.message;
26
26
  }
27
- const source = typeof error.details.source === "string" ? ` (${error.details.source})` : "";
28
- return `${error.message}: ${reason.message}${source}`;
27
+ return `${error.message}: ${reason.message} (${String(error.details.source)})`;
29
28
  }
30
29
  const YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \((\d+)\)/;
31
30
  function parseFailedMessage(error) {
@@ -55,8 +54,10 @@ const CLI_ERROR_REPORTS = {
55
54
  CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },
56
55
  CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },
57
56
  CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
57
+ CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },
58
58
  CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
59
59
  CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
60
+ CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
60
61
  OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },
61
62
  OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },
62
63
  OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT }
@@ -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 const source = typeof error.details.source === \"string\" ? ` (${error.details.source})` : \"\";\n return `${error.message}: ${reason.message}${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\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA },\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_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { 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":"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"}
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\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA },\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 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":"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"}
@@ -22,8 +22,7 @@ function loadFailedMessage(error) {
22
22
  if (!(reason instanceof Error)) {
23
23
  return error.message;
24
24
  }
25
- const source = typeof error.details.source === "string" ? ` (${error.details.source})` : "";
26
- return `${error.message}: ${reason.message}${source}`;
25
+ return `${error.message}: ${reason.message} (${String(error.details.source)})`;
27
26
  }
28
27
  const YAML_DEPTH_LIMIT_MESSAGE = /nesting exceeded maxDepth \((\d+)\)/;
29
28
  function parseFailedMessage(error) {
@@ -53,8 +52,10 @@ const CLI_ERROR_REPORTS = {
53
52
  CLI_FLAG_REMOVED: { exitCode: EXIT_CODES.USAGE },
54
53
  CLI_GLOB_UNSUPPORTED: { exitCode: EXIT_CODES.USAGE },
55
54
  CLI_CONFIG_NOT_FOUND: { exitCode: EXIT_CODES.USAGE },
55
+ CLI_CONFIG_INVALID: { exitCode: EXIT_CODES.USAGE },
56
56
  CLI_CONFIG_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
57
57
  CLI_CHECK_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
58
+ CLI_INPUT_MISSING: { exitCode: EXIT_CODES.USAGE },
58
59
  OUTPUT_STALE: { exitCode: EXIT_CODES.OUTPUT_STALE },
59
60
  OUTPUT_READ_FAILED: { exitCode: EXIT_CODES.OUTPUT },
60
61
  OUTPUT_WRITE_FAILED: { exitCode: EXIT_CODES.OUTPUT }
@@ -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 const source = typeof error.details.source === \"string\" ? ` (${error.details.source})` : \"\";\n return `${error.message}: ${reason.message}${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\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA },\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_OUTPUT_MISSING: { exitCode: EXIT_CODES.USAGE },\n CLI_CHECK_OUTPUT_MISSING: { 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\nconst CLI_ERROR_REPORTS: Readonly<Record<ErrorCode, CliErrorReport>> = {\n SCHEMA_SOURCE_EMPTY: { exitCode: EXIT_CODES.SCHEMA },\n SCHEMA_SOURCE_INVALID: { exitCode: EXIT_CODES.SCHEMA },\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 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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"}
@@ -9,8 +9,13 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
9
9
 
10
10
  const path__default = /*#__PURE__*/_interopDefaultCompat(path);
11
11
 
12
- function resolveFileUrl(filePath, base) {
13
- return path__default.isAbsolute(filePath) ? node_url.pathToFileURL(filePath) : new URL(filePath, base);
12
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
13
+ function resolveLocationUrl(location, base) {
14
+ if (URL_SCHEME.test(location)) {
15
+ return new URL(location);
16
+ }
17
+ const baseDirectory = node_url.fileURLToPath(new URL(".", base));
18
+ return node_url.pathToFileURL(path__default.resolve(baseDirectory, location));
14
19
  }
15
20
  function printDone(run, output) {
16
21
  const { style, now } = run.deps;
@@ -33,5 +38,5 @@ function emitOutput(run, output, contents) {
33
38
  }
34
39
 
35
40
  exports.emitOutput = emitOutput;
36
- exports.resolveFileUrl = resolveFileUrl;
41
+ exports.resolveLocationUrl = resolveLocationUrl;
37
42
  //# sourceMappingURL=cli-output.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-output.cjs","sources":["../../src/cli/cli-output.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError } from \"./cli-errors.js\";\n\n/** Writing one generated file, or checking it with `--check`, and the line printed for it. */\n\n/** One CLI run: its dependencies, its arguments and when it started. */\nexport interface CliRun {\n readonly deps: CliDependencies;\n readonly args: CliArguments;\n readonly startedAt: number;\n}\n\n/** A generated file: `source` names the schema and `output` is the path as the user wrote it. */\nexport interface OutputFile {\n readonly source: string;\n readonly output: string;\n readonly file: URL;\n}\n\n/** A file URL for a path that is absolute, or relative to `base` (a directory or file URL). */\nexport function resolveFileUrl(filePath: string, base: URL): URL {\n return path.isAbsolute(filePath) ? pathToFileURL(filePath) : new URL(filePath, base);\n}\n\nfunction printDone(run: CliRun, output: OutputFile): void {\n const { style, now } = run.deps;\n const target = style.green(`${output.source} → ${style.bold(output.output)}`);\n const duration = style.dim(`[${formatDuration(now() - run.startedAt)}]`);\n run.deps.console.info(`🚀 ${target} ${duration}`);\n}\n\n/**\n * With `--check`, fail with `OUTPUT_STALE` when the file differs from `contents` and leave it\n * alone otherwise. Without it, write the file and print where it went.\n */\nexport function emitOutput(run: CliRun, output: OutputFile, contents: string): void {\n if (run.args.isCheck) {\n if (run.deps.files.readText(output.file) !== contents) {\n // The original message, then the file: with several APIs it tells which one is stale.\n throw cliError(\n \"OUTPUT_STALE\",\n `Generated types are not up-to-date! ${output.output} differs from its schema.`,\n );\n }\n return;\n }\n run.deps.files.writeText(output.file, contents);\n printDone(run, output);\n}\n"],"names":["path","pathToFileURL","formatDuration","cliError"],"mappings":";;;;;;;;;;;AAwBO,SAAS,cAAA,CAAe,UAAkB,IAAA,EAAgB;AAC/D,EAAA,OAAOA,aAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAIC,sBAAA,CAAc,QAAQ,CAAA,GAAI,IAAI,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACrF;AAEA,SAAS,SAAA,CAAU,KAAa,MAAA,EAA0B;AACxD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,QAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAIC,6BAAA,CAAe,KAAI,GAAI,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,aAAM,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAClD;AAMO,SAAS,UAAA,CAAW,GAAA,EAAa,MAAA,EAAoB,QAAA,EAAwB;AAClF,EAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,IAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,MAAA,CAAO,IAAI,MAAM,QAAA,EAAU;AAErD,MAAA,MAAMC,kBAAA;AAAA,QACJ,cAAA;AAAA,QACA,CAAA,oCAAA,EAAuC,OAAO,MAAM,CAAA,yBAAA;AAAA,OACtD;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC9C,EAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACvB;;;"}
1
+ {"version":3,"file":"cli-output.cjs","sources":["../../src/cli/cli-output.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError } from \"./cli-errors.js\";\n\n/** Writing one generated file, or checking it with `--check`, and the line printed for it. */\n\n/** One CLI run: its dependencies, its arguments and when it started. */\nexport interface CliRun {\n readonly deps: CliDependencies;\n readonly args: CliArguments;\n readonly startedAt: number;\n}\n\n/** A generated file: `source` names the schema and `output` is the path as the user wrote it. */\nexport interface OutputFile {\n readonly source: string;\n readonly output: string;\n readonly file: URL;\n}\n\n/**\n * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so\n * `C:\\\\specs\\\\api.yaml` stays a path.\n */\nconst URL_SCHEME = /^[a-z][a-z\\d+.-]+:/i;\n\n/**\n * The URL of a location the user wrote: a URL as it is, else a file path, absolute or relative to\n * the directory of `base` (a directory or file URL). A path is not parsed as a URL, so `#`, `?` and\n * `%` are part of the file name.\n */\nexport function resolveLocationUrl(location: string, base: URL): URL {\n if (URL_SCHEME.test(location)) {\n return new URL(location);\n }\n const baseDirectory = fileURLToPath(new URL(\".\", base));\n return pathToFileURL(path.resolve(baseDirectory, location));\n}\n\nfunction printDone(run: CliRun, output: OutputFile): void {\n const { style, now } = run.deps;\n const target = style.green(`${output.source} → ${style.bold(output.output)}`);\n const duration = style.dim(`[${formatDuration(now() - run.startedAt)}]`);\n run.deps.console.info(`🚀 ${target} ${duration}`);\n}\n\n/**\n * With `--check`, fail with `OUTPUT_STALE` when the file differs from `contents` and leave it\n * alone otherwise. Without it, write the file and print where it went.\n */\nexport function emitOutput(run: CliRun, output: OutputFile, contents: string): void {\n if (run.args.isCheck) {\n if (run.deps.files.readText(output.file) !== contents) {\n // The original message, then the file: with several APIs it tells which one is stale.\n throw cliError(\n \"OUTPUT_STALE\",\n `Generated types are not up-to-date! ${output.output} differs from its schema.`,\n );\n }\n return;\n }\n run.deps.files.writeText(output.file, contents);\n printDone(run, output);\n}\n"],"names":["fileURLToPath","pathToFileURL","path","formatDuration","cliError"],"mappings":";;;;;;;;;;;AA2BA,MAAM,UAAA,GAAa,qBAAA;AAOZ,SAAS,kBAAA,CAAmB,UAAkB,IAAA,EAAgB;AACnE,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAI,IAAI,QAAQ,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,gBAAgBA,sBAAA,CAAc,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AACtD,EAAA,OAAOC,sBAAA,CAAcC,aAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,QAAQ,CAAC,CAAA;AAC5D;AAEA,SAAS,SAAA,CAAU,KAAa,MAAA,EAA0B;AACxD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,QAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAIC,6BAAA,CAAe,KAAI,GAAI,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,aAAM,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAClD;AAMO,SAAS,UAAA,CAAW,GAAA,EAAa,MAAA,EAAoB,QAAA,EAAwB;AAClF,EAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,IAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,MAAA,CAAO,IAAI,MAAM,QAAA,EAAU;AAErD,MAAA,MAAMC,kBAAA;AAAA,QACJ,cAAA;AAAA,QACA,CAAA,oCAAA,EAAuC,OAAO,MAAM,CAAA,yBAAA;AAAA,OACtD;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC9C,EAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACvB;;;"}
@@ -1,10 +1,15 @@
1
1
  import path from 'node:path';
2
- import { pathToFileURL } from 'node:url';
2
+ import { fileURLToPath, pathToFileURL } from 'node:url';
3
3
  import { formatDuration } from '../adapters/terminal-logger/terminal-logger.mjs';
4
4
  import { cliError } from './cli-errors.mjs';
5
5
 
6
- function resolveFileUrl(filePath, base) {
7
- return path.isAbsolute(filePath) ? pathToFileURL(filePath) : new URL(filePath, base);
6
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
7
+ function resolveLocationUrl(location, base) {
8
+ if (URL_SCHEME.test(location)) {
9
+ return new URL(location);
10
+ }
11
+ const baseDirectory = fileURLToPath(new URL(".", base));
12
+ return pathToFileURL(path.resolve(baseDirectory, location));
8
13
  }
9
14
  function printDone(run, output) {
10
15
  const { style, now } = run.deps;
@@ -26,5 +31,5 @@ function emitOutput(run, output, contents) {
26
31
  printDone(run, output);
27
32
  }
28
33
 
29
- export { emitOutput, resolveFileUrl };
34
+ export { emitOutput, resolveLocationUrl };
30
35
  //# sourceMappingURL=cli-output.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-output.mjs","sources":["../../src/cli/cli-output.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError } from \"./cli-errors.js\";\n\n/** Writing one generated file, or checking it with `--check`, and the line printed for it. */\n\n/** One CLI run: its dependencies, its arguments and when it started. */\nexport interface CliRun {\n readonly deps: CliDependencies;\n readonly args: CliArguments;\n readonly startedAt: number;\n}\n\n/** A generated file: `source` names the schema and `output` is the path as the user wrote it. */\nexport interface OutputFile {\n readonly source: string;\n readonly output: string;\n readonly file: URL;\n}\n\n/** A file URL for a path that is absolute, or relative to `base` (a directory or file URL). */\nexport function resolveFileUrl(filePath: string, base: URL): URL {\n return path.isAbsolute(filePath) ? pathToFileURL(filePath) : new URL(filePath, base);\n}\n\nfunction printDone(run: CliRun, output: OutputFile): void {\n const { style, now } = run.deps;\n const target = style.green(`${output.source} → ${style.bold(output.output)}`);\n const duration = style.dim(`[${formatDuration(now() - run.startedAt)}]`);\n run.deps.console.info(`🚀 ${target} ${duration}`);\n}\n\n/**\n * With `--check`, fail with `OUTPUT_STALE` when the file differs from `contents` and leave it\n * alone otherwise. Without it, write the file and print where it went.\n */\nexport function emitOutput(run: CliRun, output: OutputFile, contents: string): void {\n if (run.args.isCheck) {\n if (run.deps.files.readText(output.file) !== contents) {\n // The original message, then the file: with several APIs it tells which one is stale.\n throw cliError(\n \"OUTPUT_STALE\",\n `Generated types are not up-to-date! ${output.output} differs from its schema.`,\n );\n }\n return;\n }\n run.deps.files.writeText(output.file, contents);\n printDone(run, output);\n}\n"],"names":[],"mappings":";;;;;AAwBO,SAAS,cAAA,CAAe,UAAkB,IAAA,EAAgB;AAC/D,EAAA,OAAO,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,aAAA,CAAc,QAAQ,CAAA,GAAI,IAAI,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AACrF;AAEA,SAAS,SAAA,CAAU,KAAa,MAAA,EAA0B;AACxD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,QAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,cAAA,CAAe,KAAI,GAAI,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,aAAM,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAClD;AAMO,SAAS,UAAA,CAAW,GAAA,EAAa,MAAA,EAAoB,QAAA,EAAwB;AAClF,EAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,IAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,MAAA,CAAO,IAAI,MAAM,QAAA,EAAU;AAErD,MAAA,MAAM,QAAA;AAAA,QACJ,cAAA;AAAA,QACA,CAAA,oCAAA,EAAuC,OAAO,MAAM,CAAA,yBAAA;AAAA,OACtD;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC9C,EAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACvB;;"}
1
+ {"version":3,"file":"cli-output.mjs","sources":["../../src/cli/cli-output.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { CliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError } from \"./cli-errors.js\";\n\n/** Writing one generated file, or checking it with `--check`, and the line printed for it. */\n\n/** One CLI run: its dependencies, its arguments and when it started. */\nexport interface CliRun {\n readonly deps: CliDependencies;\n readonly args: CliArguments;\n readonly startedAt: number;\n}\n\n/** A generated file: `source` names the schema and `output` is the path as the user wrote it. */\nexport interface OutputFile {\n readonly source: string;\n readonly output: string;\n readonly file: URL;\n}\n\n/**\n * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so\n * `C:\\\\specs\\\\api.yaml` stays a path.\n */\nconst URL_SCHEME = /^[a-z][a-z\\d+.-]+:/i;\n\n/**\n * The URL of a location the user wrote: a URL as it is, else a file path, absolute or relative to\n * the directory of `base` (a directory or file URL). A path is not parsed as a URL, so `#`, `?` and\n * `%` are part of the file name.\n */\nexport function resolveLocationUrl(location: string, base: URL): URL {\n if (URL_SCHEME.test(location)) {\n return new URL(location);\n }\n const baseDirectory = fileURLToPath(new URL(\".\", base));\n return pathToFileURL(path.resolve(baseDirectory, location));\n}\n\nfunction printDone(run: CliRun, output: OutputFile): void {\n const { style, now } = run.deps;\n const target = style.green(`${output.source} → ${style.bold(output.output)}`);\n const duration = style.dim(`[${formatDuration(now() - run.startedAt)}]`);\n run.deps.console.info(`🚀 ${target} ${duration}`);\n}\n\n/**\n * With `--check`, fail with `OUTPUT_STALE` when the file differs from `contents` and leave it\n * alone otherwise. Without it, write the file and print where it went.\n */\nexport function emitOutput(run: CliRun, output: OutputFile, contents: string): void {\n if (run.args.isCheck) {\n if (run.deps.files.readText(output.file) !== contents) {\n // The original message, then the file: with several APIs it tells which one is stale.\n throw cliError(\n \"OUTPUT_STALE\",\n `Generated types are not up-to-date! ${output.output} differs from its schema.`,\n );\n }\n return;\n }\n run.deps.files.writeText(output.file, contents);\n printDone(run, output);\n}\n"],"names":[],"mappings":";;;;;AA2BA,MAAM,UAAA,GAAa,qBAAA;AAOZ,SAAS,kBAAA,CAAmB,UAAkB,IAAA,EAAgB;AACnE,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAI,IAAI,QAAQ,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,gBAAgB,aAAA,CAAc,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AACtD,EAAA,OAAO,aAAA,CAAc,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,QAAQ,CAAC,CAAA;AAC5D;AAEA,SAAS,SAAA,CAAU,KAAa,MAAA,EAA0B;AACxD,EAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,GAAA,CAAI,IAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,QAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,cAAA,CAAe,KAAI,GAAI,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,aAAM,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAClD;AAMO,SAAS,UAAA,CAAW,GAAA,EAAa,MAAA,EAAoB,QAAA,EAAwB;AAClF,EAAA,IAAI,GAAA,CAAI,KAAK,OAAA,EAAS;AACpB,IAAA,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,MAAA,CAAO,IAAI,MAAM,QAAA,EAAU;AAErD,MAAA,MAAM,QAAA;AAAA,QACJ,cAAA;AAAA,QACA,CAAA,oCAAA,EAAuC,OAAO,MAAM,CAAA,yBAAA;AAAA,OACtD;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAA,CAAO,MAAM,QAAQ,CAAA;AAC9C,EAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACvB;;"}