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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
  23. package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
  25. package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/query-named-components.cjs +129 -0
  27. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/query-named-components.mjs +126 -0
  29. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
  31. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
  33. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +39 -18
  35. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +40 -19
  37. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-access.cjs +25 -4
  39. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-access.mjs +26 -5
  41. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  43. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  45. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +20 -3
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +20 -4
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  59. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  60. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  61. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  62. package/dist/api/cwd-option.cjs +58 -0
  63. package/dist/api/cwd-option.cjs.map +1 -0
  64. package/dist/api/cwd-option.mjs +52 -0
  65. package/dist/api/cwd-option.mjs.map +1 -0
  66. package/dist/api/default-ports.cjs +15 -7
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -8
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/document-refs.cjs +16 -1
  71. package/dist/api/document-refs.cjs.map +1 -1
  72. package/dist/api/document-refs.mjs +16 -1
  73. package/dist/api/document-refs.mjs.map +1 -1
  74. package/dist/api/document-run.cjs +6 -26
  75. package/dist/api/document-run.cjs.map +1 -1
  76. package/dist/api/document-run.mjs +5 -21
  77. package/dist/api/document-run.mjs.map +1 -1
  78. package/dist/api/legacy-utils.cjs +1 -1
  79. package/dist/api/legacy-utils.cjs.map +1 -1
  80. package/dist/api/legacy-utils.mjs +1 -1
  81. package/dist/api/legacy-utils.mjs.map +1 -1
  82. package/dist/api/openapi-ts.cjs +1 -2
  83. package/dist/api/openapi-ts.cjs.map +1 -1
  84. package/dist/api/openapi-ts.mjs +2 -3
  85. package/dist/api/openapi-ts.mjs.map +1 -1
  86. package/dist/api/option-errors.cjs +24 -0
  87. package/dist/api/option-errors.cjs.map +1 -0
  88. package/dist/api/option-errors.mjs +21 -0
  89. package/dist/api/option-errors.mjs.map +1 -0
  90. package/dist/api/ref-limit-options.cjs +58 -0
  91. package/dist/api/ref-limit-options.cjs.map +1 -0
  92. package/dist/api/ref-limit-options.mjs +52 -0
  93. package/dist/api/ref-limit-options.mjs.map +1 -0
  94. package/dist/api/transform-schema.cjs +12 -5
  95. package/dist/api/transform-schema.cjs.map +1 -1
  96. package/dist/api/transform-schema.mjs +12 -5
  97. package/dist/api/transform-schema.mjs.map +1 -1
  98. package/dist/application/transform/declared-value-types.cjs +36 -0
  99. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  100. package/dist/application/transform/declared-value-types.mjs +34 -0
  101. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  102. package/dist/application/transform/document/document.cjs +3 -1
  103. package/dist/application/transform/document/document.cjs.map +1 -1
  104. package/dist/application/transform/document/document.mjs +3 -1
  105. package/dist/application/transform/document/document.mjs.map +1 -1
  106. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  107. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  108. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  109. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  110. package/dist/application/transform/document/header.cjs +11 -3
  111. package/dist/application/transform/document/header.cjs.map +1 -1
  112. package/dist/application/transform/document/header.mjs +10 -2
  113. package/dist/application/transform/document/header.mjs.map +1 -1
  114. package/dist/application/transform/document/parameter.cjs +1 -1
  115. package/dist/application/transform/document/parameter.cjs.map +1 -1
  116. package/dist/application/transform/document/parameter.mjs +1 -1
  117. package/dist/application/transform/document/parameter.mjs.map +1 -1
  118. package/dist/application/transform/document/parameters.cjs +23 -5
  119. package/dist/application/transform/document/parameters.cjs.map +1 -1
  120. package/dist/application/transform/document/parameters.mjs +23 -5
  121. package/dist/application/transform/document/parameters.mjs.map +1 -1
  122. package/dist/application/transform/document/path-item.cjs +4 -3
  123. package/dist/application/transform/document/path-item.cjs.map +1 -1
  124. package/dist/application/transform/document/path-item.mjs +4 -4
  125. package/dist/application/transform/document/path-item.mjs.map +1 -1
  126. package/dist/application/transform/document/path-template-key.cjs +84 -0
  127. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  128. package/dist/application/transform/document/path-template-key.mjs +79 -0
  129. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  130. package/dist/application/transform/document/path-template-refs.cjs +80 -0
  131. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  132. package/dist/application/transform/document/path-template-refs.mjs +77 -0
  133. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  134. package/dist/application/transform/document/paths-enum.cjs +7 -6
  135. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  136. package/dist/application/transform/document/paths-enum.mjs +7 -6
  137. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  138. package/dist/application/transform/document/paths.cjs +38 -66
  139. package/dist/application/transform/document/paths.cjs.map +1 -1
  140. package/dist/application/transform/document/paths.mjs +36 -66
  141. package/dist/application/transform/document/paths.mjs.map +1 -1
  142. package/dist/application/transform/document/webhooks.cjs +10 -3
  143. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  144. package/dist/application/transform/document/webhooks.mjs +9 -2
  145. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  146. package/dist/application/transform/footer/document-footer.cjs +6 -3
  147. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  148. package/dist/application/transform/footer/document-footer.mjs +6 -3
  149. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  150. package/dist/application/transform/helper-types.cjs +3 -3
  151. package/dist/application/transform/helper-types.cjs.map +1 -1
  152. package/dist/application/transform/helper-types.mjs +3 -3
  153. package/dist/application/transform/helper-types.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  155. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  157. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/generated-shape.cjs +63 -64
  159. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  160. package/dist/application/transform/ref-pointer/generated-shape.mjs +57 -53
  161. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  162. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  163. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  165. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  166. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  167. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  168. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  169. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  170. package/dist/application/transform/ref-pointer/original-index.cjs +69 -14
  171. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  172. package/dist/application/transform/ref-pointer/original-index.mjs +71 -16
  173. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  174. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  175. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  176. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  177. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  178. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  179. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  180. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  181. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  182. package/dist/application/transform/ref-pointer/property-shape.cjs +57 -0
  183. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  184. package/dist/application/transform/ref-pointer/property-shape.mjs +49 -0
  185. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  186. package/dist/application/transform/ref-pointer/typed-walk.cjs +90 -22
  187. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  188. package/dist/application/transform/ref-pointer/typed-walk.mjs +87 -19
  189. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  190. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  191. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  192. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  193. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  194. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  195. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  196. package/dist/application/transform/schema/input-location.cjs +23 -0
  197. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  198. package/dist/application/transform/schema/input-location.mjs +21 -0
  199. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  200. package/dist/application/transform/schema/object-type.cjs +15 -5
  201. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  202. package/dist/application/transform/schema/object-type.mjs +15 -5
  203. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  204. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  205. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  206. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  207. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  208. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  209. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  210. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  211. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  212. package/dist/cli/api-logger.cjs +13 -0
  213. package/dist/cli/api-logger.cjs.map +1 -0
  214. package/dist/cli/api-logger.mjs +11 -0
  215. package/dist/cli/api-logger.mjs.map +1 -0
  216. package/dist/cli/api-settings.cjs +10 -17
  217. package/dist/cli/api-settings.cjs.map +1 -1
  218. package/dist/cli/api-settings.mjs +10 -17
  219. package/dist/cli/api-settings.mjs.map +1 -1
  220. package/dist/cli/api-writes.cjs +7 -1
  221. package/dist/cli/api-writes.cjs.map +1 -1
  222. package/dist/cli/api-writes.mjs +7 -1
  223. package/dist/cli/api-writes.mjs.map +1 -1
  224. package/dist/cli/cli-arguments.cjs +32 -74
  225. package/dist/cli/cli-arguments.cjs.map +1 -1
  226. package/dist/cli/cli-arguments.mjs +28 -70
  227. package/dist/cli/cli-arguments.mjs.map +1 -1
  228. package/dist/cli/cli-errors.cjs +18 -0
  229. package/dist/cli/cli-errors.cjs.map +1 -1
  230. package/dist/cli/cli-errors.mjs +18 -1
  231. package/dist/cli/cli-errors.mjs.map +1 -1
  232. package/dist/cli/cli-flag-names.cjs +77 -0
  233. package/dist/cli/cli-flag-names.cjs.map +1 -0
  234. package/dist/cli/cli-flag-names.mjs +64 -0
  235. package/dist/cli/cli-flag-names.mjs.map +1 -0
  236. package/dist/cli/cli-output.cjs +13 -6
  237. package/dist/cli/cli-output.cjs.map +1 -1
  238. package/dist/cli/cli-output.mjs +14 -7
  239. package/dist/cli/cli-output.mjs.map +1 -1
  240. package/dist/cli/main.cjs +11 -5
  241. package/dist/cli/main.cjs.map +1 -1
  242. package/dist/cli/main.mjs +11 -5
  243. package/dist/cli/main.mjs.map +1 -1
  244. package/dist/cli/redocly-apis.cjs +33 -12
  245. package/dist/cli/redocly-apis.cjs.map +1 -1
  246. package/dist/cli/redocly-apis.mjs +35 -14
  247. package/dist/cli/redocly-apis.mjs.map +1 -1
  248. package/dist/cli/ref-limits.cjs +15 -1
  249. package/dist/cli/ref-limits.cjs.map +1 -1
  250. package/dist/cli/ref-limits.mjs +15 -2
  251. package/dist/cli/ref-limits.mjs.map +1 -1
  252. package/dist/cli/run-cli.cjs +24 -7
  253. package/dist/cli/run-cli.cjs.map +1 -1
  254. package/dist/cli/run-cli.mjs +25 -8
  255. package/dist/cli/run-cli.mjs.map +1 -1
  256. package/dist/cli/written-flags.cjs +83 -0
  257. package/dist/cli/written-flags.cjs.map +1 -0
  258. package/dist/cli/written-flags.mjs +77 -0
  259. package/dist/cli/written-flags.mjs.map +1 -0
  260. package/dist/domain/cause-secrets.cjs +31 -16
  261. package/dist/domain/cause-secrets.cjs.map +1 -1
  262. package/dist/domain/cause-secrets.mjs +31 -16
  263. package/dist/domain/cause-secrets.mjs.map +1 -1
  264. package/dist/domain/errors.cjs +3 -0
  265. package/dist/domain/errors.cjs.map +1 -1
  266. package/dist/domain/errors.mjs +3 -0
  267. package/dist/domain/errors.mjs.map +1 -1
  268. package/dist/domain/location-text.cjs +15 -0
  269. package/dist/domain/location-text.cjs.map +1 -0
  270. package/dist/domain/location-text.mjs +13 -0
  271. package/dist/domain/location-text.mjs.map +1 -0
  272. package/dist/domain/openapi/document-places.cjs +55 -0
  273. package/dist/domain/openapi/document-places.cjs.map +1 -0
  274. package/dist/domain/openapi/document-places.mjs +53 -0
  275. package/dist/domain/openapi/document-places.mjs.map +1 -0
  276. package/dist/domain/output-fixes.cjs +8 -2
  277. package/dist/domain/output-fixes.cjs.map +1 -1
  278. package/dist/domain/output-fixes.mjs +8 -2
  279. package/dist/domain/output-fixes.mjs.map +1 -1
  280. package/dist/domain/terminal-text.cjs +31 -0
  281. package/dist/domain/terminal-text.cjs.map +1 -0
  282. package/dist/domain/terminal-text.mjs +29 -0
  283. package/dist/domain/terminal-text.mjs.map +1 -0
  284. package/dist/domain/warnings.cjs +1 -0
  285. package/dist/domain/warnings.cjs.map +1 -1
  286. package/dist/domain/warnings.mjs +1 -0
  287. package/dist/domain/warnings.mjs.map +1 -1
  288. package/dist/index.d.cts +29 -18
  289. package/dist/index.d.mts +29 -18
  290. package/dist/index.d.ts +29 -18
  291. package/package.json +1 -1
  292. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  293. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  294. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  295. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  296. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  297. package/src/adapters/redocly-loader/query-document-names.ts +79 -0
  298. package/src/adapters/redocly-loader/query-named-components.ts +200 -0
  299. package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
  300. package/src/adapters/redocly-loader/redocly-schema-loader.ts +63 -17
  301. package/src/adapters/redocly-loader/ref-access.ts +32 -5
  302. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  303. package/src/adapters/redocly-loader/remote-fetch.ts +37 -2
  304. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  305. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  306. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  307. package/src/api/cwd-option.ts +76 -0
  308. package/src/api/default-ports.ts +33 -10
  309. package/src/api/document-refs.ts +29 -1
  310. package/src/api/document-run.ts +7 -32
  311. package/src/api/legacy-utils.ts +1 -1
  312. package/src/api/openapi-ts.ts +20 -4
  313. package/src/api/option-errors.ts +22 -0
  314. package/src/api/ref-limit-options.ts +69 -0
  315. package/src/api/transform-schema.ts +20 -5
  316. package/src/application/ports/file-system.ts +8 -0
  317. package/src/application/ports/redocly-config-source.ts +5 -0
  318. package/src/application/transform/declared-value-types.ts +42 -0
  319. package/src/application/transform/document/document.ts +4 -2
  320. package/src/application/transform/document/exploded-query-values.ts +88 -0
  321. package/src/application/transform/document/header.ts +25 -5
  322. package/src/application/transform/document/parameter.ts +4 -4
  323. package/src/application/transform/document/parameters.ts +45 -10
  324. package/src/application/transform/document/path-item.ts +3 -3
  325. package/src/application/transform/document/path-template-key.ts +152 -0
  326. package/src/application/transform/document/path-template-refs.ts +127 -0
  327. package/src/application/transform/document/paths-enum.ts +23 -9
  328. package/src/application/transform/document/paths.ts +53 -123
  329. package/src/application/transform/document/webhooks.ts +18 -5
  330. package/src/application/transform/footer/document-footer.ts +18 -8
  331. package/src/application/transform/helper-types.ts +4 -4
  332. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  333. package/src/application/transform/ref-pointer/generated-shape.ts +115 -83
  334. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  335. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  336. package/src/application/transform/ref-pointer/original-index.ts +106 -20
  337. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  338. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  339. package/src/application/transform/ref-pointer/property-shape.ts +106 -0
  340. package/src/application/transform/ref-pointer/typed-walk.ts +143 -29
  341. package/src/application/transform/schema/access-flags.ts +5 -2
  342. package/src/application/transform/schema/index-signature-type.ts +31 -0
  343. package/src/application/transform/schema/input-location.ts +35 -0
  344. package/src/application/transform/schema/object-type.ts +18 -8
  345. package/src/application/transform/schema/schema-transform.ts +2 -1
  346. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  347. package/src/cli/api-logger.ts +17 -0
  348. package/src/cli/api-settings.ts +12 -20
  349. package/src/cli/api-writes.ts +11 -3
  350. package/src/cli/cli-arguments.ts +57 -92
  351. package/src/cli/cli-dependencies.ts +7 -2
  352. package/src/cli/cli-errors.ts +23 -0
  353. package/src/cli/cli-flag-names.ts +99 -0
  354. package/src/cli/cli-output.ts +31 -16
  355. package/src/cli/main.ts +12 -5
  356. package/src/cli/redocly-apis.ts +56 -20
  357. package/src/cli/ref-limits.ts +21 -2
  358. package/src/cli/run-cli.ts +39 -7
  359. package/src/cli/written-flags.ts +131 -0
  360. package/src/domain/cause-secrets.ts +59 -25
  361. package/src/domain/errors.ts +3 -0
  362. package/src/domain/location-text.ts +27 -0
  363. package/src/domain/openapi/document-places.ts +78 -0
  364. package/src/domain/output-fixes.ts +9 -2
  365. package/src/domain/terminal-text.ts +44 -0
  366. package/src/domain/warnings.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { hasUrlScheme } from \"../domain/location-text.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport {\n type CliRun,\n ensureOutputIsNotSchema,\n filesReadBy,\n type OutputFile,\n outputFileOf,\n redoclyConfigFiles,\n resolveLocationUrl,\n writeOutput,\n} from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** The character that made the original CLI read a schema argument as a glob pattern. */\nconst GLOB_WILDCARD = \"*\";\n\n/**\n * Whether the schema argument is a glob pattern, which the CLI no longer expands: a path with a\n * `*` that names no file. A URL is no pattern (`?fields=*` is its query), nor a file whose name\n * has a `*`, which the CLI reads as any other file.\n */\nfunction isGlobPattern(run: CliRun, input: string): boolean {\n return (\n input.includes(GLOB_WILDCARD) &&\n !hasUrlScheme(input) &&\n !run.deps.files.isFile(resolveLocationUrl(input, run.deps.cwd))\n );\n}\n\n/**\n * One schema from a path, a URL or stdin; without `--output`, the types go to stdout. Warnings and\n * errors go to stderr either way, so they never mix with the types (upstream dropped warnings).\n */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input !== undefined && isGlobPattern(run, input)) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n for (const notice of ineffectiveFlagNotices(run.args.generatorFlags)) {\n run.deps.console.notice(notice);\n }\n const source = schemaSource(run);\n const outputFile = output ? singleOutputFile(run, output, source, redocly) : undefined;\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n };\n const types = await run.deps.generate(source, options);\n if (!outputFile) {\n run.deps.writeStdout(types.contents);\n return;\n }\n writeOutput(run, outputFile, types, filesReadBy(run, types, outputFile.source));\n}\n\n/**\n * The `--output` file; it must not be the schema file nor the Redocly config, which writing it\n * would replace.\n */\nfunction singleOutputFile(\n run: CliRun,\n output: string,\n source: SchemaSource,\n redocly: RedoclyConfig,\n): OutputFile {\n const { input } = run.args;\n const outputFile = outputFileOf(run, { source: input ?? \"stdin\", output }, run.deps.cwd);\n const schemas =\n input && source instanceof URL ? [{ name: `schema ${input}`, location: source }] : [];\n ensureOutputIsNotSchema(run, outputFile, [...schemas, ...redoclyConfigFiles(run, redocly)]);\n return outputFile;\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n warnAboutIgnoredArguments(run);\n return generateRedoclyApis(run, redocly);\n}\n\n/** With the APIs of a Redocly config, the input and the output of the command line are unused. */\nfunction warnAboutIgnoredArguments(run: CliRun): void {\n const { args, deps } = run;\n if (args.input) {\n deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n if (args.output) {\n deps.logger.warn(\n warningText(\n `APIs are specified in Redocly Config, so --output ${args.output} is ignored: ` +\n \"each API is written to its x-openapi-ts.output.\",\n WARNING_CODES.CLI_OUTPUT_IGNORED,\n ),\n );\n }\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ const scule = require('scule');
