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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  23. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  25. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +26 -14
  27. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +26 -14
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/ref-access.cjs +16 -3
  31. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/ref-access.mjs +16 -3
  33. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  35. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  37. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/remote-fetch.cjs +5 -3
  39. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/remote-fetch.mjs +5 -3
  41. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  43. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  45. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  47. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  49. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  50. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  51. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  52. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  53. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  54. package/dist/api/document-refs.cjs +16 -1
  55. package/dist/api/document-refs.cjs.map +1 -1
  56. package/dist/api/document-refs.mjs +16 -1
  57. package/dist/api/document-refs.mjs.map +1 -1
  58. package/dist/api/document-run.cjs +4 -10
  59. package/dist/api/document-run.cjs.map +1 -1
  60. package/dist/api/document-run.mjs +4 -10
  61. package/dist/api/document-run.mjs.map +1 -1
  62. package/dist/api/openapi-ts.cjs +1 -2
  63. package/dist/api/openapi-ts.cjs.map +1 -1
  64. package/dist/api/openapi-ts.mjs +2 -3
  65. package/dist/api/openapi-ts.mjs.map +1 -1
  66. package/dist/api/ref-limit-options.cjs +63 -0
  67. package/dist/api/ref-limit-options.cjs.map +1 -0
  68. package/dist/api/ref-limit-options.mjs +57 -0
  69. package/dist/api/ref-limit-options.mjs.map +1 -0
  70. package/dist/api/transform-schema.cjs +12 -5
  71. package/dist/api/transform-schema.cjs.map +1 -1
  72. package/dist/api/transform-schema.mjs +12 -5
  73. package/dist/api/transform-schema.mjs.map +1 -1
  74. package/dist/application/transform/declared-value-types.cjs +36 -0
  75. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  76. package/dist/application/transform/declared-value-types.mjs +34 -0
  77. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  78. package/dist/application/transform/document/document.cjs +3 -1
  79. package/dist/application/transform/document/document.cjs.map +1 -1
  80. package/dist/application/transform/document/document.mjs +3 -1
  81. package/dist/application/transform/document/document.mjs.map +1 -1
  82. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  83. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  84. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  85. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  86. package/dist/application/transform/document/header.cjs +11 -3
  87. package/dist/application/transform/document/header.cjs.map +1 -1
  88. package/dist/application/transform/document/header.mjs +10 -2
  89. package/dist/application/transform/document/header.mjs.map +1 -1
  90. package/dist/application/transform/document/parameter.cjs +1 -1
  91. package/dist/application/transform/document/parameter.cjs.map +1 -1
  92. package/dist/application/transform/document/parameter.mjs +1 -1
  93. package/dist/application/transform/document/parameter.mjs.map +1 -1
  94. package/dist/application/transform/document/parameters.cjs +23 -5
  95. package/dist/application/transform/document/parameters.cjs.map +1 -1
  96. package/dist/application/transform/document/parameters.mjs +23 -5
  97. package/dist/application/transform/document/parameters.mjs.map +1 -1
  98. package/dist/application/transform/document/path-item.cjs +4 -3
  99. package/dist/application/transform/document/path-item.cjs.map +1 -1
  100. package/dist/application/transform/document/path-item.mjs +4 -4
  101. package/dist/application/transform/document/path-item.mjs.map +1 -1
  102. package/dist/application/transform/document/path-template-key.cjs +84 -0
  103. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  104. package/dist/application/transform/document/path-template-key.mjs +79 -0
  105. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  106. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  107. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  108. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  109. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  110. package/dist/application/transform/document/paths-enum.cjs +7 -6
  111. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  112. package/dist/application/transform/document/paths-enum.mjs +7 -6
  113. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  114. package/dist/application/transform/document/paths.cjs +38 -66
  115. package/dist/application/transform/document/paths.cjs.map +1 -1
  116. package/dist/application/transform/document/paths.mjs +36 -66
  117. package/dist/application/transform/document/paths.mjs.map +1 -1
  118. package/dist/application/transform/document/webhooks.cjs +10 -3
  119. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  120. package/dist/application/transform/document/webhooks.mjs +9 -2
  121. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  122. package/dist/application/transform/footer/document-footer.cjs +6 -3
  123. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  124. package/dist/application/transform/footer/document-footer.mjs +6 -3
  125. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  126. package/dist/application/transform/helper-types.cjs +3 -3
  127. package/dist/application/transform/helper-types.cjs.map +1 -1
  128. package/dist/application/transform/helper-types.mjs +3 -3
  129. package/dist/application/transform/helper-types.mjs.map +1 -1
  130. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  131. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  132. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  133. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  134. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  135. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  136. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  137. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  138. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  139. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  140. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  141. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  142. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  143. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  144. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  145. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  146. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  147. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  148. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  149. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  150. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  151. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  152. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  153. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  155. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  157. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  159. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  160. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  161. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  162. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  163. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  165. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  166. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  167. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  168. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  169. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  170. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  171. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  172. package/dist/application/transform/schema/input-location.cjs +23 -0
  173. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  174. package/dist/application/transform/schema/input-location.mjs +21 -0
  175. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  176. package/dist/application/transform/schema/object-type.cjs +15 -5
  177. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  178. package/dist/application/transform/schema/object-type.mjs +15 -5
  179. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  180. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  181. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  182. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  183. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  184. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  185. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  186. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  187. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  188. package/dist/cli/api-logger.cjs +13 -0
  189. package/dist/cli/api-logger.cjs.map +1 -0
  190. package/dist/cli/api-logger.mjs +11 -0
  191. package/dist/cli/api-logger.mjs.map +1 -0
  192. package/dist/cli/api-settings.cjs +7 -15
  193. package/dist/cli/api-settings.cjs.map +1 -1
  194. package/dist/cli/api-settings.mjs +8 -16
  195. package/dist/cli/api-settings.mjs.map +1 -1
  196. package/dist/cli/cli-arguments.cjs +51 -11
  197. package/dist/cli/cli-arguments.cjs.map +1 -1
  198. package/dist/cli/cli-arguments.mjs +51 -11
  199. package/dist/cli/cli-arguments.mjs.map +1 -1
  200. package/dist/cli/cli-errors.cjs +17 -0
  201. package/dist/cli/cli-errors.cjs.map +1 -1
  202. package/dist/cli/cli-errors.mjs +17 -1
  203. package/dist/cli/cli-errors.mjs.map +1 -1
  204. package/dist/cli/cli-output.cjs +6 -4
  205. package/dist/cli/cli-output.cjs.map +1 -1
  206. package/dist/cli/cli-output.mjs +7 -5
  207. package/dist/cli/cli-output.mjs.map +1 -1
  208. package/dist/cli/main.cjs +10 -4
  209. package/dist/cli/main.cjs.map +1 -1
  210. package/dist/cli/main.mjs +10 -4
  211. package/dist/cli/main.mjs.map +1 -1
  212. package/dist/cli/redocly-apis.cjs +20 -9
  213. package/dist/cli/redocly-apis.cjs.map +1 -1
  214. package/dist/cli/redocly-apis.mjs +22 -11
  215. package/dist/cli/redocly-apis.mjs.map +1 -1
  216. package/dist/cli/ref-limits.cjs +15 -1
  217. package/dist/cli/ref-limits.cjs.map +1 -1
  218. package/dist/cli/ref-limits.mjs +15 -2
  219. package/dist/cli/ref-limits.mjs.map +1 -1
  220. package/dist/cli/run-cli.cjs +24 -7
  221. package/dist/cli/run-cli.cjs.map +1 -1
  222. package/dist/cli/run-cli.mjs +25 -8
  223. package/dist/cli/run-cli.mjs.map +1 -1
  224. package/dist/domain/cause-secrets.cjs +31 -16
  225. package/dist/domain/cause-secrets.cjs.map +1 -1
  226. package/dist/domain/cause-secrets.mjs +31 -16
  227. package/dist/domain/cause-secrets.mjs.map +1 -1
  228. package/dist/domain/errors.cjs +2 -0
  229. package/dist/domain/errors.cjs.map +1 -1
  230. package/dist/domain/errors.mjs +2 -0
  231. package/dist/domain/errors.mjs.map +1 -1
  232. package/dist/domain/location-text.cjs +9 -0
  233. package/dist/domain/location-text.cjs.map +1 -0
  234. package/dist/domain/location-text.mjs +7 -0
  235. package/dist/domain/location-text.mjs.map +1 -0
  236. package/dist/domain/openapi/document-places.cjs +55 -0
  237. package/dist/domain/openapi/document-places.cjs.map +1 -0
  238. package/dist/domain/openapi/document-places.mjs +53 -0
  239. package/dist/domain/openapi/document-places.mjs.map +1 -0
  240. package/dist/domain/output-fixes.cjs +8 -2
  241. package/dist/domain/output-fixes.cjs.map +1 -1
  242. package/dist/domain/output-fixes.mjs +8 -2
  243. package/dist/domain/output-fixes.mjs.map +1 -1
  244. package/dist/domain/terminal-text.cjs +31 -0
  245. package/dist/domain/terminal-text.cjs.map +1 -0
  246. package/dist/domain/terminal-text.mjs +29 -0
  247. package/dist/domain/terminal-text.mjs.map +1 -0
  248. package/dist/domain/warnings.cjs +1 -0
  249. package/dist/domain/warnings.cjs.map +1 -1
  250. package/dist/domain/warnings.mjs +1 -0
  251. package/dist/domain/warnings.mjs.map +1 -1
  252. package/dist/index.d.cts +26 -18
  253. package/dist/index.d.mts +26 -18
  254. package/dist/index.d.ts +26 -18
  255. package/package.json +1 -1
  256. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  257. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  258. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  259. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  260. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  261. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  262. package/src/adapters/redocly-loader/redocly-schema-loader.ts +46 -14
  263. package/src/adapters/redocly-loader/ref-access.ts +16 -3
  264. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  265. package/src/adapters/redocly-loader/remote-fetch.ts +11 -2
  266. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  267. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  268. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  269. package/src/api/document-refs.ts +29 -1
  270. package/src/api/document-run.ts +6 -16
  271. package/src/api/openapi-ts.ts +6 -3
  272. package/src/api/ref-limit-options.ts +76 -0
  273. package/src/api/transform-schema.ts +20 -5
  274. package/src/application/ports/file-system.ts +8 -0
  275. package/src/application/transform/declared-value-types.ts +42 -0
  276. package/src/application/transform/document/document.ts +4 -2
  277. package/src/application/transform/document/exploded-query-values.ts +88 -0
  278. package/src/application/transform/document/header.ts +25 -5
  279. package/src/application/transform/document/parameter.ts +4 -4
  280. package/src/application/transform/document/parameters.ts +45 -10
  281. package/src/application/transform/document/path-item.ts +3 -3
  282. package/src/application/transform/document/path-template-key.ts +152 -0
  283. package/src/application/transform/document/path-template-refs.ts +106 -0
  284. package/src/application/transform/document/paths-enum.ts +23 -9
  285. package/src/application/transform/document/paths.ts +53 -123
  286. package/src/application/transform/document/webhooks.ts +18 -5
  287. package/src/application/transform/footer/document-footer.ts +18 -8
  288. package/src/application/transform/helper-types.ts +4 -4
  289. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  290. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  291. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  292. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  293. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  294. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  295. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  296. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  297. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  298. package/src/application/transform/schema/access-flags.ts +5 -2
  299. package/src/application/transform/schema/index-signature-type.ts +31 -0
  300. package/src/application/transform/schema/input-location.ts +35 -0
  301. package/src/application/transform/schema/object-type.ts +18 -8
  302. package/src/application/transform/schema/schema-transform.ts +2 -1
  303. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  304. package/src/cli/api-logger.ts +17 -0
  305. package/src/cli/api-settings.ts +12 -20
  306. package/src/cli/cli-arguments.ts +90 -14
  307. package/src/cli/cli-dependencies.ts +7 -2
  308. package/src/cli/cli-errors.ts +22 -0
  309. package/src/cli/cli-output.ts +11 -10
  310. package/src/cli/main.ts +10 -4
  311. package/src/cli/redocly-apis.ts +37 -17
  312. package/src/cli/ref-limits.ts +21 -2
  313. package/src/cli/run-cli.ts +39 -7
  314. package/src/domain/cause-secrets.ts +59 -25
  315. package/src/domain/errors.ts +2 -0
  316. package/src/domain/location-text.ts +12 -0
  317. package/src/domain/openapi/document-places.ts +78 -0
  318. package/src/domain/output-fixes.ts +9 -2
  319. package/src/domain/terminal-text.ts +44 -0
  320. package/src/domain/warnings.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.cjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":["documentEntries","pathItem","appendPointer","ROOT_POINTER","pathItemType","irProperty","toPropertyName","irObject"],"mappings":";;;;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAUA,+BAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAMC,UAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAMC,yBAAA,CAAcC,0BAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,IAAA,MAAM,IAAA,GAAOC,qBAAA,CAAaH,UAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAOI,uBAAA,CAAWC,2BAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAOC,sBAAS,OAAO,CAAA;AACzB;;"}
