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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/redocly-loader/configured-headers.cjs +32 -0
  3. package/dist/adapters/redocly-loader/configured-headers.cjs.map +1 -0
  4. package/dist/adapters/redocly-loader/configured-headers.mjs +30 -0
  5. package/dist/adapters/redocly-loader/configured-headers.mjs.map +1 -0
  6. package/dist/adapters/redocly-loader/redocly-config-source.cjs +21 -2
  7. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  8. package/dist/adapters/redocly-loader/redocly-config-source.mjs +22 -3
  9. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  10. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +34 -11
  11. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +33 -10
  13. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/ref-access.cjs +37 -4
  15. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  16. package/dist/adapters/redocly-loader/ref-access.mjs +37 -4
  17. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/ref-resolution-check.cjs +191 -0
  19. package/dist/adapters/redocly-loader/ref-resolution-check.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/ref-resolution-check.mjs +189 -0
  21. package/dist/adapters/redocly-loader/ref-resolution-check.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs +73 -0
  23. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs +60 -0
  25. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/remote-fetch.cjs +41 -14
  27. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -14
  29. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/schema-load-errors.cjs +23 -5
  31. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/schema-load-errors.mjs +23 -5
  33. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/unsupported-keys.cjs +9 -1
  35. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/unsupported-keys.mjs +9 -1
  37. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  38. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  39. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  40. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  41. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  42. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +5 -1
  43. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -1
  44. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +5 -1
  45. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -1
  46. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -1
  47. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -1
  48. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +15 -9
  49. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -1
  50. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +15 -9
  51. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -1
  52. package/dist/api/default-ports.cjs +9 -0
  53. package/dist/api/default-ports.cjs.map +1 -1
  54. package/dist/api/default-ports.mjs +8 -1
  55. package/dist/api/default-ports.mjs.map +1 -1
  56. package/dist/api/discriminator-conflict-warnings.cjs +25 -0
  57. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
  58. package/dist/api/discriminator-conflict-warnings.mjs +23 -0
  59. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
  60. package/dist/api/discriminator-enum-names.cjs +19 -0
  61. package/dist/api/discriminator-enum-names.cjs.map +1 -0
  62. package/dist/api/discriminator-enum-names.mjs +17 -0
  63. package/dist/api/discriminator-enum-names.mjs.map +1 -0
  64. package/dist/api/discriminator-enum-parent.cjs +59 -0
  65. package/dist/api/discriminator-enum-parent.cjs.map +1 -0
  66. package/dist/api/discriminator-enum-parent.mjs +57 -0
  67. package/dist/api/discriminator-enum-parent.mjs.map +1 -0
  68. package/dist/api/discriminator-enum.cjs +25 -0
  69. package/dist/api/discriminator-enum.cjs.map +1 -1
  70. package/dist/api/discriminator-enum.mjs +25 -1
  71. package/dist/api/discriminator-enum.mjs.map +1 -1
  72. package/dist/api/discriminator-other-owners.cjs +67 -0
  73. package/dist/api/discriminator-other-owners.cjs.map +1 -0
  74. package/dist/api/discriminator-other-owners.mjs +64 -0
  75. package/dist/api/discriminator-other-owners.mjs.map +1 -0
  76. package/dist/api/discriminator-patch.cjs +92 -0
  77. package/dist/api/discriminator-patch.cjs.map +1 -0
  78. package/dist/api/discriminator-patch.mjs +86 -0
  79. package/dist/api/discriminator-patch.mjs.map +1 -0
  80. package/dist/api/discriminator-scan.cjs +50 -65
  81. package/dist/api/discriminator-scan.cjs.map +1 -1
  82. package/dist/api/discriminator-scan.mjs +44 -59
  83. package/dist/api/discriminator-scan.mjs.map +1 -1
  84. package/dist/api/document-refs.cjs +15 -12
  85. package/dist/api/document-refs.cjs.map +1 -1
  86. package/dist/api/document-refs.mjs +15 -12
  87. package/dist/api/document-refs.mjs.map +1 -1
  88. package/dist/api/document-run.cjs +21 -4
  89. package/dist/api/document-run.cjs.map +1 -1
  90. package/dist/api/document-run.mjs +22 -5
  91. package/dist/api/document-run.mjs.map +1 -1
  92. package/dist/api/enum-values-warnings.cjs +16 -0
  93. package/dist/api/enum-values-warnings.cjs.map +1 -0
  94. package/dist/api/enum-values-warnings.mjs +14 -0
  95. package/dist/api/enum-values-warnings.mjs.map +1 -0
  96. package/dist/api/footer-sink.cjs +25 -2
  97. package/dist/api/footer-sink.cjs.map +1 -1
  98. package/dist/api/footer-sink.mjs +25 -2
  99. package/dist/api/footer-sink.mjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.cjs +4 -1
  101. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  102. package/dist/api/legacy-callback-warning.mjs +4 -1
  103. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  104. package/dist/api/legacy-ts-helpers.cjs.map +1 -1
  105. package/dist/api/legacy-ts-helpers.mjs.map +1 -1
  106. package/dist/api/legacy-utils.cjs.map +1 -1
  107. package/dist/api/legacy-utils.mjs.map +1 -1
  108. package/dist/api/openapi-ts.cjs +2 -1
  109. package/dist/api/openapi-ts.cjs.map +1 -1
  110. package/dist/api/openapi-ts.mjs +3 -2
  111. package/dist/api/openapi-ts.mjs.map +1 -1
  112. package/dist/api/path-template-warnings.cjs +21 -0
  113. package/dist/api/path-template-warnings.cjs.map +1 -0
  114. package/dist/api/path-template-warnings.mjs +19 -0
  115. package/dist/api/path-template-warnings.mjs.map +1 -0
  116. package/dist/api/transform-context.cjs +4 -2
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +4 -2
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +52 -3
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +53 -4
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/api/unsupported-feature-warnings.cjs +6 -1
  125. package/dist/api/unsupported-feature-warnings.cjs.map +1 -1
  126. package/dist/api/unsupported-feature-warnings.mjs +6 -1
  127. package/dist/api/unsupported-feature-warnings.mjs.map +1 -1
  128. package/dist/application/print/type-printer.cjs +7 -1
  129. package/dist/application/print/type-printer.cjs.map +1 -1
  130. package/dist/application/print/type-printer.mjs +7 -1
  131. package/dist/application/print/type-printer.mjs.map +1 -1
  132. package/dist/application/transform/document/assignability.cjs +144 -0
  133. package/dist/application/transform/document/assignability.cjs.map +1 -0
  134. package/dist/application/transform/document/assignability.mjs +138 -0
  135. package/dist/application/transform/document/assignability.mjs.map +1 -0
  136. package/dist/application/transform/document/components.cjs +2 -2
  137. package/dist/application/transform/document/components.cjs.map +1 -1
  138. package/dist/application/transform/document/components.mjs +4 -4
  139. package/dist/application/transform/document/components.mjs.map +1 -1
  140. package/dist/application/transform/document/declared-types.cjs +66 -0
  141. package/dist/application/transform/document/declared-types.cjs.map +1 -0
  142. package/dist/application/transform/document/declared-types.mjs +63 -0
  143. package/dist/application/transform/document/declared-types.mjs.map +1 -0
  144. package/dist/application/transform/document/document.cjs +32 -9
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +34 -11
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/exploded-query.cjs +46 -0
  149. package/dist/application/transform/document/exploded-query.cjs.map +1 -0
  150. package/dist/application/transform/document/exploded-query.mjs +43 -0
  151. package/dist/application/transform/document/exploded-query.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +63 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -0
  154. package/dist/application/transform/document/global-type-references.mjs +61 -0
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -0
  156. package/dist/application/transform/document/list-assignability.cjs +54 -0
  157. package/dist/application/transform/document/list-assignability.cjs.map +1 -0
  158. package/dist/application/transform/document/list-assignability.mjs +52 -0
  159. package/dist/application/transform/document/list-assignability.mjs.map +1 -0
  160. package/dist/application/transform/document/parameters.cjs +41 -9
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +42 -10
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-key-overlaps.cjs +83 -33
  165. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -1
  166. package/dist/application/transform/document/path-key-overlaps.mjs +83 -33
  167. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -1
  168. package/dist/application/transform/document/path-template-replace.cjs +48 -0
  169. package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
  170. package/dist/application/transform/document/path-template-replace.mjs +45 -0
  171. package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
  172. package/dist/application/transform/document/paths.cjs +55 -29
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +54 -30
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/root-type-aliases.cjs +15 -14
  177. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  178. package/dist/application/transform/document/root-type-aliases.mjs +15 -13
  179. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  180. package/dist/application/transform/document/template-key-match.cjs +128 -0
  181. package/dist/application/transform/document/template-key-match.cjs.map +1 -0
  182. package/dist/application/transform/document/template-key-match.mjs +125 -0
  183. package/dist/application/transform/document/template-key-match.mjs.map +1 -0
  184. package/dist/application/transform/document/type-assignability.cjs +192 -0
  185. package/dist/application/transform/document/type-assignability.cjs.map +1 -0
  186. package/dist/application/transform/document/type-assignability.mjs +190 -0
  187. package/dist/application/transform/document/type-assignability.mjs.map +1 -0
  188. package/dist/application/transform/document/type-key.cjs +70 -0
  189. package/dist/application/transform/document/type-key.cjs.map +1 -0
  190. package/dist/application/transform/document/type-key.mjs +68 -0
  191. package/dist/application/transform/document/type-key.mjs.map +1 -0
  192. package/dist/application/transform/document/type-resolution.cjs +131 -0
  193. package/dist/application/transform/document/type-resolution.cjs.map +1 -0
  194. package/dist/application/transform/document/type-resolution.mjs +125 -0
  195. package/dist/application/transform/document/type-resolution.mjs.map +1 -0
  196. package/dist/application/transform/footer/document-footer.cjs +66 -4
  197. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  198. package/dist/application/transform/footer/document-footer.mjs +67 -5
  199. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  200. package/dist/application/transform/footer/enum-naming.cjs +17 -0
  201. package/dist/application/transform/footer/enum-naming.cjs.map +1 -1
  202. package/dist/application/transform/footer/enum-naming.mjs +17 -1
  203. package/dist/application/transform/footer/enum-naming.mjs.map +1 -1
  204. package/dist/application/transform/footer/enum-values-check.cjs +129 -0
  205. package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
  206. package/dist/application/transform/footer/enum-values-check.mjs +127 -0
  207. package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
  208. package/dist/application/transform/footer/evaluation.cjs +42 -0
  209. package/dist/application/transform/footer/evaluation.cjs.map +1 -0
  210. package/dist/application/transform/footer/evaluation.mjs +33 -0
  211. package/dist/application/transform/footer/evaluation.mjs.map +1 -0
  212. package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
  213. package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
  214. package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
  215. package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +138 -0
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
  218. package/dist/application/transform/footer/type-evaluation.mjs +136 -0
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
  220. package/dist/application/transform/footer/type-indexing.cjs +107 -0
  221. package/dist/application/transform/footer/type-indexing.cjs.map +1 -0
  222. package/dist/application/transform/footer/type-indexing.mjs +105 -0
  223. package/dist/application/transform/footer/type-indexing.mjs.map +1 -0
  224. package/dist/application/transform/footer/type-rules.cjs +172 -0
  225. package/dist/application/transform/footer/type-rules.cjs.map +1 -0
  226. package/dist/application/transform/footer/type-rules.mjs +166 -0
  227. package/dist/application/transform/footer/type-rules.mjs.map +1 -0
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
  232. package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
  233. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
  234. package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
  235. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
  236. package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
  237. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
  238. package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
  239. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
  240. package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
  241. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
  242. package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
  243. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
  244. package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
  245. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
  246. package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
  247. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
  248. package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
  249. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
  250. package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
  251. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
  252. package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
  253. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
  254. package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
  255. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
  256. package/dist/application/transform/ref-type.cjs +7 -2
  257. package/dist/application/transform/ref-type.cjs.map +1 -1
  258. package/dist/application/transform/ref-type.mjs +3 -2
  259. package/dist/application/transform/ref-type.mjs.map +1 -1
  260. package/dist/application/transform/schema/access-flags.cjs +38 -0
  261. package/dist/application/transform/schema/access-flags.cjs.map +1 -0
  262. package/dist/application/transform/schema/access-flags.mjs +36 -0
  263. package/dist/application/transform/schema/access-flags.mjs.map +1 -0
  264. package/dist/application/transform/schema/array-type.cjs +32 -1
  265. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/array-type.mjs +33 -2
  267. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/composition-type.cjs +50 -15
  269. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  270. package/dist/application/transform/schema/composition-type.mjs +50 -15
  271. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  272. package/dist/application/transform/schema/core-type.cjs +3 -1
  273. package/dist/application/transform/schema/core-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/core-type.mjs +3 -1
  275. package/dist/application/transform/schema/core-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/discriminated-union.cjs +30 -0
  277. package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
  278. package/dist/application/transform/schema/discriminated-union.mjs +27 -0
  279. package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
  280. package/dist/application/transform/schema/discriminator-property.cjs +3 -2
  281. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -1
  282. package/dist/application/transform/schema/discriminator-property.mjs +3 -2
  283. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -1
  284. package/dist/application/transform/schema/enum-rule.cjs +66 -10
  285. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  286. package/dist/application/transform/schema/enum-rule.mjs +67 -12
  287. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  288. package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
  289. package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
  290. package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
  291. package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
  292. package/dist/application/transform/schema/object-type.cjs +38 -25
  293. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  294. package/dist/application/transform/schema/object-type.mjs +39 -27
  295. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  296. package/dist/application/transform/schema/required-variants.cjs +45 -0
  297. package/dist/application/transform/schema/required-variants.cjs.map +1 -0
  298. package/dist/application/transform/schema/required-variants.mjs +42 -0
  299. package/dist/application/transform/schema/required-variants.mjs.map +1 -0
  300. package/dist/application/transform/schema/schema-transform.cjs +2 -2
  301. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  302. package/dist/application/transform/schema/schema-transform.mjs +2 -2
  303. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  304. package/dist/application/transform/schema-comment.cjs +51 -5
  305. package/dist/application/transform/schema-comment.cjs.map +1 -1
  306. package/dist/application/transform/schema-comment.mjs +50 -6
  307. package/dist/application/transform/schema-comment.mjs.map +1 -1
  308. package/dist/application/transform/type-combinators.mjs +1 -1
  309. package/dist/cli/api-settings.cjs +78 -0
  310. package/dist/cli/api-settings.cjs.map +1 -0
  311. package/dist/cli/api-settings.mjs +73 -0
  312. package/dist/cli/api-settings.mjs.map +1 -0
  313. package/dist/cli/cli-arguments.cjs +12 -3
  314. package/dist/cli/cli-arguments.cjs.map +1 -1
  315. package/dist/cli/cli-arguments.mjs +12 -4
  316. package/dist/cli/cli-arguments.mjs.map +1 -1
  317. package/dist/cli/cli-errors.cjs +3 -2
  318. package/dist/cli/cli-errors.cjs.map +1 -1
  319. package/dist/cli/cli-errors.mjs +3 -2
  320. package/dist/cli/cli-errors.mjs.map +1 -1
  321. package/dist/cli/cli-output.cjs +8 -3
  322. package/dist/cli/cli-output.cjs.map +1 -1
  323. package/dist/cli/cli-output.mjs +9 -4
  324. package/dist/cli/cli-output.mjs.map +1 -1
  325. package/dist/cli/help-text.cjs +3 -3
  326. package/dist/cli/help-text.cjs.map +1 -1
  327. package/dist/cli/help-text.mjs +3 -3
  328. package/dist/cli/help-text.mjs.map +1 -1
  329. package/dist/cli/main.cjs +5 -0
  330. package/dist/cli/main.cjs.map +1 -1
  331. package/dist/cli/main.mjs +5 -0
  332. package/dist/cli/main.mjs.map +1 -1
  333. package/dist/cli/redocly-apis.cjs +15 -7
  334. package/dist/cli/redocly-apis.cjs.map +1 -1
  335. package/dist/cli/redocly-apis.mjs +15 -7
  336. package/dist/cli/redocly-apis.mjs.map +1 -1
  337. package/dist/cli/ref-limits.cjs +1 -1
  338. package/dist/cli/ref-limits.cjs.map +1 -1
  339. package/dist/cli/ref-limits.mjs +2 -2
  340. package/dist/cli/ref-limits.mjs.map +1 -1
  341. package/dist/cli/run-cli.cjs +20 -3
  342. package/dist/cli/run-cli.cjs.map +1 -1
  343. package/dist/cli/run-cli.mjs +21 -4
  344. package/dist/cli/run-cli.mjs.map +1 -1
  345. package/dist/domain/errors.cjs +6 -1
  346. package/dist/domain/errors.cjs.map +1 -1
  347. package/dist/domain/errors.mjs +6 -1
  348. package/dist/domain/errors.mjs.map +1 -1
  349. package/dist/domain/ir/constructors.cjs +7 -1
  350. package/dist/domain/ir/constructors.cjs.map +1 -1
  351. package/dist/domain/ir/constructors.mjs +6 -2
  352. package/dist/domain/ir/constructors.mjs.map +1 -1
  353. package/dist/domain/openapi/admitted-values.cjs +75 -0
  354. package/dist/domain/openapi/admitted-values.cjs.map +1 -0
  355. package/dist/domain/openapi/admitted-values.mjs +72 -0
  356. package/dist/domain/openapi/admitted-values.mjs.map +1 -0
  357. package/dist/domain/openapi/discriminated-union.cjs +68 -0
  358. package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
  359. package/dist/domain/openapi/discriminated-union.mjs +62 -0
  360. package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
  361. package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
  362. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
  363. package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
  364. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
  365. package/dist/domain/openapi/parameter-object.cjs.map +1 -1
  366. package/dist/domain/openapi/parameter-object.mjs.map +1 -1
  367. package/dist/domain/openapi/path-templates.cjs +23 -0
  368. package/dist/domain/openapi/path-templates.cjs.map +1 -0
  369. package/dist/domain/openapi/path-templates.mjs +21 -0
  370. package/dist/domain/openapi/path-templates.mjs.map +1 -0
  371. package/dist/domain/output-fixes.cjs +36 -1
  372. package/dist/domain/output-fixes.cjs.map +1 -1
  373. package/dist/domain/output-fixes.mjs +36 -1
  374. package/dist/domain/output-fixes.mjs.map +1 -1
  375. package/dist/domain/url-credentials.cjs +10 -0
  376. package/dist/domain/url-credentials.cjs.map +1 -0
  377. package/dist/domain/url-credentials.mjs +8 -0
  378. package/dist/domain/url-credentials.mjs.map +1 -0
  379. package/dist/domain/warnings.cjs +23 -0
  380. package/dist/domain/warnings.cjs.map +1 -0
  381. package/dist/domain/warnings.mjs +20 -0
  382. package/dist/domain/warnings.mjs.map +1 -0
  383. package/dist/index.cjs +2 -0
  384. package/dist/index.cjs.map +1 -1
  385. package/dist/index.d.cts +1182 -46
  386. package/dist/index.d.mts +1182 -46
  387. package/dist/index.d.ts +1182 -46
  388. package/dist/index.mjs +1 -0
  389. package/dist/index.mjs.map +1 -1
  390. package/dist/transform/components-object.cjs +2 -1
  391. package/dist/transform/components-object.cjs.map +1 -1
  392. package/dist/transform/components-object.mjs +2 -1
  393. package/dist/transform/components-object.mjs.map +1 -1
  394. package/dist/transform/path-item-object.cjs.map +1 -1
  395. package/dist/transform/path-item-object.mjs.map +1 -1
  396. package/package.json +6 -5
  397. package/src/adapters/redocly-loader/configured-headers.ts +65 -0
  398. package/src/adapters/redocly-loader/redocly-config-source.ts +41 -6
  399. package/src/adapters/redocly-loader/redocly-schema-loader.ts +44 -13
  400. package/src/adapters/redocly-loader/ref-access.ts +60 -5
  401. package/src/adapters/redocly-loader/ref-resolution-check.ts +257 -0
  402. package/src/adapters/redocly-loader/ref-resolution-steps.ts +113 -0
  403. package/src/adapters/redocly-loader/remote-fetch.ts +77 -21
  404. package/src/adapters/redocly-loader/schema-load-errors.ts +33 -11
  405. package/src/adapters/redocly-loader/unsupported-keys.ts +17 -2
  406. package/src/adapters/terminal-logger/terminal-logger.ts +9 -5
  407. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +5 -1
  408. package/src/adapters/type-ast-bridge/print-typescript.ts +3 -1
  409. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +26 -12
  410. package/src/adapters/type-ast-bridge/typescript-types.ts +57 -5
  411. package/src/api/default-ports.ts +16 -0
  412. package/src/api/discriminator-conflict-warnings.ts +43 -0
  413. package/src/api/discriminator-enum-names.ts +26 -0
  414. package/src/api/discriminator-enum-parent.ts +129 -0
  415. package/src/api/discriminator-enum.ts +39 -0
  416. package/src/api/discriminator-other-owners.ts +97 -0
  417. package/src/api/discriminator-patch.ts +152 -0
  418. package/src/api/discriminator-scan.ts +78 -90
  419. package/src/api/document-refs.ts +19 -15
  420. package/src/api/document-run.ts +32 -11
  421. package/src/api/enum-values-warnings.ts +21 -0
  422. package/src/api/footer-sink.ts +34 -2
  423. package/src/api/legacy-callback-warning.ts +7 -3
  424. package/src/api/legacy-ts-helpers.ts +7 -5
  425. package/src/api/legacy-utils.ts +1 -1
  426. package/src/api/openapi-ts.ts +2 -0
  427. package/src/api/path-template-warnings.ts +27 -0
  428. package/src/api/run-context.ts +34 -0
  429. package/src/api/transform-context.ts +17 -9
  430. package/src/api/transform-schema.ts +90 -5
  431. package/src/api/unsupported-feature-warnings.ts +8 -1
  432. package/src/application/ports/redocly-config-source.ts +5 -1
  433. package/src/application/print/type-printer.ts +8 -1
  434. package/src/application/transform/document/assignability.ts +203 -0
  435. package/src/application/transform/document/components.ts +6 -6
  436. package/src/application/transform/document/declared-types.ts +93 -0
  437. package/src/application/transform/document/document.ts +71 -13
  438. package/src/application/transform/document/exploded-query.ts +91 -0
  439. package/src/application/transform/document/global-type-references.ts +78 -0
  440. package/src/application/transform/document/list-assignability.ts +87 -0
  441. package/src/application/transform/document/parameters.ts +78 -12
  442. package/src/application/transform/document/path-key-overlaps.ts +148 -59
  443. package/src/application/transform/document/path-template-replace.ts +90 -0
  444. package/src/application/transform/document/paths.ts +101 -38
  445. package/src/application/transform/document/root-type-aliases.ts +29 -28
  446. package/src/application/transform/document/template-key-match.ts +183 -0
  447. package/src/application/transform/document/type-assignability.ts +268 -0
  448. package/src/application/transform/document/type-key.ts +80 -0
  449. package/src/application/transform/document/type-resolution.ts +163 -0
  450. package/src/application/transform/footer/document-footer.ts +91 -6
  451. package/src/application/transform/footer/enum-naming.ts +29 -0
  452. package/src/application/transform/footer/enum-values-check.ts +171 -0
  453. package/src/application/transform/footer/evaluation.ts +57 -0
  454. package/src/application/transform/footer/shared-enum-names.ts +86 -0
  455. package/src/application/transform/footer/type-evaluation.ts +167 -0
  456. package/src/application/transform/footer/type-indexing.ts +152 -0
  457. package/src/application/transform/footer/type-rules.ts +269 -0
  458. package/src/application/transform/ref-pointer/generated-location.ts +211 -0
  459. package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
  460. package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
  461. package/src/application/transform/ref-pointer/original-index.ts +95 -0
  462. package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
  463. package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
  464. package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
  465. package/src/application/transform/ref-type.ts +11 -6
  466. package/src/application/transform/schema/access-flags.ts +63 -0
  467. package/src/application/transform/schema/array-type.ts +66 -5
  468. package/src/application/transform/schema/composition-type.ts +96 -24
  469. package/src/application/transform/schema/core-type.ts +8 -4
  470. package/src/application/transform/schema/discriminated-union.ts +58 -0
  471. package/src/application/transform/schema/discriminator-property.ts +8 -3
  472. package/src/application/transform/schema/enum-rule.ts +136 -13
  473. package/src/application/transform/schema/inherited-discriminator.ts +54 -0
  474. package/src/application/transform/schema/object-type.ts +51 -33
  475. package/src/application/transform/schema/required-variants.ts +88 -0
  476. package/src/application/transform/schema/schema-context.ts +26 -0
  477. package/src/application/transform/schema/schema-transform.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +84 -4
  479. package/src/cli/api-settings.ts +109 -0
  480. package/src/cli/cli-arguments.ts +18 -5
  481. package/src/cli/cli-dependencies.ts +5 -0
  482. package/src/cli/cli-errors.ts +4 -2
  483. package/src/cli/cli-output.ts +18 -4
  484. package/src/cli/help-text.ts +4 -4
  485. package/src/cli/main.ts +6 -0
  486. package/src/cli/redocly-apis.ts +21 -11
  487. package/src/cli/ref-limits.ts +2 -2
  488. package/src/cli/run-cli.ts +25 -4
  489. package/src/domain/errors.ts +10 -2
  490. package/src/domain/ir/constructors.ts +9 -1
  491. package/src/domain/ir/nodes.ts +11 -7
  492. package/src/domain/openapi/admitted-values.ts +113 -0
  493. package/src/domain/openapi/discriminated-union.ts +109 -0
  494. package/src/domain/openapi/discriminator-conflicts.ts +251 -0
  495. package/src/domain/openapi/parameter-object.ts +4 -0
  496. package/src/domain/openapi/path-templates.ts +32 -0
  497. package/src/domain/openapi/schema-object.ts +2 -0
  498. package/src/domain/output-fixes.ts +43 -2
  499. package/src/domain/url-credentials.ts +18 -0
  500. package/src/domain/warnings.ts +28 -0
  501. package/src/index.ts +1 -0
  502. package/src/transform/components-object.ts +3 -1
  503. package/src/transform/path-item-object.ts +6 -2
  504. package/src/types/generator-options.ts +12 -21
  505. package/src/types/openapi-common.ts +1 -0
  506. package/src/types/openapi-request.ts +3 -0
  507. package/src/types/openapi-schema.ts +2 -0
  508. package/src/types/openapi-security.ts +1 -0
  509. package/dist/application/transform/document/path-item-conflicts.cjs +0 -51
  510. package/dist/application/transform/document/path-item-conflicts.cjs.map +0 -1
  511. package/dist/application/transform/document/path-item-conflicts.mjs +0 -49
  512. package/dist/application/transform/document/path-item-conflicts.mjs.map +0 -1
  513. package/src/application/transform/document/path-item-conflicts.ts +0 -79
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveFileUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = input ? new URL(input, run.deps.cwd) : run.deps.stdin();\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveFileUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.mjs","sources":["../../src/cli/run-cli.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type { RedoclyConfig } from \"../application/ports/redocly-config-source.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { SchemaSource } from \"../types.js\";\nimport { ineffectiveFlagNotices, parseCliArguments } from \"./cli-arguments.js\";\nimport type { CliDependencies } from \"./cli-dependencies.js\";\nimport { cliError, describeCliFailure, EXIT_CODES, type ExitCode } from \"./cli-errors.js\";\nimport { type CliRun, emitOutput, resolveLocationUrl } from \"./cli-output.js\";\nimport { MULTIPLE_SCHEMAS_DOCS_URL } from \"./docs-links.js\";\nimport { fixOption } from \"./fix-option.js\";\nimport { HELP_TEXT } from \"./help-text.js\";\nimport { generateRedoclyApis, hasRedoclyApis } from \"./redocly-apis.js\";\nimport { refLimitOptions } from \"./ref-limits.js\";\n\n/**\n * The CLI's use case: parse the arguments, then generate the APIs of the Redocly config, one\n * schema file or URL, or stdin. It has no process access of its own; `main.ts` wires it (ADR-012).\n */\n\nasync function loadRedoclyConfig(run: CliRun): Promise<RedoclyConfig> {\n const { redoclyConfigs } = run.deps;\n const explicitPath = run.args.redocly;\n const configPath = redoclyConfigs.find(explicitPath);\n if (explicitPath && !configPath) {\n throw cliError(\"CLI_CONFIG_NOT_FOUND\", `Redocly config not found at: ${explicitPath}`);\n }\n return configPath ? redoclyConfigs.load(configPath) : redoclyConfigs.createDefault();\n}\n\n/** The schema's URL, or stdin when no path or URL is given and something is piped in. */\nfunction schemaSource(run: CliRun): SchemaSource {\n const { input } = run.args;\n if (input) {\n return resolveLocationUrl(input, run.deps.cwd);\n }\n if (run.deps.isStdinTerminal()) {\n throw cliError(\n \"CLI_INPUT_MISSING\",\n \"No schema given: pass a schema path or URL, pipe a schema into stdin, or define `apis` \" +\n \"in redocly.yaml. See --help.\",\n );\n }\n return run.deps.stdin();\n}\n\n/** One schema from a path, a URL or stdin; without `--output`, the types go to stdout only. */\nasync function generateSingleSchema(run: CliRun, redocly: RedoclyConfig): Promise<void> {\n const { input, output } = run.args;\n if (input?.includes(\"*\")) {\n throw cliError(\n \"CLI_GLOB_UNSUPPORTED\",\n \"Globbing has been deprecated in favor of redocly.yaml’s `apis` keys. \" +\n `See ${MULTIPLE_SCHEMAS_DOCS_URL}`,\n );\n }\n if (run.args.isCheck && !output) {\n // Without a file there is nothing to compare: the original printed the types and passed.\n throw cliError(\n \"CLI_CHECK_OUTPUT_MISSING\",\n \"--check needs the generated file to compare with: add --output <file>.\",\n );\n }\n const source = schemaSource(run);\n const options = {\n ...run.args.generatorFlags,\n ...refLimitOptions(run.args, run.deps.cwd),\n ...fixOption(run.args.fix),\n redocly,\n silent: !output,\n };\n const contents = await run.deps.generate(source, options);\n if (!output) {\n run.deps.writeStdout(contents);\n return;\n }\n const file = resolveLocationUrl(output, run.deps.cwd);\n emitOutput(run, { source: input ?? \"stdin\", output, file }, contents);\n}\n\nasync function generate(run: CliRun): Promise<unknown[]> {\n const redocly = await loadRedoclyConfig(run);\n if (!hasRedoclyApis(redocly)) {\n await generateSingleSchema(run, redocly);\n return [];\n }\n if (run.args.input) {\n run.deps.logger.warn(\n warningText(\n \"APIs are specified both in Redocly Config and CLI argument. Only using Redocly config.\",\n WARNING_CODES.CLI_INPUT_IGNORED,\n ),\n );\n }\n return generateRedoclyApis(run, redocly);\n}\n\n/** Run the command; the failures it returns did not stop the other outputs. */\nasync function runCommand(argv: readonly string[], deps: CliDependencies): Promise<unknown[]> {\n const startedAt = deps.now();\n for (const notice of ineffectiveFlagNotices(argv)) {\n deps.console.notice(notice);\n }\n const args = parseCliArguments(argv);\n for (const flag of args.unknownFlags) {\n deps.console.notice(`Unknown flag ${flag} is ignored (see --help)`);\n }\n if (args.isHelp || args.isVersion) {\n deps.console.info(args.isHelp ? HELP_TEXT : `v${deps.version}`);\n return [];\n }\n if (args.output) {\n deps.console.info(`✨ ${deps.style.bold(`openapi-typesafe ${deps.version}`)}`);\n }\n return generate({ deps, args, startedAt });\n}\n\n/** Print one line per failure; the exit code is the first failure's (ADR-011). */\nfunction reportFailures(failures: readonly unknown[], logger: Logger): ExitCode {\n const reports = failures.map(describeCliFailure);\n for (const report of reports) {\n logger.error(report.message);\n }\n return reports[0]?.exitCode ?? EXIT_CODES.SUCCESS;\n}\n\n/** Run the CLI with the arguments after `node cli.js`, and return the process exit code. */\nexport async function runCli(argv: readonly string[], deps: CliDependencies): Promise<ExitCode> {\n let failures: unknown[];\n try {\n failures = await runCommand(argv, deps);\n } catch (thrown) {\n failures = [thrown];\n }\n return reportFailures(failures, deps.logger);\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  'use strict';
2
2
 
