openapi-typesafe 1.0.0-rc.3 → 1.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/CHANGELOG.md +1972 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  15. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  16. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  17. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +48 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  27. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  29. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  31. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  32. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  33. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  34. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  35. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  36. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  37. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  38. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  39. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  41. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
  43. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
  45. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
  47. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
  49. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  51. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/ref-holders.mjs +53 -12
  53. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  55. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  56. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  57. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  58. package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
  59. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
  61. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
  63. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  64. package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
  65. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  66. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  67. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  68. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  69. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  70. package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
  71. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  72. package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
  73. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  74. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  75. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  76. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  77. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  78. package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
  79. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  80. package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
  81. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  82. package/dist/api/default-ports.cjs +14 -2
  83. package/dist/api/default-ports.cjs.map +1 -1
  84. package/dist/api/default-ports.mjs +14 -2
  85. package/dist/api/default-ports.mjs.map +1 -1
  86. package/dist/api/discriminator-enum-parent.cjs +2 -2
  87. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  88. package/dist/api/discriminator-enum-parent.mjs +3 -3
  89. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  90. package/dist/api/discriminator-other-owners.cjs +5 -3
  91. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  92. package/dist/api/discriminator-other-owners.mjs +5 -3
  93. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  94. package/dist/api/discriminator-patch.cjs +5 -1
  95. package/dist/api/discriminator-patch.cjs.map +1 -1
  96. package/dist/api/discriminator-patch.mjs +5 -1
  97. package/dist/api/discriminator-patch.mjs.map +1 -1
  98. package/dist/api/discriminator-scan.cjs +15 -8
  99. package/dist/api/discriminator-scan.cjs.map +1 -1
  100. package/dist/api/discriminator-scan.mjs +15 -8
  101. package/dist/api/discriminator-scan.mjs.map +1 -1
  102. package/dist/api/document-refs.cjs +16 -1
  103. package/dist/api/document-refs.cjs.map +1 -1
  104. package/dist/api/document-refs.mjs +16 -1
  105. package/dist/api/document-refs.mjs.map +1 -1
  106. package/dist/api/document-run.cjs +6 -12
  107. package/dist/api/document-run.cjs.map +1 -1
  108. package/dist/api/document-run.mjs +6 -12
  109. package/dist/api/document-run.mjs.map +1 -1
  110. package/dist/api/legacy-utils.cjs.map +1 -1
  111. package/dist/api/legacy-utils.mjs.map +1 -1
  112. package/dist/api/openapi-ts.cjs +9 -6
  113. package/dist/api/openapi-ts.cjs.map +1 -1
  114. package/dist/api/openapi-ts.mjs +10 -8
  115. package/dist/api/openapi-ts.mjs.map +1 -1
  116. package/dist/api/ref-limit-options.cjs +63 -0
  117. package/dist/api/ref-limit-options.cjs.map +1 -0
  118. package/dist/api/ref-limit-options.mjs +57 -0
  119. package/dist/api/ref-limit-options.mjs.map +1 -0
  120. package/dist/api/schema-callbacks.cjs +36 -12
  121. package/dist/api/schema-callbacks.cjs.map +1 -1
  122. package/dist/api/schema-callbacks.mjs +36 -12
  123. package/dist/api/schema-callbacks.mjs.map +1 -1
  124. package/dist/api/transform-context.cjs +7 -3
  125. package/dist/api/transform-context.cjs.map +1 -1
  126. package/dist/api/transform-context.mjs +7 -3
  127. package/dist/api/transform-context.mjs.map +1 -1
  128. package/dist/api/transform-schema.cjs +47 -10
  129. package/dist/api/transform-schema.cjs.map +1 -1
  130. package/dist/api/transform-schema.mjs +48 -11
  131. package/dist/api/transform-schema.mjs.map +1 -1
  132. package/dist/application/print/text-writer.cjs +10 -3
  133. package/dist/application/print/text-writer.cjs.map +1 -1
  134. package/dist/application/print/text-writer.mjs +10 -3
  135. package/dist/application/print/text-writer.mjs.map +1 -1
  136. package/dist/application/stack-overflow.cjs +2 -1
  137. package/dist/application/stack-overflow.cjs.map +1 -1
  138. package/dist/application/stack-overflow.mjs +2 -1
  139. package/dist/application/stack-overflow.mjs.map +1 -1
  140. package/dist/application/transform/declared-value-types.cjs +36 -0
  141. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  142. package/dist/application/transform/declared-value-types.mjs +34 -0
  143. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  144. package/dist/application/transform/document/components.cjs +1 -1
  145. package/dist/application/transform/document/components.cjs.map +1 -1
  146. package/dist/application/transform/document/components.mjs +2 -2
  147. package/dist/application/transform/document/components.mjs.map +1 -1
  148. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  149. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  150. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  151. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  152. package/dist/application/transform/document/defs-root.cjs +1 -1
  153. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  154. package/dist/application/transform/document/defs-root.mjs +2 -2
  155. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  156. package/dist/application/transform/document/document.cjs +7 -2
  157. package/dist/application/transform/document/document.cjs.map +1 -1
  158. package/dist/application/transform/document/document.mjs +6 -3
  159. package/dist/application/transform/document/document.mjs.map +1 -1
  160. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  161. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  162. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  163. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  164. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  165. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  166. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  167. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  168. package/dist/application/transform/document/global-type-references.cjs +1 -0
  169. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  170. package/dist/application/transform/document/global-type-references.mjs +1 -1
  171. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  172. package/dist/application/transform/document/header.cjs +11 -3
  173. package/dist/application/transform/document/header.cjs.map +1 -1
  174. package/dist/application/transform/document/header.mjs +10 -2
  175. package/dist/application/transform/document/header.mjs.map +1 -1
  176. package/dist/application/transform/document/media-type.cjs +2 -2
  177. package/dist/application/transform/document/media-type.cjs.map +1 -1
  178. package/dist/application/transform/document/media-type.mjs +3 -3
  179. package/dist/application/transform/document/media-type.mjs.map +1 -1
  180. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  181. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  182. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  183. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  184. package/dist/application/transform/document/operation.cjs +1 -1
  185. package/dist/application/transform/document/operation.cjs.map +1 -1
  186. package/dist/application/transform/document/operation.mjs +2 -2
  187. package/dist/application/transform/document/operation.mjs.map +1 -1
  188. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  189. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  190. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  191. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  192. package/dist/application/transform/document/parameter.cjs +12 -4
  193. package/dist/application/transform/document/parameter.cjs.map +1 -1
  194. package/dist/application/transform/document/parameter.mjs +13 -5
  195. package/dist/application/transform/document/parameter.mjs.map +1 -1
  196. package/dist/application/transform/document/parameters.cjs +29 -34
  197. package/dist/application/transform/document/parameters.cjs.map +1 -1
  198. package/dist/application/transform/document/parameters.mjs +29 -34
  199. package/dist/application/transform/document/parameters.mjs.map +1 -1
  200. package/dist/application/transform/document/path-item.cjs +15 -17
  201. package/dist/application/transform/document/path-item.cjs.map +1 -1
  202. package/dist/application/transform/document/path-item.mjs +15 -19
  203. package/dist/application/transform/document/path-item.mjs.map +1 -1
  204. package/dist/application/transform/document/path-template-key.cjs +84 -0
  205. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  206. package/dist/application/transform/document/path-template-key.mjs +79 -0
  207. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  208. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  209. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  210. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  211. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  212. package/dist/application/transform/document/paths-enum.cjs +8 -6
  213. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  214. package/dist/application/transform/document/paths-enum.mjs +8 -7
  215. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  216. package/dist/application/transform/document/paths.cjs +43 -67
  217. package/dist/application/transform/document/paths.cjs.map +1 -1
  218. package/dist/application/transform/document/paths.mjs +42 -68
  219. package/dist/application/transform/document/paths.mjs.map +1 -1
  220. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  221. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  222. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  223. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  224. package/dist/application/transform/document/request-body.cjs +1 -1
  225. package/dist/application/transform/document/request-body.cjs.map +1 -1
  226. package/dist/application/transform/document/request-body.mjs +2 -2
  227. package/dist/application/transform/document/request-body.mjs.map +1 -1
  228. package/dist/application/transform/document/response.cjs +2 -2
  229. package/dist/application/transform/document/response.cjs.map +1 -1
  230. package/dist/application/transform/document/response.mjs +3 -3
  231. package/dist/application/transform/document/response.mjs.map +1 -1
  232. package/dist/application/transform/document/responses.cjs +1 -1
  233. package/dist/application/transform/document/responses.cjs.map +1 -1
  234. package/dist/application/transform/document/responses.mjs +2 -2
  235. package/dist/application/transform/document/responses.mjs.map +1 -1
  236. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  237. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  238. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  239. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  240. package/dist/application/transform/document/type-resolution.cjs +3 -1
  241. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  242. package/dist/application/transform/document/type-resolution.mjs +3 -1
  243. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  244. package/dist/application/transform/document/webhooks.cjs +10 -3
  245. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  246. package/dist/application/transform/document/webhooks.mjs +10 -3
  247. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  248. package/dist/application/transform/footer/document-footer.cjs +16 -5
  249. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  250. package/dist/application/transform/footer/document-footer.mjs +16 -5
  251. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  252. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  253. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  254. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  255. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  256. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  257. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  258. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  259. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  260. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  261. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  262. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  263. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  264. package/dist/application/transform/helper-types.cjs +3 -3
  265. package/dist/application/transform/helper-types.cjs.map +1 -1
  266. package/dist/application/transform/helper-types.mjs +3 -3
  267. package/dist/application/transform/helper-types.mjs.map +1 -1
  268. package/dist/application/transform/numbered-names.cjs +9 -0
  269. package/dist/application/transform/numbered-names.cjs.map +1 -1
  270. package/dist/application/transform/numbered-names.mjs +9 -1
  271. package/dist/application/transform/numbered-names.mjs.map +1 -1
  272. package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
  273. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  274. package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
  275. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  276. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  277. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  278. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  279. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  280. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  281. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  282. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  283. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  284. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  285. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  286. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  287. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  288. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  289. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  290. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  291. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  292. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  293. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  294. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  295. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  296. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  297. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  298. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  299. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  300. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  301. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  302. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  303. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  304. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  305. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  306. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  307. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  308. package/dist/application/transform/ref-type.cjs +2 -1
  309. package/dist/application/transform/ref-type.cjs.map +1 -1
  310. package/dist/application/transform/ref-type.mjs +2 -1
  311. package/dist/application/transform/ref-type.mjs.map +1 -1
  312. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  313. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  314. package/dist/application/transform/schema/composition-type.cjs +1 -1
  315. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  316. package/dist/application/transform/schema/composition-type.mjs +2 -2
  317. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  318. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  319. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  320. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  321. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  322. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  323. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  324. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  325. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  326. package/dist/application/transform/schema/input-location.cjs +23 -0
  327. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  328. package/dist/application/transform/schema/input-location.mjs +21 -0
  329. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  330. package/dist/application/transform/schema/object-type.cjs +18 -8
  331. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  332. package/dist/application/transform/schema/object-type.mjs +19 -9
  333. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  334. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  335. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  336. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  337. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  338. package/dist/application/transform/schema/schema-transform.cjs +6 -3
  339. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  340. package/dist/application/transform/schema/schema-transform.mjs +6 -3
  341. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  342. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  343. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  344. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  345. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  346. package/dist/application/transform/schema-comment.cjs +5 -1
  347. package/dist/application/transform/schema-comment.cjs.map +1 -1
  348. package/dist/application/transform/schema-comment.mjs +5 -1
  349. package/dist/application/transform/schema-comment.mjs.map +1 -1
  350. package/dist/cli/api-logger.cjs +13 -0
  351. package/dist/cli/api-logger.cjs.map +1 -0
  352. package/dist/cli/api-logger.mjs +11 -0
  353. package/dist/cli/api-logger.mjs.map +1 -0
  354. package/dist/cli/api-settings.cjs +57 -9
  355. package/dist/cli/api-settings.cjs.map +1 -1
  356. package/dist/cli/api-settings.mjs +56 -11
  357. package/dist/cli/api-settings.mjs.map +1 -1
  358. package/dist/cli/api-writes.cjs +72 -0
  359. package/dist/cli/api-writes.cjs.map +1 -0
  360. package/dist/cli/api-writes.mjs +69 -0
  361. package/dist/cli/api-writes.mjs.map +1 -0
  362. package/dist/cli/cli-arguments.cjs +51 -11
  363. package/dist/cli/cli-arguments.cjs.map +1 -1
  364. package/dist/cli/cli-arguments.mjs +51 -11
  365. package/dist/cli/cli-arguments.mjs.map +1 -1
  366. package/dist/cli/cli-errors.cjs +29 -1
  367. package/dist/cli/cli-errors.cjs.map +1 -1
  368. package/dist/cli/cli-errors.mjs +29 -2
  369. package/dist/cli/cli-errors.mjs.map +1 -1
  370. package/dist/cli/cli-output.cjs +111 -4
  371. package/dist/cli/cli-output.cjs.map +1 -1
  372. package/dist/cli/cli-output.mjs +104 -5
  373. package/dist/cli/cli-output.mjs.map +1 -1
  374. package/dist/cli/main.cjs +13 -3
  375. package/dist/cli/main.cjs.map +1 -1
  376. package/dist/cli/main.mjs +14 -4
  377. package/dist/cli/main.mjs.map +1 -1
  378. package/dist/cli/redocly-apis.cjs +94 -37
  379. package/dist/cli/redocly-apis.cjs.map +1 -1
  380. package/dist/cli/redocly-apis.mjs +99 -42
  381. package/dist/cli/redocly-apis.mjs.map +1 -1
  382. package/dist/cli/ref-limits.cjs +15 -1
  383. package/dist/cli/ref-limits.cjs.map +1 -1
  384. package/dist/cli/ref-limits.mjs +15 -2
  385. package/dist/cli/ref-limits.mjs.map +1 -1
  386. package/dist/cli/run-cli.cjs +37 -14
  387. package/dist/cli/run-cli.cjs.map +1 -1
  388. package/dist/cli/run-cli.mjs +39 -16
  389. package/dist/cli/run-cli.mjs.map +1 -1
  390. package/dist/domain/append-all.cjs +10 -0
  391. package/dist/domain/append-all.cjs.map +1 -0
  392. package/dist/domain/append-all.mjs +8 -0
  393. package/dist/domain/append-all.mjs.map +1 -0
  394. package/dist/domain/cause-secrets.cjs +52 -0
  395. package/dist/domain/cause-secrets.cjs.map +1 -0
  396. package/dist/domain/cause-secrets.mjs +50 -0
  397. package/dist/domain/cause-secrets.mjs.map +1 -0
  398. package/dist/domain/errors.cjs +11 -3
  399. package/dist/domain/errors.cjs.map +1 -1
  400. package/dist/domain/errors.mjs +11 -3
  401. package/dist/domain/errors.mjs.map +1 -1
  402. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  403. package/dist/domain/ir/identifier-text.mjs +1 -1
  404. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  405. package/dist/domain/ir/ir-shape.cjs +187 -0
  406. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  407. package/dist/domain/ir/ir-shape.mjs +184 -0
  408. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  409. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  410. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  411. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  412. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  413. package/dist/domain/location-text.cjs +9 -0
  414. package/dist/domain/location-text.cjs.map +1 -0
  415. package/dist/domain/location-text.mjs +7 -0
  416. package/dist/domain/location-text.mjs.map +1 -0
  417. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  418. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  419. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  420. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  421. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  422. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  423. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  424. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  425. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  426. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  427. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  428. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  429. package/dist/domain/openapi/document-places.cjs +55 -0
  430. package/dist/domain/openapi/document-places.cjs.map +1 -0
  431. package/dist/domain/openapi/document-places.mjs +53 -0
  432. package/dist/domain/openapi/document-places.mjs.map +1 -0
  433. package/dist/domain/openapi/json-pointer.cjs +43 -1
  434. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  435. package/dist/domain/openapi/json-pointer.mjs +40 -2
  436. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  437. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  438. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  439. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  440. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  441. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  442. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  443. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  444. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  445. package/dist/domain/output-fixes.cjs +20 -0
  446. package/dist/domain/output-fixes.cjs.map +1 -1
  447. package/dist/domain/output-fixes.mjs +20 -0
  448. package/dist/domain/output-fixes.mjs.map +1 -1
  449. package/dist/domain/terminal-text.cjs +31 -0
  450. package/dist/domain/terminal-text.cjs.map +1 -0
  451. package/dist/domain/terminal-text.mjs +29 -0
  452. package/dist/domain/terminal-text.mjs.map +1 -0
  453. package/dist/domain/url-secrets.cjs +48 -0
  454. package/dist/domain/url-secrets.cjs.map +1 -0
  455. package/dist/domain/url-secrets.mjs +45 -0
  456. package/dist/domain/url-secrets.mjs.map +1 -0
  457. package/dist/domain/warnings.cjs +1 -0
  458. package/dist/domain/warnings.cjs.map +1 -1
  459. package/dist/domain/warnings.mjs +1 -0
  460. package/dist/domain/warnings.mjs.map +1 -1
  461. package/dist/index.d.cts +46 -20
  462. package/dist/index.d.mts +46 -20
  463. package/dist/index.d.ts +46 -20
  464. package/package.json +4 -5
  465. package/src/adapters/node-file-system/file-claims.ts +138 -0
  466. package/src/adapters/node-file-system/file-identity.ts +137 -0
  467. package/src/adapters/node-file-system/node-file-system.ts +158 -18
  468. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  469. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
  470. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  471. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  472. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  473. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  474. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  475. package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
  476. package/src/adapters/redocly-loader/ref-access.ts +51 -4
  477. package/src/adapters/redocly-loader/ref-holders.ts +76 -15
  478. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  479. package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
  480. package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
  481. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  482. package/src/adapters/redocly-loader/schema-source.ts +35 -11
  483. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  484. package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
  485. package/src/api/default-ports.ts +33 -4
  486. package/src/api/discriminator-enum-parent.ts +3 -3
  487. package/src/api/discriminator-other-owners.ts +5 -3
  488. package/src/api/discriminator-patch.ts +5 -1
  489. package/src/api/discriminator-scan.ts +16 -8
  490. package/src/api/document-refs.ts +29 -1
  491. package/src/api/document-run.ts +10 -19
  492. package/src/api/legacy-utils.ts +5 -1
  493. package/src/api/openapi-ts.ts +26 -8
  494. package/src/api/ref-limit-options.ts +76 -0
  495. package/src/api/run-context.ts +3 -0
  496. package/src/api/schema-callbacks.ts +60 -17
  497. package/src/api/transform-context.ts +7 -3
  498. package/src/api/transform-schema.ts +79 -12
  499. package/src/application/ports/file-system.ts +47 -0
  500. package/src/application/ports/schema-loader.ts +11 -1
  501. package/src/application/print/text-writer.ts +10 -3
  502. package/src/application/stack-overflow.ts +9 -5
  503. package/src/application/transform/declared-value-types.ts +42 -0
  504. package/src/application/transform/document/components.ts +2 -2
  505. package/src/application/transform/document/declared-type-names.ts +36 -0
  506. package/src/application/transform/document/defs-root.ts +2 -2
  507. package/src/application/transform/document/document.ts +8 -5
  508. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  509. package/src/application/transform/document/exploded-query-values.ts +88 -0
  510. package/src/application/transform/document/global-type-references.ts +1 -1
  511. package/src/application/transform/document/header.ts +25 -5
  512. package/src/application/transform/document/media-type.ts +4 -3
  513. package/src/application/transform/document/operation-keys-written.ts +27 -0
  514. package/src/application/transform/document/operation.ts +2 -2
  515. package/src/application/transform/document/parameter-entries.ts +70 -0
  516. package/src/application/transform/document/parameter.ts +21 -9
  517. package/src/application/transform/document/parameters.ts +56 -66
  518. package/src/application/transform/document/path-item.ts +16 -34
  519. package/src/application/transform/document/path-template-key.ts +152 -0
  520. package/src/application/transform/document/path-template-refs.ts +106 -0
  521. package/src/application/transform/document/paths-enum.ts +24 -10
  522. package/src/application/transform/document/paths.ts +59 -125
  523. package/src/application/transform/document/referenced-parameter.ts +146 -0
  524. package/src/application/transform/document/request-body.ts +2 -2
  525. package/src/application/transform/document/response.ts +3 -3
  526. package/src/application/transform/document/responses.ts +2 -2
  527. package/src/application/transform/document/root-type-aliases.ts +17 -38
  528. package/src/application/transform/document/type-resolution.ts +2 -1
  529. package/src/application/transform/document/webhooks.ts +19 -6
  530. package/src/application/transform/footer/document-footer.ts +36 -9
  531. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  532. package/src/application/transform/footer/operation-keys.ts +28 -0
  533. package/src/application/transform/footer/type-evaluation.ts +4 -4
  534. package/src/application/transform/helper-types.ts +8 -7
  535. package/src/application/transform/numbered-names.ts +15 -0
  536. package/src/application/transform/ref-pointer/generated-location.ts +3 -3
  537. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  538. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  539. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  540. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  541. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  542. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  543. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  544. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  545. package/src/application/transform/ref-type.ts +2 -1
  546. package/src/application/transform/schema/access-flags.ts +5 -2
  547. package/src/application/transform/schema/composition-type.ts +2 -2
  548. package/src/application/transform/schema/enum-rule.ts +6 -2
  549. package/src/application/transform/schema/index-signature-type.ts +31 -0
  550. package/src/application/transform/schema/input-location.ts +35 -0
  551. package/src/application/transform/schema/object-type.ts +22 -12
  552. package/src/application/transform/schema/ref-siblings.ts +76 -0
  553. package/src/application/transform/schema/schema-context.ts +3 -0
  554. package/src/application/transform/schema/schema-transform.ts +6 -3
  555. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  556. package/src/application/transform/schema-comment.ts +5 -1
  557. package/src/application/transform/transform-context.ts +5 -0
  558. package/src/cli/api-logger.ts +17 -0
  559. package/src/cli/api-settings.ts +80 -13
  560. package/src/cli/api-writes.ts +117 -0
  561. package/src/cli/cli-arguments.ts +90 -14
  562. package/src/cli/cli-dependencies.ts +26 -4
  563. package/src/cli/cli-errors.ts +42 -1
  564. package/src/cli/cli-output.ts +195 -15
  565. package/src/cli/main.ts +14 -5
  566. package/src/cli/redocly-apis.ts +177 -52
  567. package/src/cli/ref-limits.ts +21 -2
  568. package/src/cli/run-cli.ts +76 -15
  569. package/src/domain/append-all.ts +10 -0
  570. package/src/domain/cause-secrets.ts +86 -0
  571. package/src/domain/errors.ts +16 -5
  572. package/src/domain/ir/identifier-text.ts +6 -5
  573. package/src/domain/ir/ir-shape.ts +299 -0
  574. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  575. package/src/domain/location-text.ts +12 -0
  576. package/src/domain/openapi/alias-expansion.ts +4 -1
  577. package/src/domain/openapi/discriminated-union.ts +6 -4
  578. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  579. package/src/domain/openapi/document-object.ts +2 -0
  580. package/src/domain/openapi/document-places.ts +78 -0
  581. package/src/domain/openapi/json-pointer.ts +96 -7
  582. package/src/domain/openapi/schema-dialect.ts +22 -0
  583. package/src/domain/openapi/unsupported-features.ts +2 -2
  584. package/src/domain/output-fixes.ts +28 -2
  585. package/src/domain/terminal-text.ts +44 -0
  586. package/src/domain/url-secrets.ts +72 -0
  587. package/src/domain/warnings.ts +1 -0
  588. package/src/types/generator-options.ts +1 -1
  589. package/dist/cli/main.d.cts +0 -2
  590. package/dist/cli/main.d.mts +0 -2
  591. package/dist/cli/main.d.ts +0 -2
  592. package/dist/domain/url-credentials.cjs +0 -10
  593. package/dist/domain/url-credentials.cjs.map +0 -1
  594. package/dist/domain/url-credentials.mjs +0 -8
  595. package/dist/domain/url-credentials.mjs.map +0 -1
  596. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"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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"}