1
+ {"version":3,"file":"webhooks.cjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. A `$ref`\n * entry (often to `components/pathItems`) is the type it points at, as in `paths`; the original\n * read it as a path item, so every method was `never`. Members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const type = webhookType(name, pathItem, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n\nfunction webhookType(\n name: string,\n pathItem: PathsObject[string],\n context: TransformContext,\n): IrType {\n // A document may hold any value here; one that is no object is read as a path item, as before.\n if (typeof pathItem === \"object\" && pathItem !== null && \"$ref\" in pathItem) {\n return refType(pathItem.$ref);\n }\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n return pathItemType(pathItem as PathItemObject, location, context);\n}\n"],"names":["documentEntries","irProperty","toPropertyName","irObject","pathItem","refType","appendPointer","ROOT_POINTER","pathItemType"],"mappings":";;;;;;;;;AAeO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAUA,+BAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAChD,IAAA,OAAOC,uBAAA,CAAWC,2BAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAOC,sBAAS,OAAO,CAAA;AACzB;AAEA,SAAS,WAAA,CACP,IAAA,EACAC,UAAA,EACA,OAAA,EACQ;AAER,EAAA,IAAI,OAAOA,UAAA,KAAa,QAAA,IAAYA,UAAA,KAAa,IAAA,IAAQ,UAAUA,UAAA,EAAU;AAC3E,IAAA,OAAOC,eAAA,CAAQD,WAAS,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAME,yBAAA,CAAcC,0BAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,EAAA,OAAOC,qBAAA,CAAaJ,UAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACnE;;"}
@@ -2,16 +2,23 @@ import { irProperty, irObject } from '../../../domain/ir/constructors.mjs';
2
2
  import { toPropertyName } from '../../../domain/ir/property-name.mjs';