3
+ const urlCredentials = require('./url-credentials.cjs');
4
+
3
5
  const ERROR_CODES = {
4
6
  SCHEMA_SOURCE_EMPTY: "SCHEMA_SOURCE_EMPTY",
5
7
  SCHEMA_SOURCE_INVALID: "SCHEMA_SOURCE_INVALID",
@@ -20,8 +22,10 @@ const ERROR_CODES = {
20
22
  CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
21
23
  CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
22
24
  CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
25
+ CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
23
26
  CLI_CONFIG_OUTPUT_MISSING: "CLI_CONFIG_OUTPUT_MISSING",
24
27
  CLI_CHECK_OUTPUT_MISSING: "CLI_CHECK_OUTPUT_MISSING",
28
+ CLI_INPUT_MISSING: "CLI_INPUT_MISSING",
25
29
  OUTPUT_STALE: "OUTPUT_STALE",
26
30
  OUTPUT_READ_FAILED: "OUTPUT_READ_FAILED",
27
31
  OUTPUT_WRITE_FAILED: "OUTPUT_WRITE_FAILED"
@@ -30,7 +34,8 @@ class OpenAPITypesafeError extends Error {
30
34
  code;
31
35
  details;
32
36
  constructor(init) {
33
- super(init.message, init.cause === void 0 ? void 0 : { cause: init.cause });
37
+ const message = urlCredentials.redactUrlCredentials(init.message);
38
+ super(message, init.cause === void 0 ? void 0 : { cause: init.cause });
34
39
  this.name = "OpenAPITypesafeError";
35
40
  this.code = init.code;
36
41
  this.details = init.details ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/** The base of every expected failure; check `code`, not the class or the message. */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n super(init.message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":";;AAQO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAgBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAChF,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;;;"}
1
+ {"version":3,"file":"errors.cjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactUrlCredentials } from \"./url-credentials.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * never shows the user info of a URL (`url-credentials.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlCredentials(init.message);\n super(message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":["redactUrlCredentials"],"mappings":";;;;AAUO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAmBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAUA,mCAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC3E,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;;;"}
@@ -1,3 +1,5 @@
1
+ import { redactUrlCredentials } from './url-credentials.mjs';
2
+
1
3
  const ERROR_CODES = {
2
4
  SCHEMA_SOURCE_EMPTY: "SCHEMA_SOURCE_EMPTY",
3
5
  SCHEMA_SOURCE_INVALID: "SCHEMA_SOURCE_INVALID",
@@ -18,8 +20,10 @@ const ERROR_CODES = {
18
20
  CLI_FLAG_REMOVED: "CLI_FLAG_REMOVED",
19
21
  CLI_GLOB_UNSUPPORTED: "CLI_GLOB_UNSUPPORTED",
20
22
  CLI_CONFIG_NOT_FOUND: "CLI_CONFIG_NOT_FOUND",
23
+ CLI_CONFIG_INVALID: "CLI_CONFIG_INVALID",
21
24
  CLI_CONFIG_OUTPUT_MISSING: "CLI_CONFIG_OUTPUT_MISSING",
22
25
  CLI_CHECK_OUTPUT_MISSING: "CLI_CHECK_OUTPUT_MISSING",
26
+ CLI_INPUT_MISSING: "CLI_INPUT_MISSING",
23
27
  OUTPUT_STALE: "OUTPUT_STALE",
24
28
  OUTPUT_READ_FAILED: "OUTPUT_READ_FAILED",
25
29
  OUTPUT_WRITE_FAILED: "OUTPUT_WRITE_FAILED"
@@ -28,7 +32,8 @@ class OpenAPITypesafeError extends Error {
28
32
  code;
29
33
  details;
30
34
  constructor(init) {
31
- super(init.message, init.cause === void 0 ? void 0 : { cause: init.cause });
35
+ const message = redactUrlCredentials(init.message);
36
+ super(message, init.cause === void 0 ? void 0 : { cause: init.cause });
32
37
  this.name = "OpenAPITypesafeError";
33
38
  this.code = init.code;
34
39
  this.details = init.details ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/** The base of every expected failure; check `code`, not the class or the message. */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n super(init.message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":"AAQO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAgBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAChF,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;"}
1
+ {"version":3,"file":"errors.mjs","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { redactUrlCredentials } from \"./url-credentials.js\";\n\n/**\n * Typed errors (ENGINEERING_PLAN 4.6, ADR-011). Every expected failure of the generator and the CLI\n * is an `OpenAPITypesafeError` with a stable machine-readable `code` and structured `details`. The\n * `message` is English text for people; programs and the CLI decide by `code`. A bug (a broken\n * invariant) is a plain `Error`, not one of these.\n */\n\n/** Every error code. The set is closed: a new code must be handled by the CLI exit-code table. */\nexport const ERROR_CODES = {\n SCHEMA_SOURCE_EMPTY: \"SCHEMA_SOURCE_EMPTY\",\n SCHEMA_SOURCE_INVALID: \"SCHEMA_SOURCE_INVALID\",\n SCHEMA_LOAD_FAILED: \"SCHEMA_LOAD_FAILED\",\n SCHEMA_PARSE_FAILED: \"SCHEMA_PARSE_FAILED\",\n SCHEMA_VERSION_UNSUPPORTED: \"SCHEMA_VERSION_UNSUPPORTED\",\n SCHEMA_INVALID: \"SCHEMA_INVALID\",\n SCHEMA_REF_INVALID: \"SCHEMA_REF_INVALID\",\n SCHEMA_REF_FORBIDDEN: \"SCHEMA_REF_FORBIDDEN\",\n SCHEMA_OBJECT_INVALID: \"SCHEMA_OBJECT_INVALID\",\n SCHEMA_PROPERTY_INVALID: \"SCHEMA_PROPERTY_INVALID\",\n SCHEMA_TOO_DEEP: \"SCHEMA_TOO_DEEP\",\n SCHEMA_KEY_UNSUPPORTED: \"SCHEMA_KEY_UNSUPPORTED\",\n ENUM_NAME_EMPTY: \"ENUM_NAME_EMPTY\",\n CALLBACK_RESULT_UNREADABLE: \"CALLBACK_RESULT_UNREADABLE\",\n OPTION_FIX_UNKNOWN: \"OPTION_FIX_UNKNOWN\",\n TYPESCRIPT_NOT_FOUND: \"TYPESCRIPT_NOT_FOUND\",\n CLI_FLAG_REMOVED: \"CLI_FLAG_REMOVED\",\n CLI_GLOB_UNSUPPORTED: \"CLI_GLOB_UNSUPPORTED\",\n CLI_CONFIG_NOT_FOUND: \"CLI_CONFIG_NOT_FOUND\",\n CLI_CONFIG_INVALID: \"CLI_CONFIG_INVALID\",\n CLI_CONFIG_OUTPUT_MISSING: \"CLI_CONFIG_OUTPUT_MISSING\",\n CLI_CHECK_OUTPUT_MISSING: \"CLI_CHECK_OUTPUT_MISSING\",\n CLI_INPUT_MISSING: \"CLI_INPUT_MISSING\",\n OUTPUT_STALE: \"OUTPUT_STALE\",\n OUTPUT_READ_FAILED: \"OUTPUT_READ_FAILED\",\n OUTPUT_WRITE_FAILED: \"OUTPUT_WRITE_FAILED\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/** Structured, JSON-serializable facts about a failure, for programs and logs. */\nexport type ErrorDetails = Readonly<Record<string, unknown>>;\n\nexport interface OpenAPITypesafeErrorInit {\n readonly code: ErrorCode;\n readonly message: string;\n readonly details?: ErrorDetails;\n /** The lower-level error this one reports, if any (kept as the standard `cause`). */\n readonly cause?: unknown;\n}\n\n/**\n * The base of every expected failure; check `code`, not the class or the message. The message\n * never shows the user info of a URL (`url-credentials.ts`).\n */\nexport class OpenAPITypesafeError extends Error {\n readonly code: ErrorCode;\n readonly details: ErrorDetails;\n\n constructor(init: OpenAPITypesafeErrorInit) {\n const message = redactUrlCredentials(init.message);\n super(message, init.cause === undefined ? undefined : { cause: init.cause });\n this.name = \"OpenAPITypesafeError\";\n this.code = init.code;\n this.details = init.details ?? {};\n }\n}\n\n/** Whether a thrown value is one of our typed errors (also across bundled copies of the class). */\nexport function isOpenAPITypesafeError(value: unknown): value is OpenAPITypesafeError {\n if (value instanceof OpenAPITypesafeError) {\n return true;\n }\n const code = (value as { code?: unknown } | null)?.code;\n return (\n value instanceof Error &&\n typeof code === \"string\" &&\n Object.hasOwn(ERROR_CODES, code) &&\n typeof (value as { details?: unknown }).details === \"object\"\n );\n}\n"],"names":[],"mappings":";;AAUO,MAAM,WAAA,GAAc;AAAA,EACzB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,eAAA,EAAiB,iBAAA;AAAA,EACjB,0BAAA,EAA4B,4BAAA;AAAA,EAC5B,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,kBAAA,EAAoB,oBAAA;AAAA,EACpB,mBAAA,EAAqB;AACvB;AAmBO,MAAM,6BAA6B,KAAA,CAAM;AAAA,EACrC,IAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,IAAA,EAAgC;AAC1C,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AACjD,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,KAAA,KAAU,MAAA,GAAY,SAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAC3E,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,EAClC;AACF;AAGO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,iBAAiB,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAQ,KAAA,EAAqC,IAAA;AACnD,EAAA,OACE,KAAA,YAAiB,KAAA,IACjB,OAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,IAAI,CAAA,IAC/B,OAAQ,KAAA,CAAgC,OAAA,KAAY,QAAA;AAExD;;"}
@@ -3,6 +3,7 @@
3
3
  function irKeyword(keyword) {
4
4
  return { kind: "keyword", keyword };
5
5
  }
6
+ const DEFAULT_STRING_ENCODING = "json";
6
7
  function irString(value, encoding) {
7
8
  return { kind: "stringLiteral", value, encoding };
8
9
  }
@@ -25,7 +26,10 @@ function irTuple(elements) {
25
26
  return { kind: "tuple", elements };
26
27
  }
27
28
  function irTupleElement(type, isRest = false) {
28
- return { type, isRest };
29
+ return { type, isRest, isOptional: false };
30
+ }
31
+ function irOptionalTupleElement(type) {
32
+ return { type, isRest: false, isOptional: true };
29
33
  }
30
34
  function irUnion(types) {
31
35
  return { kind: "union", types };
@@ -69,6 +73,7 @@ function irRecord(key, value) {
69
73
  return irReference("Record", [key, value]);
70
74
  }
71
75
 
76
+ exports.DEFAULT_STRING_ENCODING = DEFAULT_STRING_ENCODING;
72
77
  exports.irArray = irArray;
73
78
  exports.irBoolean = irBoolean;
74
79
  exports.irIndexedAccess = irIndexedAccess;
@@ -76,6 +81,7 @@ exports.irIntersection = irIntersection;
76
81
  exports.irKeyword = irKeyword;
77
82
  exports.irNumber = irNumber;
78
83
  exports.irObject = irObject;
84
+ exports.irOptionalTupleElement = irOptionalTupleElement;
79
85
  exports.irProperty = irProperty;
80
86
  exports.irRaw = irRaw;
81
87
  exports.irReadonly = irReadonly;
@@ -1 +1 @@
1
- {"version":3,"file":"constructors.cjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":";;AA+BO,SAAS,UAAU,OAAA,EAAmC;AAC3D,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAQ;AACpC;AAEO,SAAS,QAAA,CAAS,OAAe,QAAA,EAAiD;AACvF,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,QAAA,EAAS;AAClD;AAGO,SAAS,SAAS,KAAA,EAAoC;AAC3D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,iDAAA,EAAoD,KAAK,CAAA,CAAE,CAAA;AAAA,EAClF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAM;AACxC;AAEO,SAAS,UAAU,KAAA,EAAsC;AAC9D,EAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAM;AACzC;AAEO,SAAS,WAAA,CAAY,IAAA,EAAc,aAAA,GAAmC,EAAC,EAAoB;AAChG,EAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,aAAA,EAAc;AAClD;AAEO,SAAS,QAAQ,OAAA,EAA8B;AACpD,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAQ;AAClC;AAEO,SAAS,QAAQ,QAAA,EAAkD;AACxE,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAS;AACnC;AAEO,SAAS,cAAA,CAAe,IAAA,EAAc,MAAA,GAAS,KAAA,EAAuB;AAC3E,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAEO,SAAS,QAAQ,KAAA,EAAuC;AAC7D,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAM;AAChC;AAEO,SAAS,eAAe,KAAA,EAA8C;AAC3E,EAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAM;AACvC;AAEO,SAAS,SAAS,OAAA,EAA4C;AACnE,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AACnC;AAEO,SAAS,eAAA,CAAgB,QAAgB,KAAA,EAAoC;AAClF,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,MAAA,EAAQ,KAAA,EAAM;AAChD;AAEO,SAAS,WAAW,IAAA,EAA8B;AACvD,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAK;AAClC;AAMO,SAAS,KAAA,CAAM,MAAc,MAAA,EAA6B;AAC/D,EAAA,OAAO,MAAA,KAAW,MAAA,GAAY,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,GAAI,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AACpF;AASO,SAAS,UAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,GAA6B,EAAC,EACT;AACrB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,IAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,KAAA;AAAA,IAClC,UAAA,EAAY,QAAQ,UAAA,IAAc,KAAA;AAAA,IAClC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GACjC;AACF;AAGO,SAAS,sBAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,GAAa,KAAA,EACK;AAClB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,aAAA;AAAA,IACA,aAAA,EAAe,UAAU,QAAQ,CAAA;AAAA,IACjC,IAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAU;AAAC,GACb;AACF;AAGO,SAAS,QAAA,CAAS,KAAa,KAAA,EAAgC;AACpE,EAAA,OAAO,WAAA,CAAY,QAAA,EAAU,CAAC,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"constructors.cjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\n/** The encoding of a string literal that does not name one. */\nexport const DEFAULT_STRING_ENCODING: IrStringEncoding = \"json\";\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  function irKeyword(keyword) {
2
2
  return { kind: "keyword", keyword };
3
3
  }
4
+ const DEFAULT_STRING_ENCODING = "json";
4
5
  function irString(value, encoding) {
5
6
  return { kind: "stringLiteral", value, encoding };
6
7
  }
@@ -23,7 +24,10 @@ function irTuple(elements) {
23
24
  return { kind: "tuple", elements };
24
25
  }
25
26
  function irTupleElement(type, isRest = false) {
26
- return { type, isRest };
27
+ return { type, isRest, isOptional: false };
28
+ }
29
+ function irOptionalTupleElement(type) {
30
+ return { type, isRest: false, isOptional: true };
27
31
  }
28
32
  function irUnion(types) {
29
33
  return { kind: "union", types };
@@ -67,5 +71,5 @@ function irRecord(key, value) {
67
71
  return irReference("Record", [key, value]);
68
72
  }
69
73
 
70
- export { irArray, irBoolean, irIndexedAccess, irIntersection, irKeyword, irNumber, irObject, irProperty, irRaw, irReadonly, irRecord, irReference, irString, irStringIndexSignature, irTuple, irTupleElement, irUnion };
74
+ export { DEFAULT_STRING_ENCODING, irArray, irBoolean, irIndexedAccess, irIntersection, irKeyword, irNumber, irObject, irOptionalTupleElement, irProperty, irRaw, irReadonly, irRecord, irReference, irString, irStringIndexSignature, irTuple, irTupleElement, irUnion };
71
75
  //# sourceMappingURL=constructors.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constructors.mjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"constructors.mjs","sources":["../../../src/domain/ir/constructors.ts"],"sourcesContent":["import type {\n IrArrayType,\n IrBooleanLiteralType,\n IrComment,\n IrIndexedAccessType,\n IrIndexSignature,\n IrIntersectionType,\n IrKeyword,\n IrKeywordType,\n IrMember,\n IrNumberLiteralType,\n IrObjectType,\n IrPropertyName,\n IrPropertySignature,\n IrRawType,\n IrReadonlyType,\n IrReferenceType,\n IrStringEncoding,\n IrStringLiteralType,\n IrTupleElement,\n IrTupleType,\n IrType,\n IrUnionType,\n} from \"./nodes.js\";\n\n/**\n * Constructors of IR nodes. They build exactly the node asked for: no flattening, de-duplication or\n * sorting happens here (ENGINEERING_PLAN §4.2). Callers that need those call the functions in\n * `normalize.ts` explicitly, at the same places the original generator does.\n */\n\nexport function irKeyword(keyword: IrKeyword): IrKeywordType {\n return { kind: \"keyword\", keyword };\n}\n\n/** The encoding of a string literal that does not name one. */\nexport const DEFAULT_STRING_ENCODING: IrStringEncoding = \"json\";\n\nexport function irString(value: string, encoding: IrStringEncoding): IrStringLiteralType {\n return { kind: \"stringLiteral\", value, encoding };\n}\n\n/** Throws on NaN and infinities: they have no literal type. */\nexport function irNumber(value: number): IrNumberLiteralType {\n if (!Number.isFinite(value)) {\n throw new RangeError(`A number literal type needs a finite number, got ${value}`);\n }\n return { kind: \"numberLiteral\", value };\n}\n\nexport function irBoolean(value: boolean): IrBooleanLiteralType {\n return { kind: \"booleanLiteral\", value };\n}\n\nexport function irReference(name: string, typeArguments: readonly IrType[] = []): IrReferenceType {\n return { kind: \"reference\", name, typeArguments };\n}\n\nexport function irArray(element: IrType): IrArrayType {\n return { kind: \"array\", element };\n}\n\nexport function irTuple(elements: readonly IrTupleElement[]): IrTupleType {\n return { kind: \"tuple\", elements };\n}\n\nexport function irTupleElement(type: IrType, isRest = false): IrTupleElement {\n return { type, isRest, isOptional: false };\n}\n\n/** `T?`: an element the tuple may end before. */\nexport function irOptionalTupleElement(type: IrType): IrTupleElement {\n return { type, isRest: false, isOptional: true };\n}\n\nexport function irUnion(types: readonly IrType[]): IrUnionType {\n return { kind: \"union\", types };\n}\n\nexport function irIntersection(types: readonly IrType[]): IrIntersectionType {\n return { kind: \"intersection\", types };\n}\n\nexport function irObject(members: readonly IrMember[]): IrObjectType {\n return { kind: \"object\", members };\n}\n\nexport function irIndexedAccess(object: IrType, index: IrType): IrIndexedAccessType {\n return { kind: \"indexedAccess\", object, index };\n}\n\nexport function irReadonly(type: IrType): IrReadonlyType {\n return { kind: \"readonly\", type };\n}\n\n/**\n * Type text printed as is. The original builds some types from text (template literal path keys,\n * root type aliases); keeping them as text keeps their exact spelling.\n */\nexport function irRaw(text: string, origin?: unknown): IrRawType {\n return origin === undefined ? { kind: \"raw\", text } : { kind: \"raw\", text, origin };\n}\n\n/** Options of a property signature; omitted flags are false and there are no comments. */\nexport interface IrPropertyOptions {\n readonly isOptional?: boolean;\n readonly isReadonly?: boolean;\n readonly comments?: readonly IrComment[];\n}\n\nexport function irProperty(\n name: IrPropertyName,\n type: IrType,\n options: IrPropertyOptions = {},\n): IrPropertySignature {\n return {\n kind: \"property\",\n name,\n type,\n isOptional: options.isOptional ?? false,\n isReadonly: options.isReadonly ?? false,\n comments: options.comments ?? [],\n };\n}\n\n/** `[name: string]: type` (a `string` key, the only kind the generator writes). */\nexport function irStringIndexSignature(\n parameterName: string,\n type: IrType,\n isReadonly = false,\n): IrIndexSignature {\n return {\n kind: \"indexSignature\",\n parameterName,\n parameterType: irKeyword(\"string\"),\n type,\n isReadonly,\n comments: [],\n };\n}\n\n/** `Record<key, value>`. */\nexport function irRecord(key: IrType, value: IrType): IrReferenceType {\n return irReference(\"Record\", [key, value]);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('./json-pointer.cjs');
4
+
5
+ const MAX_DEPTH = 16;
6
+ const LOCAL_REF_PREFIX = "#/";
7
+ function isObject(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
+ }
10
+ function resolveLocalRef(document, ref) {
11
+ if (!ref.startsWith(LOCAL_REF_PREFIX)) {
12
+ return void 0;
13
+ }
14
+ let node = document;
15
+ for (const segment of jsonPointer.parseRefPointer(ref)) {
16
+ node = isObject(node) || Array.isArray(node) ? node[segment] : void 0;
17
+ }
18
+ return node;
19
+ }
20
+ function intersect(left, right) {
21
+ if (left === null || right === null) {
22
+ return left ?? right;
23
+ }
24
+ return new Set([...left].filter((value) => right.has(value)));
25
+ }
26
+ function unite(sets) {
27
+ return sets.some((set) => set === null) ? null : new Set(sets.flatMap((set) => [...set ?? []]));
28
+ }
29
+ function isAdmittedValue(value) {
30
+ return value === null || ["string", "number", "boolean"].includes(typeof value);
31
+ }
32
+ function follow(node, walk) {
33
+ if (!isObject(node) || typeof node.$ref !== "string") {
34
+ return node;
35
+ }
36
+ return walk.skipped.has(node.$ref) ? void 0 : resolveLocalRef(walk.document, node.$ref);
37
+ }
38
+ function members(node, keyword) {
39
+ const list = node[keyword];
40
+ return Array.isArray(list) ? list : [];
41
+ }
42
+ function ownValues(node) {
43
+ const listed = Array.isArray(node.enum) ? node.enum.filter(isAdmittedValue) : null;
44
+ const constant = "const" in node && isAdmittedValue(node.const) ? /* @__PURE__ */ new Set([node.const]) : null;
45
+ return intersect(listed === null ? null : new Set(listed), constant);
46
+ }
47
+ function schemaValues(schema, walk) {
48
+ const node = follow(schema, walk);
49
+ if (!isObject(node) || walk.depth > MAX_DEPTH) {
50
+ return null;
51
+ }
52
+ const next = { ...walk, depth: walk.depth + 1 };
53
+ const parts = members(node, "allOf").map((part) => schemaValues(part, next));
54
+ const variants = [...members(node, "anyOf"), ...members(node, "oneOf")];
55
+ const union = variants.length === 0 ? null : unite(variants.map((v) => schemaValues(v, next)));
56
+ return [...parts, union].reduce(intersect, ownValues(node));
57
+ }
58
+ function propertyValues(schema, key, walk) {
59
+ const node = follow(schema, walk);
60
+ if (!isObject(node) || walk.depth > MAX_DEPTH) {
61
+ return null;
62
+ }
63
+ const next = { ...walk, depth: walk.depth + 1 };
64
+ const properties = isObject(node.properties) ? node.properties : {};
65
+ const own = Object.hasOwn(properties, key) ? schemaValues(properties[key], next) : null;
66
+ const parts = members(node, "allOf").map((part) => propertyValues(part, key, next));
67
+ return parts.reduce(intersect, own);
68
+ }
69
+ function admittedPropertyValues(schema, key, document, skipped = /* @__PURE__ */ new Set()) {
70
+ return propertyValues(schema, key, { document, depth: 0, skipped });
71
+ }
72
+
73
+ exports.admittedPropertyValues = admittedPropertyValues;
74
+ exports.resolveLocalRef = resolveLocalRef;
75
+ //# sourceMappingURL=admitted-values.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admitted-values.cjs","sources":["../../../src/domain/openapi/admitted-values.ts"],"sourcesContent":["import { parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * The values a schema admits when it admits only finitely many (`enum`, `const`, and `allOf` /\n * `anyOf` / `oneOf` of those), read from the document. Null means \"any value\" as far as this\n * reading goes: a schema of any other shape, or a `$ref` it cannot follow, is never assumed to\n * exclude a value.\n */\n\nexport type AdmittedValue = string | number | boolean | null;\n/** A finite set of values, or null for every value. */\nexport type AdmittedValues = ReadonlySet<AdmittedValue> | null;\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\n/** How deep `$ref`s and compositions are followed; deeper schemas admit every value. */\nconst MAX_DEPTH = 16;\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The node at a local `$ref` (`#/...`) of the document, or undefined. */\nexport function resolveLocalRef(document: unknown, ref: string): unknown {\n if (!ref.startsWith(LOCAL_REF_PREFIX)) {\n return undefined;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node;\n}\n\nfunction intersect(left: AdmittedValues, right: AdmittedValues): AdmittedValues {\n if (left === null || right === null) {\n return left ?? right;\n }\n return new Set([...left].filter((value) => right.has(value)));\n}\n\nfunction unite(sets: readonly AdmittedValues[]): AdmittedValues {\n return sets.some((set) => set === null) ? null : new Set(sets.flatMap((set) => [...(set ?? [])]));\n}\n\nfunction isAdmittedValue(value: unknown): value is AdmittedValue {\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value);\n}\n\ninterface Walk {\n readonly document: unknown;\n readonly depth: number;\n /** `$ref`s whose targets are left out: they add nothing to the generated type here. */\n readonly skipped: ReadonlySet<string>;\n}\n\nfunction follow(node: unknown, walk: Walk): unknown {\n if (!isObject(node) || typeof node.$ref !== \"string\") {\n return node;\n }\n return walk.skipped.has(node.$ref) ? undefined : resolveLocalRef(walk.document, node.$ref);\n}\n\nfunction members(node: JsonObject, keyword: string): readonly unknown[] {\n const list = node[keyword];\n return Array.isArray(list) ? list : [];\n}\n\n/** `enum` and `const` of the schema itself, before its compositions. */\nfunction ownValues(node: JsonObject): AdmittedValues {\n const listed = Array.isArray(node.enum) ? node.enum.filter(isAdmittedValue) : null;\n const constant = \"const\" in node && isAdmittedValue(node.const) ? new Set([node.const]) : null;\n return intersect(listed === null ? null : new Set(listed), constant);\n}\n\nfunction schemaValues(schema: unknown, walk: Walk): AdmittedValues {\n const node = follow(schema, walk);\n if (!isObject(node) || walk.depth > MAX_DEPTH) {\n return null;\n }\n const next = { ...walk, depth: walk.depth + 1 };\n const parts = members(node, \"allOf\").map((part) => schemaValues(part, next));\n const variants = [...members(node, \"anyOf\"), ...members(node, \"oneOf\")];\n const union = variants.length === 0 ? null : unite(variants.map((v) => schemaValues(v, next)));\n return [...parts, union].reduce<AdmittedValues>(intersect, ownValues(node));\n}\n\nfunction propertyValues(schema: unknown, key: string, walk: Walk): AdmittedValues {\n const node = follow(schema, walk);\n if (!isObject(node) || walk.depth > MAX_DEPTH) {\n return null;\n }\n const next = { ...walk, depth: walk.depth + 1 };\n const properties = isObject(node.properties) ? node.properties : {};\n const own = Object.hasOwn(properties, key) ? schemaValues(properties[key], next) : null;\n const parts = members(node, \"allOf\").map((part) => propertyValues(part, key, next));\n return parts.reduce<AdmittedValues>(intersect, own);\n}\n\n/**\n * The values property `key` of an object schema admits: the intersection over the schema's own\n * `properties` and its `allOf` parts (followed through `$ref`s, except `skipped` ones); null for\n * every value.\n */\nexport function admittedPropertyValues(\n schema: unknown,\n key: string,\n document: unknown,\n skipped: ReadonlySet<string> = new Set(),\n): AdmittedValues {\n return propertyValues(schema, key, { document, depth: 0, skipped });\n}\n"],"names":["parseRefPointer"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { parseRefPointer } from './json-pointer.mjs';
2
+
3
+ const MAX_DEPTH = 16;
4
+ const LOCAL_REF_PREFIX = "#/";
5
+ function isObject(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ function resolveLocalRef(document, ref) {
9
+ if (!ref.startsWith(LOCAL_REF_PREFIX)) {
10
+ return void 0;
11
+ }
12
+ let node = document;
13
+ for (const segment of parseRefPointer(ref)) {
14
+ node = isObject(node) || Array.isArray(node) ? node[segment] : void 0;
15
+ }
16
+ return node;
17
+ }
18
+ function intersect(left, right) {
19
+ if (left === null || right === null) {
20
+ return left ?? right;
21
+ }
22
+ return new Set([...left].filter((value) => right.has(value)));
23
+ }
24
+ function unite(sets) {
25
+ return sets.some((set) => set === null) ? null : new Set(sets.flatMap((set) => [...set ?? []]));
26
+ }
27
+ function isAdmittedValue(value) {
28
+ return value === null || ["string", "number", "boolean"].includes(typeof value);
29
+ }
30
+ function follow(node, walk) {
31
+ if (!isObject(node) || typeof node.$ref !== "string") {
32
+ return node;
33
+ }
34
+ return walk.skipped.has(node.$ref) ? void 0 : resolveLocalRef(walk.document, node.$ref);
35
+ }
36
+ function members(node, keyword) {
37
+ const list = node[keyword];
38
+ return Array.isArray(list) ? list : [];
39
+ }
40
+ function ownValues(node) {
41
+ const listed = Array.isArray(node.enum) ? node.enum.filter(isAdmittedValue) : null;
42
+ const constant = "const" in node && isAdmittedValue(node.const) ? /* @__PURE__ */ new Set([node.const]) : null;
43
+ return intersect(listed === null ? null : new Set(listed), constant);
44
+ }
45
+ function schemaValues(schema, walk) {
46
+ const node = follow(schema, walk);
47
+ if (!isObject(node) || walk.depth > MAX_DEPTH) {
48
+ return null;
49
+ }
50
+ const next = { ...walk, depth: walk.depth + 1 };
51
+ const parts = members(node, "allOf").map((part) => schemaValues(part, next));
52
+ const variants = [...members(node, "anyOf"), ...members(node, "oneOf")];
53
+ const union = variants.length === 0 ? null : unite(variants.map((v) => schemaValues(v, next)));
54
+ return [...parts, union].reduce(intersect, ownValues(node));
55
+ }
56
+ function propertyValues(schema, key, walk) {
57
+ const node = follow(schema, walk);
58
+ if (!isObject(node) || walk.depth > MAX_DEPTH) {
59
+ return null;
60
+ }
61
+ const next = { ...walk, depth: walk.depth + 1 };
62
+ const properties = isObject(node.properties) ? node.properties : {};
63
+ const own = Object.hasOwn(properties, key) ? schemaValues(properties[key], next) : null;
64
+ const parts = members(node, "allOf").map((part) => propertyValues(part, key, next));
65
+ return parts.reduce(intersect, own);
66
+ }
67
+ function admittedPropertyValues(schema, key, document, skipped = /* @__PURE__ */ new Set()) {
68
+ return propertyValues(schema, key, { document, depth: 0, skipped });
69
+ }
70
+
71
+ export { admittedPropertyValues, resolveLocalRef };
72
+ //# sourceMappingURL=admitted-values.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admitted-values.mjs","sources":["../../../src/domain/openapi/admitted-values.ts"],"sourcesContent":["import { parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * The values a schema admits when it admits only finitely many (`enum`, `const`, and `allOf` /\n * `anyOf` / `oneOf` of those), read from the document. Null means \"any value\" as far as this\n * reading goes: a schema of any other shape, or a `$ref` it cannot follow, is never assumed to\n * exclude a value.\n */\n\nexport type AdmittedValue = string | number | boolean | null;\n/** A finite set of values, or null for every value. */\nexport type AdmittedValues = ReadonlySet<AdmittedValue> | null;\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\n/** How deep `$ref`s and compositions are followed; deeper schemas admit every value. */\nconst MAX_DEPTH = 16;\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The node at a local `$ref` (`#/...`) of the document, or undefined. */\nexport function resolveLocalRef(document: unknown, ref: string): unknown {\n if (!ref.startsWith(LOCAL_REF_PREFIX)) {\n return undefined;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node;\n}\n\nfunction intersect(left: AdmittedValues, right: AdmittedValues): AdmittedValues {\n if (left === null || right === null) {\n return left ?? right;\n }\n return new Set([...left].filter((value) => right.has(value)));\n}\n\nfunction unite(sets: readonly AdmittedValues[]): AdmittedValues {\n return sets.some((set) => set === null) ? null : new Set(sets.flatMap((set) => [...(set ?? [])]));\n}\n\nfunction isAdmittedValue(value: unknown): value is AdmittedValue {\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value);\n}\n\ninterface Walk {\n readonly document: unknown;\n readonly depth: number;\n /** `$ref`s whose targets are left out: they add nothing to the generated type here. */\n readonly skipped: ReadonlySet<string>;\n}\n\nfunction follow(node: unknown, walk: Walk): unknown {\n if (!isObject(node) || typeof node.$ref !== \"string\") {\n return node;\n }\n return walk.skipped.has(node.$ref) ? undefined : resolveLocalRef(walk.document, node.$ref);\n}\n\nfunction members(node: JsonObject, keyword: string): readonly unknown[] {\n const list = node[keyword];\n return Array.isArray(list) ? list : [];\n}\n\n/** `enum` and `const` of the schema itself, before its compositions. */\nfunction ownValues(node: JsonObject): AdmittedValues {\n const listed = Array.isArray(node.enum) ? node.enum.filter(isAdmittedValue) : null;\n const constant = \"const\" in node && isAdmittedValue(node.const) ? new Set([node.const]) : null;\n return intersect(listed === null ? null : new Set(listed), constant);\n}\n\nfunction schemaValues(schema: unknown, walk: Walk): AdmittedValues {\n const node = follow(schema, walk);\n if (!isObject(node) || walk.depth > MAX_DEPTH) {\n return null;\n }\n const next = { ...walk, depth: walk.depth + 1 };\n const parts = members(node, \"allOf\").map((part) => schemaValues(part, next));\n const variants = [...members(node, \"anyOf\"), ...members(node, \"oneOf\")];\n const union = variants.length === 0 ? null : unite(variants.map((v) => schemaValues(v, next)));\n return [...parts, union].reduce<AdmittedValues>(intersect, ownValues(node));\n}\n\nfunction propertyValues(schema: unknown, key: string, walk: Walk): AdmittedValues {\n const node = follow(schema, walk);\n if (!isObject(node) || walk.depth > MAX_DEPTH) {\n return null;\n }\n const next = { ...walk, depth: walk.depth + 1 };\n const properties = isObject(node.properties) ? node.properties : {};\n const own = Object.hasOwn(properties, key) ? schemaValues(properties[key], next) : null;\n const parts = members(node, \"allOf\").map((part) => propertyValues(part, key, next));\n return parts.reduce<AdmittedValues>(intersect, own);\n}\n\n/**\n * The values property `key` of an object schema admits: the intersection over the schema's own\n * `properties` and its `allOf` parts (followed through `$ref`s, except `skipped` ones); null for\n * every value.\n */\nexport function admittedPropertyValues(\n schema: unknown,\n key: string,\n document: unknown,\n skipped: ReadonlySet<string> = new Set(),\n): AdmittedValues {\n return propertyValues(schema, key, { document, depth: 0, skipped });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('./json-pointer.cjs');
4
+
5
+ const UNION_KEYWORDS = ["oneOf", "anyOf"];
6
+ const COMPOSITION_KEYWORDS = ["allOf", ...UNION_KEYWORDS];
7
+ function isSchemaObject(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
+ }
10
+ function keywordItems(schema, keywords) {
11
+ const record = schema;
12
+ return keywords.flatMap((keyword) => {
13
+ const items = record[keyword];
14
+ return Array.isArray(items) ? items : [];
15
+ });
16
+ }
17
+ function unionMembers(schema) {
18
+ return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];
19
+ }
20
+ function unionAt(ref, resolve) {
21
+ const schema = resolve(ref);
22
+ return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : void 0;
23
+ }
24
+ function reaches(schema, search) {
25
+ if (!isSchemaObject(schema)) {
26
+ return false;
27
+ }
28
+ const ref = schema.$ref;
29
+ if (typeof ref === "string") {
30
+ if (ref === search.target) {
31
+ return true;
32
+ }
33
+ if (search.visited.has(ref)) {
34
+ return false;
35
+ }
36
+ search.visited.add(ref);
37
+ return reaches(search.resolve(ref), search);
38
+ }
39
+ return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));
40
+ }
41
+ function unionReaches(union, target, resolve) {
42
+ const search = { target, resolve, visited: /* @__PURE__ */ new Set() };
43
+ return unionMembers(union).some((member) => reaches(member, search));
44
+ }
45
+ const COMPONENT_SCHEMAS = "#/components/schemas/";
46
+ function mappingRef(target) {
47
+ if (typeof target !== "string") {
48
+ return void 0;
49
+ }
50
+ return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${jsonPointer.escapePointerSegment(target)}`;
51
+ }
52
+ function unionMaps(union, target) {
53
+ const mapping = union.discriminator?.mapping;
54
+ if (!isSchemaObject(mapping)) {
55
+ return false;
56
+ }
57
+ return Object.values(mapping).some((value) => mappingRef(value) === target);
58
+ }
59
+ function isUnionMember(union, target, resolve) {
60
+ return unionMaps(union, target) || unionReaches(union, target, resolve);
61
+ }
62
+
63
+ exports.isUnionMember = isUnionMember;
64
+ exports.unionAt = unionAt;
65
+ exports.unionMaps = unionMaps;
66
+ exports.unionMembers = unionMembers;
67
+ exports.unionReaches = unionReaches;
68
+ //# sourceMappingURL=discriminated-union.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discriminated-union.cjs","sources":["../../../src/domain/openapi/discriminated-union.ts"],"sourcesContent":["import { escapePointerSegment } from \"./json-pointer.js\";\nimport type { Schema, SchemaObject } from \"./schema-object.js\";\n\n/**\n * A discriminator owner is either a parent that its members `allOf` (an object with the\n * discriminator property) or a union (`oneOf` / `anyOf` of the members). The generated type of a\n * union is a TypeScript union, so it cannot be used like a parent: `Omit<Union, \"kind\">` keeps\n * only the keys that every member has, and a member that intersects the union it belongs to\n * refers to itself (TS2502, upstream #1665).\n */\n\n/** Resolves a `$ref` of the document; `undefined` when it points nowhere. */\nexport type ResolveSchemaRef = (ref: string) => unknown;\n\nconst UNION_KEYWORDS = [\"oneOf\", \"anyOf\"] as const;\nconst COMPOSITION_KEYWORDS = [\"allOf\", ...UNION_KEYWORDS] as const;\n\nfunction isSchemaObject(value: unknown): value is SchemaObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction keywordItems(schema: SchemaObject, keywords: readonly string[]): readonly Schema[] {\n const record = schema as Readonly<Record<string, unknown>>;\n return keywords.flatMap((keyword) => {\n const items = record[keyword];\n return Array.isArray(items) ? (items as readonly Schema[]) : [];\n });\n}\n\n/** The `oneOf` and `anyOf` members of a schema; empty when it is not a union. */\nexport function unionMembers(schema: unknown): readonly Schema[] {\n return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];\n}\n\n/** The schema at `ref` when it is a union (has `oneOf` or `anyOf` members), else undefined. */\nexport function unionAt(ref: string, resolve: ResolveSchemaRef): SchemaObject | undefined {\n const schema = resolve(ref);\n return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : undefined;\n}\n\n/** What one search for a `$ref` has seen, so that a `$ref` cycle ends. */\ninterface Search {\n readonly target: string;\n readonly resolve: ResolveSchemaRef;\n readonly visited: Set<string>;\n}\n\nfunction reaches(schema: Schema, search: Search): boolean {\n if (!isSchemaObject(schema)) {\n return false;\n }\n const ref = (schema as { readonly $ref?: unknown }).$ref;\n if (typeof ref === \"string\") {\n if (ref === search.target) {\n return true;\n }\n if (search.visited.has(ref)) {\n return false;\n }\n search.visited.add(ref);\n return reaches(search.resolve(ref) as Schema, search);\n }\n return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));\n}\n\n/**\n * Whether the type of `union` contains the schema at `target` without an object in between: one\n * of its members is a `$ref` to it, or `allOf` / `oneOf` / `anyOf` such a `$ref`, at any depth.\n * Such a reference is resolved at once by TypeScript, unlike one in a property or an array.\n */\nexport function unionReaches(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n const search = { target, resolve, visited: new Set<string>() };\n return unionMembers(union).some((member) => reaches(member, search));\n}\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\n/** A mapping value as a `$ref`: a bare name is a component schema's name. */\nfunction mappingRef(target: unknown): string | undefined {\n if (typeof target !== \"string\") {\n return undefined;\n }\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\n/** Whether the discriminator `mapping` of `union` names the schema at `target`. */\nexport function unionMaps(union: SchemaObject, target: string): boolean {\n const mapping = (union.discriminator as { readonly mapping?: unknown } | undefined)?.mapping;\n if (!isSchemaObject(mapping)) {\n return false;\n }\n return Object.values(mapping).some((value) => mappingRef(value) === target);\n}\n\n/**\n * Whether the schema at `target` is a member of `union`: the union's type contains it, or the\n * discriminator `mapping` names it, which gives it a value of the union as a member does.\n */\nexport function isUnionMember(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n return unionMaps(union, target) || unionReaches(union, target, resolve);\n}\n"],"names":["escapePointerSegment"],"mappings":";;;;AAcA,MAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,OAAO,CAAA;AACxC,MAAM,oBAAA,GAAuB,CAAC,OAAA,EAAS,GAAG,cAAc,CAAA;AAExD,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,YAAA,CAAa,QAAsB,QAAA,EAAgD;AAC1F,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,QAA8B,EAAC;AAAA,EAChE,CAAC,CAAA;AACH;AAGO,SAAS,aAAa,MAAA,EAAoC;AAC/D,EAAA,OAAO,eAAe,MAAM,CAAA,GAAI,aAAa,MAAA,EAAQ,cAAc,IAAI,EAAC;AAC1E;AAGO,SAAS,OAAA,CAAQ,KAAa,OAAA,EAAqD;AACxF,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAG,CAAA;AAC1B,EAAA,OAAO,cAAA,CAAe,MAAM,CAAA,IAAK,YAAA,CAAa,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAC9E;AASA,SAAS,OAAA,CAAQ,QAAgB,MAAA,EAAyB;AACxD,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAO,MAAA,CAAuC,IAAA;AACpD,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,KAAQ,OAAO,MAAA,EAAQ;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,GAAG,CAAA;AACtB,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,GAAG,GAAa,MAAM,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,oBAAoB,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAC,CAAA;AACxF;AAOO,SAAS,YAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,SAAS,EAAE,MAAA,EAAQ,SAAS,OAAA,kBAAS,IAAI,KAAY,EAAE;AAC7D,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AACrE;AAEA,MAAM,iBAAA,GAAoB,uBAAA;AAG1B,SAAS,WAAW,MAAA,EAAqC;AACvD,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA,GAAS,GAAG,iBAAiB,CAAA,EAAGA,gCAAA,CAAqB,MAAM,CAAC,CAAA,CAAA;AAC9F;AAGO,SAAS,SAAA,CAAU,OAAqB,MAAA,EAAyB;AACtE,EAAA,MAAM,OAAA,GAAW,MAAM,aAAA,EAA8D,OAAA;AACrF,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU,UAAA,CAAW,KAAK,CAAA,KAAM,MAAM,CAAA;AAC5E;AAMO,SAAS,aAAA,CACd,KAAA,EACA,MAAA,EACA,OAAA,EACS;AACT,EAAA,OAAO,UAAU,KAAA,EAAO,MAAM,KAAK,YAAA,CAAa,KAAA,EAAO,QAAQ,OAAO,CAAA;AACxE;;;;;;"}
@@ -0,0 +1,62 @@
1
+ import { escapePointerSegment } from './json-pointer.mjs';
2
+
3
+ const UNION_KEYWORDS = ["oneOf", "anyOf"];
4
+ const COMPOSITION_KEYWORDS = ["allOf", ...UNION_KEYWORDS];
5
+ function isSchemaObject(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ function keywordItems(schema, keywords) {
9
+ const record = schema;
10
+ return keywords.flatMap((keyword) => {
11
+ const items = record[keyword];
12
+ return Array.isArray(items) ? items : [];
13
+ });
14
+ }
15
+ function unionMembers(schema) {
16
+ return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];
17
+ }
18
+ function unionAt(ref, resolve) {
19
+ const schema = resolve(ref);
20
+ return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : void 0;
21
+ }
22
+ function reaches(schema, search) {
23
+ if (!isSchemaObject(schema)) {
24
+ return false;
25
+ }
26
+ const ref = schema.$ref;
27
+ if (typeof ref === "string") {
28
+ if (ref === search.target) {
29
+ return true;
30
+ }
31
+ if (search.visited.has(ref)) {
32
+ return false;
33
+ }
34
+ search.visited.add(ref);
35
+ return reaches(search.resolve(ref), search);
36
+ }
37
+ return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));
38
+ }
39
+ function unionReaches(union, target, resolve) {
40
+ const search = { target, resolve, visited: /* @__PURE__ */ new Set() };
41
+ return unionMembers(union).some((member) => reaches(member, search));
42
+ }
43
+ const COMPONENT_SCHEMAS = "#/components/schemas/";
44
+ function mappingRef(target) {
45
+ if (typeof target !== "string") {
46
+ return void 0;
47
+ }
48
+ return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
49
+ }
50
+ function unionMaps(union, target) {
51
+ const mapping = union.discriminator?.mapping;
52
+ if (!isSchemaObject(mapping)) {
53
+ return false;
54
+ }
55
+ return Object.values(mapping).some((value) => mappingRef(value) === target);
56
+ }
57
+ function isUnionMember(union, target, resolve) {
58
+ return unionMaps(union, target) || unionReaches(union, target, resolve);
59
+ }
60
+
61
+ export { isUnionMember, unionAt, unionMaps, unionMembers, unionReaches };
62
+ //# sourceMappingURL=discriminated-union.mjs.map