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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  23. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  25. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +26 -14
  27. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +26 -14
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/ref-access.cjs +16 -3
  31. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/ref-access.mjs +16 -3
  33. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  35. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  37. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/remote-fetch.cjs +5 -3
  39. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/remote-fetch.mjs +5 -3
  41. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  43. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  45. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  47. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  49. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  50. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  51. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  52. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  53. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  54. package/dist/api/document-refs.cjs +16 -1
  55. package/dist/api/document-refs.cjs.map +1 -1
  56. package/dist/api/document-refs.mjs +16 -1
  57. package/dist/api/document-refs.mjs.map +1 -1
  58. package/dist/api/document-run.cjs +4 -10
  59. package/dist/api/document-run.cjs.map +1 -1
  60. package/dist/api/document-run.mjs +4 -10
  61. package/dist/api/document-run.mjs.map +1 -1
  62. package/dist/api/openapi-ts.cjs +1 -2
  63. package/dist/api/openapi-ts.cjs.map +1 -1
  64. package/dist/api/openapi-ts.mjs +2 -3
  65. package/dist/api/openapi-ts.mjs.map +1 -1
  66. package/dist/api/ref-limit-options.cjs +63 -0
  67. package/dist/api/ref-limit-options.cjs.map +1 -0
  68. package/dist/api/ref-limit-options.mjs +57 -0
  69. package/dist/api/ref-limit-options.mjs.map +1 -0
  70. package/dist/api/transform-schema.cjs +12 -5
  71. package/dist/api/transform-schema.cjs.map +1 -1
  72. package/dist/api/transform-schema.mjs +12 -5
  73. package/dist/api/transform-schema.mjs.map +1 -1
  74. package/dist/application/transform/declared-value-types.cjs +36 -0
  75. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  76. package/dist/application/transform/declared-value-types.mjs +34 -0
  77. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  78. package/dist/application/transform/document/document.cjs +3 -1
  79. package/dist/application/transform/document/document.cjs.map +1 -1
  80. package/dist/application/transform/document/document.mjs +3 -1
  81. package/dist/application/transform/document/document.mjs.map +1 -1
  82. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  83. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  84. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  85. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  86. package/dist/application/transform/document/header.cjs +11 -3
  87. package/dist/application/transform/document/header.cjs.map +1 -1
  88. package/dist/application/transform/document/header.mjs +10 -2
  89. package/dist/application/transform/document/header.mjs.map +1 -1
  90. package/dist/application/transform/document/parameter.cjs +1 -1
  91. package/dist/application/transform/document/parameter.cjs.map +1 -1
  92. package/dist/application/transform/document/parameter.mjs +1 -1
  93. package/dist/application/transform/document/parameter.mjs.map +1 -1
  94. package/dist/application/transform/document/parameters.cjs +23 -5
  95. package/dist/application/transform/document/parameters.cjs.map +1 -1
  96. package/dist/application/transform/document/parameters.mjs +23 -5
  97. package/dist/application/transform/document/parameters.mjs.map +1 -1
  98. package/dist/application/transform/document/path-item.cjs +4 -3
  99. package/dist/application/transform/document/path-item.cjs.map +1 -1
  100. package/dist/application/transform/document/path-item.mjs +4 -4
  101. package/dist/application/transform/document/path-item.mjs.map +1 -1
  102. package/dist/application/transform/document/path-template-key.cjs +84 -0
  103. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  104. package/dist/application/transform/document/path-template-key.mjs +79 -0
  105. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  106. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  107. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  108. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  109. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  110. package/dist/application/transform/document/paths-enum.cjs +7 -6
  111. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  112. package/dist/application/transform/document/paths-enum.mjs +7 -6
  113. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  114. package/dist/application/transform/document/paths.cjs +38 -66
  115. package/dist/application/transform/document/paths.cjs.map +1 -1
  116. package/dist/application/transform/document/paths.mjs +36 -66
  117. package/dist/application/transform/document/paths.mjs.map +1 -1
  118. package/dist/application/transform/document/webhooks.cjs +10 -3
  119. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  120. package/dist/application/transform/document/webhooks.mjs +9 -2
  121. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  122. package/dist/application/transform/footer/document-footer.cjs +6 -3
  123. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  124. package/dist/application/transform/footer/document-footer.mjs +6 -3
  125. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  126. package/dist/application/transform/helper-types.cjs +3 -3
  127. package/dist/application/transform/helper-types.cjs.map +1 -1
  128. package/dist/application/transform/helper-types.mjs +3 -3
  129. package/dist/application/transform/helper-types.mjs.map +1 -1
  130. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  131. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  132. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  133. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  134. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  135. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  136. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  137. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  138. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  139. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  140. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  141. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  142. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  143. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  144. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  145. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  146. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  147. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  148. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  149. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  150. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  151. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  152. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  153. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  155. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  157. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  159. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  160. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  161. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  162. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  163. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  165. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  166. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  167. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  168. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  169. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  170. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  171. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  172. package/dist/application/transform/schema/input-location.cjs +23 -0
  173. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  174. package/dist/application/transform/schema/input-location.mjs +21 -0
  175. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  176. package/dist/application/transform/schema/object-type.cjs +15 -5
  177. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  178. package/dist/application/transform/schema/object-type.mjs +15 -5
  179. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  180. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  181. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  182. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  183. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  184. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  185. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  186. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  187. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  188. package/dist/cli/api-logger.cjs +13 -0
  189. package/dist/cli/api-logger.cjs.map +1 -0
  190. package/dist/cli/api-logger.mjs +11 -0
  191. package/dist/cli/api-logger.mjs.map +1 -0
  192. package/dist/cli/api-settings.cjs +7 -15
  193. package/dist/cli/api-settings.cjs.map +1 -1
  194. package/dist/cli/api-settings.mjs +8 -16
  195. package/dist/cli/api-settings.mjs.map +1 -1
  196. package/dist/cli/cli-arguments.cjs +51 -11
  197. package/dist/cli/cli-arguments.cjs.map +1 -1
  198. package/dist/cli/cli-arguments.mjs +51 -11
  199. package/dist/cli/cli-arguments.mjs.map +1 -1
  200. package/dist/cli/cli-errors.cjs +17 -0
  201. package/dist/cli/cli-errors.cjs.map +1 -1
  202. package/dist/cli/cli-errors.mjs +17 -1
  203. package/dist/cli/cli-errors.mjs.map +1 -1
  204. package/dist/cli/cli-output.cjs +6 -4
  205. package/dist/cli/cli-output.cjs.map +1 -1
  206. package/dist/cli/cli-output.mjs +7 -5
  207. package/dist/cli/cli-output.mjs.map +1 -1
  208. package/dist/cli/main.cjs +10 -4
  209. package/dist/cli/main.cjs.map +1 -1
  210. package/dist/cli/main.mjs +10 -4
  211. package/dist/cli/main.mjs.map +1 -1
  212. package/dist/cli/redocly-apis.cjs +20 -9
  213. package/dist/cli/redocly-apis.cjs.map +1 -1
  214. package/dist/cli/redocly-apis.mjs +22 -11
  215. package/dist/cli/redocly-apis.mjs.map +1 -1
  216. package/dist/cli/ref-limits.cjs +15 -1
  217. package/dist/cli/ref-limits.cjs.map +1 -1
  218. package/dist/cli/ref-limits.mjs +15 -2
  219. package/dist/cli/ref-limits.mjs.map +1 -1
  220. package/dist/cli/run-cli.cjs +24 -7
  221. package/dist/cli/run-cli.cjs.map +1 -1
  222. package/dist/cli/run-cli.mjs +25 -8
  223. package/dist/cli/run-cli.mjs.map +1 -1
  224. package/dist/domain/cause-secrets.cjs +31 -16
  225. package/dist/domain/cause-secrets.cjs.map +1 -1
  226. package/dist/domain/cause-secrets.mjs +31 -16
  227. package/dist/domain/cause-secrets.mjs.map +1 -1
  228. package/dist/domain/errors.cjs +2 -0
  229. package/dist/domain/errors.cjs.map +1 -1
  230. package/dist/domain/errors.mjs +2 -0
  231. package/dist/domain/errors.mjs.map +1 -1
  232. package/dist/domain/location-text.cjs +9 -0
  233. package/dist/domain/location-text.cjs.map +1 -0
  234. package/dist/domain/location-text.mjs +7 -0
  235. package/dist/domain/location-text.mjs.map +1 -0
  236. package/dist/domain/openapi/document-places.cjs +55 -0
  237. package/dist/domain/openapi/document-places.cjs.map +1 -0
  238. package/dist/domain/openapi/document-places.mjs +53 -0
  239. package/dist/domain/openapi/document-places.mjs.map +1 -0
  240. package/dist/domain/output-fixes.cjs +8 -2
  241. package/dist/domain/output-fixes.cjs.map +1 -1
  242. package/dist/domain/output-fixes.mjs +8 -2
  243. package/dist/domain/output-fixes.mjs.map +1 -1
  244. package/dist/domain/terminal-text.cjs +31 -0
  245. package/dist/domain/terminal-text.cjs.map +1 -0
  246. package/dist/domain/terminal-text.mjs +29 -0
  247. package/dist/domain/terminal-text.mjs.map +1 -0
  248. package/dist/domain/warnings.cjs +1 -0
  249. package/dist/domain/warnings.cjs.map +1 -1
  250. package/dist/domain/warnings.mjs +1 -0
  251. package/dist/domain/warnings.mjs.map +1 -1
  252. package/dist/index.d.cts +26 -18
  253. package/dist/index.d.mts +26 -18
  254. package/dist/index.d.ts +26 -18
  255. package/package.json +1 -1
  256. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  257. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  258. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  259. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  260. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  261. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  262. package/src/adapters/redocly-loader/redocly-schema-loader.ts +46 -14
  263. package/src/adapters/redocly-loader/ref-access.ts +16 -3
  264. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  265. package/src/adapters/redocly-loader/remote-fetch.ts +11 -2
  266. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  267. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  268. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  269. package/src/api/document-refs.ts +29 -1
  270. package/src/api/document-run.ts +6 -16
  271. package/src/api/openapi-ts.ts +6 -3
  272. package/src/api/ref-limit-options.ts +76 -0
  273. package/src/api/transform-schema.ts +20 -5
  274. package/src/application/ports/file-system.ts +8 -0
  275. package/src/application/transform/declared-value-types.ts +42 -0
  276. package/src/application/transform/document/document.ts +4 -2
  277. package/src/application/transform/document/exploded-query-values.ts +88 -0
  278. package/src/application/transform/document/header.ts +25 -5
  279. package/src/application/transform/document/parameter.ts +4 -4
  280. package/src/application/transform/document/parameters.ts +45 -10
  281. package/src/application/transform/document/path-item.ts +3 -3
  282. package/src/application/transform/document/path-template-key.ts +152 -0
  283. package/src/application/transform/document/path-template-refs.ts +106 -0
  284. package/src/application/transform/document/paths-enum.ts +23 -9
  285. package/src/application/transform/document/paths.ts +53 -123
  286. package/src/application/transform/document/webhooks.ts +18 -5
  287. package/src/application/transform/footer/document-footer.ts +18 -8
  288. package/src/application/transform/helper-types.ts +4 -4
  289. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  290. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  291. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  292. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  293. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  294. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  295. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  296. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  297. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  298. package/src/application/transform/schema/access-flags.ts +5 -2
  299. package/src/application/transform/schema/index-signature-type.ts +31 -0
  300. package/src/application/transform/schema/input-location.ts +35 -0
  301. package/src/application/transform/schema/object-type.ts +18 -8
  302. package/src/application/transform/schema/schema-transform.ts +2 -1
  303. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  304. package/src/cli/api-logger.ts +17 -0
  305. package/src/cli/api-settings.ts +12 -20
  306. package/src/cli/cli-arguments.ts +90 -14
  307. package/src/cli/cli-dependencies.ts +7 -2
  308. package/src/cli/cli-errors.ts +22 -0
  309. package/src/cli/cli-output.ts +11 -10
  310. package/src/cli/main.ts +10 -4
  311. package/src/cli/redocly-apis.ts +37 -17
  312. package/src/cli/ref-limits.ts +21 -2
  313. package/src/cli/run-cli.ts +39 -7
  314. package/src/domain/cause-secrets.ts +59 -25
  315. package/src/domain/errors.ts +2 -0
  316. package/src/domain/location-text.ts +12 -0
  317. package/src/domain/openapi/document-places.ts +78 -0
  318. package/src/domain/output-fixes.ts +9 -2
  319. package/src/domain/terminal-text.ts +44 -0
  320. package/src/domain/warnings.ts +1 -0
