openapi-typesafe 1.0.0-rc.3 → 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 (448) hide show
  1. package/CHANGELOG.md +1831 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +90 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +90 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +75 -0
  15. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +72 -0
  17. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  19. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  20. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  21. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  22. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  23. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  25. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +14 -15
  27. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +12 -13
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/ref-access.cjs +31 -3
  31. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/ref-access.mjs +31 -3
  33. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-holders.cjs +2 -2
  35. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-holders.mjs +3 -3
  37. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  39. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  41. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/remote-fetch.cjs +35 -6
  43. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/remote-fetch.mjs +35 -6
  45. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-node-limit.cjs +47 -0
  47. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  48. package/dist/adapters/redocly-loader/remote-node-limit.mjs +44 -0
  49. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  50. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  51. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  53. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +11 -7
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +12 -8
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  59. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  61. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  62. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  63. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  64. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  65. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  66. package/dist/api/default-ports.cjs +14 -2
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -2
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/discriminator-enum-parent.cjs +2 -2
  71. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  72. package/dist/api/discriminator-enum-parent.mjs +3 -3
  73. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  74. package/dist/api/discriminator-other-owners.cjs +5 -3
  75. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  76. package/dist/api/discriminator-other-owners.mjs +5 -3
  77. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  78. package/dist/api/discriminator-patch.cjs +5 -1
  79. package/dist/api/discriminator-patch.cjs.map +1 -1
  80. package/dist/api/discriminator-patch.mjs +5 -1
  81. package/dist/api/discriminator-patch.mjs.map +1 -1
  82. package/dist/api/discriminator-scan.cjs +15 -8
  83. package/dist/api/discriminator-scan.cjs.map +1 -1
  84. package/dist/api/discriminator-scan.mjs +15 -8
  85. package/dist/api/discriminator-scan.mjs.map +1 -1
  86. package/dist/api/document-run.cjs +2 -2
  87. package/dist/api/document-run.cjs.map +1 -1
  88. package/dist/api/document-run.mjs +2 -2
  89. package/dist/api/document-run.mjs.map +1 -1
  90. package/dist/api/legacy-utils.cjs.map +1 -1
  91. package/dist/api/legacy-utils.mjs.map +1 -1
  92. package/dist/api/openapi-ts.cjs +8 -4
  93. package/dist/api/openapi-ts.cjs.map +1 -1
  94. package/dist/api/openapi-ts.mjs +8 -5
  95. package/dist/api/openapi-ts.mjs.map +1 -1
  96. package/dist/api/schema-callbacks.cjs +36 -12
  97. package/dist/api/schema-callbacks.cjs.map +1 -1
  98. package/dist/api/schema-callbacks.mjs +36 -12
  99. package/dist/api/schema-callbacks.mjs.map +1 -1
  100. package/dist/api/transform-context.cjs +7 -3
  101. package/dist/api/transform-context.cjs.map +1 -1
  102. package/dist/api/transform-context.mjs +7 -3
  103. package/dist/api/transform-context.mjs.map +1 -1
  104. package/dist/api/transform-schema.cjs +40 -10
  105. package/dist/api/transform-schema.cjs.map +1 -1
  106. package/dist/api/transform-schema.mjs +41 -11
  107. package/dist/api/transform-schema.mjs.map +1 -1
  108. package/dist/application/print/text-writer.cjs +10 -3
  109. package/dist/application/print/text-writer.cjs.map +1 -1
  110. package/dist/application/print/text-writer.mjs +10 -3
  111. package/dist/application/print/text-writer.mjs.map +1 -1
  112. package/dist/application/stack-overflow.cjs +2 -1
  113. package/dist/application/stack-overflow.cjs.map +1 -1
  114. package/dist/application/stack-overflow.mjs +2 -1
  115. package/dist/application/stack-overflow.mjs.map +1 -1
  116. package/dist/application/transform/document/components.cjs +1 -1
  117. package/dist/application/transform/document/components.cjs.map +1 -1
  118. package/dist/application/transform/document/components.mjs +2 -2
  119. package/dist/application/transform/document/components.mjs.map +1 -1
  120. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  121. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  122. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  123. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  124. package/dist/application/transform/document/defs-root.cjs +1 -1
  125. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  126. package/dist/application/transform/document/defs-root.mjs +2 -2
  127. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  128. package/dist/application/transform/document/document.cjs +4 -1
  129. package/dist/application/transform/document/document.cjs.map +1 -1
  130. package/dist/application/transform/document/document.mjs +3 -2
  131. package/dist/application/transform/document/document.mjs.map +1 -1
  132. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  133. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  134. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  135. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  136. package/dist/application/transform/document/global-type-references.cjs +1 -0
  137. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  138. package/dist/application/transform/document/global-type-references.mjs +1 -1
  139. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  140. package/dist/application/transform/document/media-type.cjs +2 -2
  141. package/dist/application/transform/document/media-type.cjs.map +1 -1
  142. package/dist/application/transform/document/media-type.mjs +3 -3
  143. package/dist/application/transform/document/media-type.mjs.map +1 -1
  144. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  145. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  146. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  147. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  148. package/dist/application/transform/document/operation.cjs +1 -1
  149. package/dist/application/transform/document/operation.cjs.map +1 -1
  150. package/dist/application/transform/document/operation.mjs +2 -2
  151. package/dist/application/transform/document/operation.mjs.map +1 -1
  152. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  153. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  154. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  155. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  156. package/dist/application/transform/document/parameter.cjs +12 -4
  157. package/dist/application/transform/document/parameter.cjs.map +1 -1
  158. package/dist/application/transform/document/parameter.mjs +13 -5
  159. package/dist/application/transform/document/parameter.mjs.map +1 -1
  160. package/dist/application/transform/document/parameters.cjs +6 -29
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +6 -29
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-item.cjs +11 -14
  165. package/dist/application/transform/document/path-item.cjs.map +1 -1
  166. package/dist/application/transform/document/path-item.mjs +12 -16
  167. package/dist/application/transform/document/path-item.mjs.map +1 -1
  168. package/dist/application/transform/document/paths-enum.cjs +1 -0
  169. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  170. package/dist/application/transform/document/paths-enum.mjs +1 -1
  171. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  172. package/dist/application/transform/document/paths.cjs +5 -1
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +6 -2
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  177. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  178. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  179. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  180. package/dist/application/transform/document/request-body.cjs +1 -1
  181. package/dist/application/transform/document/request-body.cjs.map +1 -1
  182. package/dist/application/transform/document/request-body.mjs +2 -2
  183. package/dist/application/transform/document/request-body.mjs.map +1 -1
  184. package/dist/application/transform/document/response.cjs +2 -2
  185. package/dist/application/transform/document/response.cjs.map +1 -1
  186. package/dist/application/transform/document/response.mjs +3 -3
  187. package/dist/application/transform/document/response.mjs.map +1 -1
  188. package/dist/application/transform/document/responses.cjs +1 -1
  189. package/dist/application/transform/document/responses.cjs.map +1 -1
  190. package/dist/application/transform/document/responses.mjs +2 -2
  191. package/dist/application/transform/document/responses.mjs.map +1 -1
  192. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  193. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  194. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  195. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  196. package/dist/application/transform/document/type-resolution.cjs +3 -1
  197. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  198. package/dist/application/transform/document/type-resolution.mjs +3 -1
  199. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  200. package/dist/application/transform/document/webhooks.cjs +1 -1
  201. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  202. package/dist/application/transform/document/webhooks.mjs +2 -2
  203. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  204. package/dist/application/transform/footer/document-footer.cjs +10 -2
  205. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  206. package/dist/application/transform/footer/document-footer.mjs +10 -2
  207. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  208. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  209. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  210. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  211. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  212. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  213. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  214. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  215. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  218. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  220. package/dist/application/transform/helper-types.cjs +1 -1
  221. package/dist/application/transform/helper-types.cjs.map +1 -1
  222. package/dist/application/transform/helper-types.mjs +1 -1
  223. package/dist/application/transform/helper-types.mjs.map +1 -1
  224. package/dist/application/transform/numbered-names.cjs +9 -0
  225. package/dist/application/transform/numbered-names.cjs.map +1 -1
  226. package/dist/application/transform/numbered-names.mjs +9 -1
  227. package/dist/application/transform/numbered-names.mjs.map +1 -1
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +1 -1
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +2 -2
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  232. package/dist/application/transform/ref-type.cjs +2 -1
  233. package/dist/application/transform/ref-type.cjs.map +1 -1
  234. package/dist/application/transform/ref-type.mjs +2 -1
  235. package/dist/application/transform/ref-type.mjs.map +1 -1
  236. package/dist/application/transform/schema/composition-type.cjs +1 -1
  237. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  238. package/dist/application/transform/schema/composition-type.mjs +2 -2
  239. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  240. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  241. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  242. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  243. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  244. package/dist/application/transform/schema/object-type.cjs +3 -3
  245. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  246. package/dist/application/transform/schema/object-type.mjs +4 -4
  247. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  248. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  249. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  250. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  251. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  252. package/dist/application/transform/schema/schema-transform.cjs +4 -2
  253. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  254. package/dist/application/transform/schema/schema-transform.mjs +4 -2
  255. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  256. package/dist/application/transform/schema-comment.cjs +5 -1
  257. package/dist/application/transform/schema-comment.cjs.map +1 -1
  258. package/dist/application/transform/schema-comment.mjs +5 -1
  259. package/dist/application/transform/schema-comment.mjs.map +1 -1
  260. package/dist/cli/api-settings.cjs +62 -6
  261. package/dist/cli/api-settings.cjs.map +1 -1
  262. package/dist/cli/api-settings.mjs +60 -7
  263. package/dist/cli/api-settings.mjs.map +1 -1
  264. package/dist/cli/api-writes.cjs +72 -0
  265. package/dist/cli/api-writes.cjs.map +1 -0
  266. package/dist/cli/api-writes.mjs +69 -0
  267. package/dist/cli/api-writes.mjs.map +1 -0
  268. package/dist/cli/cli-errors.cjs +12 -1
  269. package/dist/cli/cli-errors.cjs.map +1 -1
  270. package/dist/cli/cli-errors.mjs +12 -1
  271. package/dist/cli/cli-errors.mjs.map +1 -1
  272. package/dist/cli/cli-output.cjs +106 -1
  273. package/dist/cli/cli-output.cjs.map +1 -1
  274. package/dist/cli/cli-output.mjs +99 -2
  275. package/dist/cli/cli-output.mjs.map +1 -1
  276. package/dist/cli/main.cjs +5 -1
  277. package/dist/cli/main.cjs.map +1 -1
  278. package/dist/cli/main.mjs +6 -2
  279. package/dist/cli/main.mjs.map +1 -1
  280. package/dist/cli/redocly-apis.cjs +82 -36
  281. package/dist/cli/redocly-apis.cjs.map +1 -1
  282. package/dist/cli/redocly-apis.mjs +85 -39
  283. package/dist/cli/redocly-apis.mjs.map +1 -1
  284. package/dist/cli/run-cli.cjs +13 -7
  285. package/dist/cli/run-cli.cjs.map +1 -1
  286. package/dist/cli/run-cli.mjs +14 -8
  287. package/dist/cli/run-cli.mjs.map +1 -1
  288. package/dist/domain/append-all.cjs +10 -0
  289. package/dist/domain/append-all.cjs.map +1 -0
  290. package/dist/domain/append-all.mjs +8 -0
  291. package/dist/domain/append-all.mjs.map +1 -0
  292. package/dist/domain/cause-secrets.cjs +37 -0
  293. package/dist/domain/cause-secrets.cjs.map +1 -0
  294. package/dist/domain/cause-secrets.mjs +35 -0
  295. package/dist/domain/cause-secrets.mjs.map +1 -0
  296. package/dist/domain/errors.cjs +9 -3
  297. package/dist/domain/errors.cjs.map +1 -1
  298. package/dist/domain/errors.mjs +9 -3
  299. package/dist/domain/errors.mjs.map +1 -1
  300. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  301. package/dist/domain/ir/identifier-text.mjs +1 -1
  302. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  303. package/dist/domain/ir/ir-shape.cjs +187 -0
  304. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  305. package/dist/domain/ir/ir-shape.mjs +184 -0
  306. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  307. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  308. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  309. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  310. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  311. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  312. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  313. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  314. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  315. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  316. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  317. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  318. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  319. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  320. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  321. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  322. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  323. package/dist/domain/openapi/json-pointer.cjs +43 -1
  324. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  325. package/dist/domain/openapi/json-pointer.mjs +40 -2
  326. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  327. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  328. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  329. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  330. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  331. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  332. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  333. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  334. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  335. package/dist/domain/output-fixes.cjs +14 -0
  336. package/dist/domain/output-fixes.cjs.map +1 -1
  337. package/dist/domain/output-fixes.mjs +14 -0
  338. package/dist/domain/output-fixes.mjs.map +1 -1
  339. package/dist/domain/url-secrets.cjs +48 -0
  340. package/dist/domain/url-secrets.cjs.map +1 -0
  341. package/dist/domain/url-secrets.mjs +45 -0
  342. package/dist/domain/url-secrets.mjs.map +1 -0
  343. package/dist/index.d.cts +22 -4
  344. package/dist/index.d.mts +22 -4
  345. package/dist/index.d.ts +22 -4
  346. package/package.json +4 -5
  347. package/src/adapters/node-file-system/file-claims.ts +138 -0
  348. package/src/adapters/node-file-system/file-identity.ts +137 -0
  349. package/src/adapters/node-file-system/node-file-system.ts +145 -18
  350. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +95 -0
  351. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  352. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  353. package/src/adapters/redocly-loader/redocly-schema-loader.ts +18 -24
  354. package/src/adapters/redocly-loader/ref-access.ts +37 -3
  355. package/src/adapters/redocly-loader/ref-holders.ts +3 -3
  356. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  357. package/src/adapters/redocly-loader/remote-fetch.ts +74 -11
  358. package/src/adapters/redocly-loader/remote-node-limit.ts +62 -0
  359. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  360. package/src/adapters/redocly-loader/schema-source.ts +20 -8
  361. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  362. package/src/adapters/terminal-logger/terminal-logger.ts +10 -5
  363. package/src/api/default-ports.ts +33 -4
  364. package/src/api/discriminator-enum-parent.ts +3 -3
  365. package/src/api/discriminator-other-owners.ts +5 -3
  366. package/src/api/discriminator-patch.ts +5 -1
  367. package/src/api/discriminator-scan.ts +16 -8
  368. package/src/api/document-run.ts +4 -3
  369. package/src/api/legacy-utils.ts +5 -1
  370. package/src/api/openapi-ts.ts +20 -5
  371. package/src/api/run-context.ts +3 -0
  372. package/src/api/schema-callbacks.ts +60 -17
  373. package/src/api/transform-context.ts +7 -3
  374. package/src/api/transform-schema.ts +64 -12
  375. package/src/application/ports/file-system.ts +39 -0
  376. package/src/application/ports/schema-loader.ts +11 -1
  377. package/src/application/print/text-writer.ts +10 -3
  378. package/src/application/stack-overflow.ts +9 -5
  379. package/src/application/transform/document/components.ts +2 -2
  380. package/src/application/transform/document/declared-type-names.ts +36 -0
  381. package/src/application/transform/document/defs-root.ts +2 -2
  382. package/src/application/transform/document/document.ts +4 -3
  383. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  384. package/src/application/transform/document/global-type-references.ts +1 -1
  385. package/src/application/transform/document/media-type.ts +4 -3
  386. package/src/application/transform/document/operation-keys-written.ts +27 -0
  387. package/src/application/transform/document/operation.ts +2 -2
  388. package/src/application/transform/document/parameter-entries.ts +70 -0
  389. package/src/application/transform/document/parameter.ts +21 -9
  390. package/src/application/transform/document/parameters.ts +11 -56
  391. package/src/application/transform/document/path-item.ts +13 -31
  392. package/src/application/transform/document/paths-enum.ts +1 -1
  393. package/src/application/transform/document/paths.ts +6 -2
  394. package/src/application/transform/document/referenced-parameter.ts +146 -0
  395. package/src/application/transform/document/request-body.ts +2 -2
  396. package/src/application/transform/document/response.ts +3 -3
  397. package/src/application/transform/document/responses.ts +2 -2
  398. package/src/application/transform/document/root-type-aliases.ts +17 -38
  399. package/src/application/transform/document/type-resolution.ts +2 -1
  400. package/src/application/transform/document/webhooks.ts +2 -2
  401. package/src/application/transform/footer/document-footer.ts +18 -1
  402. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  403. package/src/application/transform/footer/operation-keys.ts +28 -0
  404. package/src/application/transform/footer/type-evaluation.ts +4 -4
  405. package/src/application/transform/helper-types.ts +6 -5
  406. package/src/application/transform/numbered-names.ts +15 -0
  407. package/src/application/transform/ref-pointer/generated-location.ts +2 -2
  408. package/src/application/transform/ref-type.ts +2 -1
  409. package/src/application/transform/schema/composition-type.ts +2 -2
  410. package/src/application/transform/schema/enum-rule.ts +6 -2
  411. package/src/application/transform/schema/object-type.ts +4 -4
  412. package/src/application/transform/schema/ref-siblings.ts +76 -0
  413. package/src/application/transform/schema/schema-context.ts +3 -0
  414. package/src/application/transform/schema/schema-transform.ts +4 -2
  415. package/src/application/transform/schema-comment.ts +5 -1
  416. package/src/application/transform/transform-context.ts +5 -0
  417. package/src/cli/api-settings.ts +82 -7
  418. package/src/cli/api-writes.ts +117 -0
  419. package/src/cli/cli-dependencies.ts +21 -4
  420. package/src/cli/cli-errors.ts +20 -1
  421. package/src/cli/cli-output.ts +186 -7
  422. package/src/cli/main.ts +6 -3
  423. package/src/cli/redocly-apis.ts +153 -48
  424. package/src/cli/run-cli.ts +37 -8
  425. package/src/domain/append-all.ts +10 -0
  426. package/src/domain/cause-secrets.ts +52 -0
  427. package/src/domain/errors.ts +14 -5
  428. package/src/domain/ir/identifier-text.ts +6 -5
  429. package/src/domain/ir/ir-shape.ts +299 -0
  430. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  431. package/src/domain/openapi/alias-expansion.ts +4 -1
  432. package/src/domain/openapi/discriminated-union.ts +6 -4
  433. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  434. package/src/domain/openapi/document-object.ts +2 -0
  435. package/src/domain/openapi/json-pointer.ts +96 -7
  436. package/src/domain/openapi/schema-dialect.ts +22 -0
  437. package/src/domain/openapi/unsupported-features.ts +2 -2
  438. package/src/domain/output-fixes.ts +21 -2
  439. package/src/domain/url-secrets.ts +72 -0
  440. package/src/types/generator-options.ts +1 -1
  441. package/dist/cli/main.d.cts +0 -2
  442. package/dist/cli/main.d.mts +0 -2
  443. package/dist/cli/main.d.ts +0 -2
  444. package/dist/domain/url-credentials.cjs +0 -10
  445. package/dist/domain/url-credentials.cjs.map +0 -1
  446. package/dist/domain/url-credentials.mjs +0 -8
  447. package/dist/domain/url-credentials.mjs.map +0 -1
  448. package/src/domain/url-credentials.ts +0 -18