1
+ {"version":3,"file":"api-settings.cjs","sources":["../../src/cli/api-settings.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags, hostList } from \"./cli-arguments.js\";\nimport { ApiFailure, cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport { localRootUrl, 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 LOCAL_ROOT_EXPECTED = \"a directory path or a file: URL\";\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 key a setting is written with: camelCase, else kebab-case; undefined when it is absent. */\nfunction settingKey(settings: ApiSettings, name: string): string | undefined {\n if (name in settings) {\n return name;\n }\n const kebabName = kebabCase(name);\n return kebabName in settings ? kebabName : undefined;\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 const key = settingKey(settings, name);\n return key === undefined ? undefined : settings[key];\n}\n\nfunction hasSetting(settings: ApiSettings, name: string): boolean {\n return settingKey(settings, name) !== undefined;\n}\n\n/** `CLI_CONFIG_INVALID` for the setting `name` of an API, named as the user wrote it. */\nfunction invalidSetting(apiName: string, settings: ApiSettings, name: string, expected: string) {\n const key = settingKey(settings, name) ?? kebabCase(name);\n return cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${apiName}: \\`${key}\\` in x-openapi-ts must be ${expected}`,\n );\n}\n\n/**\n * The boolean flags an API sets, in camelCase or kebab-case; they win over the CLI's flags. A\n * value of another type (`root-types: \"true\"`) fails with `CLI_CONFIG_INVALID`: ignoring it\n * would generate other types than the config asks for, without a word.\n */\nexport function apiFlags(apiName: string, settings: ApiSettings): GeneratorFlags {\n const flags: Partial<Record<(typeof GENERATOR_FLAGS)[number], boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n const value = settingValue(settings, name);\n if (typeof value === \"boolean\") {\n flags[name] = value;\n } else if (hasSetting(settings, name)) {\n throw invalidSetting(apiName, settings, name, \"true or false\");\n }\n }\n return flags;\n}\n\n/** The API's `output` file as written; fails with `CLI_CONFIG_INVALID` when it is not text. */\nexport function apiOutputOf(apiName: string, settings: ApiSettings): string {\n const output = settings[OUTPUT_SETTING];\n if (typeof output !== \"string\") {\n throw invalidSetting(apiName, settings, OUTPUT_SETTING, \"a file path\");\n }\n return output;\n}\n\n/**\n * The API's `fix` names, which replace the CLI's `--fix` (ADR-021). An entry that is not text\n * fails with `CLI_CONFIG_INVALID`; an unknown name with `OPTION_FIX_UNKNOWN`, naming the API.\n */\nexport function apiFixNames(\n apiName: string,\n settings: ApiSettings,\n): readonly OutputFixName[] | undefined {\n if (!hasSetting(settings, FIX_SETTING)) {\n return undefined;\n }\n const entries = [settingValue(settings, FIX_SETTING)].flat();\n if (entries.some((entry) => typeof entry !== \"string\")) {\n throw invalidSetting(apiName, settings, FIX_SETTING, \"a list of fix names or a comma list\");\n }\n try {\n return fixNamesOf(entries);\n } catch (error) {\n throw new ApiFailure(apiName, error);\n }\n}\n\n/**\n * `local-ref-root: dir`, relative to the config file; empty means the config file's directory. A\n * value that is no text or a URL of another protocol fails with `CLI_CONFIG_INVALID`.\n */\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 const localRoot = typeof value === \"string\" ? localRootUrl(value, configRoot) : undefined;\n if (localRoot === undefined) {\n throw invalidSetting(apiName, settings, LOCAL_REF_ROOT_SETTING, LOCAL_ROOT_EXPECTED);\n }\n return { localRefRoot: localRoot };\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, settings, 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","fixNamesOf","ApiFailure","localRootUrl","hostList"],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  import { kebabCase } from 'scule';
2
2
  import { warningText, WARNING_CODES } from '../domain/warnings.mjs';
3
3
  import { GENERATOR_FLAGS, hostList } from './cli-arguments.mjs';
4
- import { cliError } from './cli-errors.mjs';
5
- import { resolveLocationUrl } from './cli-output.mjs';
4
+ import { cliError, ApiFailure } from './cli-errors.mjs';
5
+ import { fixNamesOf } from './fix-option.mjs';
6
+ import { localRootUrl } from './ref-limits.mjs';
6
7
 
7
8
  const OUTPUT_SETTING = "output";
8
9
  const FIX_SETTING = "fix";
9
10
  const LOCAL_REF_ROOT_SETTING = "localRefRoot";
11
+ const LOCAL_ROOT_EXPECTED = "a directory path or a file: URL";
10
12
  const REMOTE_REF_HOSTS_SETTING = "remoteRefHosts";
11
13
  const IGNORED_SETTINGS = ["contentNever"];
12
14
  const CAMEL_CASE_SETTINGS = [
@@ -29,27 +31,70 @@ function unknownSettingWarnings(apiName, settings) {
29
31
  )
30
32
  );
31
33
  }