4
+ const cliErrors = require('./cli-errors.cjs');
5
+ const cliFlagNames = require('./cli-flag-names.cjs');
6
+
7
+ const REMOVED_FLAGS = [
8
+ ["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
9
+ ["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
10
+ [
11
+ "--support-array-length",
12
+ `The --support-array-length flag has been renamed to "--array-length".`
13
+ ],
14
+ ["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
15
+ ["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
16
+ ];
17
+ const OPTIONS_END = "--";
18
+ const VALUE_SEPARATOR = "=";
19
+ const BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "false"]);
20
+ const LETTER = /^[a-z]$/i;
21
+ function writtenFlags(argv) {
22
+ const end = argv.indexOf(OPTIONS_END);
23
+ return (end === -1 ? argv : argv.slice(0, end)).filter((arg) => arg.startsWith(cliFlagNames.SHORT_PREFIX) && arg !== cliFlagNames.SHORT_PREFIX).map((arg) => {
24
+ const at = arg.indexOf(VALUE_SEPARATOR);
25
+ return at === -1 ? { name: arg, value: void 0 } : { name: arg.slice(0, at), value: arg.slice(at + 1) };
26
+ });
27
+ }
28
+ function canonicalFlagName(name) {
29
+ if (!name.startsWith(cliFlagNames.LONG_PREFIX)) {
30
+ return name;
31
+ }
32
+ const bare = name.startsWith(cliFlagNames.NEGATION_PREFIX) ? name.slice(cliFlagNames.NEGATION_PREFIX.length) : name.slice(cliFlagNames.LONG_PREFIX.length);
33
+ return `${cliFlagNames.LONG_PREFIX}${scule.kebabCase(bare)}`;
34
+ }
35
+ function rejectRemovedFlags(flags) {
36
+ const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));
37
+ for (const [flag, message] of REMOVED_FLAGS) {
38
+ if (names.has(flag)) {
39
+ throw cliErrors.cliError("CLI_FLAG_REMOVED", message);
40
+ }
41
+ }
42
+ }
43
+ function rejectInvalidBooleans(flags) {
44
+ for (const { name, value } of flags) {
45
+ const negated = name.startsWith(cliFlagNames.NEGATION_PREFIX) ? `${cliFlagNames.LONG_PREFIX}${name.slice(cliFlagNames.NEGATION_PREFIX.length)}` : void 0;
46
+ const isNegatedWithValue = negated !== void 0 && cliFlagNames.BOOLEAN_FLAG_NAMES.has(negated);
47
+ const isInvalid = cliFlagNames.BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? "true");
48
+ if (value !== void 0 && (isNegatedWithValue || isInvalid)) {
49
+ throw cliErrors.cliError(
50
+ "CLI_FLAG_INVALID",
51
+ `${name}=${value}: a boolean flag takes no value, or =true or =false.`
52
+ );
53
+ }
54
+ }
55
+ }
56
+ function rejectNegatedValueFlags(flags) {
57
+ for (const { name } of flags) {
58
+ if (name.startsWith(cliFlagNames.NEGATION_PREFIX) && cliFlagNames.VALUE_FLAG_NAMES.has(canonicalFlagName(name))) {
59
+ throw cliErrors.cliError(
60
+ "CLI_FLAG_INVALID",
61
+ `${name}: a flag that takes a value has no --no- form. Leave the flag out instead.`
62
+ );
63
+ }
64
+ }
65
+ }
66
+ function unknownNamesOf({ name }) {
67
+ if (name.startsWith(cliFlagNames.LONG_PREFIX)) {
68
+ return cliFlagNames.KNOWN_LONG_FLAG_NAMES.has(canonicalFlagName(name)) ? [] : [name.slice(cliFlagNames.LONG_PREFIX.length)];
69
+ }
70
+ return [...name.slice(cliFlagNames.SHORT_PREFIX.length)].filter(
71
+ (letter) => LETTER.test(letter) && !cliFlagNames.KNOWN_SHORT_FLAGS.has(letter)
72
+ );
73
+ }
74
+ function unknownFlagNames(flags) {
75
+ return [...new Set(flags.flatMap(unknownNamesOf))];
76
+ }
77
+
78
+ exports.rejectInvalidBooleans = rejectInvalidBooleans;
79
+ exports.rejectNegatedValueFlags = rejectNegatedValueFlags;
80
+ exports.rejectRemovedFlags = rejectRemovedFlags;
81
+ exports.unknownFlagNames = unknownFlagNames;
82
+ exports.writtenFlags = writtenFlags;
83
+ //# sourceMappingURL=written-flags.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"written-flags.cjs","sources":["../../src/cli/written-flags.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n BOOLEAN_FLAG_NAMES,\n KNOWN_LONG_FLAG_NAMES,\n KNOWN_SHORT_FLAGS,\n LONG_PREFIX,\n NEGATION_PREFIX,\n SHORT_PREFIX,\n VALUE_FLAG_NAMES,\n} from \"./cli-flag-names.js\";\n\n/**\n * Checks of the flags as the user wrote them, before yargs-parser reads them: yargs-parser accepts\n * any spelling and value, so what it cannot tell apart is checked here.\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\nconst OPTIONS_END = \"--\";\nconst VALUE_SEPARATOR = \"=\";\nconst BOOLEAN_VALUES: ReadonlySet<string> = new Set([\"true\", \"false\"]);\nconst LETTER = /^[a-z]$/i;\n\n/** A flag as written before `--`: its name (`--redoc`, `-o`) and the text after `=`, if any. */\nexport interface WrittenFlag {\n readonly name: string;\n readonly value: string | undefined;\n}\n\nexport function 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(SHORT_PREFIX) && arg !== SHORT_PREFIX)\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`). */\nexport function 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\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 */\nexport function 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/**\n * A flag that takes a value has no `--no-` form: yargs-parser gave it the value false, which the\n * CLI read as the text \"false\" (`--no-output` wrote a file named `false`).\n */\nexport function rejectNegatedValueFlags(flags: readonly WrittenFlag[]): void {\n for (const { name } of flags) {\n if (name.startsWith(NEGATION_PREFIX) && VALUE_FLAG_NAMES.has(canonicalFlagName(name))) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `${name}: a flag that takes a value has no --no- form. Leave the flag out instead.`,\n );\n }\n }\n}\n\n/** The bare names of the unknown flags in a written long flag or a group of short flags. */\nfunction unknownNamesOf({ name }: WrittenFlag): string[] {\n if (name.startsWith(LONG_PREFIX)) {\n return KNOWN_LONG_FLAG_NAMES.has(canonicalFlagName(name))\n ? []\n : [name.slice(LONG_PREFIX.length)];\n }\n return [...name.slice(SHORT_PREFIX.length)].filter(\n (letter) => LETTER.test(letter) && !KNOWN_SHORT_FLAGS.has(letter),\n );\n}\n\n/**\n * The unknown flags, to declare as boolean: yargs-parser gives an undeclared flag the next\n * argument as its value, so `--alphabetise api.yaml` took the schema path and read stdin. An\n * unknown flag is ignored, so it takes a value only as `--flag=value`.\n */\nexport function unknownFlagNames(flags: readonly WrittenFlag[]): string[] {\n return [...new Set(flags.flatMap(unknownNamesOf))];\n}\n"],"names":["SHORT_PREFIX","LONG_PREFIX","NEGATION_PREFIX","kebabCase","cliError","BOOLEAN_FLAG_NAMES","VALUE_FLAG_NAMES","KNOWN_LONG_FLAG_NAMES","KNOWN_SHORT_FLAGS"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { kebabCase } from 'scule';
2
+ import { cliError } from './cli-errors.mjs';
3
+ import { SHORT_PREFIX, NEGATION_PREFIX, LONG_PREFIX, BOOLEAN_FLAG_NAMES, VALUE_FLAG_NAMES, KNOWN_LONG_FLAG_NAMES, KNOWN_SHORT_FLAGS } from './cli-flag-names.mjs';
4
+
5
+ const REMOVED_FLAGS = [
6
+ ["-ap", `The -ap alias has been deprecated. Use "--additional-properties" instead.`],
7
+ ["--immutable-types", `The --immutable-types flag has been renamed to "--immutable".`],
8
+ [
9
+ "--support-array-length",
10
+ `The --support-array-length flag has been renamed to "--array-length".`
11
+ ],
12
+ ["-it", `The -it alias has been deprecated. Use "--immutable" instead.`],
13
+ ["--redoc", `The --redoc config flag has been renamed to "--redocly" (or -c as shorthand).`]
14
+ ];
15
+ const OPTIONS_END = "--";
16
+ const VALUE_SEPARATOR = "=";
17
+ const BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "false"]);
18
+ const LETTER = /^[a-z]$/i;
19
+ function writtenFlags(argv) {
20
+ const end = argv.indexOf(OPTIONS_END);
21
+ return (end === -1 ? argv : argv.slice(0, end)).filter((arg) => arg.startsWith(SHORT_PREFIX) && arg !== SHORT_PREFIX).map((arg) => {
22
+ const at = arg.indexOf(VALUE_SEPARATOR);
23
+ return at === -1 ? { name: arg, value: void 0 } : { name: arg.slice(0, at), value: arg.slice(at + 1) };
24
+ });
25
+ }
26
+ function canonicalFlagName(name) {
27
+ if (!name.startsWith(LONG_PREFIX)) {
28
+ return name;
29
+ }
30
+ const bare = name.startsWith(NEGATION_PREFIX) ? name.slice(NEGATION_PREFIX.length) : name.slice(LONG_PREFIX.length);
31
+ return `${LONG_PREFIX}${kebabCase(bare)}`;
32
+ }
33
+ function rejectRemovedFlags(flags) {
34
+ const names = new Set(flags.map(({ name }) => canonicalFlagName(name)));
35
+ for (const [flag, message] of REMOVED_FLAGS) {
36
+ if (names.has(flag)) {
37
+ throw cliError("CLI_FLAG_REMOVED", message);
38
+ }
39
+ }
40
+ }
41
+ function rejectInvalidBooleans(flags) {
42
+ for (const { name, value } of flags) {
43
+ const negated = name.startsWith(NEGATION_PREFIX) ? `${LONG_PREFIX}${name.slice(NEGATION_PREFIX.length)}` : void 0;
44
+ const isNegatedWithValue = negated !== void 0 && BOOLEAN_FLAG_NAMES.has(negated);
45
+ const isInvalid = BOOLEAN_FLAG_NAMES.has(name) && !BOOLEAN_VALUES.has(value ?? "true");
46
+ if (value !== void 0 && (isNegatedWithValue || isInvalid)) {
47
+ throw cliError(
48
+ "CLI_FLAG_INVALID",
49
+ `${name}=${value}: a boolean flag takes no value, or =true or =false.`
50
+ );
51
+ }
52
+ }
53
+ }
54
+ function rejectNegatedValueFlags(flags) {
55
+ for (const { name } of flags) {
56
+ if (name.startsWith(NEGATION_PREFIX) && VALUE_FLAG_NAMES.has(canonicalFlagName(name))) {
57
+ throw cliError(
58
+ "CLI_FLAG_INVALID",
59
+ `${name}: a flag that takes a value has no --no- form. Leave the flag out instead.`
60
+ );
61
+ }
62
+ }
63
+ }
64
+ function unknownNamesOf({ name }) {
65
+ if (name.startsWith(LONG_PREFIX)) {
66
+ return KNOWN_LONG_FLAG_NAMES.has(canonicalFlagName(name)) ? [] : [name.slice(LONG_PREFIX.length)];
67
+ }
68
+ return [...name.slice(SHORT_PREFIX.length)].filter(
69
+ (letter) => LETTER.test(letter) && !KNOWN_SHORT_FLAGS.has(letter)
70
+ );
71
+ }
72
+ function unknownFlagNames(flags) {
73
+ return [...new Set(flags.flatMap(unknownNamesOf))];
74
+ }
75
+
76
+ export { rejectInvalidBooleans, rejectNegatedValueFlags, rejectRemovedFlags, unknownFlagNames, writtenFlags };
77
+ //# sourceMappingURL=written-flags.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"written-flags.mjs","sources":["../../src/cli/written-flags.ts"],"sourcesContent":["import { kebabCase } from \"scule\";\nimport { cliError } from \"./cli-errors.js\";\nimport {\n BOOLEAN_FLAG_NAMES,\n KNOWN_LONG_FLAG_NAMES,\n KNOWN_SHORT_FLAGS,\n LONG_PREFIX,\n NEGATION_PREFIX,\n SHORT_PREFIX,\n VALUE_FLAG_NAMES,\n} from \"./cli-flag-names.js\";\n\n/**\n * Checks of the flags as the user wrote them, before yargs-parser reads them: yargs-parser accepts\n * any spelling and value, so what it cannot tell apart is checked here.\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\nconst OPTIONS_END = \"--\";\nconst VALUE_SEPARATOR = \"=\";\nconst BOOLEAN_VALUES: ReadonlySet<string> = new Set([\"true\", \"false\"]);\nconst LETTER = /^[a-z]$/i;\n\n/** A flag as written before `--`: its name (`--redoc`, `-o`) and the text after `=`, if any. */\nexport interface WrittenFlag {\n readonly name: string;\n readonly value: string | undefined;\n}\n\nexport function 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(SHORT_PREFIX) && arg !== SHORT_PREFIX)\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`). */\nexport function 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\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 */\nexport function 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/**\n * A flag that takes a value has no `--no-` form: yargs-parser gave it the value false, which the\n * CLI read as the text \"false\" (`--no-output` wrote a file named `false`).\n */\nexport function rejectNegatedValueFlags(flags: readonly WrittenFlag[]): void {\n for (const { name } of flags) {\n if (name.startsWith(NEGATION_PREFIX) && VALUE_FLAG_NAMES.has(canonicalFlagName(name))) {\n throw cliError(\n \"CLI_FLAG_INVALID\",\n `${name}: a flag that takes a value has no --no- form. Leave the flag out instead.`,\n );\n }\n }\n}\n\n/** The bare names of the unknown flags in a written long flag or a group of short flags. */\nfunction unknownNamesOf({ name }: WrittenFlag): string[] {\n if (name.startsWith(LONG_PREFIX)) {\n return KNOWN_LONG_FLAG_NAMES.has(canonicalFlagName(name))\n ? []\n : [name.slice(LONG_PREFIX.length)];\n }\n return [...name.slice(SHORT_PREFIX.length)].filter(\n (letter) => LETTER.test(letter) && !KNOWN_SHORT_FLAGS.has(letter),\n );\n}\n\n/**\n * The unknown flags, to declare as boolean: yargs-parser gives an undeclared flag the next\n * argument as its value, so `--alphabetise api.yaml` took the schema path and read stdin. An\n * unknown flag is ignored, so it takes a value only as `--flag=value`.\n */\nexport function unknownFlagNames(flags: readonly WrittenFlag[]): string[] {\n return [...new Set(flags.flatMap(unknownNamesOf))];\n}\n"],"names":[],"mappings":"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"}
@@ -2,18 +2,24 @@
2
2
 