@@ -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;;"}
@@ -5,7 +5,7 @@ const typeIndexing = require('./type-indexing.cjs');
5
5
  const typeRules = require('./type-rules.cjs');
6
6
 
7
7
  const MAX_EXPANSIONS = 200;
8
- const DEEP_PREFIX = "FlattenedDeepRequired<";
8
+ const DEEP_HELPER = "FlattenedDeepRequired";
9
9
  const MAX_DISTRIBUTED = 64;
10
10
  class TypeEvaluator {
11
11
  declared = /* @__PURE__ */ new Map();
@@ -49,15 +49,15 @@ class TypeEvaluator {
49
49
  if (this.expansions++ > MAX_EXPANSIONS) {
50
50
  return evaluation.OPAQUE;
51
51
  }
52
- if (name.startsWith(DEEP_PREFIX) && name.endsWith(">")) {
53
- const root = this.declared.get(name.slice(DEEP_PREFIX.length, -1));
52
+ const [first, second] = args;
53
+ if (name === DEEP_HELPER && first?.kind === "reference" && first.typeArguments.length === 0) {
54
+ const root = this.declared.get(first.name);
54
55
  return root === void 0 ? evaluation.OPAQUE : this.expand({ kind: "type", type: root, deep: true });
55
56
  }
56
57
  const declared = args.length === 0 ? this.declared.get(name) : void 0;
57
58
  if (declared !== void 0) {
58
59
  return this.expand({ ...value, type: declared });
59
60
  }
60
- const [first, second] = args;
61
61
  if (first === void 0) {
62
62
  return evaluation.OPAQUE;
63
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type-evaluation.cjs","sources":["../../../../src/application/transform/footer/type-evaluation.ts"],"sourcesContent":["import type { IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n absorbed,\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { indexType } from \"./type-indexing.js\";\nimport { extracted, markerObject, omitted } from \"./type-rules.js\";\n\n/**\n * A small evaluator of the generated types, as TypeScript reads them, for the `--enum-values`\n * check (ADR-027). It follows the declarations of the document and the helper types the generator\n * writes (`NonNullable`, `Extract`, `WithRequired`, `Omit`, `Record`, `FlattenedDeepRequired`). Its\n * answers are sure: a key is `missing` only where TypeScript reports it, and every type it does\n * not model is `opaque`, which never counts as an error.\n */\n\n/** How many references one evaluation expands; a deeper one is opaque. */\nconst MAX_EXPANSIONS = 200;\nconst DEEP_PREFIX = \"FlattenedDeepRequired<\";\n/** How many members distributing an intersection may give; more is opaque. */\nconst MAX_DISTRIBUTED = 64;\n\nexport class TypeEvaluator {\n private readonly declared = new Map<string, IrType>();\n private expansions = 0;\n\n constructor(declarations: readonly IrDeclaration[]) {\n for (const declaration of declarations) {\n if (declaration.kind === \"interface\") {\n this.declared.set(declaration.name, { kind: \"object\", members: declaration.members });\n } else if (declaration.kind === \"typeAlias\") {\n this.declared.set(declaration.name, declaration.type);\n }\n }\n }\n\n /** Evaluate a type written in the footer; the expansion budget starts again. */\n evaluate(type: IrType): Evaluation {\n this.expansions = 0;\n return this.expand({ kind: \"type\", type, deep: false });\n }\n\n /** The type with references, `readonly` and indexed access resolved at the top. */\n expand(value: Evaluated): Evaluation {\n const { type } = value;\n switch (type.kind) {\n case \"readonly\":\n return this.expand({ ...value, type: type.type });\n case \"indexedAccess\":\n return this.indexedAccess(value, type.object, type.index);\n case \"reference\":\n return this.reference(value, type.name, type.typeArguments);\n case \"raw\":\n case \"tuple\":\n return OPAQUE;\n default:\n return value;\n }\n }\n\n private indexedAccess(value: Evaluated, object: IrType, index: IrType): Evaluation {\n const owner = this.expand({ ...value, type: object });\n return owner.kind === \"type\" ? this.index(owner, index) : owner;\n }\n\n private reference(value: Evaluated, name: string, args: readonly IrType[]): Evaluation {\n // Only references cost budget: re-expanding an already expanded value (as the checks after\n // `evaluate` do) is free, so a large evaluation does not leave its checks opaque.\n if (this.expansions++ > MAX_EXPANSIONS) {\n return OPAQUE;\n }\n if (name.startsWith(DEEP_PREFIX) && name.endsWith(\">\")) {\n const root = this.declared.get(name.slice(DEEP_PREFIX.length, -1));\n return root === undefined ? OPAQUE : this.expand({ kind: \"type\", type: root, deep: true });\n }\n const declared = args.length === 0 ? this.declared.get(name) : undefined;\n if (declared !== undefined) {\n return this.expand({ ...value, type: declared });\n }\n const [first, second] = args;\n if (first === undefined) {\n return OPAQUE;\n }\n const argument = this.expand({ ...value, type: first });\n if (argument.kind !== \"type\") {\n return argument;\n }\n return this.helper(name, argument, second);\n }\n\n private helper(name: string, argument: Evaluated, second: IrType | undefined): Evaluation {\n switch (name) {\n case \"NonNullable\":\n return this.withoutNullish(argument);\n case \"WithRequired\":\n case \"Readonly\":\n return argument;\n case \"Extract\":\n return second === undefined ? OPAQUE : this.extract(argument, second);\n case \"Omit\":\n return second === undefined ? OPAQUE : omitted(this, argument, second);\n default:\n return markerObject(name, argument) ?? OPAQUE;\n }\n }\n\n /**\n * The members of a union, each expanded; an intersection with unions in it is distributed over\n * them (`A & (B | C)` is `(A & B) | (A & C)`), as TypeScript normalizes it. A type that is not a\n * union is its only member. A union with an `any` or `unknown` member is that keyword alone.\n */\n membersOf(value: Evaluated): readonly Evaluation[] {\n const expanded = this.expand(value);\n if (expanded.kind !== \"type\") {\n return [expanded];\n }\n const { type } = expanded;\n if (type.kind === \"union\") {\n return absorbed(\n type.types.flatMap((member) => this.membersOf({ ...expanded, type: member })),\n );\n }\n return type.kind === \"intersection\" ? this.distributed(expanded, type.types) : [expanded];\n }\n\n private distributed(value: Evaluated, parts: readonly IrType[]): readonly Evaluation[] {\n const memberLists = parts.map((part) => this.membersOf({ ...value, type: part }));\n const size = memberLists.reduce((product, list) => product * list.length, 1);\n if (size > MAX_DISTRIBUTED || memberLists.some((list) => list.some((m) => m.kind !== \"type\"))) {\n return [OPAQUE];\n }\n let combinations: IrType[][] = [[]];\n for (const list of memberLists as Evaluated[][]) {\n combinations = combinations.flatMap((done) => list.map((member) => [...done, member.type]));\n }\n return combinations.map((types) => ({ ...value, type: intersectionType(types) }));\n }\n\n private withoutNullish(value: Evaluated): Evaluation {\n const members = this.membersOf(value);\n if (members.some((member) => member.kind !== \"type\")) {\n return OPAQUE;\n }\n const kept = (members as Evaluated[]).filter((member) => !isNullish(member.type));\n return { ...value, type: unionType(kept.map((member) => member.type)) };\n }\n\n /** `Extract<T, { key: unknown }>` keeps the members that have `key`; other probes are opaque. */\n private extract(value: Evaluated, probe: IrType): Evaluation {\n const [member] = probe.kind === \"object\" ? probe.members : [];\n if (probe.kind !== \"object\" || probe.members.length !== 1 || member?.kind !== \"property\") {\n return OPAQUE;\n }\n return extracted(this, value, propertyKey(member.name));\n }\n\n /** `value[index]` for a string literal, `string` or `number` index. */\n index(value: Evaluated, index: IrType): Evaluation {\n return indexType(this, value, index);\n }\n}\n"],"names":["OPAQUE","omitted","markerObject","absorbed","intersectionType","isNullish","unionType","extracted","propertyKey","indexType"],"mappings":"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"}
1
+ {"version":3,"file":"type-evaluation.cjs","sources":["../../../../src/application/transform/footer/type-evaluation.ts"],"sourcesContent":["import type { IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n absorbed,\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { indexType } from \"./type-indexing.js\";\nimport { extracted, markerObject, omitted } from \"./type-rules.js\";\n\n/**\n * A small evaluator of the generated types, as TypeScript reads them, for the `--enum-values`\n * check (ADR-027). It follows the declarations of the document and the helper types the generator\n * writes (`NonNullable`, `Extract`, `WithRequired`, `Omit`, `Record`, `FlattenedDeepRequired`). Its\n * answers are sure: a key is `missing` only where TypeScript reports it, and every type it does\n * not model is `opaque`, which never counts as an error.\n */\n\n/** How many references one evaluation expands; a deeper one is opaque. */\nconst MAX_EXPANSIONS = 200;\nconst DEEP_HELPER = \"FlattenedDeepRequired\";\n/** How many members distributing an intersection may give; more is opaque. */\nconst MAX_DISTRIBUTED = 64;\n\nexport class TypeEvaluator {\n private readonly declared = new Map<string, IrType>();\n private expansions = 0;\n\n constructor(declarations: readonly IrDeclaration[]) {\n for (const declaration of declarations) {\n if (declaration.kind === \"interface\") {\n this.declared.set(declaration.name, { kind: \"object\", members: declaration.members });\n } else if (declaration.kind === \"typeAlias\") {\n this.declared.set(declaration.name, declaration.type);\n }\n }\n }\n\n /** Evaluate a type written in the footer; the expansion budget starts again. */\n evaluate(type: IrType): Evaluation {\n this.expansions = 0;\n return this.expand({ kind: \"type\", type, deep: false });\n }\n\n /** The type with references, `readonly` and indexed access resolved at the top. */\n expand(value: Evaluated): Evaluation {\n const { type } = value;\n switch (type.kind) {\n case \"readonly\":\n return this.expand({ ...value, type: type.type });\n case \"indexedAccess\":\n return this.indexedAccess(value, type.object, type.index);\n case \"reference\":\n return this.reference(value, type.name, type.typeArguments);\n case \"raw\":\n case \"tuple\":\n return OPAQUE;\n default:\n return value;\n }\n }\n\n private indexedAccess(value: Evaluated, object: IrType, index: IrType): Evaluation {\n const owner = this.expand({ ...value, type: object });\n return owner.kind === \"type\" ? this.index(owner, index) : owner;\n }\n\n private reference(value: Evaluated, name: string, args: readonly IrType[]): Evaluation {\n // Only references cost budget: re-expanding an already expanded value (as the checks after\n // `evaluate` do) is free, so a large evaluation does not leave its checks opaque.\n if (this.expansions++ > MAX_EXPANSIONS) {\n return OPAQUE;\n }\n const [first, second] = args;\n if (name === DEEP_HELPER && first?.kind === \"reference\" && first.typeArguments.length === 0) {\n const root = this.declared.get(first.name);\n return root === undefined ? OPAQUE : this.expand({ kind: \"type\", type: root, deep: true });\n }\n const declared = args.length === 0 ? this.declared.get(name) : undefined;\n if (declared !== undefined) {\n return this.expand({ ...value, type: declared });\n }\n if (first === undefined) {\n return OPAQUE;\n }\n const argument = this.expand({ ...value, type: first });\n if (argument.kind !== \"type\") {\n return argument;\n }\n return this.helper(name, argument, second);\n }\n\n private helper(name: string, argument: Evaluated, second: IrType | undefined): Evaluation {\n switch (name) {\n case \"NonNullable\":\n return this.withoutNullish(argument);\n case \"WithRequired\":\n case \"Readonly\":\n return argument;\n case \"Extract\":\n return second === undefined ? OPAQUE : this.extract(argument, second);\n case \"Omit\":\n return second === undefined ? OPAQUE : omitted(this, argument, second);\n default:\n return markerObject(name, argument) ?? OPAQUE;\n }\n }\n\n /**\n * The members of a union, each expanded; an intersection with unions in it is distributed over\n * them (`A & (B | C)` is `(A & B) | (A & C)`), as TypeScript normalizes it. A type that is not a\n * union is its only member. A union with an `any` or `unknown` member is that keyword alone.\n */\n membersOf(value: Evaluated): readonly Evaluation[] {\n const expanded = this.expand(value);\n if (expanded.kind !== \"type\") {\n return [expanded];\n }\n const { type } = expanded;\n if (type.kind === \"union\") {\n return absorbed(\n type.types.flatMap((member) => this.membersOf({ ...expanded, type: member })),\n );\n }\n return type.kind === \"intersection\" ? this.distributed(expanded, type.types) : [expanded];\n }\n\n private distributed(value: Evaluated, parts: readonly IrType[]): readonly Evaluation[] {\n const memberLists = parts.map((part) => this.membersOf({ ...value, type: part }));\n const size = memberLists.reduce((product, list) => product * list.length, 1);\n if (size > MAX_DISTRIBUTED || memberLists.some((list) => list.some((m) => m.kind !== \"type\"))) {\n return [OPAQUE];\n }\n let combinations: IrType[][] = [[]];\n for (const list of memberLists as Evaluated[][]) {\n combinations = combinations.flatMap((done) => list.map((member) => [...done, member.type]));\n }\n return combinations.map((types) => ({ ...value, type: intersectionType(types) }));\n }\n\n private withoutNullish(value: Evaluated): Evaluation {\n const members = this.membersOf(value);\n if (members.some((member) => member.kind !== \"type\")) {\n return OPAQUE;\n }\n const kept = (members as Evaluated[]).filter((member) => !isNullish(member.type));\n return { ...value, type: unionType(kept.map((member) => member.type)) };\n }\n\n /** `Extract<T, { key: unknown }>` keeps the members that have `key`; other probes are opaque. */\n private extract(value: Evaluated, probe: IrType): Evaluation {\n const [member] = probe.kind === \"object\" ? probe.members : [];\n if (probe.kind !== \"object\" || probe.members.length !== 1 || member?.kind !== \"property\") {\n return OPAQUE;\n }\n return extracted(this, value, propertyKey(member.name));\n }\n\n /** `value[index]` for a string literal, `string` or `number` index. */\n index(value: Evaluated, index: IrType): Evaluation {\n return indexType(this, value, index);\n }\n}\n"],"names":["OPAQUE","omitted","markerObject","absorbed","intersectionType","isNullish","unionType","extracted","propertyKey","indexType"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { indexType } from './type-indexing.mjs';
3
3
  import { markerObject, omitted, extracted } from './type-rules.mjs';
4
4
 
5
5
  const MAX_EXPANSIONS = 200;
6
- const DEEP_PREFIX = "FlattenedDeepRequired<";
6
+ const DEEP_HELPER = "FlattenedDeepRequired";
7
7
  const MAX_DISTRIBUTED = 64;
8
8
  class TypeEvaluator {
9
9
  declared = /* @__PURE__ */ new Map();
@@ -47,15 +47,15 @@ class TypeEvaluator {
47
47
  if (this.expansions++ > MAX_EXPANSIONS) {
48
48
  return OPAQUE;
49
49
  }
50
- if (name.startsWith(DEEP_PREFIX) && name.endsWith(">")) {
51
- const root = this.declared.get(name.slice(DEEP_PREFIX.length, -1));
50
+ const [first, second] = args;
51
+ if (name === DEEP_HELPER && first?.kind === "reference" && first.typeArguments.length === 0) {
52
+ const root = this.declared.get(first.name);
52
53
  return root === void 0 ? OPAQUE : this.expand({ kind: "type", type: root, deep: true });
53
54
  }
54
55
  const declared = args.length === 0 ? this.declared.get(name) : void 0;
55
56
  if (declared !== void 0) {
56
57
  return this.expand({ ...value, type: declared });
57
58
  }
58
- const [first, second] = args;
59
59
  if (first === void 0) {
60
60
  return OPAQUE;
61
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"type-evaluation.mjs","sources":["../../../../src/application/transform/footer/type-evaluation.ts"],"sourcesContent":["import type { IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n absorbed,\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { indexType } from \"./type-indexing.js\";\nimport { extracted, markerObject, omitted } from \"./type-rules.js\";\n\n/**\n * A small evaluator of the generated types, as TypeScript reads them, for the `--enum-values`\n * check (ADR-027). It follows the declarations of the document and the helper types the generator\n * writes (`NonNullable`, `Extract`, `WithRequired`, `Omit`, `Record`, `FlattenedDeepRequired`). Its\n * answers are sure: a key is `missing` only where TypeScript reports it, and every type it does\n * not model is `opaque`, which never counts as an error.\n */\n\n/** How many references one evaluation expands; a deeper one is opaque. */\nconst MAX_EXPANSIONS = 200;\nconst DEEP_PREFIX = \"FlattenedDeepRequired<\";\n/** How many members distributing an intersection may give; more is opaque. */\nconst MAX_DISTRIBUTED = 64;\n\nexport class TypeEvaluator {\n private readonly declared = new Map<string, IrType>();\n private expansions = 0;\n\n constructor(declarations: readonly IrDeclaration[]) {\n for (const declaration of declarations) {\n if (declaration.kind === \"interface\") {\n this.declared.set(declaration.name, { kind: \"object\", members: declaration.members });\n } else if (declaration.kind === \"typeAlias\") {\n this.declared.set(declaration.name, declaration.type);\n }\n }\n }\n\n /** Evaluate a type written in the footer; the expansion budget starts again. */\n evaluate(type: IrType): Evaluation {\n this.expansions = 0;\n return this.expand({ kind: \"type\", type, deep: false });\n }\n\n /** The type with references, `readonly` and indexed access resolved at the top. */\n expand(value: Evaluated): Evaluation {\n const { type } = value;\n switch (type.kind) {\n case \"readonly\":\n return this.expand({ ...value, type: type.type });\n case \"indexedAccess\":\n return this.indexedAccess(value, type.object, type.index);\n case \"reference\":\n return this.reference(value, type.name, type.typeArguments);\n case \"raw\":\n case \"tuple\":\n return OPAQUE;\n default:\n return value;\n }\n }\n\n private indexedAccess(value: Evaluated, object: IrType, index: IrType): Evaluation {\n const owner = this.expand({ ...value, type: object });\n return owner.kind === \"type\" ? this.index(owner, index) : owner;\n }\n\n private reference(value: Evaluated, name: string, args: readonly IrType[]): Evaluation {\n // Only references cost budget: re-expanding an already expanded value (as the checks after\n // `evaluate` do) is free, so a large evaluation does not leave its checks opaque.\n if (this.expansions++ > MAX_EXPANSIONS) {\n return OPAQUE;\n }\n if (name.startsWith(DEEP_PREFIX) && name.endsWith(\">\")) {\n const root = this.declared.get(name.slice(DEEP_PREFIX.length, -1));\n return root === undefined ? OPAQUE : this.expand({ kind: \"type\", type: root, deep: true });\n }\n const declared = args.length === 0 ? this.declared.get(name) : undefined;\n if (declared !== undefined) {\n return this.expand({ ...value, type: declared });\n }\n const [first, second] = args;\n if (first === undefined) {\n return OPAQUE;\n }\n const argument = this.expand({ ...value, type: first });\n if (argument.kind !== \"type\") {\n return argument;\n }\n return this.helper(name, argument, second);\n }\n\n private helper(name: string, argument: Evaluated, second: IrType | undefined): Evaluation {\n switch (name) {\n case \"NonNullable\":\n return this.withoutNullish(argument);\n case \"WithRequired\":\n case \"Readonly\":\n return argument;\n case \"Extract\":\n return second === undefined ? OPAQUE : this.extract(argument, second);\n case \"Omit\":\n return second === undefined ? OPAQUE : omitted(this, argument, second);\n default:\n return markerObject(name, argument) ?? OPAQUE;\n }\n }\n\n /**\n * The members of a union, each expanded; an intersection with unions in it is distributed over\n * them (`A & (B | C)` is `(A & B) | (A & C)`), as TypeScript normalizes it. A type that is not a\n * union is its only member. A union with an `any` or `unknown` member is that keyword alone.\n */\n membersOf(value: Evaluated): readonly Evaluation[] {\n const expanded = this.expand(value);\n if (expanded.kind !== \"type\") {\n return [expanded];\n }\n const { type } = expanded;\n if (type.kind === \"union\") {\n return absorbed(\n type.types.flatMap((member) => this.membersOf({ ...expanded, type: member })),\n );\n }\n return type.kind === \"intersection\" ? this.distributed(expanded, type.types) : [expanded];\n }\n\n private distributed(value: Evaluated, parts: readonly IrType[]): readonly Evaluation[] {\n const memberLists = parts.map((part) => this.membersOf({ ...value, type: part }));\n const size = memberLists.reduce((product, list) => product * list.length, 1);\n if (size > MAX_DISTRIBUTED || memberLists.some((list) => list.some((m) => m.kind !== \"type\"))) {\n return [OPAQUE];\n }\n let combinations: IrType[][] = [[]];\n for (const list of memberLists as Evaluated[][]) {\n combinations = combinations.flatMap((done) => list.map((member) => [...done, member.type]));\n }\n return combinations.map((types) => ({ ...value, type: intersectionType(types) }));\n }\n\n private withoutNullish(value: Evaluated): Evaluation {\n const members = this.membersOf(value);\n if (members.some((member) => member.kind !== \"type\")) {\n return OPAQUE;\n }\n const kept = (members as Evaluated[]).filter((member) => !isNullish(member.type));\n return { ...value, type: unionType(kept.map((member) => member.type)) };\n }\n\n /** `Extract<T, { key: unknown }>` keeps the members that have `key`; other probes are opaque. */\n private extract(value: Evaluated, probe: IrType): Evaluation {\n const [member] = probe.kind === \"object\" ? probe.members : [];\n if (probe.kind !== \"object\" || probe.members.length !== 1 || member?.kind !== \"property\") {\n return OPAQUE;\n }\n return extracted(this, value, propertyKey(member.name));\n }\n\n /** `value[index]` for a string literal, `string` or `number` index. */\n index(value: Evaluated, index: IrType): Evaluation {\n return indexType(this, value, index);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"type-evaluation.mjs","sources":["../../../../src/application/transform/footer/type-evaluation.ts"],"sourcesContent":["import type { IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n absorbed,\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { indexType } from \"./type-indexing.js\";\nimport { extracted, markerObject, omitted } from \"./type-rules.js\";\n\n/**\n * A small evaluator of the generated types, as TypeScript reads them, for the `--enum-values`\n * check (ADR-027). It follows the declarations of the document and the helper types the generator\n * writes (`NonNullable`, `Extract`, `WithRequired`, `Omit`, `Record`, `FlattenedDeepRequired`). Its\n * answers are sure: a key is `missing` only where TypeScript reports it, and every type it does\n * not model is `opaque`, which never counts as an error.\n */\n\n/** How many references one evaluation expands; a deeper one is opaque. */\nconst MAX_EXPANSIONS = 200;\nconst DEEP_HELPER = \"FlattenedDeepRequired\";\n/** How many members distributing an intersection may give; more is opaque. */\nconst MAX_DISTRIBUTED = 64;\n\nexport class TypeEvaluator {\n private readonly declared = new Map<string, IrType>();\n private expansions = 0;\n\n constructor(declarations: readonly IrDeclaration[]) {\n for (const declaration of declarations) {\n if (declaration.kind === \"interface\") {\n this.declared.set(declaration.name, { kind: \"object\", members: declaration.members });\n } else if (declaration.kind === \"typeAlias\") {\n this.declared.set(declaration.name, declaration.type);\n }\n }\n }\n\n /** Evaluate a type written in the footer; the expansion budget starts again. */\n evaluate(type: IrType): Evaluation {\n this.expansions = 0;\n return this.expand({ kind: \"type\", type, deep: false });\n }\n\n /** The type with references, `readonly` and indexed access resolved at the top. */\n expand(value: Evaluated): Evaluation {\n const { type } = value;\n switch (type.kind) {\n case \"readonly\":\n return this.expand({ ...value, type: type.type });\n case \"indexedAccess\":\n return this.indexedAccess(value, type.object, type.index);\n case \"reference\":\n return this.reference(value, type.name, type.typeArguments);\n case \"raw\":\n case \"tuple\":\n return OPAQUE;\n default:\n return value;\n }\n }\n\n private indexedAccess(value: Evaluated, object: IrType, index: IrType): Evaluation {\n const owner = this.expand({ ...value, type: object });\n return owner.kind === \"type\" ? this.index(owner, index) : owner;\n }\n\n private reference(value: Evaluated, name: string, args: readonly IrType[]): Evaluation {\n // Only references cost budget: re-expanding an already expanded value (as the checks after\n // `evaluate` do) is free, so a large evaluation does not leave its checks opaque.\n if (this.expansions++ > MAX_EXPANSIONS) {\n return OPAQUE;\n }\n const [first, second] = args;\n if (name === DEEP_HELPER && first?.kind === \"reference\" && first.typeArguments.length === 0) {\n const root = this.declared.get(first.name);\n return root === undefined ? OPAQUE : this.expand({ kind: \"type\", type: root, deep: true });\n }\n const declared = args.length === 0 ? this.declared.get(name) : undefined;\n if (declared !== undefined) {\n return this.expand({ ...value, type: declared });\n }\n if (first === undefined) {\n return OPAQUE;\n }\n const argument = this.expand({ ...value, type: first });\n if (argument.kind !== \"type\") {\n return argument;\n }\n return this.helper(name, argument, second);\n }\n\n private helper(name: string, argument: Evaluated, second: IrType | undefined): Evaluation {\n switch (name) {\n case \"NonNullable\":\n return this.withoutNullish(argument);\n case \"WithRequired\":\n case \"Readonly\":\n return argument;\n case \"Extract\":\n return second === undefined ? OPAQUE : this.extract(argument, second);\n case \"Omit\":\n return second === undefined ? OPAQUE : omitted(this, argument, second);\n default:\n return markerObject(name, argument) ?? OPAQUE;\n }\n }\n\n /**\n * The members of a union, each expanded; an intersection with unions in it is distributed over\n * them (`A & (B | C)` is `(A & B) | (A & C)`), as TypeScript normalizes it. A type that is not a\n * union is its only member. A union with an `any` or `unknown` member is that keyword alone.\n */\n membersOf(value: Evaluated): readonly Evaluation[] {\n const expanded = this.expand(value);\n if (expanded.kind !== \"type\") {\n return [expanded];\n }\n const { type } = expanded;\n if (type.kind === \"union\") {\n return absorbed(\n type.types.flatMap((member) => this.membersOf({ ...expanded, type: member })),\n );\n }\n return type.kind === \"intersection\" ? this.distributed(expanded, type.types) : [expanded];\n }\n\n private distributed(value: Evaluated, parts: readonly IrType[]): readonly Evaluation[] {\n const memberLists = parts.map((part) => this.membersOf({ ...value, type: part }));\n const size = memberLists.reduce((product, list) => product * list.length, 1);\n if (size > MAX_DISTRIBUTED || memberLists.some((list) => list.some((m) => m.kind !== \"type\"))) {\n return [OPAQUE];\n }\n let combinations: IrType[][] = [[]];\n for (const list of memberLists as Evaluated[][]) {\n combinations = combinations.flatMap((done) => list.map((member) => [...done, member.type]));\n }\n return combinations.map((types) => ({ ...value, type: intersectionType(types) }));\n }\n\n private withoutNullish(value: Evaluated): Evaluation {\n const members = this.membersOf(value);\n if (members.some((member) => member.kind !== \"type\")) {\n return OPAQUE;\n }\n const kept = (members as Evaluated[]).filter((member) => !isNullish(member.type));\n return { ...value, type: unionType(kept.map((member) => member.type)) };\n }\n\n /** `Extract<T, { key: unknown }>` keeps the members that have `key`; other probes are opaque. */\n private extract(value: Evaluated, probe: IrType): Evaluation {\n const [member] = probe.kind === \"object\" ? probe.members : [];\n if (probe.kind !== \"object\" || probe.members.length !== 1 || member?.kind !== \"property\") {\n return OPAQUE;\n }\n return extracted(this, value, propertyKey(member.name));\n }\n\n /** `value[index]` for a string literal, `string` or `number` index. */\n index(value: Evaluated, index: IrType): Evaluation {\n return indexType(this, value, index);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -47,7 +47,7 @@ const READ_WRITE_MARKER_TYPES = lines(
47
47
  "type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
48
48
  "type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
49
49
  "type ReadWriteMarkedKeys<T, Marker> = {",
50
- " [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
50
+ " [K in keyof T]-?: 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
51
51
  "}[keyof T];",
52
52
  'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends "read" | "write"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {',
53
53
  " [K in keyof T]: ReadWriteResolve<T[K], Resolved>;",
@@ -1 +1 @@
1
- {"version":3,"file":"helper-types.cjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays and null-only properties keep their types (upstream #2615, #2620, #2632,\n * #2717, #2765). The declarations equal `Readable` / `Writable` of openapi-typesafe-helpers\n * (`test/api/read-write-marker-types.test.ts`); the text is what the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> \" +\n \"extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":";;AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AASO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,+GAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;;"}
1
+ {"version":3,"file":"helper-types.cjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays, null-only and `any` properties keep their types (upstream #2615, #2620,\n * #2632, #2717, #2765). The declarations equal the `Readable` / `Writable` that\n * openapi-typesafe-fetch declares (`test/api/read-write-marker-types.test.ts`); the text is what\n * the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : \" +\n \"NonNullable<T[K]> extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":";;AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAUO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,4IAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;;"}
@@ -45,7 +45,7 @@ const READ_WRITE_MARKER_TYPES = lines(
45
45
  "type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
46
46
  "type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
47
47
  "type ReadWriteMarkedKeys<T, Marker> = {",
48
- " [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
48
+ " [K in keyof T]-?: 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
49
49
  "}[keyof T];",
50
50
  'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends "read" | "write"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {',
51
51
  " [K in keyof T]: ReadWriteResolve<T[K], Resolved>;",
@@ -1 +1 @@
1
- {"version":3,"file":"helper-types.mjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays and null-only properties keep their types (upstream #2615, #2620, #2632,\n * #2717, #2765). The declarations equal `Readable` / `Writable` of openapi-typesafe-helpers\n * (`test/api/read-write-marker-types.test.ts`); the text is what the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> \" +\n \"extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":"AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AASO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,+GAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;"}
1
+ {"version":3,"file":"helper-types.mjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays, null-only and `any` properties keep their types (upstream #2615, #2620,\n * #2632, #2717, #2765). The declarations equal the `Readable` / `Writable` that\n * openapi-typesafe-fetch declares (`test/api/read-write-marker-types.test.ts`); the text is what\n * the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : \" +\n \"NonNullable<T[K]> extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":"AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAUO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,4IAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;"}
@@ -13,6 +13,15 @@ function withNumberedRepeats(names, numbered) {
13
13
  return unique;
14
14
  });
15
15
  }
16
+ const DECLARATION_NUMBER_SEPARATOR = "_";
17
+ function freeNumberedName(name, taken) {
18
+ let count = 2;
19
+ while (taken.has(`${name}${DECLARATION_NUMBER_SEPARATOR}${count}`)) {
20
+ count += 1;
21
+ }
22
+ return `${name}${DECLARATION_NUMBER_SEPARATOR}${count}`;
23
+ }
16
24
 
25
+ exports.freeNumberedName = freeNumberedName;
17
26
  exports.withNumberedRepeats = withNumberedRepeats;
18
27
  //# sourceMappingURL=numbered-names.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"numbered-names.cjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n"],"names":[],"mappings":";;AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;;"}
1
+ {"version":3,"file":"numbered-names.cjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n\n/** Separates a repeated declaration name from its number: `Status` → `Status_2`. */\nconst DECLARATION_NUMBER_SEPARATOR = \"_\";\n\n/**\n * The first of `Name_2`, `Name_3`, … that `taken` does not hold: the suffix `--root-types` uses for\n * its own conflicts, and every other declaration that must give way to another name.\n */\nexport function freeNumberedName(name: string, taken: ReadonlySet<string>): string {\n let count = 2;\n while (taken.has(`${name}${DECLARATION_NUMBER_SEPARATOR}${count}`)) {\n count += 1;\n }\n return `${name}${DECLARATION_NUMBER_SEPARATOR}${count}`;\n}\n"],"names":[],"mappings":";;AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGA,MAAM,4BAAA,GAA+B,GAAA;AAM9B,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAoC;AACjF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,EAAG,IAAI,GAAG,4BAA4B,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,EAAG;AAClE,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,4BAA4B,GAAG,KAAK,CAAA,CAAA;AACvD;;;"}
@@ -11,6 +11,14 @@ function withNumberedRepeats(names, numbered) {
11
11
  return unique;
12
12
  });
13
13
  }
14
+ const DECLARATION_NUMBER_SEPARATOR = "_";
15
+ function freeNumberedName(name, taken) {
16
+ let count = 2;
17
+ while (taken.has(`${name}${DECLARATION_NUMBER_SEPARATOR}${count}`)) {
18
+ count += 1;
19
+ }
20
+ return `${name}${DECLARATION_NUMBER_SEPARATOR}${count}`;
21
+ }
14
22
 
15
- export { withNumberedRepeats };
23
+ export { freeNumberedName, withNumberedRepeats };
16
24
  //# sourceMappingURL=numbered-names.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"numbered-names.mjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n"],"names":[],"mappings":"AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;;"}
1
+ {"version":3,"file":"numbered-names.mjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n\n/** Separates a repeated declaration name from its number: `Status` → `Status_2`. */\nconst DECLARATION_NUMBER_SEPARATOR = \"_\";\n\n/**\n * The first of `Name_2`, `Name_3`, … that `taken` does not hold: the suffix `--root-types` uses for\n * its own conflicts, and every other declaration that must give way to another name.\n */\nexport function freeNumberedName(name: string, taken: ReadonlySet<string>): string {\n let count = 2;\n while (taken.has(`${name}${DECLARATION_NUMBER_SEPARATOR}${count}`)) {\n count += 1;\n }\n return `${name}${DECLARATION_NUMBER_SEPARATOR}${count}`;\n}\n"],"names":[],"mappings":"AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AAGA,MAAM,4BAAA,GAA+B,GAAA;AAM9B,SAAS,gBAAA,CAAiB,MAAc,KAAA,EAAoC;AACjF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,EAAG,IAAI,GAAG,4BAA4B,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,EAAG;AAClE,IAAA,KAAA,IAAS,CAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,4BAA4B,GAAG,KAAK,CAAA,CAAA;AACvD;;"}
@@ -129,7 +129,7 @@ function walkTo(ref, refs, seen) {
129
129
  function generatedLocationOf(ref, refs) {
130
130
  const walk = walkTo(ref, refs, []);
131
131
  return {
132
- path: walk === null ? ref : jsonPointer.createRef(walk.path),
132
+ path: walk === null ? ref : jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, walk.path),
133
133
  isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false
134
134
  };
135
135
  }