34
+ function settingKey(settings, name) {
35
+ if (name in settings) {
36
+ return name;
37
+ }
38
+ const kebabName = kebabCase(name);
39
+ return kebabName in settings ? kebabName : void 0;
40
+ }
32
41
  function settingValue(settings, name) {
33
- return name in settings ? settings[name] : settings[kebabCase(name)];
42
+ const key = settingKey(settings, name);
43
+ return key === void 0 ? void 0 : settings[key];
34
44
  }
35
45
  function hasSetting(settings, name) {
36
- return name in settings || kebabCase(name) in settings;
46
+ return settingKey(settings, name) !== void 0;
37
47
  }
38
- function invalidSetting(apiName, name, expected) {
48
+ function invalidSetting(apiName, settings, name, expected) {
49
+ const key = settingKey(settings, name) ?? kebabCase(name);
39
50
  return cliError(
40
51
  "CLI_CONFIG_INVALID",
41
- `API ${apiName}: \`${kebabCase(name)}\` in x-openapi-ts must be ${expected}`
52
+ `API ${apiName}: \`${key}\` in x-openapi-ts must be ${expected}`
42
53
  );
43
54
  }
55
+ function apiFlags(apiName, settings) {
56
+ const flags = {};
57
+ for (const name of GENERATOR_FLAGS) {
58
+ const value = settingValue(settings, name);
59
+ if (typeof value === "boolean") {
60
+ flags[name] = value;
61
+ } else if (hasSetting(settings, name)) {
62
+ throw invalidSetting(apiName, settings, name, "true or false");
63
+ }
64
+ }
65
+ return flags;
66
+ }
67
+ function apiOutputOf(apiName, settings) {
68
+ const output = settings[OUTPUT_SETTING];
69
+ if (typeof output !== "string") {
70
+ throw invalidSetting(apiName, settings, OUTPUT_SETTING, "a file path");
71
+ }
72
+ return output;
73
+ }
74
+ function apiFixNames(apiName, settings) {
75
+ if (!hasSetting(settings, FIX_SETTING)) {
76
+ return void 0;
77
+ }
78
+ const entries = [settingValue(settings, FIX_SETTING)].flat();
79
+ if (entries.some((entry) => typeof entry !== "string")) {
80
+ throw invalidSetting(apiName, settings, FIX_SETTING, "a list of fix names or a comma list");
81
+ }
82
+ try {
83
+ return fixNamesOf(entries);
84
+ } catch (error) {
85
+ throw new ApiFailure(apiName, error);
86
+ }
87
+ }
44
88
  function localRefRootOf(apiName, settings, configRoot) {
45
89
  if (!hasSetting(settings, LOCAL_REF_ROOT_SETTING)) {
46
90
  return {};
47
91
  }
48
92
  const value = settingValue(settings, LOCAL_REF_ROOT_SETTING) ?? "";
49
- if (typeof value !== "string") {
50
- throw invalidSetting(apiName, LOCAL_REF_ROOT_SETTING, "a directory path");
93
+ const localRoot = typeof value === "string" ? localRootUrl(value, configRoot) : void 0;
94
+ if (localRoot === void 0) {
95
+ throw invalidSetting(apiName, settings, LOCAL_REF_ROOT_SETTING, LOCAL_ROOT_EXPECTED);
51
96
  }
52
- return { localRefRoot: resolveLocationUrl(value === "" ? "." : value, configRoot) };
97
+ return { localRefRoot: localRoot };
53
98
  }
54
99
  function remoteRefHostsOf(apiName, settings) {
55
100
  if (!hasSetting(settings, REMOTE_REF_HOSTS_SETTING)) {
@@ -58,7 +103,7 @@ function remoteRefHostsOf(apiName, settings) {
58
103
  const value = settingValue(settings, REMOTE_REF_HOSTS_SETTING) ?? [];
59
104
  const entries = [value].flat();
60
105
  if (entries.some((entry) => typeof entry !== "string")) {
61
- throw invalidSetting(apiName, REMOTE_REF_HOSTS_SETTING, "a host list");
106
+ throw invalidSetting(apiName, settings, REMOTE_REF_HOSTS_SETTING, "a host list");
62
107
  }
63
108
  return { remoteRefHosts: hostList(entries) ?? [] };
64
109
  }
@@ -69,5 +114,5 @@ function apiRefLimitOptions(apiName, settings, configRoot) {
69
114
  };
70
115
  }
71
116
 
72
- export { FIX_SETTING, OUTPUT_SETTING, apiRefLimitOptions, unknownSettingWarnings };
117
+ export { FIX_SETTING, OUTPUT_SETTING, apiFixNames, apiFlags, apiOutputOf, apiRefLimitOptions, unknownSettingWarnings };
73
118
  //# sourceMappingURL=api-settings.mjs.map
@@ -1 +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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"}
1
+ {"version":3,"file":"api-settings.mjs","sources":["../../src/cli/api-settings.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { GENERATOR_FLAGS, type GeneratorFlags, hostList } from \"./cli-arguments.js\";\nimport { ApiFailure, cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\nimport { localRootUrl, 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 LOCAL_ROOT_EXPECTED = \"a directory path or a file: URL\";\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 key a setting is written with: camelCase, else kebab-case; undefined when it is absent. */\nfunction settingKey(settings: ApiSettings, name: string): string | undefined {\n if (name in settings) {\n return name;\n }\n const kebabName = kebabCase(name);\n return kebabName in settings ? kebabName : undefined;\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 const key = settingKey(settings, name);\n return key === undefined ? undefined : settings[key];\n}\n\nfunction hasSetting(settings: ApiSettings, name: string): boolean {\n return settingKey(settings, name) !== undefined;\n}\n\n/** `CLI_CONFIG_INVALID` for the setting `name` of an API, named as the user wrote it. */\nfunction invalidSetting(apiName: string, settings: ApiSettings, name: string, expected: string) {\n const key = settingKey(settings, name) ?? kebabCase(name);\n return cliError(\n \"CLI_CONFIG_INVALID\",\n `API ${apiName}: \\`${key}\\` in x-openapi-ts must be ${expected}`,\n );\n}\n\n/**\n * The boolean flags an API sets, in camelCase or kebab-case; they win over the CLI's flags. A\n * value of another type (`root-types: \"true\"`) fails with `CLI_CONFIG_INVALID`: ignoring it\n * would generate other types than the config asks for, without a word.\n */\nexport function apiFlags(apiName: string, settings: ApiSettings): GeneratorFlags {\n const flags: Partial<Record<(typeof GENERATOR_FLAGS)[number], boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n const value = settingValue(settings, name);\n if (typeof value === \"boolean\") {\n flags[name] = value;\n } else if (hasSetting(settings, name)) {\n throw invalidSetting(apiName, settings, name, \"true or false\");\n }\n }\n return flags;\n}\n\n/** The API's `output` file as written; fails with `CLI_CONFIG_INVALID` when it is not text. */\nexport function apiOutputOf(apiName: string, settings: ApiSettings): string {\n const output = settings[OUTPUT_SETTING];\n if (typeof output !== \"string\") {\n throw invalidSetting(apiName, settings, OUTPUT_SETTING, \"a file path\");\n }\n return output;\n}\n\n/**\n * The API's `fix` names, which replace the CLI's `--fix` (ADR-021). An entry that is not text\n * fails with `CLI_CONFIG_INVALID`; an unknown name with `OPTION_FIX_UNKNOWN`, naming the API.\n */\nexport function apiFixNames(\n apiName: string,\n settings: ApiSettings,\n): readonly OutputFixName[] | undefined {\n if (!hasSetting(settings, FIX_SETTING)) {\n return undefined;\n }\n const entries = [settingValue(settings, FIX_SETTING)].flat();\n if (entries.some((entry) => typeof entry !== \"string\")) {\n throw invalidSetting(apiName, settings, FIX_SETTING, \"a list of fix names or a comma list\");\n }\n try {\n return fixNamesOf(entries);\n } catch (error) {\n throw new ApiFailure(apiName, error);\n }\n}\n\n/**\n * `local-ref-root: dir`, relative to the config file; empty means the config file's directory. A\n * value that is no text or a URL of another protocol fails with `CLI_CONFIG_INVALID`.\n */\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 const localRoot = typeof value === \"string\" ? localRootUrl(value, configRoot) : undefined;\n if (localRoot === undefined) {\n throw invalidSetting(apiName, settings, LOCAL_REF_ROOT_SETTING, LOCAL_ROOT_EXPECTED);\n }\n return { localRefRoot: localRoot };\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, settings, 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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"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ const cliOutput = require('./cli-output.cjs');
4
+
5
+ function failuresOf(step) {
6
+ try {
7
+ step();
8
+ return [];
9
+ } catch (failure) {
10
+ return [failure];
11
+ }
12
+ }
13
+ function claimOutputs(run, apis, failures) {
14
+ const claimed = [];
15
+ for (const api of apis) {
16
+ try {
17
+ const claim = run.args.isCheck ? void 0 : run.deps.files.claimFile(api.outputFile.file);
18
+ claimed.push({ api, claim });
19
+ } catch (failure) {
20
+ failures.set(api.name, [failure]);
21
+ }
22
+ }
23
+ return claimed;
24
+ }
25
+ function sharedOutputs(claimed) {
26
+ const byIdentity = /* @__PURE__ */ new Map();
27
+ for (const { api, claim } of claimed) {
28
+ if (claim) {
29
+ byIdentity.set(claim.identity, [...byIdentity.get(claim.identity) ?? [], api.name]);
30
+ }
31
+ }
32
+ const shared = /* @__PURE__ */ new Map();
33
+ for (const names of byIdentity.values()) {
34
+ for (const name of names.length > 1 ? names : []) {
35
+ shared.set(
36
+ name,
37
+ names.filter((other) => other !== name).map((other) => `API ${other}`)
38
+ );
39
+ }
40
+ }
41
+ return shared;
42
+ }
43
+ function writeClaimed(run, { api, claim }) {
44
+ const failures = failuresOf(() => cliOutput.emitOutput(run, api.outputFile, api.types.contents));
45
+ return failures.length > 0 && claim ? [...failures, ...failuresOf(() => claim.release())] : failures;
46
+ }
47
+ function writeGeneratedApis(run, apis, readFiles) {
48
+ const failures = /* @__PURE__ */ new Map();
49
+ const ownOutputs = apis.filter((api) => {
50
+ const failure = failuresOf(() => cliOutput.ensureOutputIsNotSchema(run, api.outputFile, readFiles));
51
+ failures.set(api.name, failure);
52
+ return failure.length === 0;
53
+ });
54
+ const claimed = claimOutputs(run, ownOutputs, failures);
55
+ const shared = sharedOutputs(claimed);
56
+ for (const entry of [...claimed].reverse()) {
57
+ const { api, claim } = entry;
58
+ const others = shared.get(api.name);
59
+ if (others) {
60
+ const release = claim ? failuresOf(() => claim.release()) : [];
61
+ failures.set(api.name, [cliOutput.duplicateOutputError(api.outputFile, others), ...release]);
62
+ }
63
+ }
64
+ for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {
65
+ failures.set(entry.api.name, writeClaimed(run, entry));
66
+ }
67
+ return failures;
68
+ }
69
+
70
+ exports.failuresOf = failuresOf;
71
+ exports.writeGeneratedApis = writeGeneratedApis;
72
+ //# sourceMappingURL=api-writes.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-writes.cjs","sources":["../../src/cli/api-writes.ts"],"sourcesContent":["import type { ClaimedFile } from \"../application/ports/file-system.js\";\nimport type { GeneratedTypes } from \"./cli-dependencies.js\";\nimport {\n type CliRun,\n duplicateOutputError,\n emitOutput,\n ensureOutputIsNotSchema,\n type NamedFile,\n type OutputFile,\n} from \"./cli-output.js\";\n\n/**\n * Writing the generated APIs of a Redocly config. Before the first byte is written, every output\n * is claimed: a missing one is created empty, so the file system gives it its own identity. Two\n * APIs whose files then have one identity fail with `CLI_OUTPUT_DUPLICATE` and write nothing,\n * also when their names looked different (ADR-043, decision 1).\n */\n\n/** An API whose types are generated and not written yet. */\nexport interface GeneratedApi {\n readonly name: string;\n readonly outputFile: OutputFile;\n readonly types: GeneratedTypes;\n}\n\n/** An API whose output is claimed; `claim` is undefined with `--check`, which writes nothing. */\ninterface ClaimedApi {\n readonly api: GeneratedApi;\n readonly claim: ClaimedFile | undefined;\n}\n\n/** The failures of the API an API name maps to; an API without failures was written. */\ntype ApiFailures = Map<string, unknown[]>;\n\n/** The failure of a step, as a list: empty when it succeeded. */\nexport function failuresOf(step: () => void): unknown[] {\n try {\n step();\n return [];\n } catch (failure) {\n return [failure];\n }\n}\n\n/** Claim the output of each API; an API whose claim fails gets that failure instead. */\nfunction claimOutputs(run: CliRun, apis: readonly GeneratedApi[], failures: ApiFailures) {\n const claimed: ClaimedApi[] = [];\n for (const api of apis) {\n try {\n const claim = run.args.isCheck ? undefined : run.deps.files.claimFile(api.outputFile.file);\n claimed.push({ api, claim });\n } catch (failure) {\n failures.set(api.name, [failure]);\n }\n }\n return claimed;\n}\n\n/** The APIs that share their claimed file with another, by API name, with the other names. */\nfunction sharedOutputs(claimed: readonly ClaimedApi[]): Map<string, string[]> {\n const byIdentity = new Map<string, string[]>();\n for (const { api, claim } of claimed) {\n if (claim) {\n byIdentity.set(claim.identity, [...(byIdentity.get(claim.identity) ?? []), api.name]);\n }\n }\n const shared = new Map<string, string[]>();\n for (const names of byIdentity.values()) {\n for (const name of names.length > 1 ? names : []) {\n shared.set(\n name,\n names.filter((other) => other !== name).map((other) => `API ${other}`),\n );\n }\n }\n return shared;\n}\n\n/** Write one claimed API; a failed write releases the claim, so no empty file is left. */\nfunction writeClaimed(run: CliRun, { api, claim }: ClaimedApi): unknown[] {\n const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));\n return failures.length > 0 && claim\n ? [...failures, ...failuresOf(() => claim.release())]\n : failures;\n}\n\n/**\n * Write (or `--check`) every API unless its output is a file the run read or the file of another\n * API. Returns the failures by API name. Claims are released in reverse order, so a directory\n * one claim created is empty by the time it is removed.\n */\nexport function writeGeneratedApis(\n run: CliRun,\n apis: readonly GeneratedApi[],\n readFiles: readonly NamedFile[],\n): ApiFailures {\n const failures: ApiFailures = new Map();\n const ownOutputs = apis.filter((api) => {\n const failure = failuresOf(() => ensureOutputIsNotSchema(run, api.outputFile, readFiles));\n failures.set(api.name, failure);\n return failure.length === 0;\n });\n const claimed = claimOutputs(run, ownOutputs, failures);\n const shared = sharedOutputs(claimed);\n for (const entry of [...claimed].reverse()) {\n const { api, claim } = entry;\n const others = shared.get(api.name);\n if (others) {\n const release = claim ? failuresOf(() => claim.release()) : [];\n failures.set(api.name, [duplicateOutputError(api.outputFile, others), ...release]);\n }\n }\n for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {\n failures.set(entry.api.name, writeClaimed(run, entry));\n }\n return failures;\n}\n"],"names":["emitOutput","ensureOutputIsNotSchema","duplicateOutputError"],"mappings":";;;;AAmCO,SAAS,WAAW,IAAA,EAA6B;AACtD,EAAA,IAAI;AACF,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,EAAC;AAAA,EACV,SAAS,OAAA,EAAS;AAChB,IAAA,OAAO,CAAC,OAAO,CAAA;AAAA,EACjB;AACF;AAGA,SAAS,YAAA,CAAa,GAAA,EAAa,IAAA,EAA+B,QAAA,EAAuB;AACvF,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,OAAA,GAAU,KAAA,CAAA,GAAY,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AACzF,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AAAA,IAC7B,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,OAAO,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,cAAc,OAAA,EAAuD;AAC5E,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,OAAA,EAAS;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,CAAC,GAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAC,EAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IACtF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,MAAA,EAAO,EAAG;AACvC,IAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,EAAC,EAAG;AAChD,MAAA,MAAA,CAAO,GAAA;AAAA,QACL,IAAA;AAAA,QACA,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE;AAAA,OACvE;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,YAAA,CAAa,GAAA,EAAa,EAAE,GAAA,EAAK,OAAM,EAA0B;AACxE,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAMA,oBAAA,CAAW,GAAA,EAAK,IAAI,UAAA,EAAY,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AACrF,EAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,KAAA,GAC1B,CAAC,GAAG,QAAA,EAAU,GAAG,UAAA,CAAW,MAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA,GAClD,QAAA;AACN;AAOO,SAAS,kBAAA,CACd,GAAA,EACA,IAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,QAAA,uBAA4B,GAAA,EAAI;AACtC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ;AACtC,IAAA,MAAM,OAAA,GAAU,WAAW,MAAMC,iCAAA,CAAwB,KAAK,GAAA,CAAI,UAAA,EAAY,SAAS,CAAC,CAAA;AACxF,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC9B,IAAA,OAAO,QAAQ,MAAA,KAAW,CAAA;AAAA,EAC5B,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,KAAA,MAAW,SAAS,CAAC,GAAG,OAAO,CAAA,CAAE,SAAQ,EAAG;AAC1C,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,KAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,GAAU,QAAQ,UAAA,CAAW,MAAM,MAAM,OAAA,EAAS,IAAI,EAAC;AAC7D,MAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAACC,8BAAA,CAAqB,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA,EAAG,GAAG,OAAO,CAAC,CAAA;AAAA,IACnF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG;AACtE,IAAA,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,QAAA;AACT;;;"}
@@ -0,0 +1,69 @@
1
+ import { duplicateOutputError, ensureOutputIsNotSchema, emitOutput } from './cli-output.mjs';
2
+
3
+ function failuresOf(step) {
4
+ try {
5
+ step();
6
+ return [];
7
+ } catch (failure) {
8
+ return [failure];
9
+ }
10
+ }
11
+ function claimOutputs(run, apis, failures) {
12
+ const claimed = [];
13
+ for (const api of apis) {
14
+ try {
15
+ const claim = run.args.isCheck ? void 0 : run.deps.files.claimFile(api.outputFile.file);
16
+ claimed.push({ api, claim });
17
+ } catch (failure) {
18
+ failures.set(api.name, [failure]);
19
+ }
20
+ }
21
+ return claimed;
22
+ }
23
+ function sharedOutputs(claimed) {
24
+ const byIdentity = /* @__PURE__ */ new Map();
25
+ for (const { api, claim } of claimed) {
26
+ if (claim) {
27
+ byIdentity.set(claim.identity, [...byIdentity.get(claim.identity) ?? [], api.name]);
28
+ }
29
+ }
30
+ const shared = /* @__PURE__ */ new Map();
31
+ for (const names of byIdentity.values()) {
32
+ for (const name of names.length > 1 ? names : []) {
33
+ shared.set(
34
+ name,
35
+ names.filter((other) => other !== name).map((other) => `API ${other}`)
36
+ );
37
+ }
38
+ }
39
+ return shared;
40
+ }
41
+ function writeClaimed(run, { api, claim }) {
42
+ const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));
43
+ return failures.length > 0 && claim ? [...failures, ...failuresOf(() => claim.release())] : failures;
44
+ }
45
+ function writeGeneratedApis(run, apis, readFiles) {
46
+ const failures = /* @__PURE__ */ new Map();
47
+ const ownOutputs = apis.filter((api) => {
48
+ const failure = failuresOf(() => ensureOutputIsNotSchema(run, api.outputFile, readFiles));
49
+ failures.set(api.name, failure);
50
+ return failure.length === 0;
51
+ });
52
+ const claimed = claimOutputs(run, ownOutputs, failures);
53
+ const shared = sharedOutputs(claimed);
54
+ for (const entry of [...claimed].reverse()) {
55
+ const { api, claim } = entry;
56
+ const others = shared.get(api.name);
57
+ if (others) {
58
+ const release = claim ? failuresOf(() => claim.release()) : [];
59
+ failures.set(api.name, [duplicateOutputError(api.outputFile, others), ...release]);
60
+ }
61
+ }
62
+ for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {
63
+ failures.set(entry.api.name, writeClaimed(run, entry));
64
+ }
65
+ return failures;
66
+ }
67
+
68
+ export { failuresOf, writeGeneratedApis };
69
+ //# sourceMappingURL=api-writes.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-writes.mjs","sources":["../../src/cli/api-writes.ts"],"sourcesContent":["import type { ClaimedFile } from \"../application/ports/file-system.js\";\nimport type { GeneratedTypes } from \"./cli-dependencies.js\";\nimport {\n type CliRun,\n duplicateOutputError,\n emitOutput,\n ensureOutputIsNotSchema,\n type NamedFile,\n type OutputFile,\n} from \"./cli-output.js\";\n\n/**\n * Writing the generated APIs of a Redocly config. Before the first byte is written, every output\n * is claimed: a missing one is created empty, so the file system gives it its own identity. Two\n * APIs whose files then have one identity fail with `CLI_OUTPUT_DUPLICATE` and write nothing,\n * also when their names looked different (ADR-043, decision 1).\n */\n\n/** An API whose types are generated and not written yet. */\nexport interface GeneratedApi {\n readonly name: string;\n readonly outputFile: OutputFile;\n readonly types: GeneratedTypes;\n}\n\n/** An API whose output is claimed; `claim` is undefined with `--check`, which writes nothing. */\ninterface ClaimedApi {\n readonly api: GeneratedApi;\n readonly claim: ClaimedFile | undefined;\n}\n\n/** The failures of the API an API name maps to; an API without failures was written. */\ntype ApiFailures = Map<string, unknown[]>;\n\n/** The failure of a step, as a list: empty when it succeeded. */\nexport function failuresOf(step: () => void): unknown[] {\n try {\n step();\n return [];\n } catch (failure) {\n return [failure];\n }\n}\n\n/** Claim the output of each API; an API whose claim fails gets that failure instead. */\nfunction claimOutputs(run: CliRun, apis: readonly GeneratedApi[], failures: ApiFailures) {\n const claimed: ClaimedApi[] = [];\n for (const api of apis) {\n try {\n const claim = run.args.isCheck ? undefined : run.deps.files.claimFile(api.outputFile.file);\n claimed.push({ api, claim });\n } catch (failure) {\n failures.set(api.name, [failure]);\n }\n }\n return claimed;\n}\n\n/** The APIs that share their claimed file with another, by API name, with the other names. */\nfunction sharedOutputs(claimed: readonly ClaimedApi[]): Map<string, string[]> {\n const byIdentity = new Map<string, string[]>();\n for (const { api, claim } of claimed) {\n if (claim) {\n byIdentity.set(claim.identity, [...(byIdentity.get(claim.identity) ?? []), api.name]);\n }\n }\n const shared = new Map<string, string[]>();\n for (const names of byIdentity.values()) {\n for (const name of names.length > 1 ? names : []) {\n shared.set(\n name,\n names.filter((other) => other !== name).map((other) => `API ${other}`),\n );\n }\n }\n return shared;\n}\n\n/** Write one claimed API; a failed write releases the claim, so no empty file is left. */\nfunction writeClaimed(run: CliRun, { api, claim }: ClaimedApi): unknown[] {\n const failures = failuresOf(() => emitOutput(run, api.outputFile, api.types.contents));\n return failures.length > 0 && claim\n ? [...failures, ...failuresOf(() => claim.release())]\n : failures;\n}\n\n/**\n * Write (or `--check`) every API unless its output is a file the run read or the file of another\n * API. Returns the failures by API name. Claims are released in reverse order, so a directory\n * one claim created is empty by the time it is removed.\n */\nexport function writeGeneratedApis(\n run: CliRun,\n apis: readonly GeneratedApi[],\n readFiles: readonly NamedFile[],\n): ApiFailures {\n const failures: ApiFailures = new Map();\n const ownOutputs = apis.filter((api) => {\n const failure = failuresOf(() => ensureOutputIsNotSchema(run, api.outputFile, readFiles));\n failures.set(api.name, failure);\n return failure.length === 0;\n });\n const claimed = claimOutputs(run, ownOutputs, failures);\n const shared = sharedOutputs(claimed);\n for (const entry of [...claimed].reverse()) {\n const { api, claim } = entry;\n const others = shared.get(api.name);\n if (others) {\n const release = claim ? failuresOf(() => claim.release()) : [];\n failures.set(api.name, [duplicateOutputError(api.outputFile, others), ...release]);\n }\n }\n for (const entry of claimed.filter(({ api }) => !shared.has(api.name))) {\n failures.set(entry.api.name, writeClaimed(run, entry));\n }\n return failures;\n}\n"],"names":[],"mappings":";;AAmCO,SAAS,WAAW,IAAA,EAA6B;AACtD,EAAA,IAAI;AACF,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,EAAC;AAAA,EACV,SAAS,OAAA,EAAS;AAChB,IAAA,OAAO,CAAC,OAAO,CAAA;AAAA,EACjB;AACF;AAGA,SAAS,YAAA,CAAa,GAAA,EAAa,IAAA,EAA+B,QAAA,EAAuB;AACvF,EAAA,MAAM,UAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,IAAA,CAAK,OAAA,GAAU,KAAA,CAAA,GAAY,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AACzF,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AAAA,IAC7B,SAAS,OAAA,EAAS;AAChB,MAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,OAAO,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,cAAc,OAAA,EAAuD;AAC5E,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAA,EAAM,IAAK,OAAA,EAAS;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,CAAC,GAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAC,EAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IACtF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,MAAA,EAAO,EAAG;AACvC,IAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,EAAC,EAAG;AAChD,MAAA,MAAA,CAAO,GAAA;AAAA,QACL,IAAA;AAAA,QACA,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,KAAU,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE;AAAA,OACvE;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,YAAA,CAAa,GAAA,EAAa,EAAE,GAAA,EAAK,OAAM,EAA0B;AACxE,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAM,UAAA,CAAW,GAAA,EAAK,IAAI,UAAA,EAAY,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AACrF,EAAA,OAAO,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,KAAA,GAC1B,CAAC,GAAG,QAAA,EAAU,GAAG,UAAA,CAAW,MAAM,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA,GAClD,QAAA;AACN;AAOO,SAAS,kBAAA,CACd,GAAA,EACA,IAAA,EACA,SAAA,EACa;AACb,EAAA,MAAM,QAAA,uBAA4B,GAAA,EAAI;AACtC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ;AACtC,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM,uBAAA,CAAwB,KAAK,GAAA,CAAI,UAAA,EAAY,SAAS,CAAC,CAAA;AACxF,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAC9B,IAAA,OAAO,QAAQ,MAAA,KAAW,CAAA;AAAA,EAC5B,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,EAAA,KAAA,MAAW,SAAS,CAAC,GAAG,OAAO,CAAA,CAAE,SAAQ,EAAG;AAC1C,IAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,KAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,GAAU,QAAQ,UAAA,CAAW,MAAM,MAAM,OAAA,EAAS,IAAI,EAAC;AAC7D,MAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAC,oBAAA,CAAqB,GAAA,CAAI,UAAA,EAAY,MAAM,CAAA,EAAG,GAAG,OAAO,CAAC,CAAA;AAAA,IACnF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG;AACtE,IAAA,QAAA,CAAS,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,YAAA,CAAa,GAAA,EAAK,KAAK,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,QAAA;AACT;;"}
@@ -48,20 +48,59 @@ const REMOVED_FLAGS = [
48
48
  ["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
49
49
  ["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
50
50
  ];
51
- const ROOT_TYPES_FLAGS = ["--root-types-no-schema-prefix", "--root-types-keep-casing"];
52
- function rejectRemovedFlags(argv) {
51
+ const ROOT_TYPES_FLAGS = ["rootTypesNoSchemaPrefix", "rootTypesKeepCasing"];
52
+ const OPTIONS_END = "--";
53
+ const LONG_PREFIX = "--";
54
+ const NEGATION_PREFIX = "--no-";
55
+ const VALUE_SEPARATOR = "=";
56
+ const BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "false"]);
57
+ function writtenFlags(argv) {
58
+ const end = argv.indexOf(OPTIONS_END);
59
+ return (end === -1 ? argv : argv.slice(0, end)).filter((arg) => arg.startsWith("-") && arg !== "-").map((arg) => {
60
+ const at = arg.indexOf(VALUE_SEPARATOR);
61
+ return at === -1 ? { name: arg, value: void 0 } : { name: arg.slice(0, at), value: arg.slice(at + 1) };
62
+ });
63
+ }
64
+ function canonicalFlagName(name) {
65
+ if (!name.startsWith(LONG_PREFIX)) {
66
+ return name;
67
+ }
68
+ const bare = name.startsWith(NEGATION_PREFIX) ? name.slice(NEGATION_PREFIX.length) : name.slice(LONG_PREFIX.length);
69
+ return `${LONG_PREFIX}${scule.kebabCase(bare)}`;
70
+ }
71
+ function rejectRemovedFlags(flags) {
72
+ const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));
53
73
  for (const [flag, message] of REMOVED_FLAGS) {
54
- if (argv.includes(flag)) {
74
+ if (names.has(flag)) {
55
75
  throw cliErrors.cliError("CLI_FLAG_REMOVED", message);
56
76
  }
57
77
  }
58
78
  }
59
- function ineffectiveFlagNotices(argv) {
60
- if (argv.includes("--root-types")) {
79
+ const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
80
+ const BOOLEAN_ALIASES = Object.entries(ALIASES).filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag)).flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));
81
+ const BOOLEAN_FLAG_NAMES = /* @__PURE__ */ new Set([
82
+ ...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),
83
+ ...BOOLEAN_ALIASES
84
+ ]);
85
+ function rejectInvalidBooleans(flags) {
86
+ for (const { name, value } of flags) {
87
+ const negated = name.startsWith(NEGATION_PREFIX) ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}` : void 0;
88
+ const isNegatedWithValue = negated !== void 0 && BOOLEAN_FLAG_NAMES.has(negated);
89
+ const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? "true");
90
+ if (value !== void 0 && (isNegatedWithValue || isInvalid)) {
91
+ throw cliErrors.cliError(
92
+ "CLI_FLAG_INVALID",
93
+ `${name}=${value}: a boolean flag takes no value, or =true or =false.`
94
+ );
95
+ }
96
+ }
97
+ }
98
+ function ineffectiveFlagNotices(flags) {
99
+ if (flags.rootTypes === true) {
61
100
  return [];
62
101
  }
63
- return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(
64
- (flag) => `${flag} has no effect without --root-types flag`
102
+ return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(
103
+ (flag) => `--${scule.kebabCase(flag)} has no effect without --root-types flag`
65
104
  );
66
105
  }
67
106
  function generatorFlagsOf(parsed) {
@@ -99,7 +138,6 @@ const STRING_FLAGS = [
99
138
  "fix",
100
139
  ...["localRefRoot", "remoteRefHosts"].flatMap((flag) => [flag, scule.kebabCase(flag)])
101
140
  ];
102
- const ALIASES = { redocly: ["c"], exportType: ["t"], output: ["o"] };
103
141
  const KNOWN_FLAGS = /* @__PURE__ */ new Set([
104
142
  ...BOOLEAN_FLAGS,
105
143
  ...STRING_FLAGS,
@@ -119,7 +157,9 @@ function writtenFlagName(key, argv) {
119
157
  return isNegated ? negated : `--${scule.kebabCase(key)}`;
120
158
  }
121
159
  function parseCliArguments(argv) {
122
- rejectRemovedFlags(argv);
160
+ const flags = writtenFlags(argv);
161
+ rejectRemovedFlags(flags);
162
+ rejectInvalidBooleans(flags);
123
163
  const parsed = parser__default([...argv], {
124
164
  boolean: BOOLEAN_FLAGS,
125
165
  string: STRING_FLAGS,
@@ -127,8 +167,8 @@ function parseCliArguments(argv) {
127
167
  });
128
168
  return {
129
169
  input: optionalString(parsed._[0]),
130
- output: optionalString(parsed.output),
131
- redocly: optionalString(parsed.redocly),
170
+ output: lastString(parsed.output),
171
+ redocly: lastString(parsed.redocly),
132
172
  isCheck: parsed.check === true,
133
173
  isHelp: "help" in parsed,
134
174
  isVersion: "version" in parsed,
@@ -1 +1 @@
1
- {"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { fixNamesOf } from \"./fix-option.js\";\n\n/** The CLI's arguments, parsed as the original CLI parsed them (yargs-parser). */\n\n/** Boolean flags that become generator options (camelCase; yargs also accepts kebab-case). */\nexport const GENERATOR_FLAGS = [\n \"additionalProperties\",\n \"alphabetize\",\n \"arrayLength\",\n \"binaryAsBlob\",\n \"conditionalEnums\",\n \"dedupeEnums\",\n \"defaultNonNullable\",\n \"emptyObjectsUnknown\",\n \"enum\",\n \"enumValues\",\n \"excludeDeprecated\",\n \"exportType\",\n \"generatePathParams\",\n \"immutable\",\n \"lint\",\n \"makePathsEnum\",\n \"pathParamsAsTypes\",\n \"propertiesRequiredByDefault\",\n \"readWriteMarkers\",\n \"rootTypes\",\n \"rootTypesKeepCasing\",\n \"rootTypesNoSchemaPrefix\",\n] as const;\n\nexport type GeneratorFlag = (typeof GENERATOR_FLAGS)[number];\n\nexport type GeneratorFlags = Readonly<Partial<Record<GeneratorFlag, boolean>>>;\n\n// `contentNever` was a boolean flag of the original CLI that no code reads; it stays in the list\n// so that `--content-never <input>` keeps parsing as a flag and an input.\nconst CAMEL_CASE_BOOLEAN_FLAGS = [...GENERATOR_FLAGS, \"check\", \"contentNever\", \"help\"];\n\n// yargs-parser matches the `boolean` list by the exact spelling of the flag: with camelCase names\n// only, `--root-types schema.yaml` took the path as the flag's value (upstream #2523). Both\n// spellings are listed.\nconst BOOLEAN_FLAGS = [\n ...CAMEL_CASE_BOOLEAN_FLAGS,\n ...CAMEL_CASE_BOOLEAN_FLAGS.map((flag) => kebabCase(flag)),\n];\n\n/** The `$ref` limits as the user wrote them; unset flags are absent. */\nexport interface CliRefLimits {\n readonly localRefRoot?: string;\n readonly remoteRefHosts?: readonly string[];\n}\n\nexport interface CliArguments {\n /** The schema path or URL; none means stdin, or the APIs of the Redocly config. */\n readonly input: string | undefined;\n readonly output: string | undefined;\n readonly redocly: string | undefined;\n readonly isCheck: boolean;\n readonly isHelp: boolean;\n readonly isVersion: boolean;\n readonly generatorFlags: GeneratorFlags;\n readonly refLimits: CliRefLimits;\n /** `--fix`, comma-separated and repeatable (ADR-021); unset when the flag is not given. */\n readonly fix: readonly OutputFixName[] | undefined;\n /** Flags the CLI does not know, as written on the command line (`--bogus`, `-x`). */\n readonly unknownFlags: readonly string[];\n}\n\n/** Flags of older versions that were removed or renamed, with the message for each. */\nconst REMOVED_FLAGS: readonly (readonly [string, string])[] = [\n [\"-ap\", `The -ap alias has been deprecated. Use \"--additional-properties\" instead.`],\n [\"--immutable-types\", `The --immutable-types flag has been renamed to \"--immutable\".`],\n [\n \"--support-array-length\",\n `The --support-array-length flag has been renamed to \"--array-length\".`,\n ],\n [\"-it\", `The -it alias has been deprecated. Use \"--immutable\" instead.`],\n [\"--redoc\", `The --redoc config flag has been renamed to \"--redocly\" (or -c as shorthand).`],\n];\n\n/** Flags that only work together with `--root-types`. */\nconst ROOT_TYPES_FLAGS = [\"--root-types-no-schema-prefix\", \"--root-types-keep-casing\"] as const;\n\nfunction rejectRemovedFlags(argv: readonly string[]): void {\n for (const [flag, message] of REMOVED_FLAGS) {\n if (argv.includes(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(argv: readonly string[]): string[] {\n if (argv.includes(\"--root-types\")) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => argv.includes(flag)).map(\n (flag) => `${flag} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/** The last value of a flag that may be given more than once. */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** String flags, in both spellings, so that a value such as `8080` is not read as a number. */\nconst STRING_FLAGS = [\n \"output\",\n \"redocly\",\n \"fix\",\n ...[\"localRefRoot\", \"remoteRefHosts\"].flatMap((flag) => [flag, kebabCase(flag)]),\n];\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** Every name yargs-parser can return for a flag this CLI reads. */\nconst KNOWN_FLAGS = new Set<string>([\n ...BOOLEAN_FLAGS,\n ...STRING_FLAGS,\n ...Object.values(ALIASES).flat(),\n \"version\",\n]);\n\n/**\n * Flags that no code reads. The original CLI ignored them silently, so a typo such as\n * `--alphabetise` gave other output with no hint; they still do not fail the run.\n */\nfunction unknownFlagsOf(parsed: parser.Arguments, argv: readonly string[]): string[] {\n const names = Object.keys(parsed)\n .filter((key) => key !== \"_\" && key !== \"--\" && !KNOWN_FLAGS.has(key))\n .map((key) => writtenFlagName(key, argv));\n return [...new Set(names)];\n}\n\n/** The flag as the user wrote it: yargs-parser reads `--no-x` as `x: false`. */\nfunction writtenFlagName(key: string, argv: readonly string[]): string {\n if (key.length === 1) {\n return `-${key}`;\n }\n const negated = `--no-${kebabCase(key)}`;\n const isNegated = argv.some((arg) => arg === negated || arg.startsWith(`${negated}=`));\n return isNegated ? negated : `--${kebabCase(key)}`;\n}\n\n/**\n * Parse the arguments after `node cli.js`. Fails with `CLI_FLAG_REMOVED` for an old flag and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n rejectRemovedFlags(argv);\n const parsed = parser([...argv], {\n boolean: BOOLEAN_FLAGS,\n string: STRING_FLAGS,\n alias: ALIASES,\n });\n return {\n input: optionalString(parsed._[0]),\n output: optionalString(parsed.output),\n redocly: optionalString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","cliError","parser","fixNamesOf"],"mappings":"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"}
1
+ {"version":3,"file":"cli-arguments.cjs","sources":["../../src/cli/cli-arguments.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport parser from \"yargs-parser\";\nimport type { OutputFixName } from \"../domain/output-fixes.js\";\nimport { cliError } from \"./cli-errors.js\";\nimport { 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 = [\"rootTypesNoSchemaPrefix\", \"rootTypesKeepCasing\"] as const;\n\nconst OPTIONS_END = \"--\";\nconst LONG_PREFIX = \"--\";\nconst NEGATION_PREFIX = \"--no-\";\nconst VALUE_SEPARATOR = \"=\";\nconst BOOLEAN_VALUES: ReadonlySet<string> = new Set([\"true\", \"false\"]);\n\n/** A flag as written before `--`: its name (`--redoc`, `-o`) and the text after `=`, if any. */\ninterface WrittenFlag {\n readonly name: string;\n readonly value: string | undefined;\n}\n\nfunction writtenFlags(argv: readonly string[]): WrittenFlag[] {\n const end = argv.indexOf(OPTIONS_END);\n return (end === -1 ? argv : argv.slice(0, end))\n .filter((arg) => arg.startsWith(\"-\") && arg !== \"-\")\n .map((arg) => {\n const at = arg.indexOf(VALUE_SEPARATOR);\n return at === -1\n ? { name: arg, value: undefined }\n : { name: arg.slice(0, at), value: arg.slice(at + 1) };\n });\n}\n\n/**\n * A long flag as yargs-parser reads it: in kebab-case and without `--no-`, so `--immutableTypes`\n * and `--no-immutable-types` are `--immutable-types`. A short flag stays as written.\n */\nfunction canonicalFlagName(name: string): string {\n if (!name.startsWith(LONG_PREFIX)) {\n return name;\n }\n const bare = name.startsWith(NEGATION_PREFIX)\n ? name.slice(NEGATION_PREFIX.length)\n : name.slice(LONG_PREFIX.length);\n return `${LONG_PREFIX}${kebabCase(bare)}`;\n}\n\n/** An old flag fails by its name in any spelling, also with a value (`--redoc=redocly.yaml`). */\nfunction rejectRemovedFlags(flags: readonly WrittenFlag[]): void {\n const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));\n for (const [flag, message] of REMOVED_FLAGS) {\n if (names.has(flag)) {\n throw cliError(\"CLI_FLAG_REMOVED\", message);\n }\n }\n}\n\nconst ALIASES = { redocly: [\"c\"], exportType: [\"t\"], output: [\"o\"] };\n\n/** The short aliases of boolean flags (`-t`), which take a value the same way (`-t=true`). */\nconst BOOLEAN_ALIASES = Object.entries(ALIASES)\n .filter(([flag]) => CAMEL_CASE_BOOLEAN_FLAGS.includes(flag))\n .flatMap(([, aliases]) => aliases.map((alias) => `-${alias}`));\n\nconst BOOLEAN_FLAG_NAMES: ReadonlySet<string> = new Set([\n ...BOOLEAN_FLAGS.map((flag) => `${LONG_PREFIX}${flag}`),\n ...BOOLEAN_ALIASES,\n]);\n\n/**\n * A boolean flag takes `=true` or `=false`, and its `--no-` form takes no value. yargs-parser read\n * any other value as false (`--enum=1`, `--alphabetize=yes`), which turned the option off.\n */\nfunction rejectInvalidBooleans(flags: readonly WrittenFlag[]): void {\n for (const { name, value } of flags) {\n const negated = name.startsWith(NEGATION_PREFIX)\n ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}`\n : undefined;\n const isNegatedWithValue = negated !== undefined && BOOLEAN_FLAG_NAMES.has(negated);\n const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? \"true\");\n if (value !== undefined && (isNegatedWithValue || isInvalid)) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `${name}=${value}: a boolean flag takes no value, or =true or =false.`,\n );\n }\n }\n}\n\n/** Notices for flags that have no effect in this combination, printed before the run. */\nexport function ineffectiveFlagNotices(flags: GeneratorFlags): string[] {\n if (flags.rootTypes === true) {\n return [];\n }\n return ROOT_TYPES_FLAGS.filter((flag) => flags[flag] === true).map(\n (flag) => `--${kebabCase(flag)} has no effect without --root-types flag`,\n );\n}\n\nfunction generatorFlagsOf(parsed: parser.Arguments): GeneratorFlags {\n const flags: Partial<Record<GeneratorFlag, boolean>> = {};\n for (const name of GENERATOR_FLAGS) {\n if (typeof parsed[name] === \"boolean\") {\n flags[name] = parsed[name];\n }\n }\n return flags;\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return value === undefined ? undefined : String(value);\n}\n\n/**\n * The last value of a flag that takes one value: given twice, the last one wins, as for the\n * boolean flags (yargs-parser gives a list of every value).\n */\nfunction lastString(value: unknown): string | undefined {\n return optionalString(Array.isArray(value) ? value.at(-1) : value);\n}\n\n/**\n * `--remote-ref-hosts a.example,b.example`, repeatable; an empty value allows no host. The\n * `remote-ref-hosts` setting of a `redocly.yaml` API is read the same way.\n */\nexport function hostList(value: unknown): string[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n return [value]\n .flat()\n .flatMap((entry) => String(entry).split(\",\"))\n .map((host) => host.trim())\n .filter((host) => host !== \"\");\n}\n\nfunction refLimitsOf(parsed: parser.Arguments): CliRefLimits {\n const localRefRoot = lastString(parsed.localRefRoot);\n const remoteRefHosts = hostList(parsed.remoteRefHosts);\n return {\n ...(localRefRoot === undefined ? {} : { localRefRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteRefHosts }),\n };\n}\n\n/** 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\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, with\n * `CLI_FLAG_INVALID` for a boolean flag with another value than true or false, and with\n * `OPTION_FIX_UNKNOWN` for an unknown `--fix` name.\n */\nexport function parseCliArguments(argv: readonly string[]): CliArguments {\n const flags = writtenFlags(argv);\n rejectRemovedFlags(flags);\n rejectInvalidBooleans(flags);\n 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: lastString(parsed.output),\n redocly: lastString(parsed.redocly),\n isCheck: parsed.check === true,\n isHelp: \"help\" in parsed,\n isVersion: \"version\" in parsed,\n generatorFlags: generatorFlagsOf(parsed),\n refLimits: refLimitsOf(parsed),\n fix: fixNamesOf(parsed.fix),\n unknownFlags: unknownFlagsOf(parsed, argv),\n };\n}\n"],"names":["kebabCase","cliError","parser","fixNamesOf"],"mappings":"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"}