3
3
  const urlSecrets = require('./url-secrets.cjs');
4
4
 
5
- function redactedValue(value) {
6
- return typeof value === "string" ? urlSecrets.redactUrlSecrets(value) : value;
5
+ const MAX_CAUSE_DEPTH = 8;
6
+ function deeper(walk, value) {
7
+ return { path: /* @__PURE__ */ new Set([...walk.path, value]), depth: walk.depth + 1 };
7
8
  }
8
- function redactedError(error, seen) {
9
- const inner = /* @__PURE__ */ new Set([...seen, error]);
10
- const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error));
9
+ function redactedArray(array, walk) {
10
+ const inner = deeper(walk, array);
11
+ const items = array.map((item) => redactedValue(item, inner));
12
+ return items.every((item, index) => item === array[index]) ? array : items;
13
+ }
14
+ function redactedObject(value, walk) {
15
+ const inner = deeper(walk, value);
16
+ const copy = value instanceof Error ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value)) : Object.create(Object.getPrototypeOf(value));
11
17
  let isChanged = false;
12
- for (const key of Reflect.ownKeys(error)) {
13
- const value = Reflect.get(error, key);
14
- const shown = key === "cause" ? redactedCauseIn(value, inner) : redactedValue(value);
15
- isChanged ||= shown !== value;
16
- const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;
18
+ for (const key of Reflect.ownKeys(value)) {
19
+ const property = Reflect.get(value, key);
20
+ const shown = redactedValue(property, inner);
21
+ isChanged ||= shown !== property;
22
+ const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
17
23
  Object.defineProperty(copy, key, {
18
24
  value: shown,
19
25
  enumerable,
@@ -21,16 +27,25 @@ function redactedError(error, seen) {
21
27
  configurable: true
22
28
  });
23
29
  }
24
- return isChanged ? copy : error;
30
+ return isChanged ? copy : value;
31
+ }
32
+ function isOpaque(value) {
33
+ return typeof value === "function" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;
25
34
  }
26
- function redactedCauseIn(cause, seen) {
27
- if (!(cause instanceof Error)) {
28
- return redactedValue(cause);
35
+ function redactedValue(value, walk) {
36
+ if (typeof value === "string") {
37
+ return urlSecrets.redactUrlSecrets(value);
38
+ }
39
+ if (typeof value !== "object" || value === null || isOpaque(value)) {
40
+ return value;
41
+ }
42
+ if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {
43
+ return void 0;
29
44
  }
30
- return seen.has(cause) ? void 0 : redactedError(cause, seen);
45
+ return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);
31
46
  }
32
47
  function redactCauseSecrets(cause) {
33
- return redactedCauseIn(cause, /* @__PURE__ */ new Set());
48
+ return redactedValue(cause, { path: /* @__PURE__ */ new Set(), depth: 0 });
34
49
  }
35
50
 
36
51
  exports.redactCauseSecrets = redactCauseSecrets;
@@ -1 +1 @@
1
- {"version":3,"file":"cause-secrets.cjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), so the chain must\n * hide the same secrets as the message (url-secrets.ts).\n */\n\n/** A string with its URL secrets hidden; any other value as it is. */\nfunction redactedValue(value: unknown): unknown {\n return typeof value === \"string\" ? redactUrlSecrets(value) : value;\n}\n\n/**\n * A copy of `error` of the same class, its own properties (`message`, `stack`, `code`, `input`, a\n * nested `cause`) with URL secrets hidden, or `error` itself when none of them holds one. Each\n * property is read through its getter (V8 keeps `stack` behind one) and copied as a value.\n */\nfunction redactedError(error: Error, seen: ReadonlySet<Error>): Error {\n const inner = new Set([...seen, error]);\n // A real error with the class of `error`, so `util.inspect` and `util.types.isNativeError`\n // treat it as one.\n const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error)) as Error;\n let isChanged = false;\n for (const key of Reflect.ownKeys(error)) {\n const value: unknown = Reflect.get(error, key);\n const shown = key === \"cause\" ? redactedCauseIn(value, inner) : redactedValue(value);\n isChanged ||= shown !== value;\n const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : error;\n}\n\nfunction redactedCauseIn(cause: unknown, seen: ReadonlySet<Error>): unknown {\n if (!(cause instanceof Error)) {\n return redactedValue(cause);\n }\n // A chain that loops back is cut where it does, so the copy is finite.\n return seen.has(cause) ? undefined : redactedError(cause, seen);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedCauseIn(cause, new Set());\n}\n"],"names":["redactUrlSecrets"],"mappings":";;;;AAUA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAWA,2BAAA,CAAiB,KAAK,CAAA,GAAI,KAAA;AAC/D;AAOA,SAAS,aAAA,CAAc,OAAc,IAAA,EAAiC;AACpE,EAAA,MAAM,wBAAQ,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAA;AAGtC,EAAA,MAAM,IAAA,GAAO,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,eAAA,CAAgB,OAAO,KAAK,CAAA,GAAI,cAAc,KAAK,CAAA;AACnF,IAAA,SAAA,KAAc,KAAA,KAAU,KAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAEA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAAmC;AAC1E,EAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAK,GAAA,CAAI,KAAK,IAAI,MAAA,GAAY,aAAA,CAAc,OAAO,IAAI,CAAA;AAChE;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,eAAA,CAAgB,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AACzC;;"}
1
+ {"version":3,"file":"cause-secrets.cjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), and may keep it in\n * nested objects too (Redocly's parse error holds `originalError.mark.name` and\n * `source.absoluteRef`), so the chain must hide the same secrets as the message (url-secrets.ts)\n * at every depth.\n */\n\n/**\n * How deep the walk copies a cause. The data of a cause is shallow (Redocly's deepest URL is three\n * levels below the error); a value below this depth is dropped, so no secret is kept unread.\n */\nconst MAX_CAUSE_DEPTH = 8;\n\ninterface Walk {\n /** The objects on the way from the cause to the value, so a cycle is cut where it closes. */\n readonly path: ReadonlySet<object>;\n readonly depth: number;\n}\n\nfunction deeper(walk: Walk, value: object): Walk {\n return { path: new Set([...walk.path, value]), depth: walk.depth + 1 };\n}\n\n/** An array with each item hidden, or the array itself when no item holds a secret. */\nfunction redactedArray(array: readonly unknown[], walk: Walk): readonly unknown[] {\n const inner = deeper(walk, array);\n const items = array.map((item) => redactedValue(item, inner));\n return items.every((item, index) => item === array[index]) ? array : items;\n}\n\n/**\n * A copy of `value` with the same prototype, its own properties (`message`, `stack`, `code`,\n * `input`, a nested `cause` or object) with URL secrets hidden, or `value` itself when none of\n * them holds one. Each property is read through its getter (V8 keeps `stack` behind one) and\n * copied as a value.\n */\nfunction redactedObject(value: object, walk: Walk): object {\n const inner = deeper(walk, value);\n // An error is copied as a real error, so `util.inspect` and `util.types.isNativeError` treat\n // the copy as one.\n const copy: object =\n value instanceof Error\n ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value))\n : Object.create(Object.getPrototypeOf(value) as object | null);\n let isChanged = false;\n for (const key of Reflect.ownKeys(value)) {\n const property: unknown = Reflect.get(value, key);\n const shown = redactedValue(property, inner);\n isChanged ||= shown !== property;\n const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : value;\n}\n\n/** Binary data and functions hold no text to hide, so they are kept as they are. */\nfunction isOpaque(value: object): boolean {\n return typeof value === \"function\" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;\n}\n\nfunction redactedValue(value: unknown, walk: Walk): unknown {\n if (typeof value === \"string\") {\n return redactUrlSecrets(value);\n }\n if (typeof value !== \"object\" || value === null || isOpaque(value)) {\n return value;\n }\n if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {\n return undefined;\n }\n return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedValue(cause, { path: new Set(), depth: 0 });\n}\n"],"names":["redactUrlSecrets"],"mappings":";;;;AAeA,MAAM,eAAA,GAAkB,CAAA;AAQxB,SAAS,MAAA,CAAO,MAAY,KAAA,EAAqB;AAC/C,EAAA,OAAO,EAAE,IAAA,kBAAM,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAC,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAE;AACvE;AAGA,SAAS,aAAA,CAAc,OAA2B,IAAA,EAAgC;AAChF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,CAAC,SAAS,aAAA,CAAc,IAAA,EAAM,KAAK,CAAC,CAAA;AAC5D,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,SAAS,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,KAAA,GAAQ,KAAA;AACvE;AAQA,SAAS,cAAA,CAAe,OAAe,IAAA,EAAoB;AACzD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAGhC,EAAA,MAAM,OACJ,KAAA,YAAiB,KAAA,GACb,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA,GAC/D,MAAA,CAAO,OAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAkB,CAAA;AACjE,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,QAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,KAAK,CAAA;AAC3C,IAAA,SAAA,KAAc,KAAA,KAAU,QAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAGA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,IAAc,YAAY,MAAA,CAAO,KAAK,KAAK,KAAA,YAAiB,WAAA;AACtF;AAEA,SAAS,aAAA,CAAc,OAAgB,IAAA,EAAqB;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAOA,4BAAiB,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,SAAS,eAAA,EAAiB;AACzD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,aAAA,CAAc,OAAO,IAAI,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AACvF;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,aAAA,CAAc,OAAO,EAAE,IAAA,sBAAU,GAAA,EAAI,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAC3D;;"}
@@ -1,17 +1,23 @@
1
1
  import { redactUrlSecrets } from './url-secrets.mjs';
