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

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 (514) hide show
  1. package/CHANGELOG.md +1831 -0
  2. package/dist/adapters/node-deprecations/node-deprecations.cjs +14 -0
  3. package/dist/adapters/node-deprecations/node-deprecations.cjs.map +1 -0
  4. package/dist/adapters/node-deprecations/node-deprecations.mjs +12 -0
  5. package/dist/adapters/node-deprecations/node-deprecations.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  7. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  9. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  11. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  12. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  13. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  14. package/dist/adapters/node-file-system/node-file-system.cjs +90 -14
  15. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  16. package/dist/adapters/node-file-system/node-file-system.mjs +90 -14
  17. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +75 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +72 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  27. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  29. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +14 -15
  31. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +12 -13
  33. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-access.cjs +31 -3
  35. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-access.mjs +31 -3
  37. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-holders.cjs +2 -2
  39. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-holders.mjs +3 -3
  41. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  43. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  44. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  45. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +35 -6
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +35 -6
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +47 -0
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +44 -0
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  54. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  55. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  57. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  58. package/dist/adapters/redocly-loader/schema-source.cjs +11 -7
  59. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/schema-source.mjs +12 -8
  61. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  63. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  64. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  65. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  66. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  67. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  68. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  69. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  70. package/dist/api/default-ports.cjs +19 -2
  71. package/dist/api/default-ports.cjs.map +1 -1
  72. package/dist/api/default-ports.mjs +19 -3
  73. package/dist/api/default-ports.mjs.map +1 -1
  74. package/dist/api/discriminator-conflict-warnings.cjs +1 -1
  75. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -1
  76. package/dist/api/discriminator-conflict-warnings.mjs +2 -2
  77. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -1
  78. package/dist/api/discriminator-enum-parent.cjs +2 -2
  79. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  80. package/dist/api/discriminator-enum-parent.mjs +3 -3
  81. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  82. package/dist/api/discriminator-other-owners.cjs +5 -3
  83. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  84. package/dist/api/discriminator-other-owners.mjs +5 -3
  85. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  86. package/dist/api/discriminator-patch.cjs +8 -4
  87. package/dist/api/discriminator-patch.cjs.map +1 -1
  88. package/dist/api/discriminator-patch.mjs +9 -5
  89. package/dist/api/discriminator-patch.mjs.map +1 -1
  90. package/dist/api/discriminator-scan.cjs +17 -10
  91. package/dist/api/discriminator-scan.cjs.map +1 -1
  92. package/dist/api/discriminator-scan.mjs +18 -11
  93. package/dist/api/discriminator-scan.mjs.map +1 -1
  94. package/dist/api/document-run.cjs +4 -3
  95. package/dist/api/document-run.cjs.map +1 -1
  96. package/dist/api/document-run.mjs +4 -3
  97. package/dist/api/document-run.mjs.map +1 -1
  98. package/dist/api/legacy-callback-warning.cjs +7 -4
  99. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.mjs +8 -5
  101. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  102. package/dist/api/legacy-utils.cjs.map +1 -1
  103. package/dist/api/legacy-utils.mjs.map +1 -1
  104. package/dist/api/openapi-ts.cjs +9 -5
  105. package/dist/api/openapi-ts.cjs.map +1 -1
  106. package/dist/api/openapi-ts.mjs +10 -7
  107. package/dist/api/openapi-ts.mjs.map +1 -1
  108. package/dist/api/schema-callbacks.cjs +36 -12
  109. package/dist/api/schema-callbacks.cjs.map +1 -1
  110. package/dist/api/schema-callbacks.mjs +36 -12
  111. package/dist/api/schema-callbacks.mjs.map +1 -1
  112. package/dist/api/string-to-ast.cjs +7 -9
  113. package/dist/api/string-to-ast.cjs.map +1 -1
  114. package/dist/api/string-to-ast.mjs +8 -9
  115. package/dist/api/string-to-ast.mjs.map +1 -1
  116. package/dist/api/transform-context.cjs +7 -3
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +7 -3
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +42 -12
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +44 -14
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/application/print/text-writer.cjs +10 -3
  125. package/dist/application/print/text-writer.cjs.map +1 -1
  126. package/dist/application/print/text-writer.mjs +10 -3
  127. package/dist/application/print/text-writer.mjs.map +1 -1
  128. package/dist/application/stack-overflow.cjs +2 -1
  129. package/dist/application/stack-overflow.cjs.map +1 -1
  130. package/dist/application/stack-overflow.mjs +2 -1
  131. package/dist/application/stack-overflow.mjs.map +1 -1
  132. package/dist/application/transform/document/components.cjs +2 -2
  133. package/dist/application/transform/document/components.cjs.map +1 -1
  134. package/dist/application/transform/document/components.mjs +4 -4
  135. package/dist/application/transform/document/components.mjs.map +1 -1
  136. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  137. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  138. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  139. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  140. package/dist/application/transform/document/defs-root.cjs +1 -1
  141. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  142. package/dist/application/transform/document/defs-root.mjs +2 -2
  143. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  144. package/dist/application/transform/document/document.cjs +4 -1
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +3 -2
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  149. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  150. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  151. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +1 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  154. package/dist/application/transform/document/global-type-references.mjs +1 -1
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  156. package/dist/application/transform/document/media-type.cjs +2 -2
  157. package/dist/application/transform/document/media-type.cjs.map +1 -1
  158. package/dist/application/transform/document/media-type.mjs +3 -3
  159. package/dist/application/transform/document/media-type.mjs.map +1 -1
  160. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  161. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  162. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  163. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  164. package/dist/application/transform/document/operation.cjs +1 -1
  165. package/dist/application/transform/document/operation.cjs.map +1 -1
  166. package/dist/application/transform/document/operation.mjs +2 -2
  167. package/dist/application/transform/document/operation.mjs.map +1 -1
  168. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  169. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  170. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  171. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  172. package/dist/application/transform/document/parameter.cjs +12 -4
  173. package/dist/application/transform/document/parameter.cjs.map +1 -1
  174. package/dist/application/transform/document/parameter.mjs +13 -5
  175. package/dist/application/transform/document/parameter.mjs.map +1 -1
  176. package/dist/application/transform/document/parameters.cjs +7 -30
  177. package/dist/application/transform/document/parameters.cjs.map +1 -1
  178. package/dist/application/transform/document/parameters.mjs +8 -31
  179. package/dist/application/transform/document/parameters.mjs.map +1 -1
  180. package/dist/application/transform/document/path-item.cjs +11 -14
  181. package/dist/application/transform/document/path-item.cjs.map +1 -1
  182. package/dist/application/transform/document/path-item.mjs +12 -16
  183. package/dist/application/transform/document/path-item.mjs.map +1 -1
  184. package/dist/application/transform/document/paths-enum.cjs +1 -0
  185. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  186. package/dist/application/transform/document/paths-enum.mjs +1 -1
  187. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  188. package/dist/application/transform/document/paths.cjs +6 -2
  189. package/dist/application/transform/document/paths.cjs.map +1 -1
  190. package/dist/application/transform/document/paths.mjs +8 -4
  191. package/dist/application/transform/document/paths.mjs.map +1 -1
  192. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  193. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  194. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  195. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  196. package/dist/application/transform/document/request-body.cjs +1 -1
  197. package/dist/application/transform/document/request-body.cjs.map +1 -1
  198. package/dist/application/transform/document/request-body.mjs +2 -2
  199. package/dist/application/transform/document/request-body.mjs.map +1 -1
  200. package/dist/application/transform/document/response.cjs +2 -2
  201. package/dist/application/transform/document/response.cjs.map +1 -1
  202. package/dist/application/transform/document/response.mjs +3 -3
  203. package/dist/application/transform/document/response.mjs.map +1 -1
  204. package/dist/application/transform/document/responses.cjs +1 -1
  205. package/dist/application/transform/document/responses.cjs.map +1 -1
  206. package/dist/application/transform/document/responses.mjs +2 -2
  207. package/dist/application/transform/document/responses.mjs.map +1 -1
  208. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  209. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  210. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  211. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  212. package/dist/application/transform/document/type-resolution.cjs +3 -1
  213. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  214. package/dist/application/transform/document/type-resolution.mjs +3 -1
  215. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  216. package/dist/application/transform/document/webhooks.cjs +1 -1
  217. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  218. package/dist/application/transform/document/webhooks.mjs +2 -2
  219. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  220. package/dist/application/transform/footer/document-footer.cjs +10 -2
  221. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  222. package/dist/application/transform/footer/document-footer.mjs +10 -2
  223. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  224. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  225. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  226. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  227. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  228. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  229. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  230. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  231. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  232. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  233. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  234. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  235. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  236. package/dist/application/transform/helper-types.cjs +1 -1
  237. package/dist/application/transform/helper-types.cjs.map +1 -1
  238. package/dist/application/transform/helper-types.mjs +1 -1
  239. package/dist/application/transform/helper-types.mjs.map +1 -1
  240. package/dist/application/transform/numbered-names.cjs +9 -0
  241. package/dist/application/transform/numbered-names.cjs.map +1 -1
  242. package/dist/application/transform/numbered-names.mjs +9 -1
  243. package/dist/application/transform/numbered-names.mjs.map +1 -1
  244. package/dist/application/transform/ref-pointer/generated-location.cjs +1 -1
  245. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  246. package/dist/application/transform/ref-pointer/generated-location.mjs +2 -2
  247. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  248. package/dist/application/transform/ref-pointer/pointer-type.cjs +1 -1
  249. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  250. package/dist/application/transform/ref-pointer/pointer-type.mjs +2 -2
  251. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  252. package/dist/application/transform/ref-type.cjs +2 -1
  253. package/dist/application/transform/ref-type.cjs.map +1 -1
  254. package/dist/application/transform/ref-type.mjs +2 -1
  255. package/dist/application/transform/ref-type.mjs.map +1 -1
  256. package/dist/application/transform/schema/access-flags.cjs +1 -1
  257. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  258. package/dist/application/transform/schema/access-flags.mjs +2 -2
  259. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  260. package/dist/application/transform/schema/array-type.cjs +2 -2
  261. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  262. package/dist/application/transform/schema/array-type.mjs +3 -3
  263. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  264. package/dist/application/transform/schema/composition-type.cjs +4 -4
  265. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/composition-type.mjs +6 -6
  267. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/enum-rule.cjs +4 -6
  269. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  270. package/dist/application/transform/schema/enum-rule.mjs +6 -8
  271. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  272. package/dist/application/transform/schema/object-type.cjs +3 -3
  273. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/object-type.mjs +4 -4
  275. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/presence-members.cjs +1 -1
  277. package/dist/application/transform/schema/presence-members.cjs.map +1 -1
  278. package/dist/application/transform/schema/presence-members.mjs +2 -2
  279. package/dist/application/transform/schema/presence-members.mjs.map +1 -1
  280. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  281. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  282. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  283. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  284. package/dist/application/transform/schema/required-variants.cjs +2 -2
  285. package/dist/application/transform/schema/required-variants.cjs.map +1 -1
  286. package/dist/application/transform/schema/required-variants.mjs +3 -3
  287. package/dist/application/transform/schema/required-variants.mjs.map +1 -1
  288. package/dist/application/transform/schema/schema-transform.cjs +4 -2
  289. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  290. package/dist/application/transform/schema/schema-transform.mjs +4 -2
  291. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  292. package/dist/application/transform/schema/unevaluated-properties.cjs +1 -1
  293. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  294. package/dist/application/transform/schema/unevaluated-properties.mjs +2 -2
  295. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  296. package/dist/application/transform/schema-comment.cjs +6 -2
  297. package/dist/application/transform/schema-comment.cjs.map +1 -1
  298. package/dist/application/transform/schema-comment.mjs +7 -3
  299. package/dist/application/transform/schema-comment.mjs.map +1 -1
  300. package/dist/cli/api-settings.cjs +62 -6
  301. package/dist/cli/api-settings.cjs.map +1 -1
  302. package/dist/cli/api-settings.mjs +60 -7
  303. package/dist/cli/api-settings.mjs.map +1 -1
  304. package/dist/cli/api-writes.cjs +72 -0
  305. package/dist/cli/api-writes.cjs.map +1 -0
  306. package/dist/cli/api-writes.mjs +69 -0
  307. package/dist/cli/api-writes.mjs.map +1 -0
  308. package/dist/cli/cli-errors.cjs +12 -1
  309. package/dist/cli/cli-errors.cjs.map +1 -1
  310. package/dist/cli/cli-errors.mjs +12 -1
  311. package/dist/cli/cli-errors.mjs.map +1 -1
  312. package/dist/cli/cli-output.cjs +106 -1
  313. package/dist/cli/cli-output.cjs.map +1 -1
  314. package/dist/cli/cli-output.mjs +99 -2
  315. package/dist/cli/cli-output.mjs.map +1 -1
  316. package/dist/cli/main.cjs +5 -1
  317. package/dist/cli/main.cjs.map +1 -1
  318. package/dist/cli/main.mjs +6 -2
  319. package/dist/cli/main.mjs.map +1 -1
  320. package/dist/cli/redocly-apis.cjs +82 -36
  321. package/dist/cli/redocly-apis.cjs.map +1 -1
  322. package/dist/cli/redocly-apis.mjs +85 -39
  323. package/dist/cli/redocly-apis.mjs.map +1 -1
  324. package/dist/cli/run-cli.cjs +13 -7
  325. package/dist/cli/run-cli.cjs.map +1 -1
  326. package/dist/cli/run-cli.mjs +14 -8
  327. package/dist/cli/run-cli.mjs.map +1 -1
  328. package/dist/domain/append-all.cjs +10 -0
  329. package/dist/domain/append-all.cjs.map +1 -0
  330. package/dist/domain/append-all.mjs +8 -0
  331. package/dist/domain/append-all.mjs.map +1 -0
  332. package/dist/domain/cause-secrets.cjs +37 -0
  333. package/dist/domain/cause-secrets.cjs.map +1 -0
  334. package/dist/domain/cause-secrets.mjs +35 -0
  335. package/dist/domain/cause-secrets.mjs.map +1 -0
  336. package/dist/domain/deprecations.cjs +11 -0
  337. package/dist/domain/deprecations.cjs.map +1 -0
  338. package/dist/domain/deprecations.mjs +9 -0
  339. package/dist/domain/deprecations.mjs.map +1 -0
  340. package/dist/domain/errors.cjs +9 -3
  341. package/dist/domain/errors.cjs.map +1 -1
  342. package/dist/domain/errors.mjs +9 -3
  343. package/dist/domain/errors.mjs.map +1 -1
  344. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  345. package/dist/domain/ir/identifier-text.mjs +1 -1
  346. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  347. package/dist/domain/ir/ir-shape.cjs +187 -0
  348. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  349. package/dist/domain/ir/ir-shape.mjs +184 -0
  350. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  351. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  352. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  353. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  354. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  355. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  356. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  357. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  358. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  359. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  360. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  361. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  362. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  363. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  364. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  365. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  366. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  367. package/dist/domain/openapi/json-pointer.cjs +43 -1
  368. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  369. package/dist/domain/openapi/json-pointer.mjs +40 -2
  370. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  371. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  372. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  373. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  374. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  375. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  376. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  377. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  378. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  379. package/dist/domain/output-fixes.cjs +25 -14
  380. package/dist/domain/output-fixes.cjs.map +1 -1
  381. package/dist/domain/output-fixes.mjs +25 -13
  382. package/dist/domain/output-fixes.mjs.map +1 -1
  383. package/dist/domain/url-secrets.cjs +48 -0
  384. package/dist/domain/url-secrets.cjs.map +1 -0
  385. package/dist/domain/url-secrets.mjs +45 -0
  386. package/dist/domain/url-secrets.mjs.map +1 -0
  387. package/dist/domain/warnings.cjs +0 -1
  388. package/dist/domain/warnings.cjs.map +1 -1
  389. package/dist/domain/warnings.mjs +0 -1
  390. package/dist/domain/warnings.mjs.map +1 -1
  391. package/dist/index.cjs +2 -3
  392. package/dist/index.cjs.map +1 -1
  393. package/dist/index.d.cts +57 -20
  394. package/dist/index.d.mts +57 -20
  395. package/dist/index.d.ts +57 -20
  396. package/dist/index.mjs +3 -2
  397. package/dist/index.mjs.map +1 -1
  398. package/package.json +5 -6
  399. package/src/adapters/node-deprecations/node-deprecations.ts +14 -0
  400. package/src/adapters/node-file-system/file-claims.ts +138 -0
  401. package/src/adapters/node-file-system/file-identity.ts +137 -0
  402. package/src/adapters/node-file-system/node-file-system.ts +145 -18
  403. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +95 -0
  404. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  405. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  406. package/src/adapters/redocly-loader/redocly-schema-loader.ts +18 -24
  407. package/src/adapters/redocly-loader/ref-access.ts +37 -3
  408. package/src/adapters/redocly-loader/ref-holders.ts +3 -3
  409. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  410. package/src/adapters/redocly-loader/remote-fetch.ts +74 -11
  411. package/src/adapters/redocly-loader/remote-node-limit.ts +62 -0
  412. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  413. package/src/adapters/redocly-loader/schema-source.ts +20 -8
  414. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  415. package/src/adapters/terminal-logger/terminal-logger.ts +10 -5
  416. package/src/api/default-ports.ts +40 -4
  417. package/src/api/discriminator-conflict-warnings.ts +2 -2
  418. package/src/api/discriminator-enum-parent.ts +3 -3
  419. package/src/api/discriminator-other-owners.ts +5 -3
  420. package/src/api/discriminator-patch.ts +9 -6
  421. package/src/api/discriminator-scan.ts +19 -11
  422. package/src/api/document-run.ts +9 -3
  423. package/src/api/legacy-callback-warning.ts +13 -6
  424. package/src/api/legacy-utils.ts +5 -1
  425. package/src/api/openapi-ts.ts +26 -7
  426. package/src/api/run-context.ts +6 -0
  427. package/src/api/schema-callbacks.ts +60 -17
  428. package/src/api/string-to-ast.ts +11 -15
  429. package/src/api/transform-context.ts +7 -3
  430. package/src/api/transform-schema.ts +67 -15
  431. package/src/application/ports/deprecation-reporter.ts +9 -0
  432. package/src/application/ports/file-system.ts +39 -0
  433. package/src/application/ports/schema-loader.ts +11 -1
  434. package/src/application/print/text-writer.ts +10 -3
  435. package/src/application/stack-overflow.ts +9 -5
  436. package/src/application/transform/document/components.ts +4 -4
  437. package/src/application/transform/document/declared-type-names.ts +36 -0
  438. package/src/application/transform/document/defs-root.ts +2 -2
  439. package/src/application/transform/document/document.ts +4 -3
  440. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  441. package/src/application/transform/document/global-type-references.ts +1 -1
  442. package/src/application/transform/document/media-type.ts +4 -3
  443. package/src/application/transform/document/operation-keys-written.ts +27 -0
  444. package/src/application/transform/document/operation.ts +2 -2
  445. package/src/application/transform/document/parameter-entries.ts +70 -0
  446. package/src/application/transform/document/parameter.ts +21 -9
  447. package/src/application/transform/document/parameters.ts +13 -58
  448. package/src/application/transform/document/path-item.ts +13 -31
  449. package/src/application/transform/document/paths-enum.ts +1 -1
  450. package/src/application/transform/document/paths.ts +8 -4
  451. package/src/application/transform/document/referenced-parameter.ts +146 -0
  452. package/src/application/transform/document/request-body.ts +2 -2
  453. package/src/application/transform/document/response.ts +3 -3
  454. package/src/application/transform/document/responses.ts +2 -2
  455. package/src/application/transform/document/root-type-aliases.ts +17 -38
  456. package/src/application/transform/document/type-resolution.ts +2 -1
  457. package/src/application/transform/document/webhooks.ts +2 -2
  458. package/src/application/transform/footer/document-footer.ts +18 -1
  459. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  460. package/src/application/transform/footer/operation-keys.ts +28 -0
  461. package/src/application/transform/footer/type-evaluation.ts +4 -4
  462. package/src/application/transform/helper-types.ts +6 -5
  463. package/src/application/transform/numbered-names.ts +15 -0
  464. package/src/application/transform/ref-pointer/generated-location.ts +2 -2
  465. package/src/application/transform/ref-pointer/pointer-type.ts +2 -4
  466. package/src/application/transform/ref-type.ts +2 -1
  467. package/src/application/transform/schema/access-flags.ts +2 -2
  468. package/src/application/transform/schema/array-type.ts +3 -5
  469. package/src/application/transform/schema/composition-type.ts +6 -6
  470. package/src/application/transform/schema/enum-rule.ts +10 -8
  471. package/src/application/transform/schema/object-type.ts +4 -4
  472. package/src/application/transform/schema/presence-members.ts +2 -2
  473. package/src/application/transform/schema/ref-siblings.ts +76 -0
  474. package/src/application/transform/schema/required-variants.ts +3 -3
  475. package/src/application/transform/schema/schema-context.ts +3 -0
  476. package/src/application/transform/schema/schema-transform.ts +4 -2
  477. package/src/application/transform/schema/unevaluated-properties.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +7 -3
  479. package/src/application/transform/transform-context.ts +5 -0
  480. package/src/cli/api-settings.ts +82 -7
  481. package/src/cli/api-writes.ts +117 -0
  482. package/src/cli/cli-dependencies.ts +21 -4
  483. package/src/cli/cli-errors.ts +20 -1
  484. package/src/cli/cli-output.ts +186 -7
  485. package/src/cli/main.ts +6 -3
  486. package/src/cli/redocly-apis.ts +153 -48
  487. package/src/cli/run-cli.ts +37 -8
  488. package/src/domain/append-all.ts +10 -0
  489. package/src/domain/cause-secrets.ts +52 -0
  490. package/src/domain/deprecations.ts +15 -0
  491. package/src/domain/errors.ts +22 -7
  492. package/src/domain/ir/identifier-text.ts +6 -5
  493. package/src/domain/ir/ir-shape.ts +299 -0
  494. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  495. package/src/domain/openapi/alias-expansion.ts +4 -1
  496. package/src/domain/openapi/discriminated-union.ts +6 -4
  497. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  498. package/src/domain/openapi/document-object.ts +2 -0
  499. package/src/domain/openapi/json-pointer.ts +96 -7
  500. package/src/domain/openapi/schema-dialect.ts +22 -0
  501. package/src/domain/openapi/unsupported-features.ts +2 -2
  502. package/src/domain/output-fixes.ts +37 -18
  503. package/src/domain/url-secrets.ts +72 -0
  504. package/src/domain/warnings.ts +0 -1
  505. package/src/index.ts +2 -6
  506. package/src/types/generator-options.ts +1 -1
  507. package/dist/cli/main.d.cts +0 -2
  508. package/dist/cli/main.d.mts +0 -2
  509. package/dist/cli/main.d.ts +0 -2
  510. package/dist/domain/url-credentials.cjs +0 -10
  511. package/dist/domain/url-credentials.cjs.map +0 -1
  512. package/dist/domain/url-credentials.mjs +0 -8
  513. package/dist/domain/url-credentials.mjs.map +0 -1
  514. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"type-resolution.cjs","sources":["../../../../src/application/transform/document/type-resolution.ts"],"sourcesContent":["import type {\n IrIndexSignature,\n IrMember,\n IrObjectType,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport type { DeclaredTypeLookup } from \"./declared-types.js\";\n\n/**\n * The types the `--path-params-as-types` overlap check compares, as TypeScript sees them:\n * references followed to the declarations of the document, `T[\"key\"]` and `T[number]` read from\n * `T`, and an intersection of object types merged into one object.\n */\n\nconst UNDEFINED: IrType = { kind: \"keyword\", keyword: \"undefined\" };\n\nexport function nameOf(member: IrPropertySignature): string {\n return member.name.kind === \"string\" ? member.name.value : member.name.text;\n}\n\nexport function propertiesOf(type: IrObjectType): Map<string, IrPropertySignature> {\n const properties = type.members.filter(\n (member: IrMember): member is IrPropertySignature => member.kind === \"property\",\n );\n return new Map(properties.map((property) => [nameOf(property), property]));\n}\n\nexport function indexSignaturesOf(type: IrObjectType): IrIndexSignature[] {\n return type.members.filter(\n (member: IrMember): member is IrIndexSignature => member.kind === \"indexSignature\",\n );\n}\n\n/** The type read from a property: an optional one may be `undefined`. */\nexport function readType(property: IrPropertySignature): IrType {\n return property.isOptional ? { kind: \"union\", types: [property.type, UNDEFINED] } : property.type;\n}\n\n/**\n * `T[number]` for an array `T`, as the generator writes for an item of an array response: the\n * element type, readonly or not. A tuple's is the union of its elements, which is not modelled.\n */\nfunction arrayElement(type: IrType): IrType | null {\n const list = type.kind === \"readonly\" ? type.type : type;\n return list.kind === \"array\" ? list.element : null;\n}\n\n/** One property for two of the same name in an intersection. */\nfunction mergedProperty(\n first: IrPropertySignature,\n second: IrPropertySignature,\n): IrPropertySignature {\n return {\n ...first,\n type: { kind: \"intersection\", types: [first.type, second.type] },\n isOptional: first.isOptional && second.isOptional,\n isReadonly: first.isReadonly || second.isReadonly,\n };\n}\n\n/** Resolves types once each, for one comparison. */\nexport class TypeResolution {\n private readonly lookup: DeclaredTypeLookup;\n private readonly resolvedTypes = new Map<IrType, IrType>();\n\n constructor(lookup: DeclaredTypeLookup) {\n this.lookup = lookup;\n }\n\n /** The type a reference names, followed through references to references; computed once. */\n resolved(type: IrType): IrType {\n const known = this.resolvedTypes.get(type);\n if (known !== undefined) {\n return known;\n }\n // A type that reaches itself while it is resolved stays as it is written there.\n this.resolvedTypes.set(type, type);\n const seen = new Set<IrType>();\n let current = type;\n while (!seen.has(current)) {\n seen.add(current);\n const named = this.lookup(current) ?? this.indexedProperty(current);\n if (named === null) {\n break;\n }\n current = named;\n }\n const result = current.kind === \"intersection\" ? (this.merged(current) ?? current) : current;\n this.resolvedTypes.set(type, result);\n return result;\n }\n\n /**\n * `T[\"key\"]` read from the object type `T` resolves to, which the lookup does not do for an\n * object it reached through another lookup (`paths[\"/a/{id}\"][\"get\"]`). An optional property\n * reads as `T | undefined`; `T[number]` is the element of the array `T`.\n */\n private indexedProperty(type: IrType): IrType | null {\n if (type.kind !== \"indexedAccess\") {\n return null;\n }\n const { index } = type;\n if (index.kind === \"keyword\" && index.keyword === \"number\") {\n return arrayElement(this.resolved(type.object));\n }\n const object = this.resolved(type.object);\n if (index.kind !== \"stringLiteral\" || object.kind !== \"object\") {\n return null;\n }\n const property = propertiesOf(object).get(index.value);\n return property === undefined ? null : readType(property);\n }\n\n /**\n * An intersection of object types as the one object TypeScript makes of it: a property in\n * several parts has the intersection of their types, and is optional only when it is in each.\n * Null when a part is no object type.\n */\n private merged(type: IrType): IrObjectType | null {\n const parts = this.objectParts(type);\n if (parts === null) {\n return null;\n }\n const properties = new Map<string, IrPropertySignature>();\n const indexes: IrIndexSignature[] = [];\n for (const member of parts.flatMap((part) => part.members)) {\n if (member.kind === \"indexSignature\") {\n indexes.push(member);\n continue;\n }\n const name = nameOf(member);\n const other = properties.get(name);\n properties.set(name, other === undefined ? member : mergedProperty(other, member));\n }\n return { kind: \"object\", members: [...properties.values(), ...indexes] };\n }\n\n /**\n * The object types an intersection is made of, nested ones flattened; null for any other, and\n * for an intersection that contains itself, which TypeScript does not merge either.\n */\n private objectParts(\n type: IrType,\n visiting: ReadonlySet<IrType> = new Set(),\n ): IrObjectType[] | null {\n if (type.kind === \"object\") {\n return [type];\n }\n if (type.kind !== \"intersection\" || visiting.has(type)) {\n return null;\n }\n const parts: IrObjectType[] = [];\n for (const part of type.types) {\n const objects = this.objectParts(this.resolved(part), new Set([...visiting, type]));\n if (objects === null) {\n return null;\n }\n parts.push(...objects);\n }\n return parts;\n }\n}\n"],"names":[],"mappings":";;AAeA,MAAM,SAAA,GAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,WAAA,EAAY;AAE3D,SAAS,OAAO,MAAA,EAAqC;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAK,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,CAAK,KAAA,GAAQ,OAAO,IAAA,CAAK,IAAA;AACzE;AAEO,SAAS,aAAa,IAAA,EAAsD;AACjF,EAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,MAAA;AAAA,IAC9B,CAAC,MAAA,KAAoD,MAAA,CAAO,IAAA,KAAS;AAAA,GACvE;AACA,EAAA,OAAO,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAA;AAC3E;AAEO,SAAS,kBAAkB,IAAA,EAAwC;AACxE,EAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,IAClB,CAAC,MAAA,KAAiD,MAAA,CAAO,IAAA,KAAS;AAAA,GACpE;AACF;AAGO,SAAS,SAAS,QAAA,EAAuC;AAC9D,EAAA,OAAO,QAAA,CAAS,UAAA,GAAa,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,CAAC,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA,EAAE,GAAI,QAAA,CAAS,IAAA;AAC/F;AAMA,SAAS,aAAa,IAAA,EAA6B;AACjD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,UAAA,GAAa,KAAK,IAAA,GAAO,IAAA;AACpD,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAChD;AAGA,SAAS,cAAA,CACP,OACA,MAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,IAAA,EAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,KAAA,EAAO,CAAC,KAAA,CAAM,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAE;AAAA,IAC/D,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO,UAAA;AAAA,IACvC,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO;AAAA,GACzC;AACF;AAGO,MAAM,cAAA,CAAe;AAAA,EACT,MAAA;AAAA,EACA,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EAEzD,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,SAAS,IAAA,EAAsB;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACzC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACjC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,OAAO,CAAC,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,OAAO,CAAA;AAChB,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,IAAK,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAClE,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA;AAAA,MACF;AACA,MAAA,OAAA,GAAU,KAAA;AAAA,IACZ;AACA,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,cAAA,GAAkB,KAAK,MAAA,CAAO,OAAO,KAAK,OAAA,GAAW,OAAA;AACrF,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAgB,IAAA,EAA6B;AACnD,IAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,EAAE,OAAM,GAAI,IAAA;AAClB,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,YAAY,QAAA,EAAU;AAC1D,MAAA,OAAO,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,eAAA,IAAmB,MAAA,CAAO,SAAS,QAAA,EAAU;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,WAAW,YAAA,CAAa,MAAM,CAAA,CAAE,GAAA,CAAI,MAAM,KAAK,CAAA;AACrD,IAAA,OAAO,QAAA,KAAa,MAAA,GAAY,IAAA,GAAO,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,OAAO,IAAA,EAAmC;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACnC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAiC;AACxD,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,UAAU,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1D,MAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,UAAA,CAAW,GAAA,CAAI,MAAM,KAAA,KAAU,MAAA,GAAY,SAAS,cAAA,CAAe,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,CAAC,GAAG,UAAA,CAAW,MAAA,EAAO,EAAG,GAAG,OAAO,CAAA,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,WAAA,CACN,IAAA,EACA,QAAA,mBAAgC,IAAI,KAAI,EACjB;AACvB,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AACA,IAAA,IAAI,KAAK,IAAA,KAAS,cAAA,IAAkB,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,QAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAS,IAAI,CAAA,kBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AAClF,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;;;"}
