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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/CHANGELOG.md +1972 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  15. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  16. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  17. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +48 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  27. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  29. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  31. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  32. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  33. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  34. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  35. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  36. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  37. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  38. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  39. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  41. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
  43. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
  45. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
  47. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
  49. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  51. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/ref-holders.mjs +53 -12
  53. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  55. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  56. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  57. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  58. package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
  59. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
  61. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
  63. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  64. package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
  65. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  66. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  67. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  68. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  69. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  70. package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
  71. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  72. package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
  73. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  74. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  75. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  76. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  77. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  78. package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
  79. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  80. package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
  81. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  82. package/dist/api/default-ports.cjs +14 -2
  83. package/dist/api/default-ports.cjs.map +1 -1
  84. package/dist/api/default-ports.mjs +14 -2
  85. package/dist/api/default-ports.mjs.map +1 -1
  86. package/dist/api/discriminator-enum-parent.cjs +2 -2
  87. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  88. package/dist/api/discriminator-enum-parent.mjs +3 -3
  89. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  90. package/dist/api/discriminator-other-owners.cjs +5 -3
  91. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  92. package/dist/api/discriminator-other-owners.mjs +5 -3
  93. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  94. package/dist/api/discriminator-patch.cjs +5 -1
  95. package/dist/api/discriminator-patch.cjs.map +1 -1
  96. package/dist/api/discriminator-patch.mjs +5 -1
  97. package/dist/api/discriminator-patch.mjs.map +1 -1
  98. package/dist/api/discriminator-scan.cjs +15 -8
  99. package/dist/api/discriminator-scan.cjs.map +1 -1
  100. package/dist/api/discriminator-scan.mjs +15 -8
  101. package/dist/api/discriminator-scan.mjs.map +1 -1
  102. package/dist/api/document-refs.cjs +16 -1
  103. package/dist/api/document-refs.cjs.map +1 -1
  104. package/dist/api/document-refs.mjs +16 -1
  105. package/dist/api/document-refs.mjs.map +1 -1
  106. package/dist/api/document-run.cjs +6 -12
  107. package/dist/api/document-run.cjs.map +1 -1
  108. package/dist/api/document-run.mjs +6 -12
  109. package/dist/api/document-run.mjs.map +1 -1
  110. package/dist/api/legacy-utils.cjs.map +1 -1
  111. package/dist/api/legacy-utils.mjs.map +1 -1
  112. package/dist/api/openapi-ts.cjs +9 -6
  113. package/dist/api/openapi-ts.cjs.map +1 -1
  114. package/dist/api/openapi-ts.mjs +10 -8
  115. package/dist/api/openapi-ts.mjs.map +1 -1
  116. package/dist/api/ref-limit-options.cjs +63 -0
  117. package/dist/api/ref-limit-options.cjs.map +1 -0
  118. package/dist/api/ref-limit-options.mjs +57 -0
  119. package/dist/api/ref-limit-options.mjs.map +1 -0
  120. package/dist/api/schema-callbacks.cjs +36 -12
  121. package/dist/api/schema-callbacks.cjs.map +1 -1
  122. package/dist/api/schema-callbacks.mjs +36 -12
  123. package/dist/api/schema-callbacks.mjs.map +1 -1
  124. package/dist/api/transform-context.cjs +7 -3
  125. package/dist/api/transform-context.cjs.map +1 -1
  126. package/dist/api/transform-context.mjs +7 -3
  127. package/dist/api/transform-context.mjs.map +1 -1
  128. package/dist/api/transform-schema.cjs +47 -10
  129. package/dist/api/transform-schema.cjs.map +1 -1
  130. package/dist/api/transform-schema.mjs +48 -11
  131. package/dist/api/transform-schema.mjs.map +1 -1
  132. package/dist/application/print/text-writer.cjs +10 -3
  133. package/dist/application/print/text-writer.cjs.map +1 -1
  134. package/dist/application/print/text-writer.mjs +10 -3
  135. package/dist/application/print/text-writer.mjs.map +1 -1
  136. package/dist/application/stack-overflow.cjs +2 -1
  137. package/dist/application/stack-overflow.cjs.map +1 -1
  138. package/dist/application/stack-overflow.mjs +2 -1
  139. package/dist/application/stack-overflow.mjs.map +1 -1
  140. package/dist/application/transform/declared-value-types.cjs +36 -0
  141. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  142. package/dist/application/transform/declared-value-types.mjs +34 -0
  143. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  144. package/dist/application/transform/document/components.cjs +1 -1
  145. package/dist/application/transform/document/components.cjs.map +1 -1
  146. package/dist/application/transform/document/components.mjs +2 -2
  147. package/dist/application/transform/document/components.mjs.map +1 -1
  148. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  149. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  150. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  151. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  152. package/dist/application/transform/document/defs-root.cjs +1 -1
  153. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  154. package/dist/application/transform/document/defs-root.mjs +2 -2
  155. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  156. package/dist/application/transform/document/document.cjs +7 -2
  157. package/dist/application/transform/document/document.cjs.map +1 -1
  158. package/dist/application/transform/document/document.mjs +6 -3
  159. package/dist/application/transform/document/document.mjs.map +1 -1
  160. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  161. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  162. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  163. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  164. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  165. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  166. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  167. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  168. package/dist/application/transform/document/global-type-references.cjs +1 -0
  169. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  170. package/dist/application/transform/document/global-type-references.mjs +1 -1
  171. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  172. package/dist/application/transform/document/header.cjs +11 -3
  173. package/dist/application/transform/document/header.cjs.map +1 -1
  174. package/dist/application/transform/document/header.mjs +10 -2
  175. package/dist/application/transform/document/header.mjs.map +1 -1
  176. package/dist/application/transform/document/media-type.cjs +2 -2
  177. package/dist/application/transform/document/media-type.cjs.map +1 -1
  178. package/dist/application/transform/document/media-type.mjs +3 -3
  179. package/dist/application/transform/document/media-type.mjs.map +1 -1
  180. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  181. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  182. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  183. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  184. package/dist/application/transform/document/operation.cjs +1 -1
  185. package/dist/application/transform/document/operation.cjs.map +1 -1
  186. package/dist/application/transform/document/operation.mjs +2 -2
  187. package/dist/application/transform/document/operation.mjs.map +1 -1
  188. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  189. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  190. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  191. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  192. package/dist/application/transform/document/parameter.cjs +12 -4
  193. package/dist/application/transform/document/parameter.cjs.map +1 -1
  194. package/dist/application/transform/document/parameter.mjs +13 -5
  195. package/dist/application/transform/document/parameter.mjs.map +1 -1
  196. package/dist/application/transform/document/parameters.cjs +29 -34
  197. package/dist/application/transform/document/parameters.cjs.map +1 -1
  198. package/dist/application/transform/document/parameters.mjs +29 -34
  199. package/dist/application/transform/document/parameters.mjs.map +1 -1
  200. package/dist/application/transform/document/path-item.cjs +15 -17
  201. package/dist/application/transform/document/path-item.cjs.map +1 -1
  202. package/dist/application/transform/document/path-item.mjs +15 -19
  203. package/dist/application/transform/document/path-item.mjs.map +1 -1
  204. package/dist/application/transform/document/path-template-key.cjs +84 -0
  205. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  206. package/dist/application/transform/document/path-template-key.mjs +79 -0
  207. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  208. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  209. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  210. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  211. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  212. package/dist/application/transform/document/paths-enum.cjs +8 -6
  213. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  214. package/dist/application/transform/document/paths-enum.mjs +8 -7
  215. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  216. package/dist/application/transform/document/paths.cjs +43 -67
  217. package/dist/application/transform/document/paths.cjs.map +1 -1
  218. package/dist/application/transform/document/paths.mjs +42 -68
  219. package/dist/application/transform/document/paths.mjs.map +1 -1
  220. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  221. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  222. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  223. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  224. package/dist/application/transform/document/request-body.cjs +1 -1
  225. package/dist/application/transform/document/request-body.cjs.map +1 -1
  226. package/dist/application/transform/document/request-body.mjs +2 -2
  227. package/dist/application/transform/document/request-body.mjs.map +1 -1
  228. package/dist/application/transform/document/response.cjs +2 -2
  229. package/dist/application/transform/document/response.cjs.map +1 -1
  230. package/dist/application/transform/document/response.mjs +3 -3
  231. package/dist/application/transform/document/response.mjs.map +1 -1
  232. package/dist/application/transform/document/responses.cjs +1 -1
  233. package/dist/application/transform/document/responses.cjs.map +1 -1
  234. package/dist/application/transform/document/responses.mjs +2 -2
  235. package/dist/application/transform/document/responses.mjs.map +1 -1
  236. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  237. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  238. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  239. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  240. package/dist/application/transform/document/type-resolution.cjs +3 -1
  241. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  242. package/dist/application/transform/document/type-resolution.mjs +3 -1
  243. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  244. package/dist/application/transform/document/webhooks.cjs +10 -3
  245. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  246. package/dist/application/transform/document/webhooks.mjs +10 -3
  247. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  248. package/dist/application/transform/footer/document-footer.cjs +16 -5
  249. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  250. package/dist/application/transform/footer/document-footer.mjs +16 -5
  251. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  252. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  253. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  254. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  255. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  256. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  257. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  258. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  259. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  260. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  261. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  262. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  263. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  264. package/dist/application/transform/helper-types.cjs +3 -3
  265. package/dist/application/transform/helper-types.cjs.map +1 -1
  266. package/dist/application/transform/helper-types.mjs +3 -3
  267. package/dist/application/transform/helper-types.mjs.map +1 -1
  268. package/dist/application/transform/numbered-names.cjs +9 -0
  269. package/dist/application/transform/numbered-names.cjs.map +1 -1
  270. package/dist/application/transform/numbered-names.mjs +9 -1
  271. package/dist/application/transform/numbered-names.mjs.map +1 -1
  272. package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
  273. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  274. package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
  275. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  276. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  277. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  278. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  279. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  280. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  281. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  282. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  283. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  284. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  285. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  286. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  287. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  288. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  289. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  290. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  291. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  292. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  293. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  294. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  295. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  296. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  297. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  298. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  299. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  300. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  301. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  302. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  303. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  304. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  305. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  306. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  307. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  308. package/dist/application/transform/ref-type.cjs +2 -1
  309. package/dist/application/transform/ref-type.cjs.map +1 -1
  310. package/dist/application/transform/ref-type.mjs +2 -1
  311. package/dist/application/transform/ref-type.mjs.map +1 -1
  312. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  313. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  314. package/dist/application/transform/schema/composition-type.cjs +1 -1
  315. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  316. package/dist/application/transform/schema/composition-type.mjs +2 -2
  317. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  318. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  319. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  320. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  321. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  322. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  323. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  324. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  325. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  326. package/dist/application/transform/schema/input-location.cjs +23 -0
  327. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  328. package/dist/application/transform/schema/input-location.mjs +21 -0
  329. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  330. package/dist/application/transform/schema/object-type.cjs +18 -8
  331. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  332. package/dist/application/transform/schema/object-type.mjs +19 -9
  333. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  334. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  335. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  336. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  337. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  338. package/dist/application/transform/schema/schema-transform.cjs +6 -3
  339. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  340. package/dist/application/transform/schema/schema-transform.mjs +6 -3
  341. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  342. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  343. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  344. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  345. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  346. package/dist/application/transform/schema-comment.cjs +5 -1
  347. package/dist/application/transform/schema-comment.cjs.map +1 -1
  348. package/dist/application/transform/schema-comment.mjs +5 -1
  349. package/dist/application/transform/schema-comment.mjs.map +1 -1
  350. package/dist/cli/api-logger.cjs +13 -0
  351. package/dist/cli/api-logger.cjs.map +1 -0
  352. package/dist/cli/api-logger.mjs +11 -0
  353. package/dist/cli/api-logger.mjs.map +1 -0
  354. package/dist/cli/api-settings.cjs +57 -9
  355. package/dist/cli/api-settings.cjs.map +1 -1
  356. package/dist/cli/api-settings.mjs +56 -11
  357. package/dist/cli/api-settings.mjs.map +1 -1
  358. package/dist/cli/api-writes.cjs +72 -0
  359. package/dist/cli/api-writes.cjs.map +1 -0
  360. package/dist/cli/api-writes.mjs +69 -0
  361. package/dist/cli/api-writes.mjs.map +1 -0
  362. package/dist/cli/cli-arguments.cjs +51 -11
  363. package/dist/cli/cli-arguments.cjs.map +1 -1
  364. package/dist/cli/cli-arguments.mjs +51 -11
  365. package/dist/cli/cli-arguments.mjs.map +1 -1
  366. package/dist/cli/cli-errors.cjs +29 -1
  367. package/dist/cli/cli-errors.cjs.map +1 -1
  368. package/dist/cli/cli-errors.mjs +29 -2
  369. package/dist/cli/cli-errors.mjs.map +1 -1
  370. package/dist/cli/cli-output.cjs +111 -4
  371. package/dist/cli/cli-output.cjs.map +1 -1
  372. package/dist/cli/cli-output.mjs +104 -5
  373. package/dist/cli/cli-output.mjs.map +1 -1
  374. package/dist/cli/main.cjs +13 -3
  375. package/dist/cli/main.cjs.map +1 -1
  376. package/dist/cli/main.mjs +14 -4
  377. package/dist/cli/main.mjs.map +1 -1
  378. package/dist/cli/redocly-apis.cjs +94 -37
  379. package/dist/cli/redocly-apis.cjs.map +1 -1
  380. package/dist/cli/redocly-apis.mjs +99 -42
  381. package/dist/cli/redocly-apis.mjs.map +1 -1
  382. package/dist/cli/ref-limits.cjs +15 -1
  383. package/dist/cli/ref-limits.cjs.map +1 -1
  384. package/dist/cli/ref-limits.mjs +15 -2
  385. package/dist/cli/ref-limits.mjs.map +1 -1
  386. package/dist/cli/run-cli.cjs +37 -14
  387. package/dist/cli/run-cli.cjs.map +1 -1
  388. package/dist/cli/run-cli.mjs +39 -16
  389. package/dist/cli/run-cli.mjs.map +1 -1
  390. package/dist/domain/append-all.cjs +10 -0
  391. package/dist/domain/append-all.cjs.map +1 -0
  392. package/dist/domain/append-all.mjs +8 -0
  393. package/dist/domain/append-all.mjs.map +1 -0
  394. package/dist/domain/cause-secrets.cjs +52 -0
  395. package/dist/domain/cause-secrets.cjs.map +1 -0
  396. package/dist/domain/cause-secrets.mjs +50 -0
  397. package/dist/domain/cause-secrets.mjs.map +1 -0
  398. package/dist/domain/errors.cjs +11 -3
  399. package/dist/domain/errors.cjs.map +1 -1
  400. package/dist/domain/errors.mjs +11 -3
  401. package/dist/domain/errors.mjs.map +1 -1
  402. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  403. package/dist/domain/ir/identifier-text.mjs +1 -1
  404. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  405. package/dist/domain/ir/ir-shape.cjs +187 -0
  406. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  407. package/dist/domain/ir/ir-shape.mjs +184 -0
  408. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  409. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  410. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  411. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  412. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  413. package/dist/domain/location-text.cjs +9 -0
  414. package/dist/domain/location-text.cjs.map +1 -0
  415. package/dist/domain/location-text.mjs +7 -0
  416. package/dist/domain/location-text.mjs.map +1 -0
  417. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  418. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  419. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  420. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  421. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  422. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  423. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  424. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  425. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  426. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  427. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  428. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  429. package/dist/domain/openapi/document-places.cjs +55 -0
  430. package/dist/domain/openapi/document-places.cjs.map +1 -0
  431. package/dist/domain/openapi/document-places.mjs +53 -0
  432. package/dist/domain/openapi/document-places.mjs.map +1 -0
  433. package/dist/domain/openapi/json-pointer.cjs +43 -1
  434. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  435. package/dist/domain/openapi/json-pointer.mjs +40 -2
  436. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  437. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  438. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  439. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  440. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  441. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  442. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  443. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  444. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  445. package/dist/domain/output-fixes.cjs +20 -0
  446. package/dist/domain/output-fixes.cjs.map +1 -1
  447. package/dist/domain/output-fixes.mjs +20 -0
  448. package/dist/domain/output-fixes.mjs.map +1 -1
  449. package/dist/domain/terminal-text.cjs +31 -0
  450. package/dist/domain/terminal-text.cjs.map +1 -0
  451. package/dist/domain/terminal-text.mjs +29 -0
  452. package/dist/domain/terminal-text.mjs.map +1 -0
  453. package/dist/domain/url-secrets.cjs +48 -0
  454. package/dist/domain/url-secrets.cjs.map +1 -0
  455. package/dist/domain/url-secrets.mjs +45 -0
  456. package/dist/domain/url-secrets.mjs.map +1 -0
  457. package/dist/domain/warnings.cjs +1 -0
  458. package/dist/domain/warnings.cjs.map +1 -1
  459. package/dist/domain/warnings.mjs +1 -0
  460. package/dist/domain/warnings.mjs.map +1 -1
  461. package/dist/index.d.cts +46 -20
  462. package/dist/index.d.mts +46 -20
  463. package/dist/index.d.ts +46 -20
  464. package/package.json +4 -5
  465. package/src/adapters/node-file-system/file-claims.ts +138 -0
  466. package/src/adapters/node-file-system/file-identity.ts +137 -0
  467. package/src/adapters/node-file-system/node-file-system.ts +158 -18
  468. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  469. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
  470. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  471. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  472. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  473. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  474. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  475. package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
  476. package/src/adapters/redocly-loader/ref-access.ts +51 -4
  477. package/src/adapters/redocly-loader/ref-holders.ts +76 -15
  478. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  479. package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
  480. package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
  481. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  482. package/src/adapters/redocly-loader/schema-source.ts +35 -11
  483. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  484. package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
  485. package/src/api/default-ports.ts +33 -4
  486. package/src/api/discriminator-enum-parent.ts +3 -3
  487. package/src/api/discriminator-other-owners.ts +5 -3
  488. package/src/api/discriminator-patch.ts +5 -1
  489. package/src/api/discriminator-scan.ts +16 -8
  490. package/src/api/document-refs.ts +29 -1
  491. package/src/api/document-run.ts +10 -19
  492. package/src/api/legacy-utils.ts +5 -1
  493. package/src/api/openapi-ts.ts +26 -8
  494. package/src/api/ref-limit-options.ts +76 -0
  495. package/src/api/run-context.ts +3 -0
  496. package/src/api/schema-callbacks.ts +60 -17
  497. package/src/api/transform-context.ts +7 -3
  498. package/src/api/transform-schema.ts +79 -12
  499. package/src/application/ports/file-system.ts +47 -0
  500. package/src/application/ports/schema-loader.ts +11 -1
  501. package/src/application/print/text-writer.ts +10 -3
  502. package/src/application/stack-overflow.ts +9 -5
  503. package/src/application/transform/declared-value-types.ts +42 -0
  504. package/src/application/transform/document/components.ts +2 -2
  505. package/src/application/transform/document/declared-type-names.ts +36 -0
  506. package/src/application/transform/document/defs-root.ts +2 -2
  507. package/src/application/transform/document/document.ts +8 -5
  508. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  509. package/src/application/transform/document/exploded-query-values.ts +88 -0
  510. package/src/application/transform/document/global-type-references.ts +1 -1
  511. package/src/application/transform/document/header.ts +25 -5
  512. package/src/application/transform/document/media-type.ts +4 -3
  513. package/src/application/transform/document/operation-keys-written.ts +27 -0
  514. package/src/application/transform/document/operation.ts +2 -2
  515. package/src/application/transform/document/parameter-entries.ts +70 -0
  516. package/src/application/transform/document/parameter.ts +21 -9
  517. package/src/application/transform/document/parameters.ts +56 -66
  518. package/src/application/transform/document/path-item.ts +16 -34
  519. package/src/application/transform/document/path-template-key.ts +152 -0
  520. package/src/application/transform/document/path-template-refs.ts +106 -0
  521. package/src/application/transform/document/paths-enum.ts +24 -10
  522. package/src/application/transform/document/paths.ts +59 -125
  523. package/src/application/transform/document/referenced-parameter.ts +146 -0
  524. package/src/application/transform/document/request-body.ts +2 -2
  525. package/src/application/transform/document/response.ts +3 -3
  526. package/src/application/transform/document/responses.ts +2 -2
  527. package/src/application/transform/document/root-type-aliases.ts +17 -38
  528. package/src/application/transform/document/type-resolution.ts +2 -1
  529. package/src/application/transform/document/webhooks.ts +19 -6
  530. package/src/application/transform/footer/document-footer.ts +36 -9
  531. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  532. package/src/application/transform/footer/operation-keys.ts +28 -0
  533. package/src/application/transform/footer/type-evaluation.ts +4 -4
  534. package/src/application/transform/helper-types.ts +8 -7
  535. package/src/application/transform/numbered-names.ts +15 -0
  536. package/src/application/transform/ref-pointer/generated-location.ts +3 -3
  537. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  538. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  539. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  540. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  541. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  542. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  543. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  544. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  545. package/src/application/transform/ref-type.ts +2 -1
  546. package/src/application/transform/schema/access-flags.ts +5 -2
  547. package/src/application/transform/schema/composition-type.ts +2 -2
  548. package/src/application/transform/schema/enum-rule.ts +6 -2
  549. package/src/application/transform/schema/index-signature-type.ts +31 -0
  550. package/src/application/transform/schema/input-location.ts +35 -0
  551. package/src/application/transform/schema/object-type.ts +22 -12
  552. package/src/application/transform/schema/ref-siblings.ts +76 -0
  553. package/src/application/transform/schema/schema-context.ts +3 -0
  554. package/src/application/transform/schema/schema-transform.ts +6 -3
  555. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  556. package/src/application/transform/schema-comment.ts +5 -1
  557. package/src/application/transform/transform-context.ts +5 -0
  558. package/src/cli/api-logger.ts +17 -0
  559. package/src/cli/api-settings.ts +80 -13
  560. package/src/cli/api-writes.ts +117 -0
  561. package/src/cli/cli-arguments.ts +90 -14
  562. package/src/cli/cli-dependencies.ts +26 -4
  563. package/src/cli/cli-errors.ts +42 -1
  564. package/src/cli/cli-output.ts +195 -15
  565. package/src/cli/main.ts +14 -5
  566. package/src/cli/redocly-apis.ts +177 -52
  567. package/src/cli/ref-limits.ts +21 -2
  568. package/src/cli/run-cli.ts +76 -15
  569. package/src/domain/append-all.ts +10 -0
  570. package/src/domain/cause-secrets.ts +86 -0
  571. package/src/domain/errors.ts +16 -5
  572. package/src/domain/ir/identifier-text.ts +6 -5
  573. package/src/domain/ir/ir-shape.ts +299 -0
  574. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  575. package/src/domain/location-text.ts +12 -0
  576. package/src/domain/openapi/alias-expansion.ts +4 -1
  577. package/src/domain/openapi/discriminated-union.ts +6 -4
  578. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  579. package/src/domain/openapi/document-object.ts +2 -0
  580. package/src/domain/openapi/document-places.ts +78 -0
  581. package/src/domain/openapi/json-pointer.ts +96 -7
  582. package/src/domain/openapi/schema-dialect.ts +22 -0
  583. package/src/domain/openapi/unsupported-features.ts +2 -2
  584. package/src/domain/output-fixes.ts +28 -2
  585. package/src/domain/terminal-text.ts +44 -0
  586. package/src/domain/url-secrets.ts +72 -0
  587. package/src/domain/warnings.ts +1 -0
  588. package/src/types/generator-options.ts +1 -1
  589. package/dist/cli/main.d.cts +0 -2
  590. package/dist/cli/main.d.mts +0 -2
  591. package/dist/cli/main.d.ts +0 -2
  592. package/dist/domain/url-credentials.cjs +0 -10
  593. package/dist/domain/url-credentials.cjs.map +0 -1
  594. package/dist/domain/url-credentials.mjs +0 -8
  595. package/dist/domain/url-credentials.mjs.map +0 -1
  596. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"unsupported-features.cjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { createRef, parseRefPointer } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = createRef([...segments, String(index)]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":["parseRefPointer","createRef","QUERYSTRING_LOCATION","pathItemOperations"],"mappings":"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"}