3
3
  import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
4
4
  import { documentEntries } from '../document-entries.mjs';
5
+ import { refType } from '../ref-type.mjs';
5
6
  import { pathItemType } from './path-item.mjs';
6
7
 
7
8
  function webhooksType(webhooks, context) {
8
9
  const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {
9
- const location = { path: appendPointer(ROOT_POINTER, ["webhooks", name]) };
10
- const type = pathItemType(pathItem, location, context);
10
+ const type = webhookType(name, pathItem, context);
11
11
  return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });
12
12
  });
13
13
  return irObject(members);
14
14
  }
15
+ function webhookType(name, pathItem, context) {
16
+ if (typeof pathItem === "object" && pathItem !== null && "$ref" in pathItem) {
17
+ return refType(pathItem.$ref);
18
+ }
19
+ const location = { path: appendPointer(ROOT_POINTER, ["webhooks", name]) };
20
+ return pathItemType(pathItem, location, context);
21
+ }
15
22
 
16
23
  export { webhooksType };
17
24
  //# sourceMappingURL=webhooks.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.mjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. Unlike\n * `paths`, a `$ref` entry is read as a path item (so every method is `never`), as in the original,\n * and members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n const type = pathItemType(pathItem as PathItemObject, location, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n"],"names":[],"mappings":";;;;;;AAcO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,aAAA,CAAc,cAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,QAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACvE,IAAA,OAAO,UAAA,CAAW,cAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB;;"}