1
+ {"version":3,"file":"type-resolution.cjs","sources":["../../../../src/application/transform/document/type-resolution.ts"],"sourcesContent":["import { appendAll } from \"../../../domain/append-all.js\";\nimport type {\n IrIndexSignature,\n IrMember,\n IrObjectType,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport type { DeclaredTypeLookup } from \"./declared-types.js\";\n\n/**\n * The types the `--path-params-as-types` overlap check compares, as TypeScript sees them:\n * references followed to the declarations of the document, `T[\"key\"]` and `T[number]` read from\n * `T`, and an intersection of object types merged into one object.\n */\n\nconst UNDEFINED: IrType = { kind: \"keyword\", keyword: \"undefined\" };\n\nexport function nameOf(member: IrPropertySignature): string {\n return member.name.kind === \"string\" ? member.name.value : member.name.text;\n}\n\nexport function propertiesOf(type: IrObjectType): Map<string, IrPropertySignature> {\n const properties = type.members.filter(\n (member: IrMember): member is IrPropertySignature => member.kind === \"property\",\n );\n return new Map(properties.map((property) => [nameOf(property), property]));\n}\n\nexport function indexSignaturesOf(type: IrObjectType): IrIndexSignature[] {\n return type.members.filter(\n (member: IrMember): member is IrIndexSignature => member.kind === \"indexSignature\",\n );\n}\n\n/** The type read from a property: an optional one may be `undefined`. */\nexport function readType(property: IrPropertySignature): IrType {\n return property.isOptional ? { kind: \"union\", types: [property.type, UNDEFINED] } : property.type;\n}\n\n/**\n * `T[number]` for an array `T`, as the generator writes for an item of an array response: the\n * element type, readonly or not. A tuple's is the union of its elements, which is not modelled.\n */\nfunction arrayElement(type: IrType): IrType | null {\n const list = type.kind === \"readonly\" ? type.type : type;\n return list.kind === \"array\" ? list.element : null;\n}\n\n/** One property for two of the same name in an intersection. */\nfunction mergedProperty(\n first: IrPropertySignature,\n second: IrPropertySignature,\n): IrPropertySignature {\n return {\n ...first,\n type: { kind: \"intersection\", types: [first.type, second.type] },\n isOptional: first.isOptional && second.isOptional,\n isReadonly: first.isReadonly || second.isReadonly,\n };\n}\n\n/** Resolves types once each, for one comparison. */\nexport class TypeResolution {\n private readonly lookup: DeclaredTypeLookup;\n private readonly resolvedTypes = new Map<IrType, IrType>();\n\n constructor(lookup: DeclaredTypeLookup) {\n this.lookup = lookup;\n }\n\n /** The type a reference names, followed through references to references; computed once. */\n resolved(type: IrType): IrType {\n const known = this.resolvedTypes.get(type);\n if (known !== undefined) {\n return known;\n }\n // A type that reaches itself while it is resolved stays as it is written there.\n this.resolvedTypes.set(type, type);\n const seen = new Set<IrType>();\n let current = type;\n while (!seen.has(current)) {\n seen.add(current);\n const named = this.lookup(current) ?? this.indexedProperty(current);\n if (named === null) {\n break;\n }\n current = named;\n }\n const result = current.kind === \"intersection\" ? (this.merged(current) ?? current) : current;\n this.resolvedTypes.set(type, result);\n return result;\n }\n\n /**\n * `T[\"key\"]` read from the object type `T` resolves to, which the lookup does not do for an\n * object it reached through another lookup (`paths[\"/a/{id}\"][\"get\"]`). An optional property\n * reads as `T | undefined`; `T[number]` is the element of the array `T`.\n */\n private indexedProperty(type: IrType): IrType | null {\n if (type.kind !== \"indexedAccess\") {\n return null;\n }\n const { index } = type;\n if (index.kind === \"keyword\" && index.keyword === \"number\") {\n return arrayElement(this.resolved(type.object));\n }\n const object = this.resolved(type.object);\n if (index.kind !== \"stringLiteral\" || object.kind !== \"object\") {\n return null;\n }\n const property = propertiesOf(object).get(index.value);\n return property === undefined ? null : readType(property);\n }\n\n /**\n * An intersection of object types as the one object TypeScript makes of it: a property in\n * several parts has the intersection of their types, and is optional only when it is in each.\n * Null when a part is no object type.\n */\n private merged(type: IrType): IrObjectType | null {\n const parts = this.objectParts(type);\n if (parts === null) {\n return null;\n }\n const properties = new Map<string, IrPropertySignature>();\n const indexes: IrIndexSignature[] = [];\n for (const member of parts.flatMap((part) => part.members)) {\n if (member.kind === \"indexSignature\") {\n indexes.push(member);\n continue;\n }\n const name = nameOf(member);\n const other = properties.get(name);\n properties.set(name, other === undefined ? member : mergedProperty(other, member));\n }\n return { kind: \"object\", members: [...properties.values(), ...indexes] };\n }\n\n /**\n * The object types an intersection is made of, nested ones flattened; null for any other, and\n * for an intersection that contains itself, which TypeScript does not merge either.\n */\n private objectParts(\n type: IrType,\n visiting: ReadonlySet<IrType> = new Set(),\n ): IrObjectType[] | null {\n if (type.kind === \"object\") {\n return [type];\n }\n if (type.kind !== \"intersection\" || visiting.has(type)) {\n return null;\n }\n const parts: IrObjectType[] = [];\n for (const part of type.types) {\n const objects = this.objectParts(this.resolved(part), new Set([...visiting, type]));\n if (objects === null) {\n return null;\n }\n appendAll(parts, objects);\n }\n return parts;\n }\n}\n"],"names":["appendAll"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { appendAll } from '../../../domain/append-all.mjs';
2
+
1
3
  const UNDEFINED = { kind: "keyword", keyword: "undefined" };
2
4
  function nameOf(member) {
3
5
  return member.name.kind === "string" ? member.name.value : member.name.text;
@@ -115,7 +117,7 @@ class TypeResolution {
115
117
  if (objects === null) {
116
118
  return null;
117
119
  }
118
- parts.push(...objects);
120
+ appendAll(parts, objects);
119
121
  }
120
122
  return parts;
121
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type-resolution.mjs","sources":["../../../../src/application/transform/document/type-resolution.ts"],"sourcesContent":["import type {\n IrIndexSignature,\n IrMember,\n IrObjectType,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport type { DeclaredTypeLookup } from \"./declared-types.js\";\n\n/**\n * The types the `--path-params-as-types` overlap check compares, as TypeScript sees them:\n * references followed to the declarations of the document, `T[\"key\"]` and `T[number]` read from\n * `T`, and an intersection of object types merged into one object.\n */\n\nconst UNDEFINED: IrType = { kind: \"keyword\", keyword: \"undefined\" };\n\nexport function nameOf(member: IrPropertySignature): string {\n return member.name.kind === \"string\" ? member.name.value : member.name.text;\n}\n\nexport function propertiesOf(type: IrObjectType): Map<string, IrPropertySignature> {\n const properties = type.members.filter(\n (member: IrMember): member is IrPropertySignature => member.kind === \"property\",\n );\n return new Map(properties.map((property) => [nameOf(property), property]));\n}\n\nexport function indexSignaturesOf(type: IrObjectType): IrIndexSignature[] {\n return type.members.filter(\n (member: IrMember): member is IrIndexSignature => member.kind === \"indexSignature\",\n );\n}\n\n/** The type read from a property: an optional one may be `undefined`. */\nexport function readType(property: IrPropertySignature): IrType {\n return property.isOptional ? { kind: \"union\", types: [property.type, UNDEFINED] } : property.type;\n}\n\n/**\n * `T[number]` for an array `T`, as the generator writes for an item of an array response: the\n * element type, readonly or not. A tuple's is the union of its elements, which is not modelled.\n */\nfunction arrayElement(type: IrType): IrType | null {\n const list = type.kind === \"readonly\" ? type.type : type;\n return list.kind === \"array\" ? list.element : null;\n}\n\n/** One property for two of the same name in an intersection. */\nfunction mergedProperty(\n first: IrPropertySignature,\n second: IrPropertySignature,\n): IrPropertySignature {\n return {\n ...first,\n type: { kind: \"intersection\", types: [first.type, second.type] },\n isOptional: first.isOptional && second.isOptional,\n isReadonly: first.isReadonly || second.isReadonly,\n };\n}\n\n/** Resolves types once each, for one comparison. */\nexport class TypeResolution {\n private readonly lookup: DeclaredTypeLookup;\n private readonly resolvedTypes = new Map<IrType, IrType>();\n\n constructor(lookup: DeclaredTypeLookup) {\n this.lookup = lookup;\n }\n\n /** The type a reference names, followed through references to references; computed once. */\n resolved(type: IrType): IrType {\n const known = this.resolvedTypes.get(type);\n if (known !== undefined) {\n return known;\n }\n // A type that reaches itself while it is resolved stays as it is written there.\n this.resolvedTypes.set(type, type);\n const seen = new Set<IrType>();\n let current = type;\n while (!seen.has(current)) {\n seen.add(current);\n const named = this.lookup(current) ?? this.indexedProperty(current);\n if (named === null) {\n break;\n }\n current = named;\n }\n const result = current.kind === \"intersection\" ? (this.merged(current) ?? current) : current;\n this.resolvedTypes.set(type, result);\n return result;\n }\n\n /**\n * `T[\"key\"]` read from the object type `T` resolves to, which the lookup does not do for an\n * object it reached through another lookup (`paths[\"/a/{id}\"][\"get\"]`). An optional property\n * reads as `T | undefined`; `T[number]` is the element of the array `T`.\n */\n private indexedProperty(type: IrType): IrType | null {\n if (type.kind !== \"indexedAccess\") {\n return null;\n }\n const { index } = type;\n if (index.kind === \"keyword\" && index.keyword === \"number\") {\n return arrayElement(this.resolved(type.object));\n }\n const object = this.resolved(type.object);\n if (index.kind !== \"stringLiteral\" || object.kind !== \"object\") {\n return null;\n }\n const property = propertiesOf(object).get(index.value);\n return property === undefined ? null : readType(property);\n }\n\n /**\n * An intersection of object types as the one object TypeScript makes of it: a property in\n * several parts has the intersection of their types, and is optional only when it is in each.\n * Null when a part is no object type.\n */\n private merged(type: IrType): IrObjectType | null {\n const parts = this.objectParts(type);\n if (parts === null) {\n return null;\n }\n const properties = new Map<string, IrPropertySignature>();\n const indexes: IrIndexSignature[] = [];\n for (const member of parts.flatMap((part) => part.members)) {\n if (member.kind === \"indexSignature\") {\n indexes.push(member);\n continue;\n }\n const name = nameOf(member);\n const other = properties.get(name);\n properties.set(name, other === undefined ? member : mergedProperty(other, member));\n }\n return { kind: \"object\", members: [...properties.values(), ...indexes] };\n }\n\n /**\n * The object types an intersection is made of, nested ones flattened; null for any other, and\n * for an intersection that contains itself, which TypeScript does not merge either.\n */\n private objectParts(\n type: IrType,\n visiting: ReadonlySet<IrType> = new Set(),\n ): IrObjectType[] | null {\n if (type.kind === \"object\") {\n return [type];\n }\n if (type.kind !== \"intersection\" || visiting.has(type)) {\n return null;\n }\n const parts: IrObjectType[] = [];\n for (const part of type.types) {\n const objects = this.objectParts(this.resolved(part), new Set([...visiting, type]));\n if (objects === null) {\n return null;\n }\n parts.push(...objects);\n }\n return parts;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-resolution.mjs","sources":["../../../../src/application/transform/document/type-resolution.ts"],"sourcesContent":["import { appendAll } from \"../../../domain/append-all.js\";\nimport type {\n IrIndexSignature,\n IrMember,\n IrObjectType,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport type { DeclaredTypeLookup } from \"./declared-types.js\";\n\n/**\n * The types the `--path-params-as-types` overlap check compares, as TypeScript sees them:\n * references followed to the declarations of the document, `T[\"key\"]` and `T[number]` read from\n * `T`, and an intersection of object types merged into one object.\n */\n\nconst UNDEFINED: IrType = { kind: \"keyword\", keyword: \"undefined\" };\n\nexport function nameOf(member: IrPropertySignature): string {\n return member.name.kind === \"string\" ? member.name.value : member.name.text;\n}\n\nexport function propertiesOf(type: IrObjectType): Map<string, IrPropertySignature> {\n const properties = type.members.filter(\n (member: IrMember): member is IrPropertySignature => member.kind === \"property\",\n );\n return new Map(properties.map((property) => [nameOf(property), property]));\n}\n\nexport function indexSignaturesOf(type: IrObjectType): IrIndexSignature[] {\n return type.members.filter(\n (member: IrMember): member is IrIndexSignature => member.kind === \"indexSignature\",\n );\n}\n\n/** The type read from a property: an optional one may be `undefined`. */\nexport function readType(property: IrPropertySignature): IrType {\n return property.isOptional ? { kind: \"union\", types: [property.type, UNDEFINED] } : property.type;\n}\n\n/**\n * `T[number]` for an array `T`, as the generator writes for an item of an array response: the\n * element type, readonly or not. A tuple's is the union of its elements, which is not modelled.\n */\nfunction arrayElement(type: IrType): IrType | null {\n const list = type.kind === \"readonly\" ? type.type : type;\n return list.kind === \"array\" ? list.element : null;\n}\n\n/** One property for two of the same name in an intersection. */\nfunction mergedProperty(\n first: IrPropertySignature,\n second: IrPropertySignature,\n): IrPropertySignature {\n return {\n ...first,\n type: { kind: \"intersection\", types: [first.type, second.type] },\n isOptional: first.isOptional && second.isOptional,\n isReadonly: first.isReadonly || second.isReadonly,\n };\n}\n\n/** Resolves types once each, for one comparison. */\nexport class TypeResolution {\n private readonly lookup: DeclaredTypeLookup;\n private readonly resolvedTypes = new Map<IrType, IrType>();\n\n constructor(lookup: DeclaredTypeLookup) {\n this.lookup = lookup;\n }\n\n /** The type a reference names, followed through references to references; computed once. */\n resolved(type: IrType): IrType {\n const known = this.resolvedTypes.get(type);\n if (known !== undefined) {\n return known;\n }\n // A type that reaches itself while it is resolved stays as it is written there.\n this.resolvedTypes.set(type, type);\n const seen = new Set<IrType>();\n let current = type;\n while (!seen.has(current)) {\n seen.add(current);\n const named = this.lookup(current) ?? this.indexedProperty(current);\n if (named === null) {\n break;\n }\n current = named;\n }\n const result = current.kind === \"intersection\" ? (this.merged(current) ?? current) : current;\n this.resolvedTypes.set(type, result);\n return result;\n }\n\n /**\n * `T[\"key\"]` read from the object type `T` resolves to, which the lookup does not do for an\n * object it reached through another lookup (`paths[\"/a/{id}\"][\"get\"]`). An optional property\n * reads as `T | undefined`; `T[number]` is the element of the array `T`.\n */\n private indexedProperty(type: IrType): IrType | null {\n if (type.kind !== \"indexedAccess\") {\n return null;\n }\n const { index } = type;\n if (index.kind === \"keyword\" && index.keyword === \"number\") {\n return arrayElement(this.resolved(type.object));\n }\n const object = this.resolved(type.object);\n if (index.kind !== \"stringLiteral\" || object.kind !== \"object\") {\n return null;\n }\n const property = propertiesOf(object).get(index.value);\n return property === undefined ? null : readType(property);\n }\n\n /**\n * An intersection of object types as the one object TypeScript makes of it: a property in\n * several parts has the intersection of their types, and is optional only when it is in each.\n * Null when a part is no object type.\n */\n private merged(type: IrType): IrObjectType | null {\n const parts = this.objectParts(type);\n if (parts === null) {\n return null;\n }\n const properties = new Map<string, IrPropertySignature>();\n const indexes: IrIndexSignature[] = [];\n for (const member of parts.flatMap((part) => part.members)) {\n if (member.kind === \"indexSignature\") {\n indexes.push(member);\n continue;\n }\n const name = nameOf(member);\n const other = properties.get(name);\n properties.set(name, other === undefined ? member : mergedProperty(other, member));\n }\n return { kind: \"object\", members: [...properties.values(), ...indexes] };\n }\n\n /**\n * The object types an intersection is made of, nested ones flattened; null for any other, and\n * for an intersection that contains itself, which TypeScript does not merge either.\n */\n private objectParts(\n type: IrType,\n visiting: ReadonlySet<IrType> = new Set(),\n ): IrObjectType[] | null {\n if (type.kind === \"object\") {\n return [type];\n }\n if (type.kind !== \"intersection\" || visiting.has(type)) {\n return null;\n }\n const parts: IrObjectType[] = [];\n for (const part of type.types) {\n const objects = this.objectParts(this.resolved(part), new Set([...visiting, type]));\n if (objects === null) {\n return null;\n }\n appendAll(parts, objects);\n }\n return parts;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ const pathItem = require('./path-item.cjs');
8
8
 
9
9
  function webhooksType(webhooks, context) {
10
10
  const members = documentEntries.documentEntries(webhooks, context.options).map(([name, pathItem$1]) => {
11
- const location = { path: jsonPointer.createRef(["webhooks", name]) };
11
+ const location = { path: jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, ["webhooks", name]) };
12
12
  const type = pathItem.pathItemType(pathItem$1, location, context);
13
13
  return constructors.irProperty(propertyName.toPropertyName(name), type, { isReadonly: context.options.immutable });
14
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.cjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: createRef([\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":["documentEntries","pathItem","createRef","pathItemType","irProperty","toPropertyName","irObject"],"mappings":";;;;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAUA,+BAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAMC,UAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAMC,qBAAA,CAAU,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACvD,IAAA,MAAM,IAAA,GAAOC,qBAAA,CAAaF,UAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAOG,uBAAA,CAAWC,2BAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAOC,sBAAS,OAAO,CAAA;AACzB;;"}
1
+ {"version":3,"file":"webhooks.cjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":["documentEntries","pathItem","appendPointer","ROOT_POINTER","pathItemType","irProperty","toPropertyName","irObject"],"mappings":";;;;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAUA,+BAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAMC,UAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAMC,yBAAA,CAAcC,0BAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,IAAA,MAAM,IAAA,GAAOC,qBAAA,CAAaH,UAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAOI,uBAAA,CAAWC,2BAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAOC,sBAAS,OAAO,CAAA;AACzB;;"}
@@ -1,12 +1,12 @@
1
1
  import { irProperty, irObject } from '../../../domain/ir/constructors.mjs';
2
2
  import { toPropertyName } from '../../../domain/ir/property-name.mjs';
3
- import { createRef } from '../../../domain/openapi/json-pointer.mjs';
3
+ import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
4
4
  import { documentEntries } from '../document-entries.mjs';
5
5
  import { pathItemType } from './path-item.mjs';
6
6
 
7
7
  function webhooksType(webhooks, context) {
8
8
  const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {
9
- const location = { path: createRef(["webhooks", name]) };
9
+ const location = { path: appendPointer(ROOT_POINTER, ["webhooks", name]) };
10
10
  const type = pathItemType(pathItem, location, context);
11
11
  return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });
12
12
  });
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.mjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: createRef([\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":[],"mappings":";;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,SAAA,CAAU,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACvD,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,QAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAO,UAAA,CAAW,cAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB;;"}
1
+ {"version":3,"file":"webhooks.mjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":[],"mappings":";;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,aAAA,CAAc,cAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,QAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAO,UAAA,CAAW,cAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB;;"}
@@ -2,7 +2,9 @@
2
2
 
3
3
  const constructors = require('../../../domain/ir/constructors.cjs');
4
4
  const helperTypes = require('../helper-types.cjs');
5
+ const enumNameClaims = require('./enum-name-claims.cjs');
5
6
  const enumNaming = require('./enum-naming.cjs');
7
+ const operationKeys = require('./operation-keys.cjs');
6
8
  const sharedEnumNames = require('./shared-enum-names.cjs');
7
9
 
8
10
  function dedupeKey(request) {
@@ -39,19 +41,22 @@ class RunFooter {
39
41
  sink;
40
42
  isDedupingEnums;
41
43
  sharedNames;
42
- constructor(sink, isDedupingEnums, sharedNames = sharedEnumNames.FIRST_SCHEMA_NAMES) {
44
+ names;
45
+ constructor(sink, isDedupingEnums, sharedNames = sharedEnumNames.FIRST_SCHEMA_NAMES, names = { enums: new enumNameClaims.EnumNameClaims(), operations: new operationKeys.OperationKeys() }) {
43
46
  this.sink = sink;
44
47
  this.isDedupingEnums = isDedupingEnums;
45
48
  this.sharedNames = sharedNames;
49
+ this.names = names;
46
50
  }
47
51
  addEnum(request) {
48
52
  const ownName = this.naming.enumName(request.name);
49
53
  const key = this.isDedupingEnums ? dedupeKey(request) : null;
50
- const name = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);
54
+ const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);
51
55
  const known = key === null ? void 0 : this.enumNamesByKey.get(key);
52
56
  if (known !== void 0) {
53
57
  return known;
54
58
  }
59
+ const name = this.names.enums.nameFor(sharedName, request.name);
55
60
  const declared = request.values.length > 0 ? declarationKey(name, request) : null;
56
61
  if (declared !== null && this.declaredEnums.has(declared)) {
57
62
  return name;
@@ -136,6 +141,9 @@ class RunFooter {
136
141
  addOperation(build) {
137
142
  this.sink.addOperation(build);
138
143
  }
144
+ operationKey(operationId) {
145
+ return this.names.operations.keyFor(operationId);
146
+ }
139
147
  require(helper) {
140
148
  if (!this.sink.hasTypeAlias(helper.name)) {
141
149
  this.sink.add({ kind: "rawDeclaration", name: helper.name, text: helper.text });
@@ -1 +1 @@
1
- {"version":3,"file":"document-footer.cjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const name = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":["EnumNaming","FIRST_SCHEMA_NAMES","enumDeclaration","withoutDeclaredMembers","HELPER_TYPES","irReference"],"mappings":"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"}
1
+ {"version":3,"file":"document-footer.cjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNameClaims } from \"./enum-name-claims.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { OperationKeys } from \"./operation-keys.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/** The naming state a run's footer shares with the rest of the run. */\nexport interface RunFooterNames {\n readonly enums: EnumNameClaims;\n readonly operations: OperationKeys;\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n private readonly names: RunFooterNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n names: RunFooterNames = { enums: new EnumNameClaims(), operations: new OperationKeys() },\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n this.names = names;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // The owner is the schema location: its requests share one enum, with `--dedupe-enums` too.\n const name = this.names.enums.nameFor(sharedName, request.name);\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n operationKey(operationId: string): string {\n return this.names.operations.keyFor(operationId);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":["EnumNaming","FIRST_SCHEMA_NAMES","EnumNameClaims","OperationKeys","enumDeclaration","withoutDeclaredMembers","HELPER_TYPES","irReference"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { irReference } from '../../../domain/ir/constructors.mjs';
2
2
  import { HELPER_TYPES } from '../helper-types.mjs';
3
+ import { EnumNameClaims } from './enum-name-claims.mjs';
3
4
  import { EnumNaming, enumDeclaration, withoutDeclaredMembers } from './enum-naming.mjs';
5
+ import { OperationKeys } from './operation-keys.mjs';
4
6
  import { FIRST_SCHEMA_NAMES } from './shared-enum-names.mjs';
5
7
 
6
8
  function dedupeKey(request) {
@@ -37,19 +39,22 @@ class RunFooter {
37
39
  sink;
38
40
  isDedupingEnums;
39
41
  sharedNames;
40
- constructor(sink, isDedupingEnums, sharedNames = FIRST_SCHEMA_NAMES) {
42
+ names;
43
+ constructor(sink, isDedupingEnums, sharedNames = FIRST_SCHEMA_NAMES, names = { enums: new EnumNameClaims(), operations: new OperationKeys() }) {
41
44
  this.sink = sink;
42
45
  this.isDedupingEnums = isDedupingEnums;
43
46
  this.sharedNames = sharedNames;
47
+ this.names = names;
44
48
  }
45
49
  addEnum(request) {
46
50
  const ownName = this.naming.enumName(request.name);
47
51
  const key = this.isDedupingEnums ? dedupeKey(request) : null;
48
- const name = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);
52
+ const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);
49
53
  const known = key === null ? void 0 : this.enumNamesByKey.get(key);
50
54
  if (known !== void 0) {
51
55
  return known;
52
56
  }
57
+ const name = this.names.enums.nameFor(sharedName, request.name);
53
58
  const declared = request.values.length > 0 ? declarationKey(name, request) : null;
54
59
  if (declared !== null && this.declaredEnums.has(declared)) {
55
60
  return name;
@@ -134,6 +139,9 @@ class RunFooter {
134
139
  addOperation(build) {
135
140
  this.sink.addOperation(build);
136
141
  }
142
+ operationKey(operationId) {
143
+ return this.names.operations.keyFor(operationId);
144
+ }
137
145
  require(helper) {
138
146
  if (!this.sink.hasTypeAlias(helper.name)) {
139
147
  this.sink.add({ kind: "rawDeclaration", name: helper.name, text: helper.text });
@@ -1 +1 @@
1
- {"version":3,"file":"document-footer.mjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const name = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-footer.mjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNameClaims } from \"./enum-name-claims.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { OperationKeys } from \"./operation-keys.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/** The naming state a run's footer shares with the rest of the run. */\nexport interface RunFooterNames {\n readonly enums: EnumNameClaims;\n readonly operations: OperationKeys;\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n private readonly names: RunFooterNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n names: RunFooterNames = { enums: new EnumNameClaims(), operations: new OperationKeys() },\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n this.names = names;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // The owner is the schema location: its requests share one enum, with `--dedupe-enums` too.\n const name = this.names.enums.nameFor(sharedName, request.name);\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n operationKey(operationId: string): string {\n return this.names.operations.keyFor(operationId);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ const numberedNames = require('../numbered-names.cjs');
4
+
5
+ class EnumNameClaims {
6
+ mayBeNeeded;
7
+ /** The first owner of each name an enum asked for. */
8
+ owners = /* @__PURE__ */ new Map();
9
+ /** The name given to each owner, by name asked for and owner. */
10
+ given = /* @__PURE__ */ new Map();
11
+ /** Every name given, and every name the output may need. */
12
+ taken;
13
+ /** A numbered name given only because the output may need the name asked for: that name. */
14
+ standIns = /* @__PURE__ */ new Map();
15
+ /** `mayBeNeeded`: the names an enum avoids until the end of the run; empty outside a run. */
16
+ constructor(mayBeNeeded = /* @__PURE__ */ new Set()) {
17
+ this.mayBeNeeded = mayBeNeeded;
18
+ this.taken = new Set(mayBeNeeded);
19
+ }
20
+ /** The declaration name of the enum `owner` asks to name `name`; the same for every request. */
21
+ nameFor(name, owner) {
22
+ const key = JSON.stringify([name, owner]);
23
+ const known = this.given.get(key);
24
+ if (known !== void 0) {
25
+ return known;
26
+ }
27
+ const isFirstOwner = (this.owners.get(name) ?? owner) === owner;
28
+ this.owners.set(name, this.owners.get(name) ?? owner);
29
+ const isFree = isFirstOwner && !this.taken.has(name);
30
+ const declared = isFree ? name : numberedNames.freeNumberedName(name, this.taken);
31
+ if (isFirstOwner && this.mayBeNeeded.has(name)) {
32
+ this.standIns.set(declared, name);
33
+ }
34
+ this.taken.add(declared);
35
+ this.given.set(key, declared);
36
+ return declared;
37
+ }
38
+ /**
39
+ * The numbered names to rename back to the name asked for, because `needed` (the names the
40
+ * finished output declares or refers to) does not hold that name.
41
+ */
42
+ givenBack(needed) {
43
+ return new Map([...this.standIns].filter(([, name]) => !needed.has(name)));
44
+ }
45
+ }
46
+
47
+ exports.EnumNameClaims = EnumNameClaims;
48
+ //# sourceMappingURL=enum-name-claims.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum-name-claims.cjs","sources":["../../../../src/application/transform/footer/enum-name-claims.ts"],"sourcesContent":["import { freeNumberedName } from \"../numbered-names.js\";\n\n/**\n * The names of the `--enum` declarations of one run, unique across the enums and apart from the\n * names the rest of the output may need.\n *\n * Every enum has an owner: the schema location it is named after, or with `--dedupe-enums` its\n * members. Two owners whose names come out the same (`status` and `Status`) merged into one enum\n * before, so each accepted the values of the other (upstream behavior). Now the first owner keeps\n * the name and each later one gets the next free `Name_2`, `Name_3`, …; requests of one owner (a\n * property and an inline `allOf` item of one schema) still share one enum.\n *\n * An enum also gives way to a name the output may need, which is only known at the end: a global\n * type the output refers to (the `Blob` of `--binary-as-blob`, the `Record` of\n * `Record<string, never>`), a helper type, or `ApiPaths`. Until then it takes the numbered name;\n * `givenBack` lists the ones whose own name the output turned out not to need, so output that\n * compiled before keeps its names (ADR-021).\n */\nexport class EnumNameClaims {\n private readonly mayBeNeeded: ReadonlySet<string>;\n /** The first owner of each name an enum asked for. */\n private readonly owners = new Map<string, string>();\n /** The name given to each owner, by name asked for and owner. */\n private readonly given = new Map<string, string>();\n /** Every name given, and every name the output may need. */\n private readonly taken: Set<string>;\n /** A numbered name given only because the output may need the name asked for: that name. */\n private readonly standIns = new Map<string, string>();\n\n /** `mayBeNeeded`: the names an enum avoids until the end of the run; empty outside a run. */\n constructor(mayBeNeeded: ReadonlySet<string> = new Set()) {\n this.mayBeNeeded = mayBeNeeded;\n this.taken = new Set(mayBeNeeded);\n }\n\n /** The declaration name of the enum `owner` asks to name `name`; the same for every request. */\n nameFor(name: string, owner: string): string {\n const key = JSON.stringify([name, owner]);\n const known = this.given.get(key);\n if (known !== undefined) {\n return known;\n }\n const isFirstOwner = (this.owners.get(name) ?? owner) === owner;\n this.owners.set(name, this.owners.get(name) ?? owner);\n const isFree = isFirstOwner && !this.taken.has(name);\n const declared = isFree ? name : freeNumberedName(name, this.taken);\n if (isFirstOwner && this.mayBeNeeded.has(name)) {\n this.standIns.set(declared, name);\n }\n this.taken.add(declared);\n this.given.set(key, declared);\n return declared;\n }\n\n /**\n * The numbered names to rename back to the name asked for, because `needed` (the names the\n * finished output declares or refers to) does not hold that name.\n */\n givenBack(needed: ReadonlySet<string>): ReadonlyMap<string, string> {\n return new Map([...this.standIns].filter(([, name]) => !needed.has(name)));\n }\n}\n"],"names":["freeNumberedName"],"mappings":";;;;AAkBO,MAAM,cAAA,CAAe;AAAA,EACT,WAAA;AAAA;AAAA,EAEA,MAAA,uBAAa,GAAA,EAAoB;AAAA;AAAA,EAEjC,KAAA,uBAAY,GAAA,EAAoB;AAAA;AAAA,EAEhC,KAAA;AAAA;AAAA,EAEA,QAAA,uBAAe,GAAA,EAAoB;AAAA;AAAA,EAGpD,WAAA,CAAY,WAAA,mBAAmC,IAAI,GAAA,EAAI,EAAG;AACxD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,GAAA,CAAI,WAAW,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAc,KAAA,EAAuB;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,KAAK,KAAA,MAAW,KAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM,IAAA,CAAK,OAAO,GAAA,CAAI,IAAI,KAAK,KAAK,CAAA;AACpD,IAAA,MAAM,SAAS,YAAA,IAAgB,CAAC,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AACnD,IAAA,MAAM,WAAW,MAAA,GAAS,IAAA,GAAOA,8BAAA,CAAiB,IAAA,EAAM,KAAK,KAAK,CAAA;AAClE,IAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,QAAQ,CAAA;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA0D;AAClE,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,QAAQ,EAAE,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,KAAM,CAAC,OAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACF;;"}
@@ -0,0 +1,46 @@
1
+ import { freeNumberedName } from '../numbered-names.mjs';
2
+
3
+ class EnumNameClaims {
4
+ mayBeNeeded;
5
+ /** The first owner of each name an enum asked for. */
6
+ owners = /* @__PURE__ */ new Map();
7
+ /** The name given to each owner, by name asked for and owner. */
8
+ given = /* @__PURE__ */ new Map();
9
+ /** Every name given, and every name the output may need. */
10
+ taken;
11
+ /** A numbered name given only because the output may need the name asked for: that name. */
12
+ standIns = /* @__PURE__ */ new Map();
13
+ /** `mayBeNeeded`: the names an enum avoids until the end of the run; empty outside a run. */
14
+ constructor(mayBeNeeded = /* @__PURE__ */ new Set()) {
15
+ this.mayBeNeeded = mayBeNeeded;
16
+ this.taken = new Set(mayBeNeeded);
17
+ }
18
+ /** The declaration name of the enum `owner` asks to name `name`; the same for every request. */
19
+ nameFor(name, owner) {
20
+ const key = JSON.stringify([name, owner]);
21
+ const known = this.given.get(key);
22
+ if (known !== void 0) {
23
+ return known;
24
+ }
25
+ const isFirstOwner = (this.owners.get(name) ?? owner) === owner;
26
+ this.owners.set(name, this.owners.get(name) ?? owner);
27
+ const isFree = isFirstOwner && !this.taken.has(name);
28
+ const declared = isFree ? name : freeNumberedName(name, this.taken);
29
+ if (isFirstOwner && this.mayBeNeeded.has(name)) {
30
+ this.standIns.set(declared, name);
31
+ }
32
+ this.taken.add(declared);
33
+ this.given.set(key, declared);
34
+ return declared;
35
+ }
36
+ /**
37
+ * The numbered names to rename back to the name asked for, because `needed` (the names the
38
+ * finished output declares or refers to) does not hold that name.
39
+ */
40
+ givenBack(needed) {
41
+ return new Map([...this.standIns].filter(([, name]) => !needed.has(name)));
42
+ }
43
+ }
44
+
45
+ export { EnumNameClaims };
46
+ //# sourceMappingURL=enum-name-claims.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enum-name-claims.mjs","sources":["../../../../src/application/transform/footer/enum-name-claims.ts"],"sourcesContent":["import { freeNumberedName } from \"../numbered-names.js\";\n\n/**\n * The names of the `--enum` declarations of one run, unique across the enums and apart from the\n * names the rest of the output may need.\n *\n * Every enum has an owner: the schema location it is named after, or with `--dedupe-enums` its\n * members. Two owners whose names come out the same (`status` and `Status`) merged into one enum\n * before, so each accepted the values of the other (upstream behavior). Now the first owner keeps\n * the name and each later one gets the next free `Name_2`, `Name_3`, …; requests of one owner (a\n * property and an inline `allOf` item of one schema) still share one enum.\n *\n * An enum also gives way to a name the output may need, which is only known at the end: a global\n * type the output refers to (the `Blob` of `--binary-as-blob`, the `Record` of\n * `Record<string, never>`), a helper type, or `ApiPaths`. Until then it takes the numbered name;\n * `givenBack` lists the ones whose own name the output turned out not to need, so output that\n * compiled before keeps its names (ADR-021).\n */\nexport class EnumNameClaims {\n private readonly mayBeNeeded: ReadonlySet<string>;\n /** The first owner of each name an enum asked for. */\n private readonly owners = new Map<string, string>();\n /** The name given to each owner, by name asked for and owner. */\n private readonly given = new Map<string, string>();\n /** Every name given, and every name the output may need. */\n private readonly taken: Set<string>;\n /** A numbered name given only because the output may need the name asked for: that name. */\n private readonly standIns = new Map<string, string>();\n\n /** `mayBeNeeded`: the names an enum avoids until the end of the run; empty outside a run. */\n constructor(mayBeNeeded: ReadonlySet<string> = new Set()) {\n this.mayBeNeeded = mayBeNeeded;\n this.taken = new Set(mayBeNeeded);\n }\n\n /** The declaration name of the enum `owner` asks to name `name`; the same for every request. */\n nameFor(name: string, owner: string): string {\n const key = JSON.stringify([name, owner]);\n const known = this.given.get(key);\n if (known !== undefined) {\n return known;\n }\n const isFirstOwner = (this.owners.get(name) ?? owner) === owner;\n this.owners.set(name, this.owners.get(name) ?? owner);\n const isFree = isFirstOwner && !this.taken.has(name);\n const declared = isFree ? name : freeNumberedName(name, this.taken);\n if (isFirstOwner && this.mayBeNeeded.has(name)) {\n this.standIns.set(declared, name);\n }\n this.taken.add(declared);\n this.given.set(key, declared);\n return declared;\n }\n\n /**\n * The numbered names to rename back to the name asked for, because `needed` (the names the\n * finished output declares or refers to) does not hold that name.\n */\n givenBack(needed: ReadonlySet<string>): ReadonlyMap<string, string> {\n return new Map([...this.standIns].filter(([, name]) => !needed.has(name)));\n }\n}\n"],"names":[],"mappings":";;AAkBO,MAAM,cAAA,CAAe;AAAA,EACT,WAAA;AAAA;AAAA,EAEA,MAAA,uBAAa,GAAA,EAAoB;AAAA;AAAA,EAEjC,KAAA,uBAAY,GAAA,EAAoB;AAAA;AAAA,EAEhC,KAAA;AAAA;AAAA,EAEA,QAAA,uBAAe,GAAA,EAAoB;AAAA;AAAA,EAGpD,WAAA,CAAY,WAAA,mBAAmC,IAAI,GAAA,EAAI,EAAG;AACxD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,GAAA,CAAI,WAAW,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,OAAA,CAAQ,MAAc,KAAA,EAAuB;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,KAAK,KAAA,MAAW,KAAA;AAC1D,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,IAAA,EAAM,IAAA,CAAK,OAAO,GAAA,CAAI,IAAI,KAAK,KAAK,CAAA;AACpD,IAAA,MAAM,SAAS,YAAA,IAAgB,CAAC,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AACnD,IAAA,MAAM,WAAW,MAAA,GAAS,IAAA,GAAO,gBAAA,CAAiB,IAAA,EAAM,KAAK,KAAK,CAAA;AAClE,IAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,QAAQ,CAAA;AACvB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,MAAA,EAA0D;AAClE,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,QAAQ,EAAE,MAAA,CAAO,CAAC,GAAG,IAAI,CAAA,KAAM,CAAC,OAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAAA,EAC3E;AACF;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ class OperationKeys {
4
+ written;
5
+ taken = /* @__PURE__ */ new Set();
6
+ /** `written`: every operation key of the document; empty outside a document run. */
7
+ constructor(written = /* @__PURE__ */ new Set()) {
8
+ this.written = written;
9
+ }
10
+ /** The key of the next operation with this key, written or numbered. */
11
+ keyFor(key) {
12
+ let unique = key;
13
+ for (let count = 2; this.taken.has(unique); count += 1) {
14
+ const candidate = `${key}${count}`;
15
+ unique = this.written.has(candidate) ? unique : candidate;
16
+ }
17
+ this.taken.add(unique);
18
+ return unique;
19
+ }
20
+ }
21
+
22
+ exports.OperationKeys = OperationKeys;
23
+ //# sourceMappingURL=operation-keys.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-keys.cjs","sources":["../../../../src/application/transform/footer/operation-keys.ts"],"sourcesContent":["/**\n * The keys of the `operations` interface in one run. A repeated `operationId` (Redocly warns\n * about it) gave the interface two members of one name, which did not compile (TS2300). Now the\n * first operation with an ID keeps it, and each later one gets the lowest number from 2 whose key\n * no operation of the document has: the second `listItems` is `listItems2`, the name\n * `--make-paths-enum` gives it in `ApiPaths` too. Keys follow the order the operations are\n * transformed in, which is the document order (or the `--alphabetize` order).\n */\nexport class OperationKeys {\n private readonly written: ReadonlySet<string>;\n private readonly taken = new Set<string>();\n\n /** `written`: every operation key of the document; empty outside a document run. */\n constructor(written: ReadonlySet<string> = new Set()) {\n this.written = written;\n }\n\n /** The key of the next operation with this key, written or numbered. */\n keyFor(key: string): string {\n let unique = key;\n for (let count = 2; this.taken.has(unique); count += 1) {\n const candidate = `${key}${count}`;\n unique = this.written.has(candidate) ? unique : candidate;\n }\n this.taken.add(unique);\n return unique;\n }\n}\n"],"names":[],"mappings":";;AAQO,MAAM,aAAA,CAAc;AAAA,EACR,OAAA;AAAA,EACA,KAAA,uBAAY,GAAA,EAAY;AAAA;AAAA,EAGzC,WAAA,CAAY,OAAA,mBAA+B,IAAI,GAAA,EAAI,EAAG;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,OAAO,GAAA,EAAqB;AAC1B,IAAA,IAAI,MAAA,GAAS,GAAA;AACb,IAAA,KAAA,IAAS,KAAA,GAAQ,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACtD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA;AAChC,MAAA,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,IAAI,MAAA,GAAS,SAAA;AAAA,IAClD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,MAAM,CAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;"}
@@ -0,0 +1,21 @@
1
+ class OperationKeys {
2
+ written;
3
+ taken = /* @__PURE__ */ new Set();
4
+ /** `written`: every operation key of the document; empty outside a document run. */
5
+ constructor(written = /* @__PURE__ */ new Set()) {
6
+ this.written = written;
7
+ }
8
+ /** The key of the next operation with this key, written or numbered. */
9
+ keyFor(key) {
10
+ let unique = key;
11
+ for (let count = 2; this.taken.has(unique); count += 1) {
12
+ const candidate = `${key}${count}`;
13
+ unique = this.written.has(candidate) ? unique : candidate;
14
+ }
15
+ this.taken.add(unique);
16
+ return unique;
17
+ }
18
+ }
19
+
20
+ export { OperationKeys };
21
+ //# sourceMappingURL=operation-keys.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation-keys.mjs","sources":["../../../../src/application/transform/footer/operation-keys.ts"],"sourcesContent":["/**\n * The keys of the `operations` interface in one run. A repeated `operationId` (Redocly warns\n * about it) gave the interface two members of one name, which did not compile (TS2300). Now the\n * first operation with an ID keeps it, and each later one gets the lowest number from 2 whose key\n * no operation of the document has: the second `listItems` is `listItems2`, the name\n * `--make-paths-enum` gives it in `ApiPaths` too. Keys follow the order the operations are\n * transformed in, which is the document order (or the `--alphabetize` order).\n */\nexport class OperationKeys {\n private readonly written: ReadonlySet<string>;\n private readonly taken = new Set<string>();\n\n /** `written`: every operation key of the document; empty outside a document run. */\n constructor(written: ReadonlySet<string> = new Set()) {\n this.written = written;\n }\n\n /** The key of the next operation with this key, written or numbered. */\n keyFor(key: string): string {\n let unique = key;\n for (let count = 2; this.taken.has(unique); count += 1) {\n const candidate = `${key}${count}`;\n unique = this.written.has(candidate) ? unique : candidate;\n }\n this.taken.add(unique);\n return unique;\n }\n}\n"],"names":[],"mappings":"AAQO,MAAM,aAAA,CAAc;AAAA,EACR,OAAA;AAAA,EACA,KAAA,uBAAY,GAAA,EAAY;AAAA;AAAA,EAGzC,WAAA,CAAY,OAAA,mBAA+B,IAAI,GAAA,EAAI,EAAG;AACpD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,OAAO,GAAA,EAAqB;AAC1B,IAAA,IAAI,MAAA,GAAS,GAAA;AACb,IAAA,KAAA,IAAS,KAAA,GAAQ,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACtD,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA;AAChC,MAAA,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,IAAI,MAAA,GAAS,SAAA;AAAA,IAClD;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,MAAM,CAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;"}