@@ -3,31 +3,55 @@ import { redactUrlSecrets } from "./url-secrets.js";
3
3
  /**
4
4
  * The `cause` of a typed error is shown wherever the error is: `console.error(error)` and
5
5
  * `util.inspect` print the whole chain, and error trackers send it. A lower-level error names the
6
- * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), so the chain must
7
- * hide the same secrets as the message (url-secrets.ts).
6
+ * URL it failed on (fetch refuses `https://user:token@host/…` and quotes it), and may keep it in
7
+ * nested objects too (Redocly's parse error holds `originalError.mark.name` and
8
+ * `source.absoluteRef`), so the chain must hide the same secrets as the message (url-secrets.ts)
9
+ * at every depth.
8
10
  */
9
11
 
10
- /** A string with its URL secrets hidden; any other value as it is. */
11
- function redactedValue(value: unknown): unknown {
12
- return typeof value === "string" ? redactUrlSecrets(value) : value;
12
+ /**
13
+ * How deep the walk copies a cause. The data of a cause is shallow (Redocly's deepest URL is three
14
+ * levels below the error); a value below this depth is dropped, so no secret is kept unread.
15
+ */
16
+ const MAX_CAUSE_DEPTH = 8;
17
+
18
+ interface Walk {
19
+ /** The objects on the way from the cause to the value, so a cycle is cut where it closes. */
20
+ readonly path: ReadonlySet<object>;
21
+ readonly depth: number;
22
+ }
23
+
24
+ function deeper(walk: Walk, value: object): Walk {
25
+ return { path: new Set([...walk.path, value]), depth: walk.depth + 1 };
26
+ }
27
+
28
+ /** An array with each item hidden, or the array itself when no item holds a secret. */
29
+ function redactedArray(array: readonly unknown[], walk: Walk): readonly unknown[] {
30
+ const inner = deeper(walk, array);
31
+ const items = array.map((item) => redactedValue(item, inner));
32
+ return items.every((item, index) => item === array[index]) ? array : items;
13
33
  }
14
34
 
15
35
  /**
16
- * A copy of `error` of the same class, its own properties (`message`, `stack`, `code`, `input`, a
17
- * nested `cause`) with URL secrets hidden, or `error` itself when none of them holds one. Each
18
- * property is read through its getter (V8 keeps `stack` behind one) and copied as a value.
36
+ * A copy of `value` with the same prototype, its own properties (`message`, `stack`, `code`,
37
+ * `input`, a nested `cause` or object) with URL secrets hidden, or `value` itself when none of
38
+ * them holds one. Each property is read through its getter (V8 keeps `stack` behind one) and
39
+ * copied as a value.
19
40
  */
20
- function redactedError(error: Error, seen: ReadonlySet<Error>): Error {
21
- const inner = new Set([...seen, error]);
22
- // A real error with the class of `error`, so `util.inspect` and `util.types.isNativeError`
23
- // treat it as one.
24
- const copy = Object.setPrototypeOf(new Error(), Object.getPrototypeOf(error)) as Error;
41
+ function redactedObject(value: object, walk: Walk): object {
42
+ const inner = deeper(walk, value);
43
+ // An error is copied as a real error, so `util.inspect` and `util.types.isNativeError` treat
44
+ // the copy as one.
45
+ const copy: object =
46
+ value instanceof Error
47
+ ? Object.setPrototypeOf(new Error(), Object.getPrototypeOf(value))
48
+ : Object.create(Object.getPrototypeOf(value) as object | null);
25
49
  let isChanged = false;
26
- for (const key of Reflect.ownKeys(error)) {
27
- const value: unknown = Reflect.get(error, key);
28
- const shown = key === "cause" ? redactedCauseIn(value, inner) : redactedValue(value);
29
- isChanged ||= shown !== value;
30
- const enumerable = Object.getOwnPropertyDescriptor(error, key)?.enumerable === true;
50
+ for (const key of Reflect.ownKeys(value)) {
51
+ const property: unknown = Reflect.get(value, key);
52
+ const shown = redactedValue(property, inner);
53
+ isChanged ||= shown !== property;
54
+ const enumerable = Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
31
55
  Object.defineProperty(copy, key, {
32
56
  value: shown,
33
57
  enumerable,
@@ -35,18 +59,28 @@ function redactedError(error: Error, seen: ReadonlySet<Error>): Error {
35
59
  configurable: true,
36
60
  });
37
61
  }
38
- return isChanged ? copy : error;
62
+ return isChanged ? copy : value;
63
+ }
64
+
65
+ /** Binary data and functions hold no text to hide, so they are kept as they are. */
66
+ function isOpaque(value: object): boolean {
67
+ return typeof value === "function" || ArrayBuffer.isView(value) || value instanceof ArrayBuffer;
39
68
  }
40
69
 
41
- function redactedCauseIn(cause: unknown, seen: ReadonlySet<Error>): unknown {
42
- if (!(cause instanceof Error)) {
43
- return redactedValue(cause);
70
+ function redactedValue(value: unknown, walk: Walk): unknown {
71
+ if (typeof value === "string") {
72
+ return redactUrlSecrets(value);
73
+ }
74
+ if (typeof value !== "object" || value === null || isOpaque(value)) {
75
+ return value;
76
+ }
77
+ if (walk.path.has(value) || walk.depth >= MAX_CAUSE_DEPTH) {
78
+ return undefined;
44
79
  }
45
- // A chain that loops back is cut where it does, so the copy is finite.
46
- return seen.has(cause) ? undefined : redactedError(cause, seen);
80
+ return Array.isArray(value) ? redactedArray(value, walk) : redactedObject(value, walk);
47
81
  }
48
82
 
49
83
  /** The cause of a typed error with the URL secrets of its whole chain hidden. */
50
84
  export function redactCauseSecrets(cause: unknown): unknown {
51
- return redactedCauseIn(cause, new Set());
85
+ return redactedValue(cause, { path: new Set(), depth: 0 });
52
86
  }
@@ -28,8 +28,10 @@ export const ERROR_CODES = {
28
28
  ENUM_NAME_EMPTY: "ENUM_NAME_EMPTY",
29
29
  CALLBACK_RESULT_UNREADABLE: "CALLBACK_RESULT_UNREADABLE",
30
30
  OPTION_FIX_UNKNOWN: "OPTION_FIX_UNKNOWN",
31
+ OPTION_INVALID: "OPTION_INVALID",
31
32
  TYPESCRIPT_NOT_FOUND: "TYPESCRIPT_NOT_FOUND",
32
33
  CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
34
+ CLI_FLAG_INVALID: "CLI_FLAG_INVALID",
33
35
  CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
34
36
  CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
35
37
  CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
@@ -0,0 +1,12 @@
1
+ /** How a location the user writes, as a CLI argument or an option string, is read. */
2
+
3
+ /**
4
+ * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so
5
+ * `C:\\specs\\api.yaml` stays a path.
6
+ */
7
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
8
+
9
+ /** Whether the location is written as a URL, not as a file path. */
10
+ export function hasUrlScheme(location: string): boolean {
11
+ return URL_SCHEME.test(location);
12
+ }
@@ -0,0 +1,78 @@
1
+ import { ADDITIONAL_OPERATIONS_KEY, HTTP_METHODS, QUERY_METHOD } from "./path-item-object.js";
2
+
3
+ /**
4
+ * The places of an OpenAPI document that a JSON Pointer passes through, read from the document's
5
+ * structure rather than from the words of the pointer. `named*` places and `callback` are maps
6
+ * whose next segment is a name (a path, a component name, a callback expression). `outside` (a
7
+ * root key that is no document key), `input` (a parameter or a request body) and `other` end the
8
+ * walk.
9
+ */
10
+ export type DocumentPlace =
11
+ | "root"
12
+ | "outside"
13
+ | "components"
14
+ | "namedPathItems"
15
+ | "namedCallbacks"
16
+ | "callback"
17
+ | "pathItem"
18
+ | "namedOperations"
19
+ | "operation"
20
+ | "input"
21
+ | "other";
22
+
23
+ const OPERATION_KEYS: ReadonlySet<string> = new Set([...HTTP_METHODS, QUERY_METHOD]);
24
+
25
+ /** The place each fixed field leads to; any other field leads to `other`. */
26
+ const FIELDS: Readonly<Partial<Record<DocumentPlace, Readonly<Record<string, DocumentPlace>>>>> = {
27
+ root: {
28
+ paths: "namedPathItems",
29
+ webhooks: "namedPathItems",
30
+ components: "components",
31
+ $defs: "other",
32
+ },
33
+ components: {
34
+ parameters: "input",
35
+ requestBodies: "input",
36
+ pathItems: "namedPathItems",
37
+ callbacks: "namedCallbacks",
38
+ },
39
+ pathItem: { parameters: "input", [ADDITIONAL_OPERATIONS_KEY]: "namedOperations" },
40
+ operation: { parameters: "input", requestBody: "input", callbacks: "namedCallbacks" },
41
+ };
42
+
43
+ /** Maps whose every key leads to the same place. */
44
+ const NAMED: Readonly<Partial<Record<DocumentPlace, DocumentPlace>>> = {
45
+ namedPathItems: "pathItem",
46
+ namedCallbacks: "callback",
47
+ callback: "pathItem",
48
+ namedOperations: "operation",
49
+ };
50
+
51
+ function nextPlace(place: DocumentPlace, segment: string): DocumentPlace {
52
+ const named = NAMED[place];
53
+ if (named !== undefined) {
54
+ return named;
55
+ }
56
+ if (place === "pathItem" && OPERATION_KEYS.has(segment)) {
57
+ return "operation";
58
+ }
59
+ const fields = FIELDS[place] ?? {};
60
+ if (Object.hasOwn(fields, segment)) {
61
+ return fields[segment] as DocumentPlace;
62
+ }
63
+ return place === "root" ? "outside" : "other";
64
+ }
65
+
66
+ const TERMINAL_PLACES: ReadonlySet<DocumentPlace> = new Set(["outside", "input", "other"]);
67
+
68
+ /** The place the segments of a pointer (after `#`) lead to; the walk stops at a terminal place. */
69
+ export function placeOf(segments: Iterable<string>): DocumentPlace {
70
+ let place: DocumentPlace = "root";
71
+ for (const segment of segments) {
72
+ place = nextPlace(place, segment);
73
+ if (TERMINAL_PLACES.has(place)) {
74
+ return place;
75
+ }
76
+ }
77
+ return place;
78
+ }
@@ -21,6 +21,11 @@ export const FIX = {
21
21
  ARRAY_LENGTH_TUPLES: "array-length-tuples",
22
22
  /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
23
23
  DEDUPE_ENUM_NAMES: "dedupe-enum-names",
24
+ /**
25
+ * `--default-non-nullable` finds parameters and request bodies by the document's structure, not
26
+ * by the words `parameters` and `requestBody` anywhere in a schema's location.
27
+ */
28
+ DEFAULT_INPUT_LOCATIONS: "default-input-locations",
24
29
  /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
25
30
  DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
26
31
  /**
@@ -33,8 +38,8 @@ export const FIX = {
33
38
  EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
34
39
  /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
35
40
  NULLABLE_ENUMS: "nullable-enums",
36
- /** A parameter with `content` instead of `schema` is typed by the schema of its media type. */
37
- PARAMETER_CONTENT: "parameter-content",
41
+ /** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */
42
+ PARAMETER_HEADER_CONTENT: "parameter-header-content",
38
43
  /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
39
44
  PATH_PARAM_TYPE_NAMES: "path-param-type-names",
40
45
  /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
@@ -111,6 +116,7 @@ export interface OutputFixRequirement {
111
116
  readonly option:
112
117
  | "arrayLength"
113
118
  | "dedupeEnums"
119
+ | "defaultNonNullable"
114
120
  | "enum"
115
121
  | "pathParamsAsTypes"
116
122
  | "rootTypes"
@@ -129,6 +135,7 @@ const NO_SCHEMA_PREFIX = {
129
135
  const REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {
130
136
  [FIX.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
131
137
  [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
138
+ [FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: "defaultNonNullable", flag: "--default-non-nullable" }],
132
139
  [FIX.NULLABLE_ENUMS]: [ENUM],
133
140
  [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }],
134
141
  [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Text from a document or a project (a path key, an `operationId`, a file name) reaches the
3
+ * terminal and CI job logs. A line break in it starts a new line that CI reads as a command
4
+ * (`::error …` in GitHub Actions, `##vso[…]` in Azure Pipelines), and an escape sequence moves
5
+ * the cursor or erases lines, so it can forge or hide output. Each such character is shown as an
6
+ * escape instead (`\n`, `\u001b`), so one message stays one line and shows what the text holds.
7
+ */
8
+
9
+ /**
10
+ * The code points shown as escapes: C0 controls but the tab, DEL and C1 controls, the Unicode
11
+ * line and paragraph separators, and the bidirectional controls, which reorder how a terminal
12
+ * shows the text around them.
13
+ */
14
+ const CONTROL_RANGES: readonly (readonly [number, number])[] = [
15
+ [0x00, 0x08],
16
+ [0x0a, 0x1f],
17
+ [0x7f, 0x9f],
18
+ [0x2028, 0x2029],
19
+ [0x202a, 0x202e],
20
+ [0x2066, 0x2069],
21
+ ];
22
+
23
+ const SHORT_ESCAPES: Readonly<Record<string, string>> = { "\n": "\\n", "\r": "\\r" };
24
+ const HEX_DIGITS = 4;
25
+ const HEX_RADIX = 16;
26
+
27
+ function isControl(codePoint: number): boolean {
28
+ return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);
29
+ }
30
+
31
+ function escapeOf(character: string, codePoint: number): string {
32
+ const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, "0");
33
+ return SHORT_ESCAPES[character] ?? `\\u${hex}`;
34
+ }
35
+
36
+ /** The text with every control character shown as an escape, so it prints as one plain line. */
37
+ export function terminalSafeText(text: string): string {
38
+ let shown = "";
39
+ for (const character of text) {
40
+ const codePoint = character.codePointAt(0) ?? 0;
41
+ shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;
42
+ }
43
+ return shown;
44
+ }
@@ -7,6 +7,7 @@
7
7
  /** Every warning code. */
8
8
  export const WARNING_CODES = {
9
9
  CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
10
+ CLI_OUTPUT_IGNORED: "CLI_OUTPUT_IGNORED",
10
11
  CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
11
12
  DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
12
13
  DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",