1
+ {"version":3,"file":"webhooks.mjs","sources":["../../../../src/application/transform/document/webhooks.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { PathItemObject, PathsObject } from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { pathItemType } from \"./path-item.js\";\n\n/**\n * The `webhooks` interface body (OpenAPI 3.1 §4.8.1): one path item per webhook name. A `$ref`\n * entry (often to `components/pathItems`) is the type it points at, as in `paths`; the original\n * read it as a path item, so every method was `never`. Members carry no JSDoc.\n */\nexport function webhooksType(webhooks: PathsObject, context: TransformContext): IrType {\n const members = documentEntries(webhooks, context.options).map(([name, pathItem]) => {\n const type = webhookType(name, pathItem, context);\n return irProperty(toPropertyName(name), type, { isReadonly: context.options.immutable });\n });\n return irObject(members);\n}\n\nfunction webhookType(\n name: string,\n pathItem: PathsObject[string],\n context: TransformContext,\n): IrType {\n // A document may hold any value here; one that is no object is read as a path item, as before.\n if (typeof pathItem === \"object\" && pathItem !== null && \"$ref\" in pathItem) {\n return refType(pathItem.$ref);\n }\n const location = { path: appendPointer(ROOT_POINTER, [\"webhooks\", name]) };\n return pathItemType(pathItem as PathItemObject, location, context);\n}\n"],"names":[],"mappings":";;;;;;;AAeO,SAAS,YAAA,CAAa,UAAuB,OAAA,EAAmC;AACrF,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACnF,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAChD,IAAA,OAAO,UAAA,CAAW,cAAA,CAAe,IAAI,CAAA,EAAG,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,CAAA;AAAA,EACzF,CAAC,CAAA;AACD,EAAA,OAAO,SAAS,OAAO,CAAA;AACzB;AAEA,SAAS,WAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACQ;AAER,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,IAAQ,UAAU,QAAA,EAAU;AAC3E,IAAA,OAAO,OAAA,CAAQ,SAAS,IAAI,CAAA;AAAA,EAC9B;AACA,EAAA,MAAM,QAAA,GAAW,EAAE,IAAA,EAAM,aAAA,CAAc,cAAc,CAAC,UAAA,EAAY,IAAI,CAAC,CAAA,EAAE;AACzE,EAAA,OAAO,YAAA,CAAa,QAAA,EAA4B,QAAA,EAAU,OAAO,CAAA;AACnE;;"}
@@ -8,7 +8,10 @@ const operationKeys = require('./operation-keys.cjs');
8
8
  const sharedEnumNames = require('./shared-enum-names.cjs');
9
9
 
10
10
  function dedupeKey(request) {
11
- return [...request.values].sort(compareAsStrings).map((value, index) => metadataKey(String(value), request.metadata[index])).join(",");
11
+ const sorted = [...request.values].sort(compareAsStrings);
12
+ const originalPairs = sorted.map((value, index) => memberKey(value, request.metadata[index]));
13
+ const ownPairs = request.values.map((value, index) => ({ value, member: memberKey(value, request.metadata[index]) })).sort((left, right) => compareAsStrings(left.value, right.value)).map(({ member }) => member);
14
+ return JSON.stringify([originalPairs, ownPairs]);
12
15
  }
13
16
  function compareAsStrings(left, right) {
14
17
  const leftText = String(left);
@@ -18,8 +21,8 @@ function compareAsStrings(left, right) {
18
21
  }
19
22
  return leftText < rightText ? -1 : 1;
20
23
  }