1
+ {"version":3,"file":"unsupported-features.cjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { appendPointer, parseRefPointer, ROOT_POINTER } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = appendPointer(ROOT_POINTER, [...segments, index]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":["parseRefPointer","appendPointer","ROOT_POINTER","QUERYSTRING_LOCATION","pathItemOperations"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { createRef, parseRefPointer } from './json-pointer.mjs';
1
+ import { appendPointer, ROOT_POINTER, parseRefPointer } from './json-pointer.mjs';
2
2
  import { QUERYSTRING_LOCATION } from './parameter-object.mjs';
3
3
  import { pathItemOperations } from './path-item-object.mjs';
4
4
 
@@ -29,7 +29,7 @@ function locatedParameters(document, parameters, segments) {
29
29
  }
30
30
  return parameters.flatMap((entry, index) => {
31
31
  const parameter = resolveLocal(document, entry);
32
- const pointer = createRef([...segments, String(index)]);
32
+ const pointer = appendPointer(ROOT_POINTER, [...segments, index]);
33
33
  return isObject(parameter) ? [{ pointer, parameter }] : [];
34
34
  });
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"unsupported-features.mjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { createRef, parseRefPointer } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = createRef([...segments, String(index)]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":[],"mappings":";;;;AAUO,MAAM,kBAAA,GAAqB;AAAA,EAChC,yBAAA,EAA2B;AAC7B;AAUA,MAAM,cAAA,GAAiB,OAAA;AACvB,MAAM,gBAAA,GAAmB,IAAA;AAIzB,SAAS,SAAS,KAAA,EAAqC;AACrD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGA,SAAS,YAAA,CAAa,UAAsB,KAAA,EAAyB;AACnE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,KAAK,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAgB,QAAA;AACpB,EAAA,KAAA,MAAW,OAAA,IAAW,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,EAAG;AACjD,IAAA,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAK,IAAA,CAAoB,OAAO,CAAA,GAAI,MAAA;AAAA,EACjF;AACA,EAAA,OAAO,IAAA,IAAQ,IAAA;AACjB;AAQA,SAAS,iBAAA,CACP,QAAA,EACA,UAAA,EACA,QAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,UAAU,CAAC,GAAG,UAAU,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AACtD,IAAA,OAAO,QAAA,CAAS,SAAS,CAAA,GAAI,CAAC,EAAE,OAAA,EAAS,SAAA,EAAW,CAAA,GAAI,EAAC;AAAA,EAC3D,CAAC,CAAA;AACH;AAGA,SAAS,gBAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAChD,EAAA,KAAA,MAAW,WAAW,CAAC,GAAG,MAAA,EAAQ,GAAG,GAAG,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAC,IAAI,OAAO,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC3B;AAGA,SAAS,oBAAoB,UAAA,EAAmD;AAC9E,EAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAC,EAAE,SAAA,EAAU,KAAM,SAAA,CAAU,EAAA,KAAO,cAAc,CAAA;AACnF,EAAA,OAAO,WACH,UAAA,CACG,MAAA,CAAO,CAAC,EAAE,SAAA,OAAgB,SAAA,CAAU,EAAA,KAAO,oBAAoB,CAAA,CAC/D,IAAI,CAAC,EAAE,SAAQ,KAAM,OAAO,IAC/B,EAAC;AACP;AAGA,SAAS,gBAAA,CACP,QAAA,EACA,QAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAA,EAAU,QAAA,CAAS,YAAY,CAAC,GAAG,QAAA,EAAU,YAAY,CAAC,CAAA;AAC3F,EAAA,OAAO,kBAAA,CAAmB,QAA0B,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACvE,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,oBAAoB,CAAC,GAAG,UAAU,GAAG,KAAA,CAAM,UAAU,YAAY,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,QAAA,EAAU,SAAA,CAAU,YAAY,iBAAiB,CAAA;AAC/E,IAAA,OAAO,mBAAA,CAAoB,gBAAA,CAAiB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAEA,SAAS,iBAAA,CACP,QAAA,EACA,SAAA,EACA,IAAA,EACU;AACV,EAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,CAAC,GAAA,EAAK,QAAQ,CAAA,KACtD,SAAS,QAAQ,CAAA,GAAI,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI;AAAC,GAC/E;AACF;AAMO,SAAS,wBAAwB,QAAA,EAA4C;AAClF,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,aAAa,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA,CAAS,aAAa,EAAC;AAC1E,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAG,iBAAA,CAAkB,QAAA,EAAU,SAAS,KAAA,EAAO,CAAC,OAAO,CAAC,CAAA;AAAA,IACxD,GAAG,iBAAA,CAAkB,QAAA,EAAU,SAAS,QAAA,EAAU,CAAC,UAAU,CAAC,CAAA;AAAA,IAC9D,GAAG,kBAAkB,QAAA,EAAU,UAAA,CAAW,WAAW,CAAC,YAAA,EAAc,WAAW,CAAC;AAAA,GAClF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IAC9C,SAAS,kBAAA,CAAmB,yBAAA;AAAA,IAC5B;AAAA,GACF,CAAE,CAAA;AACJ;;"}
1
+ {"version":3,"file":"unsupported-features.mjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { appendPointer, parseRefPointer, ROOT_POINTER } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = appendPointer(ROOT_POINTER, [...segments, index]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":[],"mappings":"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"}
@@ -17,6 +17,11 @@ const FIX = {
17
17
  ARRAY_LENGTH_TUPLES: "array-length-tuples",
18
18
  /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
19
19
  DEDUPE_ENUM_NAMES: "dedupe-enum-names",
20
+ /**
21
+ * `--default-non-nullable` finds parameters and request bodies by the document's structure, not
22
+ * by the words `parameters` and `requestBody` anywhere in a schema's location.
23
+ */
24
+ DEFAULT_INPUT_LOCATIONS: "default-input-locations",
20
25
  /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
21
26
  DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
22
27
  /**
@@ -29,6 +34,8 @@ const FIX = {
29
34
  EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
30
35
  /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
31
36
  NULLABLE_ENUMS: "nullable-enums",
37
+ /** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */
38
+ PARAMETER_HEADER_CONTENT: "parameter-header-content",
32
39
  /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
33
40
  PATH_PARAM_TYPE_NAMES: "path-param-type-names",
34
41
  /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
@@ -40,6 +47,11 @@ const FIX = {
40
47
  * points at, also where the original type compiles through an index signature.
41
48
  */
42
49
  REF_POINTERS: "ref-pointers",
50
+ /**
51
+ * OpenAPI 3.1 and 3.2: keywords next to a `$ref` (`required`, `properties`) apply too, so the
52
+ * type is the reference intersected with them. OpenAPI 3.0 ignores them, as its spec says.
53
+ */
54
+ REF_SIBLINGS: "ref-siblings",
43
55
  /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */
44
56
  ROOT_TYPE_NUMBERING: "root-type-numbering",
45
57
  /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */
@@ -52,6 +64,13 @@ function isOutputFixName(value) {
52
64
  return typeof value === "string" && KNOWN_NAMES.has(value);
53
65
  }
54
66
  function outputFixNamesOf(values) {
67
+ if (!Array.isArray(values)) {
68
+ throw new errors.OpenAPITypesafeError({
69
+ code: errors.ERROR_CODES.OPTION_FIX_UNKNOWN,
70
+ message: `The fix option must be a list of fix names, such as ["all"]. Got ${JSON.stringify(values)}.`,
71
+ details: { unknown: [values], known: [...KNOWN_NAMES] }
72
+ });
73
+ }
55
74
  const unknown = values.filter((value) => !isOutputFixName(value));
56
75
  if (unknown.length > 0) {
57
76
  const names = unknown.map((value) => JSON.stringify(value)).join(", ");
@@ -76,6 +95,7 @@ const NO_SCHEMA_PREFIX = {
76
95
  const REQUIREMENTS = {
77
96
  [FIX.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
78
97
  [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
98
+ [FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: "defaultNonNullable", flag: "--default-non-nullable" }],
79
99
  [FIX.NULLABLE_ENUMS]: [ENUM],
80
100
  [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }],
81
101
  [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX]
@@ -1 +1 @@
1
- {"version":3,"file":"output-fixes.cjs","sources":["../../src/domain/output-fixes.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"./errors.js\";\n\n/**\n * Opt-in fixes of the output of valid schemas (ADR-021). Each one changes only the cases it names;\n * without any, the output is the same as openapi-typescript 7.13 gives. In 2.0 they become the\n * default. The object names the fixes for this package's code; the public API is the `OutputFix`\n * union and the `OUTPUT_FIXES` list (ADR-021, amendment 1).\n */\nexport const FIX = {\n /** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */\n ALLOF_DISCRIMINATED_UNION: \"allof-discriminated-union\",\n /** An `allOf` member with only `required` makes those properties of the others required. */\n ALLOF_REQUIRED: \"allof-required\",\n /** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */\n ANYOF_ONEOF_DESCRIPTIONS: \"anyof-oneof-descriptions\",\n /** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */\n ANYOF_ONEOF_REQUIRED: \"anyof-oneof-required\",\n /** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */\n ANYOF_PROPERTIES: \"anyof-properties\",\n /** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */\n ARRAY_LENGTH_TUPLES: \"array-length-tuples\",\n /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */\n DEDUPE_ENUM_NAMES: \"dedupe-enum-names\",\n /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */\n DISCRIMINATOR_MEMBER_REQUIRED: \"discriminator-member-required\",\n /**\n * The value a discriminator member gets: one enum of every discriminator's values, a mapping\n * before the schema name, a schema's own mapping before an inherited one, none where the member\n * declares it, and with `--enum` a member of the owner's enum.\n */\n DISCRIMINATOR_VALUES: \"discriminator-values\",\n /** An exploded object query parameter's properties are keys of `query`, as they are sent. */\n EXPLODED_QUERY_OBJECTS: \"exploded-query-objects\",\n /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */\n NULLABLE_ENUMS: \"nullable-enums\",\n /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */\n PATH_PARAM_TYPE_NAMES: \"path-param-type-names\",\n /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */\n PREFIX_ITEMS: \"prefix-items\",\n /** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */\n READ_WRITE_REFS: \"read-write-refs\",\n /**\n * A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it\n * points at, also where the original type compiles through an index signature.\n */\n REF_POINTERS: \"ref-pointers\",\n /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */\n ROOT_TYPE_NUMBERING: \"root-type-numbering\",\n /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */\n UNEVALUATED_PROPERTIES: \"unevaluated-properties\",\n} as const;\n/** The name of one opt-in output fix. */\nexport type OutputFix = (typeof FIX)[keyof typeof FIX];\n\n/** Every fix of this version, in the order the docs list them. */\nexport const OUTPUT_FIXES: readonly OutputFix[] = Object.values(FIX);\n\n/** The name that turns on every fix of the installed version. */\nconst ALL_FIXES = \"all\";\n\n/** A name the `fix` option accepts: one fix, or `\"all\"`. */\nexport type OutputFixName = OutputFix | typeof ALL_FIXES;\n\nconst KNOWN_NAMES: ReadonlySet<string> = new Set<string>([...OUTPUT_FIXES, ALL_FIXES]);\n\nfunction isOutputFixName(value: unknown): value is OutputFixName {\n return typeof value === \"string\" && KNOWN_NAMES.has(value);\n}\n\n/** The fix names as given; fails with `OPTION_FIX_UNKNOWN` for any other value. */\nexport function outputFixNamesOf(values: readonly unknown[]): readonly OutputFixName[] {\n const unknown = values.filter((value) => !isOutputFixName(value));\n if (unknown.length > 0) {\n const names = unknown.map((value) => JSON.stringify(value)).join(\", \");\n const known = [...KNOWN_NAMES].join(\", \");\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message: `Unknown fix ${names}. Known fixes: ${known}.`,\n details: { unknown, known: [...KNOWN_NAMES] },\n });\n }\n return values as readonly OutputFixName[];\n}\n\n/** The fixes the names turn on; `all` stands for every fix of this version. */\nexport function resolveOutputFixes(names: readonly OutputFixName[]): ReadonlySet<OutputFix> {\n return new Set(names.flatMap((name) => (name === ALL_FIXES ? OUTPUT_FIXES : [name])));\n}\n\n/** A generator option that a fix works with; without it, the fix changes nothing (ADR-021). */\nexport interface OutputFixRequirement {\n readonly option:\n | \"arrayLength\"\n | \"dedupeEnums\"\n | \"enum\"\n | \"pathParamsAsTypes\"\n | \"rootTypes\"\n | \"rootTypesNoSchemaPrefix\";\n readonly flag: string;\n}\n\nconst ROOT_TYPES = { option: \"rootTypes\", flag: \"--root-types\" } as const;\nconst ENUM = { option: \"enum\", flag: \"--enum\" } as const;\nconst NO_SCHEMA_PREFIX = {\n option: \"rootTypesNoSchemaPrefix\",\n flag: \"--root-types-no-schema-prefix\",\n} as const;\n\n/** The options each fix needs, by fix name; `all` has none. */\nconst REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {\n [FIX.ARRAY_LENGTH_TUPLES]: [{ option: \"arrayLength\", flag: \"--array-length\" }],\n [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: \"dedupeEnums\", flag: \"--dedupe-enums\" }],\n [FIX.NULLABLE_ENUMS]: [ENUM],\n [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: \"pathParamsAsTypes\", flag: \"--path-params-as-types\" }],\n [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],\n};\n\nfunction describeRequirement(requirement: OutputFixRequirement): string {\n return `${requirement.option} (${requirement.flag})`;\n}\n\n/**\n * A notice for each fix given by name with an option it needs off; it names the options that are\n * off. `all` adds none: it means every fix that applies, so one that does not apply is expected.\n */\nexport function ineffectiveFixNotices(\n names: readonly OutputFixName[],\n isOptionOn: (option: OutputFixRequirement[\"option\"]) => boolean,\n): string[] {\n return [...new Set(names)].flatMap((name) => {\n const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));\n return missing.length === 0\n ? []\n : [`Fix \"${name}\" has no effect without ${missing.map(describeRequirement).join(\" and \")}`];\n });\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES"],"mappings":"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"}
1
+ {"version":3,"file":"output-fixes.cjs","sources":["../../src/domain/output-fixes.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"./errors.js\";\n\n/**\n * Opt-in fixes of the output of valid schemas (ADR-021). Each one changes only the cases it names;\n * without any, the output is the same as openapi-typescript 7.13 gives. In 2.0 they become the\n * default. The object names the fixes for this package's code; the public API is the `OutputFix`\n * union and the `OUTPUT_FIXES` list (ADR-021, amendment 1).\n */\nexport const FIX = {\n /** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */\n ALLOF_DISCRIMINATED_UNION: \"allof-discriminated-union\",\n /** An `allOf` member with only `required` makes those properties of the others required. */\n ALLOF_REQUIRED: \"allof-required\",\n /** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */\n ANYOF_ONEOF_DESCRIPTIONS: \"anyof-oneof-descriptions\",\n /** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */\n ANYOF_ONEOF_REQUIRED: \"anyof-oneof-required\",\n /** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */\n ANYOF_PROPERTIES: \"anyof-properties\",\n /** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */\n ARRAY_LENGTH_TUPLES: \"array-length-tuples\",\n /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */\n DEDUPE_ENUM_NAMES: \"dedupe-enum-names\",\n /**\n * `--default-non-nullable` finds parameters and request bodies by the document's structure, not\n * by the words `parameters` and `requestBody` anywhere in a schema's location.\n */\n DEFAULT_INPUT_LOCATIONS: \"default-input-locations\",\n /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */\n DISCRIMINATOR_MEMBER_REQUIRED: \"discriminator-member-required\",\n /**\n * The value a discriminator member gets: one enum of every discriminator's values, a mapping\n * before the schema name, a schema's own mapping before an inherited one, none where the member\n * declares it, and with `--enum` a member of the owner's enum.\n */\n DISCRIMINATOR_VALUES: \"discriminator-values\",\n /** An exploded object query parameter's properties are keys of `query`, as they are sent. */\n EXPLODED_QUERY_OBJECTS: \"exploded-query-objects\",\n /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */\n NULLABLE_ENUMS: \"nullable-enums\",\n /** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */\n PARAMETER_HEADER_CONTENT: \"parameter-header-content\",\n /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */\n PATH_PARAM_TYPE_NAMES: \"path-param-type-names\",\n /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */\n PREFIX_ITEMS: \"prefix-items\",\n /** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */\n READ_WRITE_REFS: \"read-write-refs\",\n /**\n * A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it\n * points at, also where the original type compiles through an index signature.\n */\n REF_POINTERS: \"ref-pointers\",\n /**\n * OpenAPI 3.1 and 3.2: keywords next to a `$ref` (`required`, `properties`) apply too, so the\n * type is the reference intersected with them. OpenAPI 3.0 ignores them, as its spec says.\n */\n REF_SIBLINGS: \"ref-siblings\",\n /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */\n ROOT_TYPE_NUMBERING: \"root-type-numbering\",\n /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */\n UNEVALUATED_PROPERTIES: \"unevaluated-properties\",\n} as const;\n/** The name of one opt-in output fix. */\nexport type OutputFix = (typeof FIX)[keyof typeof FIX];\n\n/** Every fix of this version, in the order the docs list them. */\nexport const OUTPUT_FIXES: readonly OutputFix[] = Object.values(FIX);\n\n/** The name that turns on every fix of the installed version. */\nconst ALL_FIXES = \"all\";\n\n/** A name the `fix` option accepts: one fix, or `\"all\"`. */\nexport type OutputFixName = OutputFix | typeof ALL_FIXES;\n\nconst KNOWN_NAMES: ReadonlySet<string> = new Set<string>([...OUTPUT_FIXES, ALL_FIXES]);\n\nfunction isOutputFixName(value: unknown): value is OutputFixName {\n return typeof value === \"string\" && KNOWN_NAMES.has(value);\n}\n\n/**\n * The fix names as given; fails with `OPTION_FIX_UNKNOWN` for any other value, and for a `fix`\n * option that is no list (`fix: \"all\"` from JavaScript), which must not be read letter by letter.\n */\nexport function outputFixNamesOf(values: unknown): readonly OutputFixName[] {\n if (!Array.isArray(values)) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message:\n 'The fix option must be a list of fix names, such as [\"all\"]. ' +\n `Got ${JSON.stringify(values)}.`,\n details: { unknown: [values], known: [...KNOWN_NAMES] },\n });\n }\n const unknown = values.filter((value) => !isOutputFixName(value));\n if (unknown.length > 0) {\n const names = unknown.map((value) => JSON.stringify(value)).join(\", \");\n const known = [...KNOWN_NAMES].join(\", \");\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message: `Unknown fix ${names}. Known fixes: ${known}.`,\n details: { unknown, known: [...KNOWN_NAMES] },\n });\n }\n return values as readonly OutputFixName[];\n}\n\n/** The fixes the names turn on; `all` stands for every fix of this version. */\nexport function resolveOutputFixes(names: readonly OutputFixName[]): ReadonlySet<OutputFix> {\n return new Set(names.flatMap((name) => (name === ALL_FIXES ? OUTPUT_FIXES : [name])));\n}\n\n/** A generator option that a fix works with; without it, the fix changes nothing (ADR-021). */\nexport interface OutputFixRequirement {\n readonly option:\n | \"arrayLength\"\n | \"dedupeEnums\"\n | \"defaultNonNullable\"\n | \"enum\"\n | \"pathParamsAsTypes\"\n | \"rootTypes\"\n | \"rootTypesNoSchemaPrefix\";\n readonly flag: string;\n}\n\nconst ROOT_TYPES = { option: \"rootTypes\", flag: \"--root-types\" } as const;\nconst ENUM = { option: \"enum\", flag: \"--enum\" } as const;\nconst NO_SCHEMA_PREFIX = {\n option: \"rootTypesNoSchemaPrefix\",\n flag: \"--root-types-no-schema-prefix\",\n} as const;\n\n/** The options each fix needs, by fix name; `all` has none. */\nconst REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {\n [FIX.ARRAY_LENGTH_TUPLES]: [{ option: \"arrayLength\", flag: \"--array-length\" }],\n [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: \"dedupeEnums\", flag: \"--dedupe-enums\" }],\n [FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: \"defaultNonNullable\", flag: \"--default-non-nullable\" }],\n [FIX.NULLABLE_ENUMS]: [ENUM],\n [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: \"pathParamsAsTypes\", flag: \"--path-params-as-types\" }],\n [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],\n};\n\nfunction describeRequirement(requirement: OutputFixRequirement): string {\n return `${requirement.option} (${requirement.flag})`;\n}\n\n/**\n * A notice for each fix given by name with an option it needs off; it names the options that are\n * off. `all` adds none: it means every fix that applies, so one that does not apply is expected.\n */\nexport function ineffectiveFixNotices(\n names: readonly OutputFixName[],\n isOptionOn: (option: OutputFixRequirement[\"option\"]) => boolean,\n): string[] {\n return [...new Set(names)].flatMap((name) => {\n const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));\n return missing.length === 0\n ? []\n : [`Fix \"${name}\" has no effect without ${missing.map(describeRequirement).join(\" and \")}`];\n });\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES"],"mappings":"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"}
@@ -15,6 +15,11 @@ const FIX = {
15
15
  ARRAY_LENGTH_TUPLES: "array-length-tuples",
16
16
  /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
17
17
  DEDUPE_ENUM_NAMES: "dedupe-enum-names",
18
+ /**
19
+ * `--default-non-nullable` finds parameters and request bodies by the document's structure, not
20
+ * by the words `parameters` and `requestBody` anywhere in a schema's location.
21
+ */
22
+ DEFAULT_INPUT_LOCATIONS: "default-input-locations",
18
23
  /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
19
24
  DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
20
25
  /**
@@ -27,6 +32,8 @@ const FIX = {
27
32
  EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
28
33
  /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
29
34
  NULLABLE_ENUMS: "nullable-enums",
35
+ /** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */
36
+ PARAMETER_HEADER_CONTENT: "parameter-header-content",
30
37
  /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
31
38
  PATH_PARAM_TYPE_NAMES: "path-param-type-names",
32
39
  /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
@@ -38,6 +45,11 @@ const FIX = {
38
45
  * points at, also where the original type compiles through an index signature.
39
46
  */
40
47
  REF_POINTERS: "ref-pointers",
48
+ /**
49
+ * OpenAPI 3.1 and 3.2: keywords next to a `$ref` (`required`, `properties`) apply too, so the
50
+ * type is the reference intersected with them. OpenAPI 3.0 ignores them, as its spec says.
51
+ */
52
+ REF_SIBLINGS: "ref-siblings",
41
53
  /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */
42
54
  ROOT_TYPE_NUMBERING: "root-type-numbering",
43
55
  /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */
@@ -50,6 +62,13 @@ function isOutputFixName(value) {
50
62
  return typeof value === "string" && KNOWN_NAMES.has(value);
51
63
  }
52
64
  function outputFixNamesOf(values) {
65
+ if (!Array.isArray(values)) {
66
+ throw new OpenAPITypesafeError({
67
+ code: ERROR_CODES.OPTION_FIX_UNKNOWN,
68
+ message: `The fix option must be a list of fix names, such as ["all"]. Got ${JSON.stringify(values)}.`,
69
+ details: { unknown: [values], known: [...KNOWN_NAMES] }
70
+ });
71
+ }
53
72
  const unknown = values.filter((value) => !isOutputFixName(value));
54
73
  if (unknown.length > 0) {
55
74
  const names = unknown.map((value) => JSON.stringify(value)).join(", ");
@@ -74,6 +93,7 @@ const NO_SCHEMA_PREFIX = {
74
93
  const REQUIREMENTS = {
75
94
  [FIX.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
76
95
  [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
96
+ [FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: "defaultNonNullable", flag: "--default-non-nullable" }],
77
97
  [FIX.NULLABLE_ENUMS]: [ENUM],
78
98
  [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }],
79
99
  [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX]
@@ -1 +1 @@
1
- {"version":3,"file":"output-fixes.mjs","sources":["../../src/domain/output-fixes.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"./errors.js\";\n\n/**\n * Opt-in fixes of the output of valid schemas (ADR-021). Each one changes only the cases it names;\n * without any, the output is the same as openapi-typescript 7.13 gives. In 2.0 they become the\n * default. The object names the fixes for this package's code; the public API is the `OutputFix`\n * union and the `OUTPUT_FIXES` list (ADR-021, amendment 1).\n */\nexport const FIX = {\n /** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */\n ALLOF_DISCRIMINATED_UNION: \"allof-discriminated-union\",\n /** An `allOf` member with only `required` makes those properties of the others required. */\n ALLOF_REQUIRED: \"allof-required\",\n /** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */\n ANYOF_ONEOF_DESCRIPTIONS: \"anyof-oneof-descriptions\",\n /** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */\n ANYOF_ONEOF_REQUIRED: \"anyof-oneof-required\",\n /** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */\n ANYOF_PROPERTIES: \"anyof-properties\",\n /** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */\n ARRAY_LENGTH_TUPLES: \"array-length-tuples\",\n /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */\n DEDUPE_ENUM_NAMES: \"dedupe-enum-names\",\n /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */\n DISCRIMINATOR_MEMBER_REQUIRED: \"discriminator-member-required\",\n /**\n * The value a discriminator member gets: one enum of every discriminator's values, a mapping\n * before the schema name, a schema's own mapping before an inherited one, none where the member\n * declares it, and with `--enum` a member of the owner's enum.\n */\n DISCRIMINATOR_VALUES: \"discriminator-values\",\n /** An exploded object query parameter's properties are keys of `query`, as they are sent. */\n EXPLODED_QUERY_OBJECTS: \"exploded-query-objects\",\n /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */\n NULLABLE_ENUMS: \"nullable-enums\",\n /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */\n PATH_PARAM_TYPE_NAMES: \"path-param-type-names\",\n /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */\n PREFIX_ITEMS: \"prefix-items\",\n /** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */\n READ_WRITE_REFS: \"read-write-refs\",\n /**\n * A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it\n * points at, also where the original type compiles through an index signature.\n */\n REF_POINTERS: \"ref-pointers\",\n /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */\n ROOT_TYPE_NUMBERING: \"root-type-numbering\",\n /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */\n UNEVALUATED_PROPERTIES: \"unevaluated-properties\",\n} as const;\n/** The name of one opt-in output fix. */\nexport type OutputFix = (typeof FIX)[keyof typeof FIX];\n\n/** Every fix of this version, in the order the docs list them. */\nexport const OUTPUT_FIXES: readonly OutputFix[] = Object.values(FIX);\n\n/** The name that turns on every fix of the installed version. */\nconst ALL_FIXES = \"all\";\n\n/** A name the `fix` option accepts: one fix, or `\"all\"`. */\nexport type OutputFixName = OutputFix | typeof ALL_FIXES;\n\nconst KNOWN_NAMES: ReadonlySet<string> = new Set<string>([...OUTPUT_FIXES, ALL_FIXES]);\n\nfunction isOutputFixName(value: unknown): value is OutputFixName {\n return typeof value === \"string\" && KNOWN_NAMES.has(value);\n}\n\n/** The fix names as given; fails with `OPTION_FIX_UNKNOWN` for any other value. */\nexport function outputFixNamesOf(values: readonly unknown[]): readonly OutputFixName[] {\n const unknown = values.filter((value) => !isOutputFixName(value));\n if (unknown.length > 0) {\n const names = unknown.map((value) => JSON.stringify(value)).join(\", \");\n const known = [...KNOWN_NAMES].join(\", \");\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message: `Unknown fix ${names}. Known fixes: ${known}.`,\n details: { unknown, known: [...KNOWN_NAMES] },\n });\n }\n return values as readonly OutputFixName[];\n}\n\n/** The fixes the names turn on; `all` stands for every fix of this version. */\nexport function resolveOutputFixes(names: readonly OutputFixName[]): ReadonlySet<OutputFix> {\n return new Set(names.flatMap((name) => (name === ALL_FIXES ? OUTPUT_FIXES : [name])));\n}\n\n/** A generator option that a fix works with; without it, the fix changes nothing (ADR-021). */\nexport interface OutputFixRequirement {\n readonly option:\n | \"arrayLength\"\n | \"dedupeEnums\"\n | \"enum\"\n | \"pathParamsAsTypes\"\n | \"rootTypes\"\n | \"rootTypesNoSchemaPrefix\";\n readonly flag: string;\n}\n\nconst ROOT_TYPES = { option: \"rootTypes\", flag: \"--root-types\" } as const;\nconst ENUM = { option: \"enum\", flag: \"--enum\" } as const;\nconst NO_SCHEMA_PREFIX = {\n option: \"rootTypesNoSchemaPrefix\",\n flag: \"--root-types-no-schema-prefix\",\n} as const;\n\n/** The options each fix needs, by fix name; `all` has none. */\nconst REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {\n [FIX.ARRAY_LENGTH_TUPLES]: [{ option: \"arrayLength\", flag: \"--array-length\" }],\n [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: \"dedupeEnums\", flag: \"--dedupe-enums\" }],\n [FIX.NULLABLE_ENUMS]: [ENUM],\n [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: \"pathParamsAsTypes\", flag: \"--path-params-as-types\" }],\n [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],\n};\n\nfunction describeRequirement(requirement: OutputFixRequirement): string {\n return `${requirement.option} (${requirement.flag})`;\n}\n\n/**\n * A notice for each fix given by name with an option it needs off; it names the options that are\n * off. `all` adds none: it means every fix that applies, so one that does not apply is expected.\n */\nexport function ineffectiveFixNotices(\n names: readonly OutputFixName[],\n isOptionOn: (option: OutputFixRequirement[\"option\"]) => boolean,\n): string[] {\n return [...new Set(names)].flatMap((name) => {\n const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));\n return missing.length === 0\n ? []\n : [`Fix \"${name}\" has no effect without ${missing.map(describeRequirement).join(\" and \")}`];\n });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output-fixes.mjs","sources":["../../src/domain/output-fixes.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"./errors.js\";\n\n/**\n * Opt-in fixes of the output of valid schemas (ADR-021). Each one changes only the cases it names;\n * without any, the output is the same as openapi-typescript 7.13 gives. In 2.0 they become the\n * default. The object names the fixes for this package's code; the public API is the `OutputFix`\n * union and the `OUTPUT_FIXES` list (ADR-021, amendment 1).\n */\nexport const FIX = {\n /** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */\n ALLOF_DISCRIMINATED_UNION: \"allof-discriminated-union\",\n /** An `allOf` member with only `required` makes those properties of the others required. */\n ALLOF_REQUIRED: \"allof-required\",\n /** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */\n ANYOF_ONEOF_DESCRIPTIONS: \"anyof-oneof-descriptions\",\n /** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */\n ANYOF_ONEOF_REQUIRED: \"anyof-oneof-required\",\n /** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */\n ANYOF_PROPERTIES: \"anyof-properties\",\n /** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */\n ARRAY_LENGTH_TUPLES: \"array-length-tuples\",\n /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */\n DEDUPE_ENUM_NAMES: \"dedupe-enum-names\",\n /**\n * `--default-non-nullable` finds parameters and request bodies by the document's structure, not\n * by the words `parameters` and `requestBody` anywhere in a schema's location.\n */\n DEFAULT_INPUT_LOCATIONS: \"default-input-locations\",\n /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */\n DISCRIMINATOR_MEMBER_REQUIRED: \"discriminator-member-required\",\n /**\n * The value a discriminator member gets: one enum of every discriminator's values, a mapping\n * before the schema name, a schema's own mapping before an inherited one, none where the member\n * declares it, and with `--enum` a member of the owner's enum.\n */\n DISCRIMINATOR_VALUES: \"discriminator-values\",\n /** An exploded object query parameter's properties are keys of `query`, as they are sent. */\n EXPLODED_QUERY_OBJECTS: \"exploded-query-objects\",\n /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */\n NULLABLE_ENUMS: \"nullable-enums\",\n /** A parameter or header with `content`, not `schema`, is typed by its media type's schema. */\n PARAMETER_HEADER_CONTENT: \"parameter-header-content\",\n /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */\n PATH_PARAM_TYPE_NAMES: \"path-param-type-names\",\n /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */\n PREFIX_ITEMS: \"prefix-items\",\n /** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */\n READ_WRITE_REFS: \"read-write-refs\",\n /**\n * A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it\n * points at, also where the original type compiles through an index signature.\n */\n REF_POINTERS: \"ref-pointers\",\n /**\n * OpenAPI 3.1 and 3.2: keywords next to a `$ref` (`required`, `properties`) apply too, so the\n * type is the reference intersected with them. OpenAPI 3.0 ignores them, as its spec says.\n */\n REF_SIBLINGS: \"ref-siblings\",\n /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */\n ROOT_TYPE_NUMBERING: \"root-type-numbering\",\n /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */\n UNEVALUATED_PROPERTIES: \"unevaluated-properties\",\n} as const;\n/** The name of one opt-in output fix. */\nexport type OutputFix = (typeof FIX)[keyof typeof FIX];\n\n/** Every fix of this version, in the order the docs list them. */\nexport const OUTPUT_FIXES: readonly OutputFix[] = Object.values(FIX);\n\n/** The name that turns on every fix of the installed version. */\nconst ALL_FIXES = \"all\";\n\n/** A name the `fix` option accepts: one fix, or `\"all\"`. */\nexport type OutputFixName = OutputFix | typeof ALL_FIXES;\n\nconst KNOWN_NAMES: ReadonlySet<string> = new Set<string>([...OUTPUT_FIXES, ALL_FIXES]);\n\nfunction isOutputFixName(value: unknown): value is OutputFixName {\n return typeof value === \"string\" && KNOWN_NAMES.has(value);\n}\n\n/**\n * The fix names as given; fails with `OPTION_FIX_UNKNOWN` for any other value, and for a `fix`\n * option that is no list (`fix: \"all\"` from JavaScript), which must not be read letter by letter.\n */\nexport function outputFixNamesOf(values: unknown): readonly OutputFixName[] {\n if (!Array.isArray(values)) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message:\n 'The fix option must be a list of fix names, such as [\"all\"]. ' +\n `Got ${JSON.stringify(values)}.`,\n details: { unknown: [values], known: [...KNOWN_NAMES] },\n });\n }\n const unknown = values.filter((value) => !isOutputFixName(value));\n if (unknown.length > 0) {\n const names = unknown.map((value) => JSON.stringify(value)).join(\", \");\n const known = [...KNOWN_NAMES].join(\", \");\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message: `Unknown fix ${names}. Known fixes: ${known}.`,\n details: { unknown, known: [...KNOWN_NAMES] },\n });\n }\n return values as readonly OutputFixName[];\n}\n\n/** The fixes the names turn on; `all` stands for every fix of this version. */\nexport function resolveOutputFixes(names: readonly OutputFixName[]): ReadonlySet<OutputFix> {\n return new Set(names.flatMap((name) => (name === ALL_FIXES ? OUTPUT_FIXES : [name])));\n}\n\n/** A generator option that a fix works with; without it, the fix changes nothing (ADR-021). */\nexport interface OutputFixRequirement {\n readonly option:\n | \"arrayLength\"\n | \"dedupeEnums\"\n | \"defaultNonNullable\"\n | \"enum\"\n | \"pathParamsAsTypes\"\n | \"rootTypes\"\n | \"rootTypesNoSchemaPrefix\";\n readonly flag: string;\n}\n\nconst ROOT_TYPES = { option: \"rootTypes\", flag: \"--root-types\" } as const;\nconst ENUM = { option: \"enum\", flag: \"--enum\" } as const;\nconst NO_SCHEMA_PREFIX = {\n option: \"rootTypesNoSchemaPrefix\",\n flag: \"--root-types-no-schema-prefix\",\n} as const;\n\n/** The options each fix needs, by fix name; `all` has none. */\nconst REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {\n [FIX.ARRAY_LENGTH_TUPLES]: [{ option: \"arrayLength\", flag: \"--array-length\" }],\n [FIX.DEDUPE_ENUM_NAMES]: [ENUM, { option: \"dedupeEnums\", flag: \"--dedupe-enums\" }],\n [FIX.DEFAULT_INPUT_LOCATIONS]: [{ option: \"defaultNonNullable\", flag: \"--default-non-nullable\" }],\n [FIX.NULLABLE_ENUMS]: [ENUM],\n [FIX.PATH_PARAM_TYPE_NAMES]: [{ option: \"pathParamsAsTypes\", flag: \"--path-params-as-types\" }],\n [FIX.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],\n};\n\nfunction describeRequirement(requirement: OutputFixRequirement): string {\n return `${requirement.option} (${requirement.flag})`;\n}\n\n/**\n * A notice for each fix given by name with an option it needs off; it names the options that are\n * off. `all` adds none: it means every fix that applies, so one that does not apply is expected.\n */\nexport function ineffectiveFixNotices(\n names: readonly OutputFixName[],\n isOptionOn: (option: OutputFixRequirement[\"option\"]) => boolean,\n): string[] {\n return [...new Set(names)].flatMap((name) => {\n const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));\n return missing.length === 0\n ? []\n : [`Fix \"${name}\" has no effect without ${missing.map(describeRequirement).join(\" and \")}`];\n });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ const CONTROL_RANGES = [
4
+ [0, 8],
5
+ [10, 31],
6
+ [127, 159],
7
+ [8232, 8233],
8
+ [8234, 8238],
9
+ [8294, 8297]
10
+ ];
11
+ const SHORT_ESCAPES = { "\n": "\\n", "\r": "\\r" };
12
+ const HEX_DIGITS = 4;
13
+ const HEX_RADIX = 16;
14
+ function isControl(codePoint) {
15
+ return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);
16
+ }
17
+ function escapeOf(character, codePoint) {
18
+ const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, "0");
19
+ return SHORT_ESCAPES[character] ?? `\\u${hex}`;
20
+ }
21
+ function terminalSafeText(text) {
22
+ let shown = "";
23
+ for (const character of text) {
24
+ const codePoint = character.codePointAt(0) ?? 0;
25
+ shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;
26
+ }
27
+ return shown;
28
+ }
29
+
30
+ exports.terminalSafeText = terminalSafeText;
31
+ //# sourceMappingURL=terminal-text.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-text.cjs","sources":["../../src/domain/terminal-text.ts"],"sourcesContent":["/**\n * Text from a document or a project (a path key, an `operationId`, a file name) reaches the\n * terminal and CI job logs. A line break in it starts a new line that CI reads as a command\n * (`::error …` in GitHub Actions, `##vso[…]` in Azure Pipelines), and an escape sequence moves\n * the cursor or erases lines, so it can forge or hide output. Each such character is shown as an\n * escape instead (`\\n`, `\\u001b`), so one message stays one line and shows what the text holds.\n */\n\n/**\n * The code points shown as escapes: C0 controls but the tab, DEL and C1 controls, the Unicode\n * line and paragraph separators, and the bidirectional controls, which reorder how a terminal\n * shows the text around them.\n */\nconst CONTROL_RANGES: readonly (readonly [number, number])[] = [\n [0x00, 0x08],\n [0x0a, 0x1f],\n [0x7f, 0x9f],\n [0x2028, 0x2029],\n [0x202a, 0x202e],\n [0x2066, 0x2069],\n];\n\nconst SHORT_ESCAPES: Readonly<Record<string, string>> = { \"\\n\": \"\\\\n\", \"\\r\": \"\\\\r\" };\nconst HEX_DIGITS = 4;\nconst HEX_RADIX = 16;\n\nfunction isControl(codePoint: number): boolean {\n return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);\n}\n\nfunction escapeOf(character: string, codePoint: number): string {\n const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, \"0\");\n return SHORT_ESCAPES[character] ?? `\\\\u${hex}`;\n}\n\n/** The text with every control character shown as an escape, so it prints as one plain line. */\nexport function terminalSafeText(text: string): string {\n let shown = \"\";\n for (const character of text) {\n const codePoint = character.codePointAt(0) ?? 0;\n shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;\n }\n return shown;\n}\n"],"names":[],"mappings":";;AAaA,MAAM,cAAA,GAAyD;AAAA,EAC7D,CAAC,GAAM,CAAI,CAAA;AAAA,EACX,CAAC,IAAM,EAAI,CAAA;AAAA,EACX,CAAC,KAAM,GAAI,CAAA;AAAA,EACX,CAAC,MAAQ,IAAM,CAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AACjB,CAAA;AAEA,MAAM,aAAA,GAAkD,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AACnF,MAAM,UAAA,GAAa,CAAA;AACnB,MAAM,SAAA,GAAY,EAAA;AAElB,SAAS,UAAU,SAAA,EAA4B;AAC7C,EAAA,OAAO,cAAA,CAAe,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,KAAM,SAAA,IAAa,KAAA,IAAS,SAAA,IAAa,IAAI,CAAA;AACvF;AAEA,SAAS,QAAA,CAAS,WAAmB,SAAA,EAA2B;AAC9D,EAAA,MAAM,MAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,CAAE,QAAA,CAAS,YAAY,GAAG,CAAA;AAClE,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,IAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA;AAC9C;AAGO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,aAAa,IAAA,EAAM;AAC5B,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAC9C,IAAA,KAAA,IAAS,UAAU,SAAS,CAAA,GAAI,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA,GAAI,SAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;;"}
@@ -0,0 +1,29 @@
1
+ const CONTROL_RANGES = [
2
+ [0, 8],
3
+ [10, 31],
4
+ [127, 159],
5
+ [8232, 8233],
6
+ [8234, 8238],
7
+ [8294, 8297]
8
+ ];
9
+ const SHORT_ESCAPES = { "\n": "\\n", "\r": "\\r" };
10
+ const HEX_DIGITS = 4;
11
+ const HEX_RADIX = 16;
12
+ function isControl(codePoint) {
13
+ return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);
14
+ }
15
+ function escapeOf(character, codePoint) {
16
+ const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, "0");
17
+ return SHORT_ESCAPES[character] ?? `\\u${hex}`;
18
+ }
19
+ function terminalSafeText(text) {
20
+ let shown = "";
21
+ for (const character of text) {
22
+ const codePoint = character.codePointAt(0) ?? 0;
23
+ shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;
24
+ }
25
+ return shown;
26
+ }
27
+
28
+ export { terminalSafeText };
29
+ //# sourceMappingURL=terminal-text.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-text.mjs","sources":["../../src/domain/terminal-text.ts"],"sourcesContent":["/**\n * Text from a document or a project (a path key, an `operationId`, a file name) reaches the\n * terminal and CI job logs. A line break in it starts a new line that CI reads as a command\n * (`::error …` in GitHub Actions, `##vso[…]` in Azure Pipelines), and an escape sequence moves\n * the cursor or erases lines, so it can forge or hide output. Each such character is shown as an\n * escape instead (`\\n`, `\\u001b`), so one message stays one line and shows what the text holds.\n */\n\n/**\n * The code points shown as escapes: C0 controls but the tab, DEL and C1 controls, the Unicode\n * line and paragraph separators, and the bidirectional controls, which reorder how a terminal\n * shows the text around them.\n */\nconst CONTROL_RANGES: readonly (readonly [number, number])[] = [\n [0x00, 0x08],\n [0x0a, 0x1f],\n [0x7f, 0x9f],\n [0x2028, 0x2029],\n [0x202a, 0x202e],\n [0x2066, 0x2069],\n];\n\nconst SHORT_ESCAPES: Readonly<Record<string, string>> = { \"\\n\": \"\\\\n\", \"\\r\": \"\\\\r\" };\nconst HEX_DIGITS = 4;\nconst HEX_RADIX = 16;\n\nfunction isControl(codePoint: number): boolean {\n return CONTROL_RANGES.some(([first, last]) => codePoint >= first && codePoint <= last);\n}\n\nfunction escapeOf(character: string, codePoint: number): string {\n const hex = codePoint.toString(HEX_RADIX).padStart(HEX_DIGITS, \"0\");\n return SHORT_ESCAPES[character] ?? `\\\\u${hex}`;\n}\n\n/** The text with every control character shown as an escape, so it prints as one plain line. */\nexport function terminalSafeText(text: string): string {\n let shown = \"\";\n for (const character of text) {\n const codePoint = character.codePointAt(0) ?? 0;\n shown += isControl(codePoint) ? escapeOf(character, codePoint) : character;\n }\n return shown;\n}\n"],"names":[],"mappings":"AAaA,MAAM,cAAA,GAAyD;AAAA,EAC7D,CAAC,GAAM,CAAI,CAAA;AAAA,EACX,CAAC,IAAM,EAAI,CAAA;AAAA,EACX,CAAC,KAAM,GAAI,CAAA;AAAA,EACX,CAAC,MAAQ,IAAM,CAAA;AAAA,EACf,CAAC,MAAQ,IAAM,CAAA;AAAA,EACf,CAAC,MAAQ,IAAM;AACjB,CAAA;AAEA,MAAM,aAAA,GAAkD,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAM;AACnF,MAAM,UAAA,GAAa,CAAA;AACnB,MAAM,SAAA,GAAY,EAAA;AAElB,SAAS,UAAU,SAAA,EAA4B;AAC7C,EAAA,OAAO,cAAA,CAAe,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,KAAM,SAAA,IAAa,KAAA,IAAS,SAAA,IAAa,IAAI,CAAA;AACvF;AAEA,SAAS,QAAA,CAAS,WAAmB,SAAA,EAA2B;AAC9D,EAAA,MAAM,MAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,CAAE,QAAA,CAAS,YAAY,GAAG,CAAA;AAClE,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,IAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA;AAC9C;AAGO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,MAAW,aAAa,IAAA,EAAM;AAC5B,IAAA,MAAM,SAAA,GAAY,SAAA,CAAU,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAC9C,IAAA,KAAA,IAAS,UAAU,SAAS,CAAA,GAAI,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA,GAAI,SAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;;"}
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ const URL_AFTER_SCHEME = /:\/\/[^\s"'<>]*[^\s"'<>.,:;!?)]/g;
4
+ const SCHEME_SEPARATOR = "://";
5
+ const AUTHORITY_END = /[/?#]/;
6
+ const QUERY_OR_FRAGMENT = /[?#]/;
7
+ const QUERY_START = "?";
8
+ const FRAGMENT_START = "#";
9
+ const USER_INFO_END = "@";
10
+ const HIDDEN = "***";
11
+ function withoutUserInfo(rest) {
12
+ const authorityEnd = rest.search(AUTHORITY_END);
13
+ const authority = authorityEnd === -1 ? rest : rest.slice(0, authorityEnd);
14
+ const userInfoEnd = authority.lastIndexOf(USER_INFO_END);
15
+ return userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;
16
+ }
17
+ function withoutQuery(rest) {
18
+ const fragmentStart = rest.indexOf(FRAGMENT_START);
19
+ const beforeFragment = fragmentStart === -1 ? rest : rest.slice(0, fragmentStart);
20
+ const queryStart = beforeFragment.indexOf(QUERY_START);
21
+ if (queryStart === -1) {
22
+ return rest;
23
+ }
24
+ const fragment = fragmentStart === -1 ? "" : rest.slice(fragmentStart);
25
+ return `${rest.slice(0, queryStart + 1)}${HIDDEN}${fragment}`;
26
+ }
27
+ function redactUrlSecrets(text) {
28
+ return text.replace(URL_AFTER_SCHEME, (url) => {
29
+ const rest = url.slice(SCHEME_SEPARATOR.length);
30
+ return `${SCHEME_SEPARATOR}${withoutQuery(withoutUserInfo(rest))}`;
31
+ });
32
+ }
33
+ function redactUnparsedUrl(text) {
34
+ const separator = text.indexOf(SCHEME_SEPARATOR);
35
+ if (separator === -1) {
36
+ return text;
37
+ }
38
+ const rest = text.slice(separator + SCHEME_SEPARATOR.length);
39
+ const queryOrFragment = rest.search(QUERY_OR_FRAGMENT);
40
+ const beforeQuery = queryOrFragment === -1 ? rest : rest.slice(0, queryOrFragment);
41
+ const userInfoEnd = beforeQuery.lastIndexOf(USER_INFO_END);
42
+ const shown = userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;
43
+ return `${text.slice(0, separator)}${SCHEME_SEPARATOR}${withoutQuery(shown)}`;
44
+ }
45
+
46
+ exports.redactUnparsedUrl = redactUnparsedUrl;
47
+ exports.redactUrlSecrets = redactUrlSecrets;
48
+ //# sourceMappingURL=url-secrets.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-secrets.cjs","sources":["../../src/domain/url-secrets.ts"],"sourcesContent":["/**\n * URLs can reach a message: the CLI input, a `$ref`, a redirect. Messages end up in CI job logs, so\n * the parts of a URL that carry secrets are hidden in every one (audit B2, F12): the user info\n * (`https://user:token@host/…`), which fetch refuses anyway, and the query, which holds API keys\n * and signatures (`?api_key=…`, `?X-Amz-Signature=…`). Which query parameters are secret cannot be\n * told by their names, so the whole query is hidden; the path and the fragment (a JSON pointer)\n * stay, so the message still names the document and the place in it.\n */\n\n/**\n * A URL in a message, from its `://` to the first space, quote or angle bracket: a serialized URL\n * percent-encodes these, and messages put them around a URL. A match takes the rest of the URL,\n * also a later `://` in it, so the scan never starts again inside a URL; it stays linear. It ends\n * before punctuation that closes a sentence or a parenthesis (`… x.yaml?key=1: 404`, `(… ?key=1)`),\n * which the message puts after the URL; a hidden query would hide it too.\n */\nconst URL_AFTER_SCHEME = /:\\/\\/[^\\s\"'<>]*[^\\s\"'<>.,:;!?)]/g;\n\nconst SCHEME_SEPARATOR = \"://\";\nconst AUTHORITY_END = /[/?#]/;\nconst QUERY_OR_FRAGMENT = /[?#]/;\nconst QUERY_START = \"?\";\nconst FRAGMENT_START = \"#\";\nconst USER_INFO_END = \"@\";\nconst HIDDEN = \"***\";\n\n/** The part after `://` with the user info of its authority hidden: `***@host`. */\nfunction withoutUserInfo(rest: string): string {\n const authorityEnd = rest.search(AUTHORITY_END);\n const authority = authorityEnd === -1 ? rest : rest.slice(0, authorityEnd);\n const userInfoEnd = authority.lastIndexOf(USER_INFO_END);\n return userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;\n}\n\n/** The part after `://` with its query hidden: `/x.yaml?***#/a`. */\nfunction withoutQuery(rest: string): string {\n const fragmentStart = rest.indexOf(FRAGMENT_START);\n const beforeFragment = fragmentStart === -1 ? rest : rest.slice(0, fragmentStart);\n const queryStart = beforeFragment.indexOf(QUERY_START);\n if (queryStart === -1) {\n return rest;\n }\n const fragment = fragmentStart === -1 ? \"\" : rest.slice(fragmentStart);\n return `${rest.slice(0, queryStart + 1)}${HIDDEN}${fragment}`;\n}\n\n/** The text with the user info and the query of every URL in it replaced by `***`. */\nexport function redactUrlSecrets(text: string): string {\n return text.replace(URL_AFTER_SCHEME, (url) => {\n const rest = url.slice(SCHEME_SEPARATOR.length);\n return `${SCHEME_SEPARATOR}${withoutQuery(withoutUserInfo(rest))}`;\n });\n}\n\n/**\n * Text that starts like a URL but does not parse as one (`http://user:a/b@host/x`), with what may\n * be secret hidden. Without a parse there is no telling where the authority ends, so everything\n * from the `://` to the last `@` before the query counts as user info; the query is hidden as in\n * `redactUrlSecrets`.\n */\nexport function redactUnparsedUrl(text: string): string {\n const separator = text.indexOf(SCHEME_SEPARATOR);\n if (separator === -1) {\n return text;\n }\n const rest = text.slice(separator + SCHEME_SEPARATOR.length);\n const queryOrFragment = rest.search(QUERY_OR_FRAGMENT);\n const beforeQuery = queryOrFragment === -1 ? rest : rest.slice(0, queryOrFragment);\n const userInfoEnd = beforeQuery.lastIndexOf(USER_INFO_END);\n const shown = userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;\n return `${text.slice(0, separator)}${SCHEME_SEPARATOR}${withoutQuery(shown)}`;\n}\n"],"names":[],"mappings":";;AAgBA,MAAM,gBAAA,GAAmB,kCAAA;AAEzB,MAAM,gBAAA,GAAmB,KAAA;AACzB,MAAM,aAAA,GAAgB,OAAA;AACtB,MAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,cAAA,GAAiB,GAAA;AACvB,MAAM,aAAA,GAAgB,GAAA;AACtB,MAAM,MAAA,GAAS,KAAA;AAGf,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAC9C,EAAA,MAAM,YAAY,YAAA,KAAiB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,YAAY,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,CAAY,aAAa,CAAA;AACvD,EAAA,OAAO,WAAA,KAAgB,KAAK,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AACxE;AAGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AACjD,EAAA,MAAM,iBAAiB,aAAA,KAAkB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,aAAa,CAAA;AAChF,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AACrD,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,aAAA,KAAkB,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,MAAM,aAAa,CAAA;AACrE,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA;AAC7D;AAGO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,CAAC,GAAA,KAAQ;AAC7C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,CAAA;AAC9C,IAAA,OAAO,GAAG,gBAAgB,CAAA,EAAG,aAAa,eAAA,CAAgB,IAAI,CAAC,CAAC,CAAA,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAQO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAA;AAC/C,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AAC3D,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AACrD,EAAA,MAAM,cAAc,eAAA,KAAoB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA;AACjF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,WAAA,KAAgB,EAAA,GAAK,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AAC7E,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,EAAG,gBAAgB,CAAA,EAAG,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAC7E;;;"}
@@ -0,0 +1,45 @@
1
+ const URL_AFTER_SCHEME = /:\/\/[^\s"'<>]*[^\s"'<>.,:;!?)]/g;
2
+ const SCHEME_SEPARATOR = "://";
3
+ const AUTHORITY_END = /[/?#]/;
4
+ const QUERY_OR_FRAGMENT = /[?#]/;
5
+ const QUERY_START = "?";
6
+ const FRAGMENT_START = "#";
7
+ const USER_INFO_END = "@";
8
+ const HIDDEN = "***";
9
+ function withoutUserInfo(rest) {
10
+ const authorityEnd = rest.search(AUTHORITY_END);
11
+ const authority = authorityEnd === -1 ? rest : rest.slice(0, authorityEnd);
12
+ const userInfoEnd = authority.lastIndexOf(USER_INFO_END);
13
+ return userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;
14
+ }
15
+ function withoutQuery(rest) {
16
+ const fragmentStart = rest.indexOf(FRAGMENT_START);
17
+ const beforeFragment = fragmentStart === -1 ? rest : rest.slice(0, fragmentStart);
18
+ const queryStart = beforeFragment.indexOf(QUERY_START);
19
+ if (queryStart === -1) {
20
+ return rest;
21
+ }
22
+ const fragment = fragmentStart === -1 ? "" : rest.slice(fragmentStart);
23
+ return `${rest.slice(0, queryStart + 1)}${HIDDEN}${fragment}`;
24
+ }
25
+ function redactUrlSecrets(text) {
26
+ return text.replace(URL_AFTER_SCHEME, (url) => {
27
+ const rest = url.slice(SCHEME_SEPARATOR.length);
28
+ return `${SCHEME_SEPARATOR}${withoutQuery(withoutUserInfo(rest))}`;
29
+ });
30
+ }
31
+ function redactUnparsedUrl(text) {
32
+ const separator = text.indexOf(SCHEME_SEPARATOR);
33
+ if (separator === -1) {
34
+ return text;
35
+ }
36
+ const rest = text.slice(separator + SCHEME_SEPARATOR.length);
37
+ const queryOrFragment = rest.search(QUERY_OR_FRAGMENT);
38
+ const beforeQuery = queryOrFragment === -1 ? rest : rest.slice(0, queryOrFragment);
39
+ const userInfoEnd = beforeQuery.lastIndexOf(USER_INFO_END);
40
+ const shown = userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;
41
+ return `${text.slice(0, separator)}${SCHEME_SEPARATOR}${withoutQuery(shown)}`;
42
+ }
43
+
44
+ export { redactUnparsedUrl, redactUrlSecrets };
45
+ //# sourceMappingURL=url-secrets.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-secrets.mjs","sources":["../../src/domain/url-secrets.ts"],"sourcesContent":["/**\n * URLs can reach a message: the CLI input, a `$ref`, a redirect. Messages end up in CI job logs, so\n * the parts of a URL that carry secrets are hidden in every one (audit B2, F12): the user info\n * (`https://user:token@host/…`), which fetch refuses anyway, and the query, which holds API keys\n * and signatures (`?api_key=…`, `?X-Amz-Signature=…`). Which query parameters are secret cannot be\n * told by their names, so the whole query is hidden; the path and the fragment (a JSON pointer)\n * stay, so the message still names the document and the place in it.\n */\n\n/**\n * A URL in a message, from its `://` to the first space, quote or angle bracket: a serialized URL\n * percent-encodes these, and messages put them around a URL. A match takes the rest of the URL,\n * also a later `://` in it, so the scan never starts again inside a URL; it stays linear. It ends\n * before punctuation that closes a sentence or a parenthesis (`… x.yaml?key=1: 404`, `(… ?key=1)`),\n * which the message puts after the URL; a hidden query would hide it too.\n */\nconst URL_AFTER_SCHEME = /:\\/\\/[^\\s\"'<>]*[^\\s\"'<>.,:;!?)]/g;\n\nconst SCHEME_SEPARATOR = \"://\";\nconst AUTHORITY_END = /[/?#]/;\nconst QUERY_OR_FRAGMENT = /[?#]/;\nconst QUERY_START = \"?\";\nconst FRAGMENT_START = \"#\";\nconst USER_INFO_END = \"@\";\nconst HIDDEN = \"***\";\n\n/** The part after `://` with the user info of its authority hidden: `***@host`. */\nfunction withoutUserInfo(rest: string): string {\n const authorityEnd = rest.search(AUTHORITY_END);\n const authority = authorityEnd === -1 ? rest : rest.slice(0, authorityEnd);\n const userInfoEnd = authority.lastIndexOf(USER_INFO_END);\n return userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;\n}\n\n/** The part after `://` with its query hidden: `/x.yaml?***#/a`. */\nfunction withoutQuery(rest: string): string {\n const fragmentStart = rest.indexOf(FRAGMENT_START);\n const beforeFragment = fragmentStart === -1 ? rest : rest.slice(0, fragmentStart);\n const queryStart = beforeFragment.indexOf(QUERY_START);\n if (queryStart === -1) {\n return rest;\n }\n const fragment = fragmentStart === -1 ? \"\" : rest.slice(fragmentStart);\n return `${rest.slice(0, queryStart + 1)}${HIDDEN}${fragment}`;\n}\n\n/** The text with the user info and the query of every URL in it replaced by `***`. */\nexport function redactUrlSecrets(text: string): string {\n return text.replace(URL_AFTER_SCHEME, (url) => {\n const rest = url.slice(SCHEME_SEPARATOR.length);\n return `${SCHEME_SEPARATOR}${withoutQuery(withoutUserInfo(rest))}`;\n });\n}\n\n/**\n * Text that starts like a URL but does not parse as one (`http://user:a/b@host/x`), with what may\n * be secret hidden. Without a parse there is no telling where the authority ends, so everything\n * from the `://` to the last `@` before the query counts as user info; the query is hidden as in\n * `redactUrlSecrets`.\n */\nexport function redactUnparsedUrl(text: string): string {\n const separator = text.indexOf(SCHEME_SEPARATOR);\n if (separator === -1) {\n return text;\n }\n const rest = text.slice(separator + SCHEME_SEPARATOR.length);\n const queryOrFragment = rest.search(QUERY_OR_FRAGMENT);\n const beforeQuery = queryOrFragment === -1 ? rest : rest.slice(0, queryOrFragment);\n const userInfoEnd = beforeQuery.lastIndexOf(USER_INFO_END);\n const shown = userInfoEnd === -1 ? rest : `${HIDDEN}${rest.slice(userInfoEnd)}`;\n return `${text.slice(0, separator)}${SCHEME_SEPARATOR}${withoutQuery(shown)}`;\n}\n"],"names":[],"mappings":"AAgBA,MAAM,gBAAA,GAAmB,kCAAA;AAEzB,MAAM,gBAAA,GAAmB,KAAA;AACzB,MAAM,aAAA,GAAgB,OAAA;AACtB,MAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,cAAA,GAAiB,GAAA;AACvB,MAAM,aAAA,GAAgB,GAAA;AACtB,MAAM,MAAA,GAAS,KAAA;AAGf,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAC9C,EAAA,MAAM,YAAY,YAAA,KAAiB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,YAAY,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,WAAA,CAAY,aAAa,CAAA;AACvD,EAAA,OAAO,WAAA,KAAgB,KAAK,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AACxE;AAGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAA;AACjD,EAAA,MAAM,iBAAiB,aAAA,KAAkB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,aAAa,CAAA;AAChF,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAA,CAAQ,WAAW,CAAA;AACrD,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,aAAA,KAAkB,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,MAAM,aAAa,CAAA;AACrE,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA;AAC7D;AAGO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,CAAC,GAAA,KAAQ;AAC7C,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,CAAA;AAC9C,IAAA,OAAO,GAAG,gBAAgB,CAAA,EAAG,aAAa,eAAA,CAAgB,IAAI,CAAC,CAAC,CAAA,CAAA;AAAA,EAClE,CAAC,CAAA;AACH;AAQO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAA;AAC/C,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AAC3D,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,iBAAiB,CAAA;AACrD,EAAA,MAAM,cAAc,eAAA,KAAoB,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA;AACjF,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,WAAA,KAAgB,EAAA,GAAK,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAA,CAAA;AAC7E,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,EAAG,gBAAgB,CAAA,EAAG,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAC7E;;"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  const WARNING_CODES = {
4
4
  CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
5
+ CLI_OUTPUT_IGNORED: "CLI_OUTPUT_IGNORED",
5
6
  CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
6
7
  DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
7
8
  DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",
@@ -1 +1 @@
1
- {"version":3,"file":"warnings.cjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":";;AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;;"}
1
+ {"version":3,"file":"warnings.cjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CLI_OUTPUT_IGNORED: \"CLI_OUTPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":";;AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;;"}
@@ -1,5 +1,6 @@
1
1
  const WARNING_CODES = {
2
2
  CLI_INPUT_IGNORED: "CLI_INPUT_IGNORED",
3
+ CLI_OUTPUT_IGNORED: "CLI_OUTPUT_IGNORED",
3
4
  CONFIG_SETTING_UNKNOWN: "CONFIG_SETTING_UNKNOWN",
4
5
  DISCRIMINATOR_MAPPING_INVALID: "DISCRIMINATOR_MAPPING_INVALID",
5
6
  DISCRIMINATOR_VALUE_NOT_ALLOWED: "DISCRIMINATOR_VALUE_NOT_ALLOWED",
@@ -1 +1 @@
1
- {"version":3,"file":"warnings.mjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":"AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;"}
1
+ {"version":3,"file":"warnings.mjs","sources":["../../src/domain/warnings.ts"],"sourcesContent":["/**\n * Typed warnings. A warning does not stop the run: the output is written and the CLI exits with 0.\n * Each one ends with a stable machine-readable code in parentheses, as the CLI prints errors\n * (`message (CODE)`), so a script or a person can search for it.\n */\n\n/** Every warning code. */\nexport const WARNING_CODES = {\n CLI_INPUT_IGNORED: \"CLI_INPUT_IGNORED\",\n CLI_OUTPUT_IGNORED: \"CLI_OUTPUT_IGNORED\",\n CONFIG_SETTING_UNKNOWN: \"CONFIG_SETTING_UNKNOWN\",\n DISCRIMINATOR_MAPPING_INVALID: \"DISCRIMINATOR_MAPPING_INVALID\",\n DISCRIMINATOR_VALUE_NOT_ALLOWED: \"DISCRIMINATOR_VALUE_NOT_ALLOWED\",\n ENUM_VALUES_EXCLUDED: \"ENUM_VALUES_EXCLUDED\",\n FIX_NEEDS_OPTION: \"FIX_NEEDS_OPTION\",\n LINT_PROBLEM: \"LINT_PROBLEM\",\n PATH_TEMPLATES_IDENTICAL: \"PATH_TEMPLATES_IDENTICAL\",\n QUERYSTRING_NEXT_TO_QUERY: \"QUERYSTRING_NEXT_TO_QUERY\",\n REF_CIRCULAR: \"REF_CIRCULAR\",\n REF_NOT_FOUND: \"REF_NOT_FOUND\",\n} as const;\n\nexport type WarningCode = (typeof WARNING_CODES)[keyof typeof WARNING_CODES];\n\n/** The warning line for people, with its code at the end. */\nexport function warningText(message: string, code: WarningCode): string {\n return `${message} (${code})`;\n}\n"],"names":[],"mappings":"AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,+BAAA,EAAiC,iCAAA;AAAA,EACjC,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,cAAA;AAAA,EACd,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe;AACjB;AAKO,SAAS,WAAA,CAAY,SAAiB,IAAA,EAA2B;AACtE,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAC5B;;"}