2
2
 
3
- function redactedValue(value) {
4
- return typeof value === "string" ? redactUrlSecrets(value) : value;
3
+ const MAX_CAUSE_DEPTH = 8;
4
+ function deeper(walk, value) {
5
+ return { path: /* @__PURE__ */ new Set([...walk.path, value]), depth: walk.depth + 1 };
5
6
  }
6
- function redactedError(error, seen) {
7
- const inner = /* @__PURE__ */ new Set([...seen, error]);
8
- const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error));
7
+ function redactedArray(array, walk) {
8
+ const inner = deeper(walk, array);
9
+ const items = array.map((item) => redactedValue(item, inner));
10
+ return items.every((item, index) => item === array[index]) ? array : items;
11
+ }
12
+ function redactedObject(value, walk) {
13
+ const inner = deeper(walk, value);
14
+ const copy = value instanceof Error ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value)) : Object.create(Object.getPrototypeOf(value));
9
15
  let isChanged = false;
10
- for (const key of Reflect.ownKeys(error)) {
11
- const value = Reflect.get(error, key);
12
- const shown = key === "cause" ? redactedCauseIn(value, inner) : redactedValue(value);
13
- isChanged ||= shown !== value;
14
- const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;
16
+ for (const key of Reflect.ownKeys(value)) {
17
+ const property = Reflect.get(value, key);
18
+ const shown = redactedValue(property, inner);
19
+ isChanged ||= shown !== property;
20
+ const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
15
21
  Object.defineProperty(copy, key, {
16
22
  value: shown,
17
23
  enumerable,
@@ -19,16 +25,25 @@ function redactedError(error, seen) {
19
25
  configurable: true
20
26
  });
21
27
  }
22
- return isChanged ? copy : error;
28
+ return isChanged ? copy : value;
29
+ }
30
+ function isOpaque(value) {
31
+ return typeof value === "function" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;
23
32
  }
24
- function redactedCauseIn(cause, seen) {
25
- if (!(cause instanceof Error)) {
26
- return redactedValue(cause);
33
+ function redactedValue(value, walk) {
34
+ if (typeof value === "string") {
35
+ return redactUrlSecrets(value);
36
+ }
37
+ if (typeof value !== "object" || value === null || isOpaque(value)) {
38
+ return value;
39
+ }
40
+ if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {
41
+ return void 0;
27
42
  }
28
- return seen.has(cause) ? void 0 : redactedError(cause, seen);
43
+ return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);
29
44
  }
30
45
  function redactCauseSecrets(cause) {
31
- return redactedCauseIn(cause, /* @__PURE__ */ new Set());
46
+ return redactedValue(cause, { path: /* @__PURE__ */ new Set(), depth: 0 });
32
47
  }
33
48
 
34
49
  export { redactCauseSecrets };
@@ -1 +1 @@
1
- {"version":3,"file":"cause-secrets.mjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), so the chain must\n * hide the same secrets as the message (url-secrets.ts).\n */\n\n/** A string with its URL secrets hidden; any other value as it is. */\nfunction redactedValue(value: unknown): unknown {\n return typeof value === \"string\" ? redactUrlSecrets(value) : value;\n}\n\n/**\n * A copy of `error` of the same class, its own properties (`message`, `stack`, `code`, `input`, a\n * nested `cause`) with URL secrets hidden, or `error` itself when none of them holds one. Each\n * property is read through its getter (V8 keeps `stack` behind one) and copied as a value.\n */\nfunction redactedError(error: Error, seen: ReadonlySet<Error>): Error {\n const inner = new Set([...seen, error]);\n // A real error with the class of `error`, so `util.inspect` and `util.types.isNativeError`\n // treat it as one.\n const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error)) as Error;\n let isChanged = false;\n for (const key of Reflect.ownKeys(error)) {\n const value: unknown = Reflect.get(error, key);\n const shown = key === \"cause\" ? redactedCauseIn(value, inner) : redactedValue(value);\n isChanged ||= shown !== value;\n const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : error;\n}\n\nfunction redactedCauseIn(cause: unknown, seen: ReadonlySet<Error>): unknown {\n if (!(cause instanceof Error)) {\n return redactedValue(cause);\n }\n // A chain that loops back is cut where it does, so the copy is finite.\n return seen.has(cause) ? undefined : redactedError(cause, seen);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedCauseIn(cause, new Set());\n}\n"],"names":[],"mappings":";;AAUA,SAAS,cAAc,KAAA,EAAyB;AAC9C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,gBAAA,CAAiB,KAAK,CAAA,GAAI,KAAA;AAC/D;AAOA,SAAS,aAAA,CAAc,OAAc,IAAA,EAAiC;AACpE,EAAA,MAAM,wBAAQ,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAA;AAGtC,EAAA,MAAM,IAAA,GAAO,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAC5E,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAQ,OAAA,GAAU,eAAA,CAAgB,OAAO,KAAK,CAAA,GAAI,cAAc,KAAK,CAAA;AACnF,IAAA,SAAA,KAAc,KAAA,KAAU,KAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAEA,SAAS,eAAA,CAAgB,OAAgB,IAAA,EAAmC;AAC1E,EAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAK,GAAA,CAAI,KAAK,IAAI,MAAA,GAAY,aAAA,CAAc,OAAO,IAAI,CAAA;AAChE;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,eAAA,CAAgB,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AACzC;;"}
1
+ {"version":3,"file":"cause-secrets.mjs","sources":["../../src/domain/cause-secrets.ts"],"sourcesContent":["import { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and\n * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the\n * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), and may keep it in\n * nested objects too (Redocly's parse error holds `originalError.mark.name` and\n * `source.absoluteRef`), so the chain must hide the same secrets as the message (url-secrets.ts)\n * at every depth.\n */\n\n/**\n * How deep the walk copies a cause. The data of a cause is shallow (Redocly's deepest URL is three\n * levels below the error); a value below this depth is dropped, so no secret is kept unread.\n */\nconst MAX_CAUSE_DEPTH = 8;\n\ninterface Walk {\n /** The objects on the way from the cause to the value, so a cycle is cut where it closes. */\n readonly path: ReadonlySet<object>;\n readonly depth: number;\n}\n\nfunction deeper(walk: Walk, value: object): Walk {\n return { path: new Set([...walk.path, value]), depth: walk.depth + 1 };\n}\n\n/** An array with each item hidden, or the array itself when no item holds a secret. */\nfunction redactedArray(array: readonly unknown[], walk: Walk): readonly unknown[] {\n const inner = deeper(walk, array);\n const items = array.map((item) => redactedValue(item, inner));\n return items.every((item, index) => item === array[index]) ? array : items;\n}\n\n/**\n * A copy of `value` with the same prototype, its own properties (`message`, `stack`, `code`,\n * `input`, a nested `cause` or object) with URL secrets hidden, or `value` itself when none of\n * them holds one. Each property is read through its getter (V8 keeps `stack` behind one) and\n * copied as a value.\n */\nfunction redactedObject(value: object, walk: Walk): object {\n const inner = deeper(walk, value);\n // An error is copied as a real error, so `util.inspect` and `util.types.isNativeError` treat\n // the copy as one.\n const copy: object =\n value instanceof Error\n ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value))\n : Object.create(Object.getPrototypeOf(value) as object | null);\n let isChanged = false;\n for (const key of Reflect.ownKeys(value)) {\n const property: unknown = Reflect.get(value, key);\n const shown = redactedValue(property, inner);\n isChanged ||= shown !== property;\n const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;\n Object.defineProperty(copy, key, {\n value: shown,\n enumerable,\n writable: true,\n configurable: true,\n });\n }\n return isChanged ? copy : value;\n}\n\n/** Binary data and functions hold no text to hide, so they are kept as they are. */\nfunction isOpaque(value: object): boolean {\n return typeof value === \"function\" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;\n}\n\nfunction redactedValue(value: unknown, walk: Walk): unknown {\n if (typeof value === \"string\") {\n return redactUrlSecrets(value);\n }\n if (typeof value !== \"object\" || value === null || isOpaque(value)) {\n return value;\n }\n if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {\n return undefined;\n }\n return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);\n}\n\n/** The cause of a typed error with the URL secrets of its whole chain hidden. */\nexport function redactCauseSecrets(cause: unknown): unknown {\n return redactedValue(cause, { path: new Set(), depth: 0 });\n}\n"],"names":[],"mappings":";;AAeA,MAAM,eAAA,GAAkB,CAAA;AAQxB,SAAS,MAAA,CAAO,MAAY,KAAA,EAAqB;AAC/C,EAAA,OAAO,EAAE,IAAA,kBAAM,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,KAAK,CAAC,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAA,EAAE;AACvE;AAGA,SAAS,aAAA,CAAc,OAA2B,IAAA,EAAgC;AAChF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,CAAI,CAAC,SAAS,aAAA,CAAc,IAAA,EAAM,KAAK,CAAC,CAAA;AAC5D,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,EAAM,KAAA,KAAU,SAAS,KAAA,CAAM,KAAK,CAAC,CAAA,GAAI,KAAA,GAAQ,KAAA;AACvE;AAQA,SAAS,cAAA,CAAe,OAAe,IAAA,EAAoB;AACzD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAGhC,EAAA,MAAM,OACJ,KAAA,YAAiB,KAAA,GACb,OAAO,cAAA,CAAe,IAAI,OAAM,EAAG,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA,GAC/D,MAAA,CAAO,OAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAkB,CAAA;AACjE,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,QAAA,GAAoB,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,KAAK,CAAA;AAC3C,IAAA,SAAA,KAAc,KAAA,KAAU,QAAA;AACxB,IAAA,MAAM,aAAa,MAAA,CAAO,wBAAA,CAAyB,KAAA,EAAO,GAAG,GAAG,UAAA,KAAe,IAAA;AAC/E,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,GAAA,EAAK;AAAA,MAC/B,KAAA,EAAO,KAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACA,EAAA,OAAO,YAAY,IAAA,GAAO,KAAA;AAC5B;AAGA,SAAS,SAAS,KAAA,EAAwB;AACxC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,IAAc,YAAY,MAAA,CAAO,KAAK,KAAK,KAAA,YAAiB,WAAA;AACtF;AAEA,SAAS,aAAA,CAAc,OAAgB,IAAA,EAAqB;AAC1D,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,SAAS,eAAA,EAAiB;AACzD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,aAAA,CAAc,OAAO,IAAI,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,IAAI,CAAA;AACvF;AAGO,SAAS,mBAAmB,KAAA,EAAyB;AAC1D,EAAA,OAAO,aAAA,CAAc,OAAO,EAAE,IAAA,sBAAU,GAAA,EAAI,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAC3D;;"}
@@ -19,14 +19,17 @@ const ERROR_CODES = {
19
19
  ENUM_NAME_EMPTY: "ENUM_NAME_EMPTY",
20
20
  CALLBACK_RESULT_UNREADABLE: "CALLBACK_RESULT_UNREADABLE",
21
21
  OPTION_FIX_UNKNOWN: "OPTION_FIX_UNKNOWN",
22
+ OPTION_INVALID: "OPTION_INVALID",
22
23
  TYPESCRIPT_NOT_FOUND: "TYPESCRIPT_NOT_FOUND",
23
24
  CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
25
+ CLI_FLAG_INVALID: "CLI_FLAG_INVALID",
24
26
  CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
25
27
  CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
26
28
  CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
27
29
  CLI_CONFIG_OUTPUT_MISSING: "CLI_CONFIG_OUTPUT_MISSING",
28
30
  CLI_CHECK_OUTPUT_MISSING: "CLI_CHECK_OUTPUT_MISSING",
29
31
  CLI_INPUT_MISSING: "CLI_INPUT_MISSING",
32
+ CLI_INPUT_EXTRA: "CLI_INPUT_EXTRA",
30
33
  CLI_OUTPUT_IS_INPUT: "CLI_OUTPUT_IS_INPUT",
31
34
  CLI_OUTPUT_DUPLICATE: "CLI_OUTPUT_DUPLICATE",
32
35
  CLI_OUTPUT_INVALID: "CLI_OUTPUT_INVALID",
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactCauseSecrets } from \"./cause-secrets.js\";\nimport { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/**\n * Every error code. A minor release may add codes (ADR-034); each one needs a row in the CLI's\n * exit-code table, which the compiler checks.\n */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n CLI_OUTPUT_IS_INPUT: \"CLI_OUTPUT_IS_INPUT\",\n CLI_OUTPUT_DUPLICATE: \"CLI_OUTPUT_DUPLICATE\",\n CLI_OUTPUT_INVALID: \"CLI_OUTPUT_INVALID\",\n CLI_LOCATION_INVALID: \"CLI_LOCATION_INVALID\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Structured, JSON-serializable facts about a failure, for programs and logs. Only the keys that\n * docs/node.md (Errors) lists are stable (ADR-034, amendment of 2026-11-08).\n */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /**\n * The lower-level error this one reports, if any (kept as the standard `cause`; a copy with URL\n * secrets hidden when its chain names one, see cause-secrets.ts).\n */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * and the `cause` chain never show the user info or the query of a URL (`url-secrets.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlSecrets(init.message);\n const cause = redactCauseSecrets(init.cause);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":["redactUrlSecrets","redactCauseSecrets"],"mappings":";;;;;AAcO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAyBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAUA,2BAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQC,+BAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,EAAE,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;;;"}
1
+ {"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactCauseSecrets } from \"./cause-secrets.js\";\nimport { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/**\n * Every error code. A minor release may add codes (ADR-034); each one needs a row in the CLI's\n * exit-code table, which the compiler checks.\n */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n OPTION_INVALID: \"OPTION_INVALID\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_FLAG_INVALID: \"CLI_FLAG_INVALID\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n CLI_INPUT_EXTRA: \"CLI_INPUT_EXTRA\",\n CLI_OUTPUT_IS_INPUT: \"CLI_OUTPUT_IS_INPUT\",\n CLI_OUTPUT_DUPLICATE: \"CLI_OUTPUT_DUPLICATE\",\n CLI_OUTPUT_INVALID: \"CLI_OUTPUT_INVALID\",\n CLI_LOCATION_INVALID: \"CLI_LOCATION_INVALID\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Structured, JSON-serializable facts about a failure, for programs and logs. Only the keys that\n * docs/node.md (Errors) lists are stable (ADR-034, amendment of 2026-11-08).\n */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /**\n * The lower-level error this one reports, if any (kept as the standard `cause`; a copy with URL\n * secrets hidden when its chain names one, see cause-secrets.ts).\n */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * and the `cause` chain never show the user info or the query of a URL (`url-secrets.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlSecrets(init.message);\n const cause = redactCauseSecrets(init.cause);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":["redactUrlSecrets","redactCauseSecrets"],"mappings":";;;;;AAcO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,cAAA,EAAgB,gBAAA;AAAA,EAChB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAyBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAUA,2BAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQC,+BAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,EAAE,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;;;"}
@@ -17,14 +17,17 @@ const ERROR_CODES = {
17
17
  ENUM_NAME_EMPTY: "ENUM_NAME_EMPTY",
18
18
  CALLBACK_RESULT_UNREADABLE: "CALLBACK_RESULT_UNREADABLE",
19
19
  OPTION_FIX_UNKNOWN: "OPTION_FIX_UNKNOWN",
20
+ OPTION_INVALID: "OPTION_INVALID",
20
21
  TYPESCRIPT_NOT_FOUND: "TYPESCRIPT_NOT_FOUND",
21
22
  CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
23
+ CLI_FLAG_INVALID: "CLI_FLAG_INVALID",
22
24
  CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
23
25
  CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
24
26
  CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
25
27
  CLI_CONFIG_OUTPUT_MISSING: "CLI_CONFIG_OUTPUT_MISSING",
26
28
  CLI_CHECK_OUTPUT_MISSING: "CLI_CHECK_OUTPUT_MISSING",
27
29
  CLI_INPUT_MISSING: "CLI_INPUT_MISSING",
30
+ CLI_INPUT_EXTRA: "CLI_INPUT_EXTRA",
28
31
  CLI_OUTPUT_IS_INPUT: "CLI_OUTPUT_IS_INPUT",
29
32
  CLI_OUTPUT_DUPLICATE: "CLI_OUTPUT_DUPLICATE",
30
33
  CLI_OUTPUT_INVALID: "CLI_OUTPUT_INVALID",
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactCauseSecrets } from \"./cause-secrets.js\";\nimport { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/**\n * Every error code. A minor release may add codes (ADR-034); each one needs a row in the CLI's\n * exit-code table, which the compiler checks.\n */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n CLI_OUTPUT_IS_INPUT: \"CLI_OUTPUT_IS_INPUT\",\n CLI_OUTPUT_DUPLICATE: \"CLI_OUTPUT_DUPLICATE\",\n CLI_OUTPUT_INVALID: \"CLI_OUTPUT_INVALID\",\n CLI_LOCATION_INVALID: \"CLI_LOCATION_INVALID\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Structured, JSON-serializable facts about a failure, for programs and logs. Only the keys that\n * docs/node.md (Errors) lists are stable (ADR-034, amendment of 2026-11-08).\n */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /**\n * The lower-level error this one reports, if any (kept as the standard `cause`; a copy with URL\n * secrets hidden when its chain names one, see cause-secrets.ts).\n */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * and the `cause` chain never show the user info or the query of a URL (`url-secrets.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlSecrets(init.message);\n const cause = redactCauseSecrets(init.cause);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":";;;AAcO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAyBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,EAAE,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;"}
1
+ {"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactCauseSecrets } from \"./cause-secrets.js\";\nimport { redactUrlSecrets } from \"./url-secrets.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/**\n * Every error code. A minor release may add codes (ADR-034); each one needs a row in the CLI's\n * exit-code table, which the compiler checks.\n */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n OPTION_INVALID: \"OPTION_INVALID\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_FLAG_INVALID: \"CLI_FLAG_INVALID\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n CLI_INPUT_EXTRA: \"CLI_INPUT_EXTRA\",\n CLI_OUTPUT_IS_INPUT: \"CLI_OUTPUT_IS_INPUT\",\n CLI_OUTPUT_DUPLICATE: \"CLI_OUTPUT_DUPLICATE\",\n CLI_OUTPUT_INVALID: \"CLI_OUTPUT_INVALID\",\n CLI_LOCATION_INVALID: \"CLI_LOCATION_INVALID\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Structured, JSON-serializable facts about a failure, for programs and logs. Only the keys that\n * docs/node.md (Errors) lists are stable (ADR-034, amendment of 2026-11-08).\n */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /**\n * The lower-level error this one reports, if any (kept as the standard `cause`; a copy with URL\n * secrets hidden when its chain names one, see cause-secrets.ts).\n */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * and the `cause` chain never show the user info or the query of a URL (`url-secrets.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlSecrets(init.message);\n const cause = redactCauseSecrets(init.cause);\n super(message, cause === undefined ? undefined : { cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":";;;AAcO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,cAAA,EAAgB,gBAAA;AAAA,EAChB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAyBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAC3C,IAAA,KAAA,CAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAY,EAAE,OAAO,CAAA;AAC1D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
4
+ const READ_SCHEMES = /* @__PURE__ */ new Set(["file:", "http:", "https:"]);
5
+ const AUTHORITY_START = "//";
6
+ function hasUrlScheme(location) {
7
+ const scheme = URL_SCHEME.exec(location)?.[0];
8
+ if (scheme === void 0) {
9
+ return false;
10
+ }
11
+ return READ_SCHEMES.has(scheme.toLowerCase()) || location.startsWith(AUTHORITY_START, scheme.length);
12
+ }
13
+
14
+ exports.hasUrlScheme = hasUrlScheme;
15
+ //# sourceMappingURL=location-text.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-text.cjs","sources":["../../src/domain/location-text.ts"],"sourcesContent":["/** How a location the user writes, as a CLI argument or an option string, is read. */\n\n/**\n * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so\n * `C:\\\\specs\\\\api.yaml` stays a path.\n */\nconst URL_SCHEME = /^[a-z][a-z\\d+.-]+:/i;\n\n/** The schemes the generator reads, which mark a URL also without `//` (`file:api.yaml`). */\nconst READ_SCHEMES: ReadonlySet<string> = new Set([\"file:\", \"http:\", \"https:\"]);\n\nconst AUTHORITY_START = \"//\";\n\n/**\n * Whether the location is written as a URL, not as a file path: a scheme the generator reads, or\n * any scheme followed by `//` (`s3://bucket/api.yaml`). Another text before a colon is part of a\n * file name, as it is on POSIX file systems (`out:v2.ts`, `spec:v2.yaml`).\n */\nexport function hasUrlScheme(location: string): boolean {\n const scheme = URL_SCHEME.exec(location)?.[0];\n if (scheme === undefined) {\n return false;\n }\n return (\n READ_SCHEMES.has(scheme.toLowerCase()) || location.startsWith(AUTHORITY_START, scheme.length)\n );\n}\n"],"names":[],"mappings":";;AAMA,MAAM,UAAA,GAAa,qBAAA;AAGnB,MAAM,+BAAoC,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAE9E,MAAM,eAAA,GAAkB,IAAA;AAOjB,SAAS,aAAa,QAAA,EAA2B;AACtD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAI,CAAC,CAAA;AAC5C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OACE,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,KAAK,QAAA,CAAS,UAAA,CAAW,eAAA,EAAiB,MAAA,CAAO,MAAM,CAAA;AAEhG;;"}
@@ -0,0 +1,13 @@
1
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
2
+ const READ_SCHEMES = /* @__PURE__ */ new Set(["file:", "http:", "https:"]);
3
+ const AUTHORITY_START = "//";
4
+ function hasUrlScheme(location) {
5
+ const scheme = URL_SCHEME.exec(location)?.[0];
6
+ if (scheme === void 0) {
7
+ return false;
8
+ }
9
+ return READ_SCHEMES.has(scheme.toLowerCase()) || location.startsWith(AUTHORITY_START, scheme.length);
10
+ }
11
+
12
+ export { hasUrlScheme };
13
+ //# sourceMappingURL=location-text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-text.mjs","sources":["../../src/domain/location-text.ts"],"sourcesContent":["/** How a location the user writes, as a CLI argument or an option string, is read. */\n\n/**\n * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so\n * `C:\\\\specs\\\\api.yaml` stays a path.\n */\nconst URL_SCHEME = /^[a-z][a-z\\d+.-]+:/i;\n\n/** The schemes the generator reads, which mark a URL also without `//` (`file:api.yaml`). */\nconst READ_SCHEMES: ReadonlySet<string> = new Set([\"file:\", \"http:\", \"https:\"]);\n\nconst AUTHORITY_START = \"//\";\n\n/**\n * Whether the location is written as a URL, not as a file path: a scheme the generator reads, or\n * any scheme followed by `//` (`s3://bucket/api.yaml`). Another text before a colon is part of a\n * file name, as it is on POSIX file systems (`out:v2.ts`, `spec:v2.yaml`).\n */\nexport function hasUrlScheme(location: string): boolean {\n const scheme = URL_SCHEME.exec(location)?.[0];\n if (scheme === undefined) {\n return false;\n }\n return (\n READ_SCHEMES.has(scheme.toLowerCase()) || location.startsWith(AUTHORITY_START, scheme.length)\n );\n}\n"],"names":[],"mappings":"AAMA,MAAM,UAAA,GAAa,qBAAA;AAGnB,MAAM,+BAAoC,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAE9E,MAAM,eAAA,GAAkB,IAAA;AAOjB,SAAS,aAAa,QAAA,EAA2B;AACtD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,QAAQ,IAAI,CAAC,CAAA;AAC5C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OACE,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,WAAA,EAAa,KAAK,QAAA,CAAS,UAAA,CAAW,eAAA,EAAiB,MAAA,CAAO,MAAM,CAAA;AAEhG;;"}