21
- function metadataKey(value, metadata) {
22
- return `${metadata?.name ?? value}:${metadata?.description || ""}`;
24
+ function memberKey(value, metadata) {
25
+ return [value, metadata?.name ?? null, metadata?.description || null];
23
26
  }
24
27
  const ENUM_VALUES_NUMBER_SEPARATOR = "_";
25
28
  function declarationKey(name, request) {
@@ -1 +1 @@
1
- {"version":3,"file":"document-footer.cjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNameClaims } from \"./enum-name-claims.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { OperationKeys } from \"./operation-keys.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/** The naming state a run's footer shares with the rest of the run. */\nexport interface RunFooterNames {\n readonly enums: EnumNameClaims;\n readonly operations: OperationKeys;\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n private readonly names: RunFooterNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n names: RunFooterNames = { enums: new EnumNameClaims(), operations: new OperationKeys() },\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n this.names = names;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // The owner is the schema location: its requests share one enum, with `--dedupe-enums` too.\n const name = this.names.enums.nameFor(sharedName, request.name);\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n operationKey(operationId: string): string {\n return this.names.operations.keyFor(operationId);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":["EnumNaming","FIRST_SCHEMA_NAMES","EnumNameClaims","OperationKeys","enumDeclaration","withoutDeclaredMembers","HELPER_TYPES","irReference"],"mappings":"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"}
1
+ {"version":3,"file":"document-footer.cjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrDeclaration,\n IrEnumDeclaration,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNameClaims } from \"./enum-name-claims.js\";\nimport {\n type DeclaredMembers,\n EnumNaming,\n enumDeclaration,\n withoutDeclaredMembers,\n} from \"./enum-naming.js\";\nimport { OperationKeys } from \"./operation-keys.js\";\nimport { FIRST_SCHEMA_NAMES, type SharedEnumNames } from \"./shared-enum-names.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key. Two enums share a declaration only when the original shares it and\n * each value has the same name and description in both. The original key pairs the values in\n * default sort order with the metadata at the sorted position, not with the value's own metadata,\n * so `[desc, asc]` and `[asc, desc]`, both named `[Desc, Asc]`, shared one declaration, and one of\n * them typed `asc` as `Desc = \"desc\"`. The original also joined `name:description` texts with\n * `,`, and a member name stood in for its value, so enums with other values (`\"1\"` and `1`, `A`\n * and `1` both named `Active`, `[\"a\", \"b\"]` and `[\"a:,b\"]`) shared one key. As JSON, an equal key\n * means the same values and metadata; enums the original kept apart still are.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n const sorted = [...request.values].sort(compareAsStrings);\n const originalPairs = sorted.map((value, index) => memberKey(value, request.metadata[index]));\n const ownPairs = request.values\n .map((value, index) => ({ value, member: memberKey(value, request.metadata[index]) }))\n .sort((left, right) => compareAsStrings(left.value, right.value))\n .map(({ member }) => member);\n return JSON.stringify([originalPairs, ownPairs]);\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\n/** One member: the value (JSON keeps `\"1\"` and `1` apart), its name and its description. */\nfunction memberKey(value: string | number, metadata: EnumMemberMetadata | undefined) {\n return [value, metadata?.name ?? null, metadata?.description || null];\n}\n\n/** Separates a repeated `--enum-values` array name from its number, as root type aliases do. */\nconst ENUM_VALUES_NUMBER_SEPARATOR = \"_\";\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/** The naming state a run's footer shares with the rest of the run. */\nexport interface RunFooterNames {\n readonly enums: EnumNameClaims;\n readonly operations: OperationKeys;\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n /** The member names of each declared enum, by value. */\n private readonly membersByEnum = new Map<string, Map<string | number, string>>();\n /** The members of each declared enum name, by member name. */\n private readonly declaredMembers = new Map<string, Map<string, string | number>>();\n /** `--enum-values` arrays added already: their declared name by name, type and values. */\n private readonly declaredEnumValues = new Map<string, string>();\n /** The declared `--enum-values` array names. */\n private readonly enumValuesNames = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n private readonly sharedNames: SharedEnumNames;\n private readonly names: RunFooterNames;\n\n constructor(\n sink: FooterSink,\n isDedupingEnums: boolean,\n sharedNames: SharedEnumNames = FIRST_SCHEMA_NAMES,\n names: RunFooterNames = { enums: new EnumNameClaims(), operations: new OperationKeys() },\n ) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n this.sharedNames = sharedNames;\n this.names = names;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const ownName = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n // Every schema of a shared enum goes to `sharedNames`, the later ones too.\n const sharedName = key === null ? ownName : this.sharedNames.nameOf(key, ownName, request);\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // The owner is the schema location: its requests share one enum, with `--dedupe-enums` too.\n const name = this.names.enums.nameFor(sharedName, request.name);\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n const declaration = this.withoutRepeats(enumDeclaration(name, request, this.naming));\n if (declaration !== null) {\n this.record(declaration);\n this.sink.add(declaration);\n }\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n /** The declaration without members an earlier one of the name has; null when none is left. */\n private withoutRepeats(declaration: IrEnumDeclaration): IrEnumDeclaration | null {\n const earlier: DeclaredMembers | undefined = this.declaredMembers.get(declaration.name);\n if (earlier === undefined) {\n return declaration;\n }\n const merged = withoutDeclaredMembers(declaration, earlier);\n // Two empty declarations merge into one empty enum, which compiles, so the second stays.\n return merged.members.length === 0 && declaration.members.length > 0 ? null : merged;\n }\n\n /** The members of a declaration; the first member of a value names it. */\n private record(declaration: IrEnumDeclaration): void {\n const byName = this.declaredMembers.get(declaration.name) ?? new Map();\n const byValue = this.membersByEnum.get(declaration.name) ?? new Map();\n for (const member of declaration.members) {\n byName.set(member.name, member.value);\n if (!byValue.has(member.value)) {\n byValue.set(member.value, member.name);\n }\n }\n this.declaredMembers.set(declaration.name, byName);\n this.membersByEnum.set(declaration.name, byValue);\n }\n\n enumMembers(name: string): ReadonlyMap<string | number, string> {\n return this.membersByEnum.get(name) ?? new Map();\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const baseName = this.naming.arrayName(request.name);\n // The same array twice fails with \"Cannot redeclare\"; a schema typed twice adds it twice.\n const declared = JSON.stringify([baseName, request.type, request.values]);\n if (this.declaredEnumValues.has(declared)) {\n return;\n }\n const name = this.freeEnumValuesName(baseName);\n this.declaredEnumValues.set(declared, name);\n this.enumValuesNames.add(name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n /**\n * Another array may have the name: `Discount/type` and `discount/type`, or a property and an\n * inline `allOf` item of one schema, typed at one location. A redeclared `const` does not\n * compile, so a later one gets the next number (`discountTypeValues_2`). Every unnumbered name\n * ends with `Values`, so a number never takes a name that a later array needs.\n */\n private freeEnumValuesName(name: string): string {\n let candidate = name;\n for (let count = 2; this.enumValuesNames.has(candidate); count++) {\n candidate = `${name}${ENUM_VALUES_NUMBER_SEPARATOR}${count}`;\n }\n return candidate;\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n operationKey(operationId: string): string {\n return this.names.operations.keyFor(operationId);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":["EnumNaming","FIRST_SCHEMA_NAMES","EnumNameClaims","OperationKeys","enumDeclaration","withoutDeclaredMembers","HELPER_TYPES","irReference"],"mappings":"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"}
@@ -6,7 +6,10 @@ import { OperationKeys } from './operation-keys.mjs';
6
6
  import { FIRST_SCHEMA_NAMES } from './shared-enum-names.mjs';
7
7
 
8
8
  function dedupeKey(request) {
9
- return [...request.values].sort(compareAsStrings).map((value, index) => metadataKey(String(value), request.metadata[index])).join(",");
9
+ const sorted = [...request.values].sort(compareAsStrings);
10
+ const originalPairs = sorted.map((value, index) => memberKey(value, request.metadata[index]));
11
+ const ownPairs = request.values.map((value, index) => ({ value, member: memberKey(value, request.metadata[index]) })).sort((left, right) => compareAsStrings(left.value, right.value)).map(({ member }) => member);
12
+ return JSON.stringify([originalPairs, ownPairs]);
10
13
  }
11
14
  function compareAsStrings(left, right) {
12
15
  const leftText = String(left);
@@ -16,8 +19,8 @@ function compareAsStrings(left, right) {
16
19
  }
17
20
  return leftText < rightText ? -1 : 1;
18
21
  }
19
- function metadataKey(value, metadata) {
20
- return `${metadata?.name ?? value}:${metadata?.description || ""}`;
22
+ function memberKey(value, metadata) {
23
+ return [value, metadata?.name ?? null, metadata?.description || null];
21
24
  }
22
25
  const ENUM_VALUES_NUMBER_SEPARATOR = "_";
23
26
  function declarationKey(name, request) {
@@ -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 { 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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"}
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. Two enums share a declaration only when the original shares it and\n * each value has the same name and description in both. The original key pairs the values in\n * default sort order with the metadata at the sorted position, not with the value's own metadata,\n * so `[desc, asc]` and `[asc, desc]`, both named `[Desc, Asc]`, shared one declaration, and one of\n * them typed `asc` as `Desc = \"desc\"`. The original also joined `name:description` texts with\n * `,`, and a member name stood in for its value, so enums with other values (`\"1\"` and `1`, `A`\n * and `1` both named `Active`, `[\"a\", \"b\"]` and `[\"a:,b\"]`) shared one key. As JSON, an equal key\n * means the same values and metadata; enums the original kept apart still are.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n const sorted = [...request.values].sort(compareAsStrings);\n const originalPairs = sorted.map((value, index) => memberKey(value, request.metadata[index]));\n const ownPairs = request.values\n .map((value, index) => ({ value, member: memberKey(value, request.metadata[index]) }))\n .sort((left, right) => compareAsStrings(left.value, right.value))\n .map(({ member }) => member);\n return JSON.stringify([originalPairs, ownPairs]);\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\n/** One member: the value (JSON keeps `\"1\"` and `1` apart), its name and its description. */\nfunction memberKey(value: string | number, metadata: EnumMemberMetadata | undefined) {\n return [value, metadata?.name ?? null, metadata?.description || null];\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":";;;;;;;AA2CA,SAAS,UAAU,OAAA,EAAyC;AAC1D,EAAA,MAAM,SAAS,CAAC,GAAG,QAAQ,MAAM,CAAA,CAAE,KAAK,gBAAgB,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU,SAAA,CAAU,KAAA,EAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAC,CAAA;AAC5F,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CACtB,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,MAAW,EAAE,KAAA,EAAO,QAAQ,SAAA,CAAU,KAAA,EAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAA,EAAE,CAAE,CAAA,CACpF,KAAK,CAAC,IAAA,EAAM,KAAA,KAAU,gBAAA,CAAiB,KAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAC,EAC/D,GAAA,CAAI,CAAC,EAAE,MAAA,OAAa,MAAM,CAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAC,aAAA,EAAe,QAAQ,CAAC,CAAA;AACjD;AAGA,SAAS,gBAAA,CAAiB,MAAuB,KAAA,EAAgC;AAC/E,EAAA,MAAM,QAAA,GAAW,OAAO,IAAI,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,OAAO,KAAK,CAAA;AAC9B,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,GAAW,YAAY,EAAA,GAAK,CAAA;AACrC;AAGA,SAAS,SAAA,CAAU,OAAwB,QAAA,EAA0C;AACnF,EAAA,OAAO,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,IAAA,EAAM,QAAA,EAAU,eAAe,IAAI,CAAA;AACtE;AAGA,MAAM,4BAAA,GAA+B,GAAA;AAGrC,SAAS,cAAA,CAAe,MAAc,OAAA,EAAyC;AAC7E,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,IAAA,EAAM,QAAQ,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAChE;AAaO,MAAM,SAAA,CAAoC;AAAA,EAC9B,MAAA,GAAS,IAAI,UAAA,EAAW;AAAA,EACxB,cAAA,uBAAqB,GAAA,EAAoB;AAAA;AAAA,EAEzC,aAAA,uBAAoB,GAAA,EAAY;AAAA;AAAA,EAEhC,aAAA,uBAAoB,GAAA,EAA0C;AAAA;AAAA,EAE9D,eAAA,uBAAsB,GAAA,EAA0C;AAAA;AAAA,EAEhE,kBAAA,uBAAyB,GAAA,EAAoB;AAAA;AAAA,EAE7C,eAAA,uBAAsB,GAAA,EAAY;AAAA,EAClC,IAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CACE,IAAA,EACA,eAAA,EACA,WAAA,GAA+B,oBAC/B,KAAA,GAAwB,EAAE,KAAA,EAAO,IAAI,gBAAe,EAAG,UAAA,EAAY,IAAI,aAAA,IAAgB,EACvF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,OAAA,EAAyC;AAE/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAQ,IAAI,CAAA;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,eAAA,GAAkB,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAExD,IAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,GAAO,OAAA,GAAU,KAAK,WAAA,CAAY,MAAA,CAAO,GAAA,EAAK,OAAA,EAAS,OAAO,CAAA;AACzF,IAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA,GAAO,SAAY,IAAA,CAAK,cAAA,CAAe,IAAI,GAAG,CAAA;AACpE,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,OAAA,CAAQ,UAAA,EAAY,QAAQ,IAAI,CAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA,GAAI,IAAA;AAC7E,IAAA,IAAI,aAAa,IAAA,IAAQ,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,IACjC;AACA,IAAA,MAAM,WAAA,GAAc,KAAK,cAAA,CAAe,eAAA,CAAgB,MAAM,OAAA,EAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AACnF,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,OAAO,WAAW,CAAA;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,WAAW,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAe,WAAA,EAA0D;AAC/E,IAAA,MAAM,OAAA,GAAuC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,YAAY,IAAI,CAAA;AACtF,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAO,WAAA;AAAA,IACT;AACA,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,WAAA,EAAa,OAAO,CAAA;AAE1D,IAAA,OAAO,MAAA,CAAO,QAAQ,MAAA,KAAW,CAAA,IAAK,YAAY,OAAA,CAAQ,MAAA,GAAS,IAAI,IAAA,GAAO,MAAA;AAAA,EAChF;AAAA;AAAA,EAGQ,OAAO,WAAA,EAAsC;AACnD,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,GAAA,CAAI,YAAY,IAAI,CAAA,wBAAS,GAAA,EAAI;AACrE,IAAA,MAAM,OAAA,GAAU,KAAK,aAAA,CAAc,GAAA,CAAI,YAAY,IAAI,CAAA,wBAAS,GAAA,EAAI;AACpE,IAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,MAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA;AAAA,MACvC;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAAA,EAClD;AAAA,EAEA,YAAY,IAAA,EAAoD;AAC9D,IAAA,OAAO,KAAK,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,wBAAS,GAAA,EAAI;AAAA,EACjD;AAAA,EAEA,cAAc,OAAA,EAAkC;AAC9C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAQ,IAAI,CAAA;AAEnD,IAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU,CAAC,UAAU,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AACxE,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACzC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAC7C,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,qBAAqB,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,aAAa,CAAA;AACvC,IAAA,IAAA,CAAK,KAAK,GAAA,CAAI;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,IAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,IAAA,EAAM,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAAA,MAClC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU;AAAC,KACZ,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,mBAAmB,IAAA,EAAsB;AAC/C,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,IAAA,CAAK,gBAAgB,GAAA,CAAI,SAAS,GAAG,KAAA,EAAA,EAAS;AAChE,MAAA,SAAA,GAAY,CAAA,EAAG,IAAI,CAAA,EAAG,4BAA4B,GAAG,KAAK,CAAA,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,YAAY,CAAA;AAAA,EACxC;AAAA,EAEA,qBAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,aAAa,cAAc,CAAA;AAAA,EAC1C;AAAA,EAEA,aAAa,KAAA,EAAwC;AACnD,IAAA,IAAA,CAAK,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,aAAa,WAAA,EAA6B;AACxC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA;AAAA,EACjD;AAAA,EAEQ,QAAQ,MAAA,EAA0B;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IAChF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,IAAA,EAAsB;AAC7C,EAAA,OAAO,YAAY,YAAA,CAAa,aAAA,CAAc,IAAA,EAAM,CAAC,IAAI,CAAC,CAAA;AAC5D;;"}
@@ -46,9 +46,9 @@ const READ_WRITE_MARKER_TYPES = lines(
46
46
  "};",
47
47
  "type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
48
48
  "type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
49
- "type ReadWriteMarkedKeys<T, Marker> = {",
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
- "}[keyof T];",
49
+ "type ReadWriteMarkedKeys<T, Marker> = keyof {",
50
+ " [K in keyof T as 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never]: never;",
51
+ "};",
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>;",
54
54
  "};",
@@ -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, 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;;;"}
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> = keyof {\",\n \" [K in keyof T as 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : \" +\n \"NonNullable<T[K]> extends Marker ? K : never]: never;\",\n \"};\",\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,+CAAA;AAAA,EACA,mJAAA;AAAA,EAEA,IAAA;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;;;"}
@@ -44,9 +44,9 @@ const READ_WRITE_MARKER_TYPES = lines(
44
44
  "};",
45
45
  "type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
46
46
  "type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
47
- "type ReadWriteMarkedKeys<T, Marker> = {",
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
- "}[keyof T];",
47
+ "type ReadWriteMarkedKeys<T, Marker> = keyof {",
48
+ " [K in keyof T as 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never]: never;",
49
+ "};",
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>;",
52
52
  "};",
@@ -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, 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;;"}
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> = keyof {\",\n \" [K in keyof T as 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : \" +\n \"NonNullable<T[K]> extends Marker ? K : never]: never;\",\n \"};\",\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,+CAAA;AAAA,EACA,mJAAA;AAAA,EAEA,IAAA;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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
4
- const generatedShape = require('./generated-shape.cjs');
4
+ const locatedNode = require('./located-node.cjs');
5
5
  const pointerWalk = require('./pointer-walk.cjs');
6
6
 
7
7
  const PARENT_LOCATION_PAIRS = /* @__PURE__ */ new Set([
@@ -17,7 +17,7 @@ const KEPT_PAIRS = /* @__PURE__ */ new Set(["anyOf", "oneOf", "$defs"]);
17
17
  const PARENT_LOCATION_KEYWORDS = /* @__PURE__ */ new Set(["items", ...RECORD_VALUE_KEYWORDS]);
18
18
  const INDEX_RE = /^\d+$/;
19
19
  function childOf(node, segment) {
20
- return (generatedShape.isJsonObject(node) || Array.isArray(node)) && segment !== void 0 ? node[segment] : void 0;
20
+ return (locatedNode.isJsonObject(node) || Array.isArray(node)) && segment !== void 0 ? node[segment] : void 0;
21
21
  }
22
22
  function pairStep(value, next, path) {
23
23
  return { path, child: childOf(value, next), length: 2, isSchema: true };
@@ -52,7 +52,7 @@ function isPathItem(path) {
52
52
  }
53
53
  function parameterStep(walk, next) {
54
54
  const entry = childOf(childOf(walk.node, "parameters"), next);
55
- const where = generatedShape.isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];
55
+ const where = locatedNode.isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];
56
56
  const prefix = isPathItem(walk.path) ? ["parameters"] : [];
57
57
  return { path: [...prefix, "parameters", ...where], child: entry, length: 2, isSchema: false };
58
58
  }
@@ -82,7 +82,7 @@ function stepAt(walk, pointer, index) {
82
82
  return walk.isSchema ? schemaStep(walk.node, segment, segments[index + 1]) : documentStep(walk, segments, index);
83
83
  }
84
84
  function refOf(node) {
85
- return generatedShape.isJsonObject(node) && typeof node.$ref === "string" ? node.$ref : null;
85
+ return locatedNode.isJsonObject(node) && typeof node.$ref === "string" ? node.$ref : null;
86
86
  }
87
87
  function crossed(walk, ref, refs, seen) {
88
88
  if (seen.includes(ref)) {
@@ -1 +1 @@
1
- {"version":3,"file":"generated-location.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":["isJsonObject","leadingSegmentsOf","startsInSchema","refPointerOf","appendPointer","ROOT_POINTER"],"mappings":"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"}
1
+ {"version":3,"file":"generated-location.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":["isJsonObject","leadingSegmentsOf","startsInSchema","refPointerOf","appendPointer","ROOT_POINTER"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
2
- import { isJsonObject } from './generated-shape.mjs';
2
+ import { isJsonObject } from './located-node.mjs';
3
3
  import { refPointerOf, leadingSegmentsOf, startsInSchema } from './pointer-walk.mjs';
4
4
 
5
5
  const PARENT_LOCATION_PAIRS = /* @__PURE__ */ new Set([
@@ -1 +1 @@
1
- {"version":3,"file":"generated-location.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generated-location.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":[],"mappings":"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"}