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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/CHANGELOG.md +1972 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  15. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  16. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  17. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +48 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  27. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  29. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  31. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  32. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  33. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  34. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  35. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  36. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  37. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  38. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  39. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  41. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
  43. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
  45. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
  47. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
  49. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  51. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/ref-holders.mjs +53 -12
  53. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  55. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  56. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  57. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  58. package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
  59. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
  61. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
  63. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  64. package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
  65. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  66. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  67. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  68. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  69. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  70. package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
  71. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  72. package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
  73. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  74. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  75. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  76. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  77. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  78. package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
  79. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  80. package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
  81. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  82. package/dist/api/default-ports.cjs +14 -2
  83. package/dist/api/default-ports.cjs.map +1 -1
  84. package/dist/api/default-ports.mjs +14 -2
  85. package/dist/api/default-ports.mjs.map +1 -1
  86. package/dist/api/discriminator-enum-parent.cjs +2 -2
  87. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  88. package/dist/api/discriminator-enum-parent.mjs +3 -3
  89. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  90. package/dist/api/discriminator-other-owners.cjs +5 -3
  91. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  92. package/dist/api/discriminator-other-owners.mjs +5 -3
  93. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  94. package/dist/api/discriminator-patch.cjs +5 -1
  95. package/dist/api/discriminator-patch.cjs.map +1 -1
  96. package/dist/api/discriminator-patch.mjs +5 -1
  97. package/dist/api/discriminator-patch.mjs.map +1 -1
  98. package/dist/api/discriminator-scan.cjs +15 -8
  99. package/dist/api/discriminator-scan.cjs.map +1 -1
  100. package/dist/api/discriminator-scan.mjs +15 -8
  101. package/dist/api/discriminator-scan.mjs.map +1 -1
  102. package/dist/api/document-refs.cjs +16 -1
  103. package/dist/api/document-refs.cjs.map +1 -1
  104. package/dist/api/document-refs.mjs +16 -1
  105. package/dist/api/document-refs.mjs.map +1 -1
  106. package/dist/api/document-run.cjs +6 -12
  107. package/dist/api/document-run.cjs.map +1 -1
  108. package/dist/api/document-run.mjs +6 -12
  109. package/dist/api/document-run.mjs.map +1 -1
  110. package/dist/api/legacy-utils.cjs.map +1 -1
  111. package/dist/api/legacy-utils.mjs.map +1 -1
  112. package/dist/api/openapi-ts.cjs +9 -6
  113. package/dist/api/openapi-ts.cjs.map +1 -1
  114. package/dist/api/openapi-ts.mjs +10 -8
  115. package/dist/api/openapi-ts.mjs.map +1 -1
  116. package/dist/api/ref-limit-options.cjs +63 -0
  117. package/dist/api/ref-limit-options.cjs.map +1 -0
  118. package/dist/api/ref-limit-options.mjs +57 -0
  119. package/dist/api/ref-limit-options.mjs.map +1 -0
  120. package/dist/api/schema-callbacks.cjs +36 -12
  121. package/dist/api/schema-callbacks.cjs.map +1 -1
  122. package/dist/api/schema-callbacks.mjs +36 -12
  123. package/dist/api/schema-callbacks.mjs.map +1 -1
  124. package/dist/api/transform-context.cjs +7 -3
  125. package/dist/api/transform-context.cjs.map +1 -1
  126. package/dist/api/transform-context.mjs +7 -3
  127. package/dist/api/transform-context.mjs.map +1 -1
  128. package/dist/api/transform-schema.cjs +47 -10
  129. package/dist/api/transform-schema.cjs.map +1 -1
  130. package/dist/api/transform-schema.mjs +48 -11
  131. package/dist/api/transform-schema.mjs.map +1 -1
  132. package/dist/application/print/text-writer.cjs +10 -3
  133. package/dist/application/print/text-writer.cjs.map +1 -1
  134. package/dist/application/print/text-writer.mjs +10 -3
  135. package/dist/application/print/text-writer.mjs.map +1 -1
  136. package/dist/application/stack-overflow.cjs +2 -1
  137. package/dist/application/stack-overflow.cjs.map +1 -1
  138. package/dist/application/stack-overflow.mjs +2 -1
  139. package/dist/application/stack-overflow.mjs.map +1 -1
  140. package/dist/application/transform/declared-value-types.cjs +36 -0
  141. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  142. package/dist/application/transform/declared-value-types.mjs +34 -0
  143. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  144. package/dist/application/transform/document/components.cjs +1 -1
  145. package/dist/application/transform/document/components.cjs.map +1 -1
  146. package/dist/application/transform/document/components.mjs +2 -2
  147. package/dist/application/transform/document/components.mjs.map +1 -1
  148. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  149. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  150. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  151. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  152. package/dist/application/transform/document/defs-root.cjs +1 -1
  153. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  154. package/dist/application/transform/document/defs-root.mjs +2 -2
  155. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  156. package/dist/application/transform/document/document.cjs +7 -2
  157. package/dist/application/transform/document/document.cjs.map +1 -1
  158. package/dist/application/transform/document/document.mjs +6 -3
  159. package/dist/application/transform/document/document.mjs.map +1 -1
  160. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  161. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  162. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  163. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  164. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  165. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  166. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  167. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  168. package/dist/application/transform/document/global-type-references.cjs +1 -0
  169. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  170. package/dist/application/transform/document/global-type-references.mjs +1 -1
  171. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  172. package/dist/application/transform/document/header.cjs +11 -3
  173. package/dist/application/transform/document/header.cjs.map +1 -1
  174. package/dist/application/transform/document/header.mjs +10 -2
  175. package/dist/application/transform/document/header.mjs.map +1 -1
  176. package/dist/application/transform/document/media-type.cjs +2 -2
  177. package/dist/application/transform/document/media-type.cjs.map +1 -1
  178. package/dist/application/transform/document/media-type.mjs +3 -3
  179. package/dist/application/transform/document/media-type.mjs.map +1 -1
  180. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  181. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  182. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  183. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  184. package/dist/application/transform/document/operation.cjs +1 -1
  185. package/dist/application/transform/document/operation.cjs.map +1 -1
  186. package/dist/application/transform/document/operation.mjs +2 -2
  187. package/dist/application/transform/document/operation.mjs.map +1 -1
  188. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  189. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  190. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  191. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  192. package/dist/application/transform/document/parameter.cjs +12 -4
  193. package/dist/application/transform/document/parameter.cjs.map +1 -1
  194. package/dist/application/transform/document/parameter.mjs +13 -5
  195. package/dist/application/transform/document/parameter.mjs.map +1 -1
  196. package/dist/application/transform/document/parameters.cjs +29 -34
  197. package/dist/application/transform/document/parameters.cjs.map +1 -1
  198. package/dist/application/transform/document/parameters.mjs +29 -34
  199. package/dist/application/transform/document/parameters.mjs.map +1 -1
  200. package/dist/application/transform/document/path-item.cjs +15 -17
  201. package/dist/application/transform/document/path-item.cjs.map +1 -1
  202. package/dist/application/transform/document/path-item.mjs +15 -19
  203. package/dist/application/transform/document/path-item.mjs.map +1 -1
  204. package/dist/application/transform/document/path-template-key.cjs +84 -0
  205. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  206. package/dist/application/transform/document/path-template-key.mjs +79 -0
  207. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  208. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  209. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  210. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  211. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  212. package/dist/application/transform/document/paths-enum.cjs +8 -6
  213. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  214. package/dist/application/transform/document/paths-enum.mjs +8 -7
  215. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  216. package/dist/application/transform/document/paths.cjs +43 -67
  217. package/dist/application/transform/document/paths.cjs.map +1 -1
  218. package/dist/application/transform/document/paths.mjs +42 -68
  219. package/dist/application/transform/document/paths.mjs.map +1 -1
  220. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  221. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  222. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  223. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  224. package/dist/application/transform/document/request-body.cjs +1 -1
  225. package/dist/application/transform/document/request-body.cjs.map +1 -1
  226. package/dist/application/transform/document/request-body.mjs +2 -2
  227. package/dist/application/transform/document/request-body.mjs.map +1 -1
  228. package/dist/application/transform/document/response.cjs +2 -2
  229. package/dist/application/transform/document/response.cjs.map +1 -1
  230. package/dist/application/transform/document/response.mjs +3 -3
  231. package/dist/application/transform/document/response.mjs.map +1 -1
  232. package/dist/application/transform/document/responses.cjs +1 -1
  233. package/dist/application/transform/document/responses.cjs.map +1 -1
  234. package/dist/application/transform/document/responses.mjs +2 -2
  235. package/dist/application/transform/document/responses.mjs.map +1 -1
  236. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  237. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  238. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  239. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  240. package/dist/application/transform/document/type-resolution.cjs +3 -1
  241. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  242. package/dist/application/transform/document/type-resolution.mjs +3 -1
  243. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  244. package/dist/application/transform/document/webhooks.cjs +10 -3
  245. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  246. package/dist/application/transform/document/webhooks.mjs +10 -3
  247. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  248. package/dist/application/transform/footer/document-footer.cjs +16 -5
  249. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  250. package/dist/application/transform/footer/document-footer.mjs +16 -5
  251. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  252. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  253. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  254. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  255. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  256. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  257. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  258. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  259. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  260. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  261. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  262. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  263. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  264. package/dist/application/transform/helper-types.cjs +3 -3
  265. package/dist/application/transform/helper-types.cjs.map +1 -1
  266. package/dist/application/transform/helper-types.mjs +3 -3
  267. package/dist/application/transform/helper-types.mjs.map +1 -1
  268. package/dist/application/transform/numbered-names.cjs +9 -0
  269. package/dist/application/transform/numbered-names.cjs.map +1 -1
  270. package/dist/application/transform/numbered-names.mjs +9 -1
  271. package/dist/application/transform/numbered-names.mjs.map +1 -1
  272. package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
  273. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  274. package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
  275. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  276. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  277. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  278. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  279. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  280. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  281. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  282. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  283. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  284. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  285. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  286. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  287. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  288. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  289. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  290. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  291. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  292. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  293. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  294. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  295. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  296. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  297. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  298. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  299. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  300. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  301. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  302. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  303. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  304. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  305. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  306. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  307. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  308. package/dist/application/transform/ref-type.cjs +2 -1
  309. package/dist/application/transform/ref-type.cjs.map +1 -1
  310. package/dist/application/transform/ref-type.mjs +2 -1
  311. package/dist/application/transform/ref-type.mjs.map +1 -1
  312. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  313. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  314. package/dist/application/transform/schema/composition-type.cjs +1 -1
  315. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  316. package/dist/application/transform/schema/composition-type.mjs +2 -2
  317. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  318. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  319. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  320. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  321. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  322. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  323. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  324. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  325. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  326. package/dist/application/transform/schema/input-location.cjs +23 -0
  327. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  328. package/dist/application/transform/schema/input-location.mjs +21 -0
  329. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  330. package/dist/application/transform/schema/object-type.cjs +18 -8
  331. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  332. package/dist/application/transform/schema/object-type.mjs +19 -9
  333. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  334. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  335. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  336. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  337. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  338. package/dist/application/transform/schema/schema-transform.cjs +6 -3
  339. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  340. package/dist/application/transform/schema/schema-transform.mjs +6 -3
  341. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  342. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  343. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  344. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  345. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  346. package/dist/application/transform/schema-comment.cjs +5 -1
  347. package/dist/application/transform/schema-comment.cjs.map +1 -1
  348. package/dist/application/transform/schema-comment.mjs +5 -1
  349. package/dist/application/transform/schema-comment.mjs.map +1 -1
  350. package/dist/cli/api-logger.cjs +13 -0
  351. package/dist/cli/api-logger.cjs.map +1 -0
  352. package/dist/cli/api-logger.mjs +11 -0
  353. package/dist/cli/api-logger.mjs.map +1 -0
  354. package/dist/cli/api-settings.cjs +57 -9
  355. package/dist/cli/api-settings.cjs.map +1 -1
  356. package/dist/cli/api-settings.mjs +56 -11
  357. package/dist/cli/api-settings.mjs.map +1 -1
  358. package/dist/cli/api-writes.cjs +72 -0
  359. package/dist/cli/api-writes.cjs.map +1 -0
  360. package/dist/cli/api-writes.mjs +69 -0
  361. package/dist/cli/api-writes.mjs.map +1 -0
  362. package/dist/cli/cli-arguments.cjs +51 -11
  363. package/dist/cli/cli-arguments.cjs.map +1 -1
  364. package/dist/cli/cli-arguments.mjs +51 -11
  365. package/dist/cli/cli-arguments.mjs.map +1 -1
  366. package/dist/cli/cli-errors.cjs +29 -1
  367. package/dist/cli/cli-errors.cjs.map +1 -1
  368. package/dist/cli/cli-errors.mjs +29 -2
  369. package/dist/cli/cli-errors.mjs.map +1 -1
  370. package/dist/cli/cli-output.cjs +111 -4
  371. package/dist/cli/cli-output.cjs.map +1 -1
  372. package/dist/cli/cli-output.mjs +104 -5
  373. package/dist/cli/cli-output.mjs.map +1 -1
  374. package/dist/cli/main.cjs +13 -3
  375. package/dist/cli/main.cjs.map +1 -1
  376. package/dist/cli/main.mjs +14 -4
  377. package/dist/cli/main.mjs.map +1 -1
  378. package/dist/cli/redocly-apis.cjs +94 -37
  379. package/dist/cli/redocly-apis.cjs.map +1 -1
  380. package/dist/cli/redocly-apis.mjs +99 -42
  381. package/dist/cli/redocly-apis.mjs.map +1 -1
  382. package/dist/cli/ref-limits.cjs +15 -1
  383. package/dist/cli/ref-limits.cjs.map +1 -1
  384. package/dist/cli/ref-limits.mjs +15 -2
  385. package/dist/cli/ref-limits.mjs.map +1 -1
  386. package/dist/cli/run-cli.cjs +37 -14
  387. package/dist/cli/run-cli.cjs.map +1 -1
  388. package/dist/cli/run-cli.mjs +39 -16
  389. package/dist/cli/run-cli.mjs.map +1 -1
  390. package/dist/domain/append-all.cjs +10 -0
  391. package/dist/domain/append-all.cjs.map +1 -0
  392. package/dist/domain/append-all.mjs +8 -0
  393. package/dist/domain/append-all.mjs.map +1 -0
  394. package/dist/domain/cause-secrets.cjs +52 -0
  395. package/dist/domain/cause-secrets.cjs.map +1 -0
  396. package/dist/domain/cause-secrets.mjs +50 -0
  397. package/dist/domain/cause-secrets.mjs.map +1 -0
  398. package/dist/domain/errors.cjs +11 -3
  399. package/dist/domain/errors.cjs.map +1 -1
  400. package/dist/domain/errors.mjs +11 -3
  401. package/dist/domain/errors.mjs.map +1 -1
  402. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  403. package/dist/domain/ir/identifier-text.mjs +1 -1
  404. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  405. package/dist/domain/ir/ir-shape.cjs +187 -0
  406. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  407. package/dist/domain/ir/ir-shape.mjs +184 -0
  408. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  409. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  410. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  411. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  412. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  413. package/dist/domain/location-text.cjs +9 -0
  414. package/dist/domain/location-text.cjs.map +1 -0
  415. package/dist/domain/location-text.mjs +7 -0
  416. package/dist/domain/location-text.mjs.map +1 -0
  417. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  418. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  419. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  420. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  421. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  422. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  423. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  424. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  425. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  426. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  427. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  428. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  429. package/dist/domain/openapi/document-places.cjs +55 -0
  430. package/dist/domain/openapi/document-places.cjs.map +1 -0
  431. package/dist/domain/openapi/document-places.mjs +53 -0
  432. package/dist/domain/openapi/document-places.mjs.map +1 -0
  433. package/dist/domain/openapi/json-pointer.cjs +43 -1
  434. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  435. package/dist/domain/openapi/json-pointer.mjs +40 -2
  436. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  437. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  438. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  439. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  440. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  441. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  442. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  443. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  444. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  445. package/dist/domain/output-fixes.cjs +20 -0
  446. package/dist/domain/output-fixes.cjs.map +1 -1
  447. package/dist/domain/output-fixes.mjs +20 -0
  448. package/dist/domain/output-fixes.mjs.map +1 -1
  449. package/dist/domain/terminal-text.cjs +31 -0
  450. package/dist/domain/terminal-text.cjs.map +1 -0
  451. package/dist/domain/terminal-text.mjs +29 -0
  452. package/dist/domain/terminal-text.mjs.map +1 -0
  453. package/dist/domain/url-secrets.cjs +48 -0
  454. package/dist/domain/url-secrets.cjs.map +1 -0
  455. package/dist/domain/url-secrets.mjs +45 -0
  456. package/dist/domain/url-secrets.mjs.map +1 -0
  457. package/dist/domain/warnings.cjs +1 -0
  458. package/dist/domain/warnings.cjs.map +1 -1
  459. package/dist/domain/warnings.mjs +1 -0
  460. package/dist/domain/warnings.mjs.map +1 -1
  461. package/dist/index.d.cts +46 -20
  462. package/dist/index.d.mts +46 -20
  463. package/dist/index.d.ts +46 -20
  464. package/package.json +4 -5
  465. package/src/adapters/node-file-system/file-claims.ts +138 -0
  466. package/src/adapters/node-file-system/file-identity.ts +137 -0
  467. package/src/adapters/node-file-system/node-file-system.ts +158 -18
  468. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  469. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
  470. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  471. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  472. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  473. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  474. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  475. package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
  476. package/src/adapters/redocly-loader/ref-access.ts +51 -4
  477. package/src/adapters/redocly-loader/ref-holders.ts +76 -15
  478. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  479. package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
  480. package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
  481. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  482. package/src/adapters/redocly-loader/schema-source.ts +35 -11
  483. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  484. package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
  485. package/src/api/default-ports.ts +33 -4
  486. package/src/api/discriminator-enum-parent.ts +3 -3
  487. package/src/api/discriminator-other-owners.ts +5 -3
  488. package/src/api/discriminator-patch.ts +5 -1
  489. package/src/api/discriminator-scan.ts +16 -8
  490. package/src/api/document-refs.ts +29 -1
  491. package/src/api/document-run.ts +10 -19
  492. package/src/api/legacy-utils.ts +5 -1
  493. package/src/api/openapi-ts.ts +26 -8
  494. package/src/api/ref-limit-options.ts +76 -0
  495. package/src/api/run-context.ts +3 -0
  496. package/src/api/schema-callbacks.ts +60 -17
  497. package/src/api/transform-context.ts +7 -3
  498. package/src/api/transform-schema.ts +79 -12
  499. package/src/application/ports/file-system.ts +47 -0
  500. package/src/application/ports/schema-loader.ts +11 -1
  501. package/src/application/print/text-writer.ts +10 -3
  502. package/src/application/stack-overflow.ts +9 -5
  503. package/src/application/transform/declared-value-types.ts +42 -0
  504. package/src/application/transform/document/components.ts +2 -2
  505. package/src/application/transform/document/declared-type-names.ts +36 -0
  506. package/src/application/transform/document/defs-root.ts +2 -2
  507. package/src/application/transform/document/document.ts +8 -5
  508. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  509. package/src/application/transform/document/exploded-query-values.ts +88 -0
  510. package/src/application/transform/document/global-type-references.ts +1 -1
  511. package/src/application/transform/document/header.ts +25 -5
  512. package/src/application/transform/document/media-type.ts +4 -3
  513. package/src/application/transform/document/operation-keys-written.ts +27 -0
  514. package/src/application/transform/document/operation.ts +2 -2
  515. package/src/application/transform/document/parameter-entries.ts +70 -0
  516. package/src/application/transform/document/parameter.ts +21 -9
  517. package/src/application/transform/document/parameters.ts +56 -66
  518. package/src/application/transform/document/path-item.ts +16 -34
  519. package/src/application/transform/document/path-template-key.ts +152 -0
  520. package/src/application/transform/document/path-template-refs.ts +106 -0
  521. package/src/application/transform/document/paths-enum.ts +24 -10
  522. package/src/application/transform/document/paths.ts +59 -125
  523. package/src/application/transform/document/referenced-parameter.ts +146 -0
  524. package/src/application/transform/document/request-body.ts +2 -2
  525. package/src/application/transform/document/response.ts +3 -3
  526. package/src/application/transform/document/responses.ts +2 -2
  527. package/src/application/transform/document/root-type-aliases.ts +17 -38
  528. package/src/application/transform/document/type-resolution.ts +2 -1
  529. package/src/application/transform/document/webhooks.ts +19 -6
  530. package/src/application/transform/footer/document-footer.ts +36 -9
  531. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  532. package/src/application/transform/footer/operation-keys.ts +28 -0
  533. package/src/application/transform/footer/type-evaluation.ts +4 -4
  534. package/src/application/transform/helper-types.ts +8 -7
  535. package/src/application/transform/numbered-names.ts +15 -0
  536. package/src/application/transform/ref-pointer/generated-location.ts +3 -3
  537. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  538. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  539. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  540. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  541. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  542. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  543. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  544. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  545. package/src/application/transform/ref-type.ts +2 -1
  546. package/src/application/transform/schema/access-flags.ts +5 -2
  547. package/src/application/transform/schema/composition-type.ts +2 -2
  548. package/src/application/transform/schema/enum-rule.ts +6 -2
  549. package/src/application/transform/schema/index-signature-type.ts +31 -0
  550. package/src/application/transform/schema/input-location.ts +35 -0
  551. package/src/application/transform/schema/object-type.ts +22 -12
  552. package/src/application/transform/schema/ref-siblings.ts +76 -0
  553. package/src/application/transform/schema/schema-context.ts +3 -0
  554. package/src/application/transform/schema/schema-transform.ts +6 -3
  555. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  556. package/src/application/transform/schema-comment.ts +5 -1
  557. package/src/application/transform/transform-context.ts +5 -0
  558. package/src/cli/api-logger.ts +17 -0
  559. package/src/cli/api-settings.ts +80 -13
  560. package/src/cli/api-writes.ts +117 -0
  561. package/src/cli/cli-arguments.ts +90 -14
  562. package/src/cli/cli-dependencies.ts +26 -4
  563. package/src/cli/cli-errors.ts +42 -1
  564. package/src/cli/cli-output.ts +195 -15
  565. package/src/cli/main.ts +14 -5
  566. package/src/cli/redocly-apis.ts +177 -52
  567. package/src/cli/ref-limits.ts +21 -2
  568. package/src/cli/run-cli.ts +76 -15
  569. package/src/domain/append-all.ts +10 -0
  570. package/src/domain/cause-secrets.ts +86 -0
  571. package/src/domain/errors.ts +16 -5
  572. package/src/domain/ir/identifier-text.ts +6 -5
  573. package/src/domain/ir/ir-shape.ts +299 -0
  574. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  575. package/src/domain/location-text.ts +12 -0
  576. package/src/domain/openapi/alias-expansion.ts +4 -1
  577. package/src/domain/openapi/discriminated-union.ts +6 -4
  578. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  579. package/src/domain/openapi/document-object.ts +2 -0
  580. package/src/domain/openapi/document-places.ts +78 -0
  581. package/src/domain/openapi/json-pointer.ts +96 -7
  582. package/src/domain/openapi/schema-dialect.ts +22 -0
  583. package/src/domain/openapi/unsupported-features.ts +2 -2
  584. package/src/domain/output-fixes.ts +28 -2
  585. package/src/domain/terminal-text.ts +44 -0
  586. package/src/domain/url-secrets.ts +72 -0
  587. package/src/domain/warnings.ts +1 -0
  588. package/src/types/generator-options.ts +1 -1
  589. package/dist/cli/main.d.cts +0 -2
  590. package/dist/cli/main.d.mts +0 -2
  591. package/dist/cli/main.d.ts +0 -2
  592. package/dist/domain/url-credentials.cjs +0 -10
  593. package/dist/domain/url-credentials.cjs.map +0 -1
  594. package/dist/domain/url-credentials.mjs +0 -8
  595. package/dist/domain/url-credentials.mjs.map +0 -1
  596. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n objectAt: (ref) => ctx.discriminators.objects[ref],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport { canonicalRef } from \"../domain/openapi/json-pointer.js\";\nimport { SCHEMA_DIALECTS } from \"../domain/openapi/schema-dialect.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.\n objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}
@@ -3,10 +3,16 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  const document = require('../application/transform/document/document.cjs');
6
+ const enumNamesGivenBack = require('../application/transform/document/enum-names-given-back.cjs');
7
+ const operationKeysWritten = require('../application/transform/document/operation-keys-written.cjs');
8
+ const pathTemplateRefs = require('../application/transform/document/path-template-refs.cjs');
6
9
  const rootTypeAliases = require('../application/transform/document/root-type-aliases.cjs');
7
10
  const documentFooter = require('../application/transform/footer/document-footer.cjs');
11
+ const enumNameClaims = require('../application/transform/footer/enum-name-claims.cjs');
8
12
  const enumValuesCheck = require('../application/transform/footer/enum-values-check.cjs');
13
+ const operationKeys = require('../application/transform/footer/operation-keys.cjs');
9
14
  const sharedEnumNames = require('../application/transform/footer/shared-enum-names.cjs');
15
+ const schemaDialect = require('../domain/openapi/schema-dialect.cjs');
10
16
  const outputFixes = require('../domain/output-fixes.cjs');
11
17
  const discriminatorEnumNames = require('./discriminator-enum-names.cjs');
12
18
  const documentDeclarations = require('./document-declarations.cjs');
@@ -41,13 +47,28 @@ function enumNameRecorderOf(ctx) {
41
47
  }
42
48
  return ctx.fix?.includes(outputFixes.FIX.DISCRIMINATOR_VALUES) ? new discriminatorEnumNames.FirstSchemaNameRecorder() : null;
43
49
  }
44
- function withSharedEnumNames(document, ctx) {
45
- const recorder = ctx.runFooter === void 0 ? enumNameRecorderOf(ctx) : null;
46
- if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {
50
+ function withRunFooter(document, ctx, names) {
51
+ if (ctx.runFooter !== void 0) {
47
52
  return;
48
53
  }
49
- const names = sharedEnumNamesOf(document, ctx, recorder);
50
- ctx.runFooter = new documentFooter.RunFooter(new footerSink.ContextFooterSink(ctx.injectFooter), true, names);
54
+ const recorder = enumNameRecorderOf(ctx);
55
+ const shared = recorder === null || !ctx.enum || !ctx.dedupeEnums ? null : sharedEnumNamesOf(document, ctx, recorder);
56
+ const sink = new footerSink.ContextFooterSink(ctx.injectFooter);
57
+ ctx.runFooter = shared === null ? new documentFooter.RunFooter(sink, ctx.dedupeEnums, sharedEnumNames.FIRST_SCHEMA_NAMES, names) : new documentFooter.RunFooter(sink, true, shared, names);
58
+ }
59
+ function withEnumNamesGivenBack(parts, names) {
60
+ const footer = parts.footer.filter(footerEntry.isIrDeclaration);
61
+ const renames = names.enums.givenBack(enumNamesGivenBack.namesTheOutputNeeds({ ...parts, footer }));
62
+ if (renames.size === 0) {
63
+ return parts;
64
+ }
65
+ return {
66
+ body: enumNamesGivenBack.withEnumsRenamed(parts.body, renames),
67
+ footer: parts.footer.map(
68
+ (entry) => footerEntry.isIrDeclaration(entry) ? enumNamesGivenBack.withEnumsRenamed([entry], renames)[0] ?? entry : entry
69
+ ),
70
+ closing: enumNamesGivenBack.withEnumsRenamed(parts.closing, renames)
71
+ };
51
72
  }
52
73
  function enumValuesChecked(body, footer, ctx) {
53
74
  if (!ctx.enumValues) {
@@ -61,15 +82,31 @@ function enumValuesChecked(body, footer, ctx) {
61
82
  }
62
83
  return checked.footer;
63
84
  }
85
+ function withTemplateRefs({ body, footer, closing }, keys) {
86
+ return {
87
+ body: pathTemplateRefs.withTemplatePathRefs(body, keys),
88
+ footer: footer.map(
89
+ (entry) => footerEntry.isIrDeclaration(entry) ? pathTemplateRefs.withTemplatePathRefs([entry], keys)[0] ?? entry : entry
90
+ ),
91
+ closing: pathTemplateRefs.withTemplatePathRefs(closing, keys)
92
+ };
93
+ }
64
94
  function transformDocument(schema, ctx) {
65
95
  const document$1 = schema;
66
- withSharedEnumNames(document$1, ctx);
96
+ ctx.schemaDialect = schemaDialect.schemaDialectOf(document$1.openapi);
97
+ const names = {
98
+ enums: new enumNameClaims.EnumNameClaims(enumNamesGivenBack.NAMES_THE_OUTPUT_MAY_NEED),
99
+ operations: new operationKeys.OperationKeys(operationKeysWritten.operationKeysWritten(document$1))
100
+ };
101
+ withRunFooter(document$1, ctx, names);
67
102
  const context = transformContext.createTransformContext(ctx);
68
103
  const rawBody = document.documentBody(document$1, context, () => ctx.injectFooter.filter(footerEntry.isIrDeclaration));
69
- const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
70
- const closing = document.documentClosing(document$1, context, footer.some(isOperations));
71
- const body = rootTypeAliases.renameTakenAliases(rawBody, footer.filter(footerEntry.isIrDeclaration), closing);
72
- return { body, footer, closing };
104
+ const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
105
+ const rawClosing = document.documentClosing(document$1, context, rawFooter.some(isOperations));
106
+ const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };
107
+ const { body, footer, closing } = withEnumNamesGivenBack(parts, names);
108
+ const named = { body: rootTypeAliases.renameTakenAliases(body, footer.filter(footerEntry.isIrDeclaration), closing), footer };
109
+ return withTemplateRefs({ ...named, closing }, pathTemplateRefs.unmatchedTemplateKeys(document$1.paths, context));
73
110
  }
74
111
  function transformSchema(schema, ctx) {
75
112
  return documentDeclarations.documentDeclarations(transformDocument(schema, ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"transform-schema.cjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport {\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/** With a naming fix, `--enum` and `--dedupe-enums`, the run's footer names shared enums. */\nfunction withSharedEnumNames(document: DocumentObject, ctx: RunContext): void {\n const recorder = ctx.runFooter === undefined ? enumNameRecorderOf(ctx) : null;\n if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {\n return;\n }\n const names = sharedEnumNamesOf(document, ctx, recorder);\n ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n withSharedEnumNames(document, ctx);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const closing = documentClosing(document, context, footer.some(isOperations));\n const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);\n return { body, footer, closing };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":["isIrDeclaration","document","RunFooter","ContextFooterSink","createTransformContext","documentBody","FIX","SharedEnumNameRecorder","FirstSchemaNameRecorder","checkedEnumValues","excludedValuesWarning","documentClosing","renameTakenAliases","documentDeclarations"],"mappings":"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"}
1
+ {"version":3,"file":"transform-schema.cjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport {\n NAMES_THE_OUTPUT_MAY_NEED,\n namesTheOutputNeeds,\n withEnumsRenamed,\n} from \"../application/transform/document/enum-names-given-back.js\";\nimport { operationKeysWritten } from \"../application/transform/document/operation-keys-written.js\";\nimport {\n unmatchedTemplateKeys,\n withTemplatePathRefs,\n} from \"../application/transform/document/path-template-refs.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter, type RunFooterNames } from \"../application/transform/footer/document-footer.js\";\nimport { EnumNameClaims } from \"../application/transform/footer/enum-name-claims.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport { OperationKeys } from \"../application/transform/footer/operation-keys.js\";\nimport {\n FIRST_SCHEMA_NAMES,\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { schemaDialectOf } from \"../domain/openapi/schema-dialect.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/**\n * The run's footer: with a naming fix, `--enum` and `--dedupe-enums` it names shared enums. A\n * footer that a call before created on the context is kept.\n */\nfunction withRunFooter(document: DocumentObject, ctx: RunContext, names: RunFooterNames): void {\n if (ctx.runFooter !== undefined) {\n return;\n }\n const recorder = enumNameRecorderOf(ctx);\n const shared =\n recorder === null || !ctx.enum || !ctx.dedupeEnums\n ? null\n : sharedEnumNamesOf(document, ctx, recorder);\n const sink = new ContextFooterSink(ctx.injectFooter);\n ctx.runFooter =\n shared === null\n ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names)\n : new RunFooter(sink, true, shared, names);\n}\n\n/**\n * The document with the enums renamed that gave way to a name the output turned out not to need\n * (`EnumNameClaims`): they get that name back, as before.\n */\nfunction withEnumNamesGivenBack(\n parts: TransformedDocument,\n names: RunFooterNames,\n): TransformedDocument {\n const footer = parts.footer.filter(isIrDeclaration);\n const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));\n if (renames.size === 0) {\n return parts;\n }\n return {\n body: withEnumsRenamed(parts.body, renames),\n footer: parts.footer.map((entry) =>\n isIrDeclaration(entry) ? (withEnumsRenamed([entry], renames)[0] ?? entry) : entry,\n ),\n closing: withEnumsRenamed(parts.closing, renames),\n };\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** The document with its references into templated paths indexed by their templates. */\nfunction withTemplateRefs(\n { body, footer, closing }: TransformedDocument,\n keys: ReadonlyMap<string, string>,\n): TransformedDocument {\n return {\n body: withTemplatePathRefs(body, keys),\n footer: footer.map((entry) =>\n isIrDeclaration(entry) ? (withTemplatePathRefs([entry], keys)[0] ?? entry) : entry,\n ),\n closing: withTemplatePathRefs(closing, keys),\n };\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n ctx.schemaDialect = schemaDialectOf(document.openapi);\n const names: RunFooterNames = {\n enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),\n operations: new OperationKeys(operationKeysWritten(document)),\n };\n withRunFooter(document, ctx, names);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));\n const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };\n const { body, footer, closing } = withEnumNamesGivenBack(parts, names);\n const named = { body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing), footer };\n return withTemplateRefs({ ...named, closing }, unmatchedTemplateKeys(document.paths, context));\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":["isIrDeclaration","document","RunFooter","ContextFooterSink","createTransformContext","documentBody","FIX","SharedEnumNameRecorder","FirstSchemaNameRecorder","FIRST_SCHEMA_NAMES","namesTheOutputNeeds","withEnumsRenamed","checkedEnumValues","excludedValuesWarning","withTemplatePathRefs","schemaDialectOf","EnumNameClaims","NAMES_THE_OUTPUT_MAY_NEED","OperationKeys","operationKeysWritten","documentClosing","renameTakenAliases","unmatchedTemplateKeys","documentDeclarations"],"mappings":"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"}
@@ -1,8 +1,14 @@
1
1
  import { documentBody, documentClosing } from '../application/transform/document/document.mjs';
2
+ import { NAMES_THE_OUTPUT_MAY_NEED, namesTheOutputNeeds, withEnumsRenamed } from '../application/transform/document/enum-names-given-back.mjs';
3
+ import { operationKeysWritten } from '../application/transform/document/operation-keys-written.mjs';
4
+ import { unmatchedTemplateKeys, withTemplatePathRefs } from '../application/transform/document/path-template-refs.mjs';
2
5
  import { renameTakenAliases } from '../application/transform/document/root-type-aliases.mjs';
3
6
  import { RunFooter } from '../application/transform/footer/document-footer.mjs';
7
+ import { EnumNameClaims } from '../application/transform/footer/enum-name-claims.mjs';
4
8
  import { checkedEnumValues } from '../application/transform/footer/enum-values-check.mjs';
5
- import { SharedEnumNameRecorder } from '../application/transform/footer/shared-enum-names.mjs';
9
+ import { OperationKeys } from '../application/transform/footer/operation-keys.mjs';
10
+ import { FIRST_SCHEMA_NAMES, SharedEnumNameRecorder } from '../application/transform/footer/shared-enum-names.mjs';
11
+ import { schemaDialectOf } from '../domain/openapi/schema-dialect.mjs';
6
12
  import { FIX } from '../domain/output-fixes.mjs';
7
13
  import { FirstSchemaNameRecorder } from './discriminator-enum-names.mjs';
8
14
  import { documentDeclarations } from './document-declarations.mjs';
@@ -37,13 +43,28 @@ function enumNameRecorderOf(ctx) {
37
43
  }
38
44
  return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;
39
45
  }
40
- function withSharedEnumNames(document, ctx) {
41
- const recorder = ctx.runFooter === void 0 ? enumNameRecorderOf(ctx) : null;
42
- if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {
46
+ function withRunFooter(document, ctx, names) {
47
+ if (ctx.runFooter !== void 0) {
43
48
  return;
44
49
  }
45
- const names = sharedEnumNamesOf(document, ctx, recorder);
46
- ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);
50
+ const recorder = enumNameRecorderOf(ctx);
51
+ const shared = recorder === null || !ctx.enum || !ctx.dedupeEnums ? null : sharedEnumNamesOf(document, ctx, recorder);
52
+ const sink = new ContextFooterSink(ctx.injectFooter);
53
+ ctx.runFooter = shared === null ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names) : new RunFooter(sink, true, shared, names);
54
+ }
55
+ function withEnumNamesGivenBack(parts, names) {
56
+ const footer = parts.footer.filter(isIrDeclaration);
57
+ const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));
58
+ if (renames.size === 0) {
59
+ return parts;
60
+ }
61
+ return {
62
+ body: withEnumsRenamed(parts.body, renames),
63
+ footer: parts.footer.map(
64
+ (entry) => isIrDeclaration(entry) ? withEnumsRenamed([entry], renames)[0] ?? entry : entry
65
+ ),
66
+ closing: withEnumsRenamed(parts.closing, renames)
67
+ };
47
68
  }
48
69
  function enumValuesChecked(body, footer, ctx) {
49
70
  if (!ctx.enumValues) {
@@ -57,15 +78,31 @@ function enumValuesChecked(body, footer, ctx) {
57
78
  }
58
79
  return checked.footer;
59
80
  }
81
+ function withTemplateRefs({ body, footer, closing }, keys) {
82
+ return {
83
+ body: withTemplatePathRefs(body, keys),
84
+ footer: footer.map(
85
+ (entry) => isIrDeclaration(entry) ? withTemplatePathRefs([entry], keys)[0] ?? entry : entry
86
+ ),
87
+ closing: withTemplatePathRefs(closing, keys)
88
+ };
89
+ }
60
90
  function transformDocument(schema, ctx) {
61
91
  const document = schema;
62
- withSharedEnumNames(document, ctx);
92
+ ctx.schemaDialect = schemaDialectOf(document.openapi);
93
+ const names = {
94
+ enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),
95
+ operations: new OperationKeys(operationKeysWritten(document))
96
+ };
97
+ withRunFooter(document, ctx, names);
63
98
  const context = createTransformContext(ctx);
64
99
  const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));
65
- const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
66
- const closing = documentClosing(document, context, footer.some(isOperations));
67
- const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);
68
- return { body, footer, closing };
100
+ const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);
101
+ const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));
102
+ const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };
103
+ const { body, footer, closing } = withEnumNamesGivenBack(parts, names);
104
+ const named = { body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing), footer };
105
+ return withTemplateRefs({ ...named, closing }, unmatchedTemplateKeys(document.paths, context));
69
106
  }
70
107
  function transformSchema(schema, ctx) {
71
108
  return documentDeclarations(transformDocument(schema, ctx));
@@ -1 +1 @@
1
- {"version":3,"file":"transform-schema.mjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport {\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/** With a naming fix, `--enum` and `--dedupe-enums`, the run's footer names shared enums. */\nfunction withSharedEnumNames(document: DocumentObject, ctx: RunContext): void {\n const recorder = ctx.runFooter === undefined ? enumNameRecorderOf(ctx) : null;\n if (recorder === null || !ctx.enum || !ctx.dedupeEnums) {\n return;\n }\n const names = sharedEnumNamesOf(document, ctx, recorder);\n ctx.runFooter = new RunFooter(new ContextFooterSink(ctx.injectFooter), true, names);\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n withSharedEnumNames(document, ctx);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const footer = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const closing = documentClosing(document, context, footer.some(isOperations));\n const body = renameTakenAliases(rawBody, footer.filter(isIrDeclaration), closing);\n return { body, footer, closing };\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-schema.mjs","sources":["../../src/api/transform-schema.ts"],"sourcesContent":["import type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport { documentBody, documentClosing } from \"../application/transform/document/document.js\";\nimport {\n NAMES_THE_OUTPUT_MAY_NEED,\n namesTheOutputNeeds,\n withEnumsRenamed,\n} from \"../application/transform/document/enum-names-given-back.js\";\nimport { operationKeysWritten } from \"../application/transform/document/operation-keys-written.js\";\nimport {\n unmatchedTemplateKeys,\n withTemplatePathRefs,\n} from \"../application/transform/document/path-template-refs.js\";\nimport { renameTakenAliases } from \"../application/transform/document/root-type-aliases.js\";\nimport { RunFooter, type RunFooterNames } from \"../application/transform/footer/document-footer.js\";\nimport { EnumNameClaims } from \"../application/transform/footer/enum-name-claims.js\";\nimport { checkedEnumValues } from \"../application/transform/footer/enum-values-check.js\";\nimport { OperationKeys } from \"../application/transform/footer/operation-keys.js\";\nimport {\n FIRST_SCHEMA_NAMES,\n SharedEnumNameRecorder,\n type SharedEnumNames,\n} from \"../application/transform/footer/shared-enum-names.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { DocumentObject } from \"../domain/openapi/document-object.js\";\nimport { schemaDialectOf } from \"../domain/openapi/schema-dialect.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type { GlobalContext, OpenAPI3 } from \"../types.js\";\nimport { FirstSchemaNameRecorder } from \"./discriminator-enum-names.js\";\nimport { documentDeclarations, type TransformedDocument } from \"./document-declarations.js\";\nimport { excludedValuesWarning } from \"./enum-values-warnings.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { createTransformContext } from \"./transform-context.js\";\n\nconst OPERATIONS_NAME = \"operations\";\n\n/** Whether a footer entry is named `operations` (any declaration kind, as in the original). */\nfunction isOperations(entry: FooterEntry): boolean {\n const name = isIrDeclaration(entry)\n ? (entry as { name?: string }).name\n : (entry as Partial<ts.InterfaceDeclaration>).name?.escapedText;\n return name === OPERATIONS_NAME;\n}\n\n/** Drops a message: the first pass must not repeat the run's warnings or debug lines. */\nconst dropMessage = (): void => undefined;\nconst DROPPED_MESSAGES = { debug: dropMessage, warn: dropMessage, error: dropMessage };\n\n/** A shared enum name recorder of a first pass, and the names it gives the second. */\ninterface EnumNameRecorder extends SharedEnumNames {\n chosenNames(): SharedEnumNames;\n}\n\n/**\n * The names of shared enums, known only at the end: a first pass transforms the document into a\n * scratch footer that `recorder` watches; its output is dropped. User callbacks run in both\n * passes. The `dedupe-enum-names` fix (ADR-021, upstream #1683) names an enum by all of its\n * schemas; `discriminator-values` keeps the first declaring schema's name\n * (`FirstSchemaNameRecorder`).\n */\nfunction sharedEnumNamesOf(\n document: DocumentObject,\n ctx: RunContext,\n recorder: EnumNameRecorder,\n): SharedEnumNames {\n const injectFooter: FooterEntry[] = [];\n const scratch: RunContext = {\n ...ctx,\n injectFooter,\n runFooter: new RunFooter(new ContextFooterSink(injectFooter), true, recorder),\n logger: DROPPED_MESSAGES,\n legacyCallbackWarnings: new Set(),\n };\n const scratchContext = createTransformContext(scratch);\n documentBody(document, scratchContext, () => injectFooter.filter(isIrDeclaration));\n return recorder.chosenNames();\n}\n\n/** The recorder of the run's fixes, or null where the first schema's name needs no first pass. */\nfunction enumNameRecorderOf(ctx: GlobalContext): EnumNameRecorder | null {\n if (ctx.fix?.includes(FIX.DEDUPE_ENUM_NAMES)) {\n return new SharedEnumNameRecorder();\n }\n return ctx.fix?.includes(FIX.DISCRIMINATOR_VALUES) ? new FirstSchemaNameRecorder() : null;\n}\n\n/**\n * The run's footer: with a naming fix, `--enum` and `--dedupe-enums` it names shared enums. A\n * footer that a call before created on the context is kept.\n */\nfunction withRunFooter(document: DocumentObject, ctx: RunContext, names: RunFooterNames): void {\n if (ctx.runFooter !== undefined) {\n return;\n }\n const recorder = enumNameRecorderOf(ctx);\n const shared =\n recorder === null || !ctx.enum || !ctx.dedupeEnums\n ? null\n : sharedEnumNamesOf(document, ctx, recorder);\n const sink = new ContextFooterSink(ctx.injectFooter);\n ctx.runFooter =\n shared === null\n ? new RunFooter(sink, ctx.dedupeEnums, FIRST_SCHEMA_NAMES, names)\n : new RunFooter(sink, true, shared, names);\n}\n\n/**\n * The document with the enums renamed that gave way to a name the output turned out not to need\n * (`EnumNameClaims`): they get that name back, as before.\n */\nfunction withEnumNamesGivenBack(\n parts: TransformedDocument,\n names: RunFooterNames,\n): TransformedDocument {\n const footer = parts.footer.filter(isIrDeclaration);\n const renames = names.enums.givenBack(namesTheOutputNeeds({ ...parts, footer }));\n if (renames.size === 0) {\n return parts;\n }\n return {\n body: withEnumsRenamed(parts.body, renames),\n footer: parts.footer.map((entry) =>\n isIrDeclaration(entry) ? (withEnumsRenamed([entry], renames)[0] ?? entry) : entry,\n ),\n closing: withEnumsRenamed(parts.closing, renames),\n };\n}\n\n/**\n * With `--enum-values`, arrays whose location type does not hold their values are typed by their\n * values (ADR-027); a location that excludes listed values is a contradiction of the document.\n */\nfunction enumValuesChecked(\n body: readonly IrDeclaration[],\n footer: FooterEntry[],\n ctx: RunContext,\n): FooterEntry[] {\n if (!ctx.enumValues) {\n return footer;\n }\n const checked = checkedEnumValues(footer, body, isIrDeclaration);\n for (const retype of checked.retyped) {\n if (retype.kind === \"excluded\") {\n ctx.logger?.warn(excludedValuesWarning(retype.name, retype.excluded));\n }\n }\n return checked.footer;\n}\n\n/** The document with its references into templated paths indexed by their templates. */\nfunction withTemplateRefs(\n { body, footer, closing }: TransformedDocument,\n keys: ReadonlyMap<string, string>,\n): TransformedDocument {\n return {\n body: withTemplatePathRefs(body, keys),\n footer: footer.map((entry) =>\n isIrDeclaration(entry) ? (withTemplatePathRefs([entry], keys)[0] ?? entry) : entry,\n ),\n closing: withTemplatePathRefs(closing, keys),\n };\n}\n\n/** @internal Root types, the footer, then the closing declarations (Phase 5, step 6). */\nexport function transformDocument(schema: OpenAPI3, ctx: RunContext): TransformedDocument {\n const document = schema as DocumentObject;\n ctx.schemaDialect = schemaDialectOf(document.openapi);\n const names: RunFooterNames = {\n enums: new EnumNameClaims(NAMES_THE_OUTPUT_MAY_NEED),\n operations: new OperationKeys(operationKeysWritten(document)),\n };\n withRunFooter(document, ctx, names);\n const context = createTransformContext(ctx);\n // documentBody registers the enums in the footer, so the footer is read after it.\n const rawBody = documentBody(document, context, () => ctx.injectFooter.filter(isIrDeclaration));\n const rawFooter = enumValuesChecked(rawBody, [...ctx.injectFooter], ctx);\n const rawClosing = documentClosing(document, context, rawFooter.some(isOperations));\n const parts = { body: rawBody, footer: rawFooter, closing: rawClosing };\n const { body, footer, closing } = withEnumNamesGivenBack(parts, names);\n const named = { body: renameTakenAliases(body, footer.filter(isIrDeclaration), closing), footer };\n return withTemplateRefs({ ...named, closing }, unmatchedTemplateKeys(document.paths, context));\n}\n\n/**\n * The whole document as IR declarations (ENGINEERING_PLAN 6.1–6.2); `openapiTS` returns the same\n * for a loaded document.\n */\nexport default function transformSchema(schema: OpenAPI3, ctx: GlobalContext): IrDeclaration[] {\n return documentDeclarations(transformDocument(schema, ctx));\n}\n"],"names":[],"mappings":"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"}
@@ -9,7 +9,12 @@ function isLineBreak(code) {
9
9
  }
10
10
  class TextWriter {
11
11
  #options;
12
- #output = "";
12
+ /**
13
+ * The written parts, joined once at the end. A string built with `+=` is kept by V8 as a tree
14
+ * of its parts, several times the size of the text, for as long as the text is kept (until the
15
+ * CLI writes it); `join` gives one flat string.
16
+ */
17
+ #parts = [];
13
18
  #indent = 0;
14
19
  #isAtLineStart = true;
15
20
  constructor(options) {
@@ -22,7 +27,9 @@ class TextWriter {
22
27
  return this.#options;
23
28
  }
24
29
  get text() {
25
- return this.#output;
30
+ const text = this.#parts.join("");
31
+ this.#parts = [text];
32
+ return text;
26
33
  }
27
34
  increaseIndent() {
28
35
  this.#indent++;
@@ -40,7 +47,7 @@ class TextWriter {
40
47
  }
41
48
  /** Write text exactly as given. */
42
49
  rawWrite(text) {
43
- this.#output += text;
50
+ this.#parts.push(text);
44
51
  this.#updateLineStart(text);
45
52
  }
46
53
  /** End the current line; does nothing when nothing has been written on it yet. */
@@ -1 +1 @@
1
- {"version":3,"file":"text-writer.cjs","sources":["../../../src/application/print/text-writer.ts"],"sourcesContent":["import type { PrintOptions } from \"./print-options.js\";\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\nconst LINE_SEPARATOR = 0x2028;\nconst PARAGRAPH_SEPARATOR = 0x2029;\n\n/** Line breaks as the TypeScript scanner defines them (`isLineBreak`). */\nexport function isLineBreak(code: number): boolean {\n return (\n code === LINE_FEED ||\n code === CARRIAGE_RETURN ||\n code === LINE_SEPARATOR ||\n code === PARAGRAPH_SEPARATOR\n );\n}\n\n/**\n * Output buffer with indentation, modeled on the TypeScript printer's text writer: `write` indents\n * text that starts a line, `rawWrite` never does, and `writeLine` does nothing at the start of a\n * line. Matching these rules is what makes comment re-indentation byte-identical to the original.\n */\nexport class TextWriter {\n readonly #options: PrintOptions;\n #output = \"\";\n #indent = 0;\n #isAtLineStart = true;\n\n constructor(options: PrintOptions) {\n this.#options = options;\n }\n\n get indent(): number {\n return this.#indent;\n }\n\n get options(): PrintOptions {\n return this.#options;\n }\n\n get text(): string {\n return this.#output;\n }\n\n increaseIndent(): void {\n this.#indent++;\n }\n\n decreaseIndent(): void {\n this.#indent--;\n }\n\n /** Write text, indenting it first when it starts a line. */\n write(text: string): void {\n if (text.length === 0) {\n return;\n }\n const prefix = this.#isAtLineStart ? this.indentString(this.#indent) : \"\";\n this.rawWrite(prefix + text);\n }\n\n /** Write text exactly as given. */\n rawWrite(text: string): void {\n this.#output += text;\n this.#updateLineStart(text);\n }\n\n /** End the current line; does nothing when nothing has been written on it yet. */\n writeLine(): void {\n if (!this.#isAtLineStart) {\n this.rawWrite(this.#options.newLine);\n }\n }\n\n indentString(level: number): string {\n return \" \".repeat(level * this.#options.indentSize);\n }\n\n // Like TypeScript: any write leaves the writer mid-line unless the text ends with a line break.\n #updateLineStart(text: string): void {\n this.#isAtLineStart = text.length > 0 && isLineBreak(text.charCodeAt(text.length - 1));\n }\n}\n"],"names":[],"mappings":";;AAEA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAM,eAAA,GAAkB,EAAA;AACxB,MAAM,cAAA,GAAiB,IAAA;AACvB,MAAM,mBAAA,GAAsB,IAAA;AAGrB,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OACE,SAAS,SAAA,IACT,IAAA,KAAS,eAAA,IACT,IAAA,KAAS,kBACT,IAAA,KAAS,mBAAA;AAEb;AAOO,MAAM,UAAA,CAAW;AAAA,EACb,QAAA;AAAA,EACT,OAAA,GAAU,EAAA;AAAA,EACV,OAAA,GAAU,CAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA;AAAA,EAGA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AACvE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,SAAS,IAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,OAAA,IAAW,IAAA;AAChB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa,KAAA,EAAuB;AAClC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACvF;AACF;;;"}
1
+ {"version":3,"file":"text-writer.cjs","sources":["../../../src/application/print/text-writer.ts"],"sourcesContent":["import type { PrintOptions } from \"./print-options.js\";\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\nconst LINE_SEPARATOR = 0x2028;\nconst PARAGRAPH_SEPARATOR = 0x2029;\n\n/** Line breaks as the TypeScript scanner defines them (`isLineBreak`). */\nexport function isLineBreak(code: number): boolean {\n return (\n code === LINE_FEED ||\n code === CARRIAGE_RETURN ||\n code === LINE_SEPARATOR ||\n code === PARAGRAPH_SEPARATOR\n );\n}\n\n/**\n * Output buffer with indentation, modeled on the TypeScript printer's text writer: `write` indents\n * text that starts a line, `rawWrite` never does, and `writeLine` does nothing at the start of a\n * line. Matching these rules is what makes comment re-indentation byte-identical to the original.\n */\nexport class TextWriter {\n readonly #options: PrintOptions;\n /**\n * The written parts, joined once at the end. A string built with `+=` is kept by V8 as a tree\n * of its parts, several times the size of the text, for as long as the text is kept (until the\n * CLI writes it); `join` gives one flat string.\n */\n #parts: string[] = [];\n #indent = 0;\n #isAtLineStart = true;\n\n constructor(options: PrintOptions) {\n this.#options = options;\n }\n\n get indent(): number {\n return this.#indent;\n }\n\n get options(): PrintOptions {\n return this.#options;\n }\n\n get text(): string {\n const text = this.#parts.join(\"\");\n this.#parts = [text];\n return text;\n }\n\n increaseIndent(): void {\n this.#indent++;\n }\n\n decreaseIndent(): void {\n this.#indent--;\n }\n\n /** Write text, indenting it first when it starts a line. */\n write(text: string): void {\n if (text.length === 0) {\n return;\n }\n const prefix = this.#isAtLineStart ? this.indentString(this.#indent) : \"\";\n this.rawWrite(prefix + text);\n }\n\n /** Write text exactly as given. */\n rawWrite(text: string): void {\n this.#parts.push(text);\n this.#updateLineStart(text);\n }\n\n /** End the current line; does nothing when nothing has been written on it yet. */\n writeLine(): void {\n if (!this.#isAtLineStart) {\n this.rawWrite(this.#options.newLine);\n }\n }\n\n indentString(level: number): string {\n return \" \".repeat(level * this.#options.indentSize);\n }\n\n // Like TypeScript: any write leaves the writer mid-line unless the text ends with a line break.\n #updateLineStart(text: string): void {\n this.#isAtLineStart = text.length > 0 && isLineBreak(text.charCodeAt(text.length - 1));\n }\n}\n"],"names":[],"mappings":";;AAEA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAM,eAAA,GAAkB,EAAA;AACxB,MAAM,cAAA,GAAiB,IAAA;AACvB,MAAM,mBAAA,GAAsB,IAAA;AAGrB,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OACE,SAAS,SAAA,IACT,IAAA,KAAS,eAAA,IACT,IAAA,KAAS,kBACT,IAAA,KAAS,mBAAA;AAEb;AAOO,MAAM,UAAA,CAAW;AAAA,EACb,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAmB,EAAC;AAAA,EACpB,OAAA,GAAU,CAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,IAAI,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA;AAAA,EAGA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AACvE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,SAAS,IAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa,KAAA,EAAuB;AAClC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACvF;AACF;;;"}
@@ -7,7 +7,12 @@ function isLineBreak(code) {
7
7
  }
8
8
  class TextWriter {
9
9
  #options;
10
- #output = "";
10
+ /**
11
+ * The written parts, joined once at the end. A string built with `+=` is kept by V8 as a tree
12
+ * of its parts, several times the size of the text, for as long as the text is kept (until the
13
+ * CLI writes it); `join` gives one flat string.
14
+ */
15
+ #parts = [];
11
16
  #indent = 0;
12
17
  #isAtLineStart = true;
13
18
  constructor(options) {
@@ -20,7 +25,9 @@ class TextWriter {
20
25
  return this.#options;
21
26
  }
22
27
  get text() {
23
- return this.#output;
28
+ const text = this.#parts.join("");
29
+ this.#parts = [text];
30
+ return text;
24
31
  }
25
32
  increaseIndent() {
26
33
  this.#indent++;
@@ -38,7 +45,7 @@ class TextWriter {
38
45
  }
39
46
  /** Write text exactly as given. */
40
47
  rawWrite(text) {
41
- this.#output += text;
48
+ this.#parts.push(text);
42
49
  this.#updateLineStart(text);
43
50
  }
44
51
  /** End the current line; does nothing when nothing has been written on it yet. */
@@ -1 +1 @@
1
- {"version":3,"file":"text-writer.mjs","sources":["../../../src/application/print/text-writer.ts"],"sourcesContent":["import type { PrintOptions } from \"./print-options.js\";\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\nconst LINE_SEPARATOR = 0x2028;\nconst PARAGRAPH_SEPARATOR = 0x2029;\n\n/** Line breaks as the TypeScript scanner defines them (`isLineBreak`). */\nexport function isLineBreak(code: number): boolean {\n return (\n code === LINE_FEED ||\n code === CARRIAGE_RETURN ||\n code === LINE_SEPARATOR ||\n code === PARAGRAPH_SEPARATOR\n );\n}\n\n/**\n * Output buffer with indentation, modeled on the TypeScript printer's text writer: `write` indents\n * text that starts a line, `rawWrite` never does, and `writeLine` does nothing at the start of a\n * line. Matching these rules is what makes comment re-indentation byte-identical to the original.\n */\nexport class TextWriter {\n readonly #options: PrintOptions;\n #output = \"\";\n #indent = 0;\n #isAtLineStart = true;\n\n constructor(options: PrintOptions) {\n this.#options = options;\n }\n\n get indent(): number {\n return this.#indent;\n }\n\n get options(): PrintOptions {\n return this.#options;\n }\n\n get text(): string {\n return this.#output;\n }\n\n increaseIndent(): void {\n this.#indent++;\n }\n\n decreaseIndent(): void {\n this.#indent--;\n }\n\n /** Write text, indenting it first when it starts a line. */\n write(text: string): void {\n if (text.length === 0) {\n return;\n }\n const prefix = this.#isAtLineStart ? this.indentString(this.#indent) : \"\";\n this.rawWrite(prefix + text);\n }\n\n /** Write text exactly as given. */\n rawWrite(text: string): void {\n this.#output += text;\n this.#updateLineStart(text);\n }\n\n /** End the current line; does nothing when nothing has been written on it yet. */\n writeLine(): void {\n if (!this.#isAtLineStart) {\n this.rawWrite(this.#options.newLine);\n }\n }\n\n indentString(level: number): string {\n return \" \".repeat(level * this.#options.indentSize);\n }\n\n // Like TypeScript: any write leaves the writer mid-line unless the text ends with a line break.\n #updateLineStart(text: string): void {\n this.#isAtLineStart = text.length > 0 && isLineBreak(text.charCodeAt(text.length - 1));\n }\n}\n"],"names":[],"mappings":"AAEA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAM,eAAA,GAAkB,EAAA;AACxB,MAAM,cAAA,GAAiB,IAAA;AACvB,MAAM,mBAAA,GAAsB,IAAA;AAGrB,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OACE,SAAS,SAAA,IACT,IAAA,KAAS,eAAA,IACT,IAAA,KAAS,kBACT,IAAA,KAAS,mBAAA;AAEb;AAOO,MAAM,UAAA,CAAW;AAAA,EACb,QAAA;AAAA,EACT,OAAA,GAAU,EAAA;AAAA,EACV,OAAA,GAAU,CAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA;AAAA,EAGA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AACvE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,SAAS,IAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,OAAA,IAAW,IAAA;AAChB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa,KAAA,EAAuB;AAClC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACvF;AACF;;"}
1
+ {"version":3,"file":"text-writer.mjs","sources":["../../../src/application/print/text-writer.ts"],"sourcesContent":["import type { PrintOptions } from \"./print-options.js\";\n\nconst LINE_FEED = 0x0a;\nconst CARRIAGE_RETURN = 0x0d;\nconst LINE_SEPARATOR = 0x2028;\nconst PARAGRAPH_SEPARATOR = 0x2029;\n\n/** Line breaks as the TypeScript scanner defines them (`isLineBreak`). */\nexport function isLineBreak(code: number): boolean {\n return (\n code === LINE_FEED ||\n code === CARRIAGE_RETURN ||\n code === LINE_SEPARATOR ||\n code === PARAGRAPH_SEPARATOR\n );\n}\n\n/**\n * Output buffer with indentation, modeled on the TypeScript printer's text writer: `write` indents\n * text that starts a line, `rawWrite` never does, and `writeLine` does nothing at the start of a\n * line. Matching these rules is what makes comment re-indentation byte-identical to the original.\n */\nexport class TextWriter {\n readonly #options: PrintOptions;\n /**\n * The written parts, joined once at the end. A string built with `+=` is kept by V8 as a tree\n * of its parts, several times the size of the text, for as long as the text is kept (until the\n * CLI writes it); `join` gives one flat string.\n */\n #parts: string[] = [];\n #indent = 0;\n #isAtLineStart = true;\n\n constructor(options: PrintOptions) {\n this.#options = options;\n }\n\n get indent(): number {\n return this.#indent;\n }\n\n get options(): PrintOptions {\n return this.#options;\n }\n\n get text(): string {\n const text = this.#parts.join(\"\");\n this.#parts = [text];\n return text;\n }\n\n increaseIndent(): void {\n this.#indent++;\n }\n\n decreaseIndent(): void {\n this.#indent--;\n }\n\n /** Write text, indenting it first when it starts a line. */\n write(text: string): void {\n if (text.length === 0) {\n return;\n }\n const prefix = this.#isAtLineStart ? this.indentString(this.#indent) : \"\";\n this.rawWrite(prefix + text);\n }\n\n /** Write text exactly as given. */\n rawWrite(text: string): void {\n this.#parts.push(text);\n this.#updateLineStart(text);\n }\n\n /** End the current line; does nothing when nothing has been written on it yet. */\n writeLine(): void {\n if (!this.#isAtLineStart) {\n this.rawWrite(this.#options.newLine);\n }\n }\n\n indentString(level: number): string {\n return \" \".repeat(level * this.#options.indentSize);\n }\n\n // Like TypeScript: any write leaves the writer mid-line unless the text ends with a line break.\n #updateLineStart(text: string): void {\n this.#isAtLineStart = text.length > 0 && isLineBreak(text.charCodeAt(text.length - 1));\n }\n}\n"],"names":[],"mappings":"AAEA,MAAM,SAAA,GAAY,EAAA;AAClB,MAAM,eAAA,GAAkB,EAAA;AACxB,MAAM,cAAA,GAAiB,IAAA;AACvB,MAAM,mBAAA,GAAsB,IAAA;AAGrB,SAAS,YAAY,IAAA,EAAuB;AACjD,EAAA,OACE,SAAS,SAAA,IACT,IAAA,KAAS,eAAA,IACT,IAAA,KAAS,kBACT,IAAA,KAAS,mBAAA;AAEb;AAOO,MAAM,UAAA,CAAW;AAAA,EACb,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAmB,EAAC;AAAA,EACpB,OAAA,GAAU,CAAA;AAAA,EACV,cAAA,GAAiB,IAAA;AAAA,EAEjB,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EAClB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,OAAA,GAAwB;AAC1B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,IAAI,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAA,EAAA;AAAA,EACP;AAAA;AAAA,EAGA,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AACvE,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGA,SAAS,IAAA,EAAoB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,GAAkB;AAChB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AACxB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,aAAa,KAAA,EAAuB;AAClC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAAA,EACvF;AACF;;"}
@@ -7,9 +7,10 @@ function isStackOverflowError(error) {
7
7
  return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);
8
8
  }
9
9
  function schemaTooDeepError(step, cause) {
10
+ const wide = step === "load" ? ", and so does an object with more than about 100,000 keys" : "";
10
11
  return new errors.OpenAPITypesafeError({
11
12
  code: errors.ERROR_CODES.SCHEMA_TOO_DEEP,
12
- message: `The schema is nested too deeply to ${step}: the call stack ran out. Both inline schemas and chains of $ref (each schema referring to the next) count; shorten the deepest.`,
13
+ message: `The schema is nested too deeply to ${step}: the call stack ran out. Both inline schemas and chains of $ref (each schema referring to the next) count${wide}; shorten the deepest.`,
13
14
  details: { step },
14
15
  cause
15
16
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stack-overflow.cjs","sources":["../../src/application/stack-overflow.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\n\n/**\n * Deeply nested schemas (ENGINEERING_PLAN 8.5). Loading, bundling, transforming and printing walk\n * schemas recursively, and Redocly follows each `$ref` inside the walk. On the default Node.js\n * stack, about 550 levels of inline schemas or a chain of about 900 `$ref`s (each schema refers to\n * the next) run out of call stack. Real documents stay far below: every YAML or JSON file goes\n * through the YAML parser, which stops at 100 levels, and the whole corpus passes. The overflow is\n * reported as a typed error instead of a `RangeError` with a stack trace.\n */\n\n/** The step that ran out of call stack; named in the message and the details. */\nexport type DeepSchemaStep = \"load\" | \"transform\" | \"print\";\n\n/** V8 and JavaScriptCore (Node.js, Deno, Bun) throw a `RangeError` with this message. */\nconst STACK_OVERFLOW_MESSAGE = /maximum call stack size exceeded/i;\n\n/** Whether a thrown value is a call stack overflow. */\nexport function isStackOverflowError(error: unknown): boolean {\n return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);\n}\n\n/** The typed error for a document nested too deeply for the call stack. */\nexport function schemaTooDeepError(step: DeepSchemaStep, cause: unknown): OpenAPITypesafeError {\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_TOO_DEEP,\n message:\n `The schema is nested too deeply to ${step}: the call stack ran out. Both inline ` +\n \"schemas and chains of $ref (each schema referring to the next) count; shorten the deepest.\",\n details: { step },\n cause,\n });\n}\n\n/** Run a step and report a stack overflow in it as SCHEMA_TOO_DEEP; other errors pass through. */\nexport function withStackOverflowReported<T>(step: DeepSchemaStep, run: () => T): T {\n try {\n return run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n\n/** The asynchronous form of `withStackOverflowReported`. */\nexport async function withStackOverflowReportedAsync<T>(\n step: DeepSchemaStep,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;AAeA,MAAM,sBAAA,GAAyB,mCAAA;AAGxB,SAAS,qBAAqB,KAAA,EAAyB;AAC5D,EAAA,OAAO,KAAA,YAAiB,UAAA,IAAc,sBAAA,CAAuB,IAAA,CAAK,MAAM,OAAO,CAAA;AACjF;AAGO,SAAS,kBAAA,CAAmB,MAAsB,KAAA,EAAsC;AAC7F,EAAA,OAAO,IAAIA,2BAAA,CAAqB;AAAA,IAC9B,MAAMC,kBAAA,CAAY,eAAA;AAAA,IAClB,OAAA,EACE,sCAAsC,IAAI,CAAA,gIAAA,CAAA;AAAA,IAE5C,OAAA,EAAS,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAGO,SAAS,yBAAA,CAA6B,MAAsB,GAAA,EAAiB;AAClF,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,EAAI;AAAA,EACb,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;AAGA,eAAsB,8BAAA,CACpB,MACA,GAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,GAAA,EAAI;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;;;;;"}
1
+ {"version":3,"file":"stack-overflow.cjs","sources":["../../src/application/stack-overflow.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\n\n/**\n * Deeply nested schemas (ENGINEERING_PLAN 8.5). Loading, bundling, transforming and printing walk\n * schemas recursively, and Redocly follows each `$ref` inside the walk. On the default Node.js\n * stack, about 550 levels of inline schemas or a chain of about 900 `$ref`s (each schema refers to\n * the next) run out of call stack. Redocly's walk also passes the keys of an object to one call as\n * arguments, so a single object with more than about 100,000 keys runs out of it while loading.\n * Real documents stay far below: every YAML or JSON file goes through the YAML parser, which stops\n * at 100 levels, and the whole corpus passes. The overflow is reported as a typed error instead of\n * a `RangeError` with a stack trace.\n */\n\n/** The step that ran out of call stack; named in the message and the details. */\nexport type DeepSchemaStep = \"load\" | \"transform\" | \"print\";\n\n/** V8 and JavaScriptCore (Node.js, Deno, Bun) throw a `RangeError` with this message. */\nconst STACK_OVERFLOW_MESSAGE = /maximum call stack size exceeded/i;\n\n/** Whether a thrown value is a call stack overflow. */\nexport function isStackOverflowError(error: unknown): boolean {\n return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);\n}\n\n/** The typed error for a document nested too deeply, or too wide, for the call stack. */\nexport function schemaTooDeepError(step: DeepSchemaStep, cause: unknown): OpenAPITypesafeError {\n const wide = step === \"load\" ? \", and so does an object with more than about 100,000 keys\" : \"\";\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_TOO_DEEP,\n message:\n `The schema is nested too deeply to ${step}: the call stack ran out. Both inline ` +\n `schemas and chains of $ref (each schema referring to the next) count${wide}; shorten ` +\n \"the deepest.\",\n details: { step },\n cause,\n });\n}\n\n/** Run a step and report a stack overflow in it as SCHEMA_TOO_DEEP; other errors pass through. */\nexport function withStackOverflowReported<T>(step: DeepSchemaStep, run: () => T): T {\n try {\n return run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n\n/** The asynchronous form of `withStackOverflowReported`. */\nexport async function withStackOverflowReportedAsync<T>(\n step: DeepSchemaStep,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;AAiBA,MAAM,sBAAA,GAAyB,mCAAA;AAGxB,SAAS,qBAAqB,KAAA,EAAyB;AAC5D,EAAA,OAAO,KAAA,YAAiB,UAAA,IAAc,sBAAA,CAAuB,IAAA,CAAK,MAAM,OAAO,CAAA;AACjF;AAGO,SAAS,kBAAA,CAAmB,MAAsB,KAAA,EAAsC;AAC7F,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAS,2DAAA,GAA8D,EAAA;AAC7F,EAAA,OAAO,IAAIA,2BAAA,CAAqB;AAAA,IAC9B,MAAMC,kBAAA,CAAY,eAAA;AAAA,IAClB,OAAA,EACE,CAAA,mCAAA,EAAsC,IAAI,CAAA,0GAAA,EAC6B,IAAI,CAAA,sBAAA,CAAA;AAAA,IAE7E,OAAA,EAAS,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAGO,SAAS,yBAAA,CAA6B,MAAsB,GAAA,EAAiB;AAClF,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,EAAI;AAAA,EACb,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;AAGA,eAAsB,8BAAA,CACpB,MACA,GAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,GAAA,EAAI;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;;;;;"}
@@ -5,9 +5,10 @@ function isStackOverflowError(error) {
5
5
  return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);
6
6
  }
7
7
  function schemaTooDeepError(step, cause) {
8
+ const wide = step === "load" ? ", and so does an object with more than about 100,000 keys" : "";
8
9
  return new OpenAPITypesafeError({
9
10
  code: ERROR_CODES.SCHEMA_TOO_DEEP,
10
- message: `The schema is nested too deeply to ${step}: the call stack ran out. Both inline schemas and chains of $ref (each schema referring to the next) count; shorten the deepest.`,
11
+ message: `The schema is nested too deeply to ${step}: the call stack ran out. Both inline schemas and chains of $ref (each schema referring to the next) count${wide}; shorten the deepest.`,
11
12
  details: { step },
12
13
  cause
13
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stack-overflow.mjs","sources":["../../src/application/stack-overflow.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\n\n/**\n * Deeply nested schemas (ENGINEERING_PLAN 8.5). Loading, bundling, transforming and printing walk\n * schemas recursively, and Redocly follows each `$ref` inside the walk. On the default Node.js\n * stack, about 550 levels of inline schemas or a chain of about 900 `$ref`s (each schema refers to\n * the next) run out of call stack. Real documents stay far below: every YAML or JSON file goes\n * through the YAML parser, which stops at 100 levels, and the whole corpus passes. The overflow is\n * reported as a typed error instead of a `RangeError` with a stack trace.\n */\n\n/** The step that ran out of call stack; named in the message and the details. */\nexport type DeepSchemaStep = \"load\" | \"transform\" | \"print\";\n\n/** V8 and JavaScriptCore (Node.js, Deno, Bun) throw a `RangeError` with this message. */\nconst STACK_OVERFLOW_MESSAGE = /maximum call stack size exceeded/i;\n\n/** Whether a thrown value is a call stack overflow. */\nexport function isStackOverflowError(error: unknown): boolean {\n return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);\n}\n\n/** The typed error for a document nested too deeply for the call stack. */\nexport function schemaTooDeepError(step: DeepSchemaStep, cause: unknown): OpenAPITypesafeError {\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_TOO_DEEP,\n message:\n `The schema is nested too deeply to ${step}: the call stack ran out. Both inline ` +\n \"schemas and chains of $ref (each schema referring to the next) count; shorten the deepest.\",\n details: { step },\n cause,\n });\n}\n\n/** Run a step and report a stack overflow in it as SCHEMA_TOO_DEEP; other errors pass through. */\nexport function withStackOverflowReported<T>(step: DeepSchemaStep, run: () => T): T {\n try {\n return run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n\n/** The asynchronous form of `withStackOverflowReported`. */\nexport async function withStackOverflowReportedAsync<T>(\n step: DeepSchemaStep,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n"],"names":[],"mappings":";;AAeA,MAAM,sBAAA,GAAyB,mCAAA;AAGxB,SAAS,qBAAqB,KAAA,EAAyB;AAC5D,EAAA,OAAO,KAAA,YAAiB,UAAA,IAAc,sBAAA,CAAuB,IAAA,CAAK,MAAM,OAAO,CAAA;AACjF;AAGO,SAAS,kBAAA,CAAmB,MAAsB,KAAA,EAAsC;AAC7F,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,MAAM,WAAA,CAAY,eAAA;AAAA,IAClB,OAAA,EACE,sCAAsC,IAAI,CAAA,gIAAA,CAAA;AAAA,IAE5C,OAAA,EAAS,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAGO,SAAS,yBAAA,CAA6B,MAAsB,GAAA,EAAiB;AAClF,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,EAAI;AAAA,EACb,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;AAGA,eAAsB,8BAAA,CACpB,MACA,GAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,GAAA,EAAI;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;;"}
1
+ {"version":3,"file":"stack-overflow.mjs","sources":["../../src/application/stack-overflow.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\n\n/**\n * Deeply nested schemas (ENGINEERING_PLAN 8.5). Loading, bundling, transforming and printing walk\n * schemas recursively, and Redocly follows each `$ref` inside the walk. On the default Node.js\n * stack, about 550 levels of inline schemas or a chain of about 900 `$ref`s (each schema refers to\n * the next) run out of call stack. Redocly's walk also passes the keys of an object to one call as\n * arguments, so a single object with more than about 100,000 keys runs out of it while loading.\n * Real documents stay far below: every YAML or JSON file goes through the YAML parser, which stops\n * at 100 levels, and the whole corpus passes. The overflow is reported as a typed error instead of\n * a `RangeError` with a stack trace.\n */\n\n/** The step that ran out of call stack; named in the message and the details. */\nexport type DeepSchemaStep = \"load\" | \"transform\" | \"print\";\n\n/** V8 and JavaScriptCore (Node.js, Deno, Bun) throw a `RangeError` with this message. */\nconst STACK_OVERFLOW_MESSAGE = /maximum call stack size exceeded/i;\n\n/** Whether a thrown value is a call stack overflow. */\nexport function isStackOverflowError(error: unknown): boolean {\n return error instanceof RangeError && STACK_OVERFLOW_MESSAGE.test(error.message);\n}\n\n/** The typed error for a document nested too deeply, or too wide, for the call stack. */\nexport function schemaTooDeepError(step: DeepSchemaStep, cause: unknown): OpenAPITypesafeError {\n const wide = step === \"load\" ? \", and so does an object with more than about 100,000 keys\" : \"\";\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_TOO_DEEP,\n message:\n `The schema is nested too deeply to ${step}: the call stack ran out. Both inline ` +\n `schemas and chains of $ref (each schema referring to the next) count${wide}; shorten ` +\n \"the deepest.\",\n details: { step },\n cause,\n });\n}\n\n/** Run a step and report a stack overflow in it as SCHEMA_TOO_DEEP; other errors pass through. */\nexport function withStackOverflowReported<T>(step: DeepSchemaStep, run: () => T): T {\n try {\n return run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n\n/** The asynchronous form of `withStackOverflowReported`. */\nexport async function withStackOverflowReportedAsync<T>(\n step: DeepSchemaStep,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n throw isStackOverflowError(error) ? schemaTooDeepError(step, error) : error;\n }\n}\n"],"names":[],"mappings":";;AAiBA,MAAM,sBAAA,GAAyB,mCAAA;AAGxB,SAAS,qBAAqB,KAAA,EAAyB;AAC5D,EAAA,OAAO,KAAA,YAAiB,UAAA,IAAc,sBAAA,CAAuB,IAAA,CAAK,MAAM,OAAO,CAAA;AACjF;AAGO,SAAS,kBAAA,CAAmB,MAAsB,KAAA,EAAsC;AAC7F,EAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAS,2DAAA,GAA8D,EAAA;AAC7F,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,MAAM,WAAA,CAAY,eAAA;AAAA,IAClB,OAAA,EACE,CAAA,mCAAA,EAAsC,IAAI,CAAA,0GAAA,EAC6B,IAAI,CAAA,sBAAA,CAAA;AAAA,IAE7E,OAAA,EAAS,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAGO,SAAS,yBAAA,CAA6B,MAAsB,GAAA,EAAiB;AAClF,EAAA,IAAI;AACF,IAAA,OAAO,GAAA,EAAI;AAAA,EACb,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;AAGA,eAAsB,8BAAA,CACpB,MACA,GAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,GAAA,EAAI;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,qBAAqB,KAAK,CAAA,GAAI,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAA,GAAI,KAAA;AAAA,EACxE;AACF;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../domain/ir/constructors.cjs');
4
+ const helperTypes = require('./helper-types.cjs');
5
+
6
+ function memberValueTypes(member) {
7
+ if (member.kind === "indexSignature") {
8
+ return [member.type];
9
+ }
10
+ return member.isOptional ? [member.type, constructors.irKeyword("undefined")] : [member.type];
11
+ }
12
+ function declaredValueTypes(type, footer) {
13
+ switch (type.kind) {
14
+ case "object":
15
+ return type.members.flatMap(memberValueTypes);
16
+ case "union":
17
+ case "intersection":
18
+ return type.types.flatMap((member) => declaredValueTypes(member, footer));
19
+ case "reference":
20
+ case "indexedAccess":
21
+ case "raw":
22
+ footer.requirePropertyValues();
23
+ return [constructors.irReference(helperTypes.HELPER_TYPES.propertyValues.name, [type])];
24
+ case "keyword":
25
+ case "stringLiteral":
26
+ case "numberLiteral":
27
+ case "booleanLiteral":
28
+ case "array":
29
+ case "tuple":
30
+ case "readonly":
31
+ return [];
32
+ }
33
+ }
34
+
35
+ exports.declaredValueTypes = declaredValueTypes;
36
+ //# sourceMappingURL=declared-value-types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declared-value-types.cjs","sources":["../../../src/application/transform/declared-value-types.ts"],"sourcesContent":["import { irKeyword, irReference } from \"../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../domain/ir/nodes.js\";\nimport { HELPER_TYPES } from \"./helper-types.js\";\nimport type { FooterDeclarations } from \"./schema/schema-context.js\";\n\n/** The footer part that declares the `PropertyValues` helper type. */\nexport type PropertyValuesFooter = Pick<FooterDeclarations, \"requirePropertyValues\">;\n\nfunction memberValueTypes(member: IrMember): IrType[] {\n if (member.kind === \"indexSignature\") {\n return [member.type];\n }\n return member.isOptional ? [member.type, irKeyword(\"undefined\")] : [member.type];\n}\n\n/**\n * The value types a key of the type can have, read from its IR: the members of object types,\n * through unions and intersections. A reference (a `$ref`, `Omit`, `WithRequired`) or a raw\n * type is read with `PropertyValues`. Primitives, literals and arrays declare no keys.\n */\nexport function declaredValueTypes(type: IrType, footer: PropertyValuesFooter): IrType[] {\n switch (type.kind) {\n case \"object\":\n return type.members.flatMap(memberValueTypes);\n case \"union\":\n case \"intersection\":\n return type.types.flatMap((member) => declaredValueTypes(member, footer));\n case \"reference\":\n case \"indexedAccess\":\n case \"raw\":\n footer.requirePropertyValues();\n return [irReference(HELPER_TYPES.propertyValues.name, [type])];\n case \"keyword\":\n case \"stringLiteral\":\n case \"numberLiteral\":\n case \"booleanLiteral\":\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return [];\n }\n}\n"],"names":["irKeyword","irReference","HELPER_TYPES"],"mappings":";;;;;AAQA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,IAAA,EAAMA,sBAAA,CAAU,WAAW,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,IAAI,CAAA;AACjF;AAOO,SAAS,kBAAA,CAAmB,MAAc,MAAA,EAAwC;AACvF,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAC,WAAW,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC1E,KAAK,WAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,MAAA,CAAO,qBAAA,EAAsB;AAC7B,MAAA,OAAO,CAACC,yBAAYC,wBAAA,CAAa,cAAA,CAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/D,KAAK,SAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;;"}
@@ -0,0 +1,34 @@
1
+ import { irReference, irKeyword } from '../../domain/ir/constructors.mjs';
2
+ import { HELPER_TYPES } from './helper-types.mjs';
3
+
4
+ function memberValueTypes(member) {
5
+ if (member.kind === "indexSignature") {
6
+ return [member.type];
7
+ }
8
+ return member.isOptional ? [member.type, irKeyword("undefined")] : [member.type];
9
+ }
10
+ function declaredValueTypes(type, footer) {
11
+ switch (type.kind) {
12
+ case "object":
13
+ return type.members.flatMap(memberValueTypes);
14
+ case "union":
15
+ case "intersection":
16
+ return type.types.flatMap((member) => declaredValueTypes(member, footer));
17
+ case "reference":
18
+ case "indexedAccess":
19
+ case "raw":
20
+ footer.requirePropertyValues();
21
+ return [irReference(HELPER_TYPES.propertyValues.name, [type])];
22
+ case "keyword":
23
+ case "stringLiteral":
24
+ case "numberLiteral":
25
+ case "booleanLiteral":
26
+ case "array":
27
+ case "tuple":
28
+ case "readonly":
29
+ return [];
30
+ }
31
+ }
32
+
33
+ export { declaredValueTypes };
34
+ //# sourceMappingURL=declared-value-types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declared-value-types.mjs","sources":["../../../src/application/transform/declared-value-types.ts"],"sourcesContent":["import { irKeyword, irReference } from \"../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../domain/ir/nodes.js\";\nimport { HELPER_TYPES } from \"./helper-types.js\";\nimport type { FooterDeclarations } from \"./schema/schema-context.js\";\n\n/** The footer part that declares the `PropertyValues` helper type. */\nexport type PropertyValuesFooter = Pick<FooterDeclarations, \"requirePropertyValues\">;\n\nfunction memberValueTypes(member: IrMember): IrType[] {\n if (member.kind === \"indexSignature\") {\n return [member.type];\n }\n return member.isOptional ? [member.type, irKeyword(\"undefined\")] : [member.type];\n}\n\n/**\n * The value types a key of the type can have, read from its IR: the members of object types,\n * through unions and intersections. A reference (a `$ref`, `Omit`, `WithRequired`) or a raw\n * type is read with `PropertyValues`. Primitives, literals and arrays declare no keys.\n */\nexport function declaredValueTypes(type: IrType, footer: PropertyValuesFooter): IrType[] {\n switch (type.kind) {\n case \"object\":\n return type.members.flatMap(memberValueTypes);\n case \"union\":\n case \"intersection\":\n return type.types.flatMap((member) => declaredValueTypes(member, footer));\n case \"reference\":\n case \"indexedAccess\":\n case \"raw\":\n footer.requirePropertyValues();\n return [irReference(HELPER_TYPES.propertyValues.name, [type])];\n case \"keyword\":\n case \"stringLiteral\":\n case \"numberLiteral\":\n case \"booleanLiteral\":\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return [];\n }\n}\n"],"names":[],"mappings":";;;AAQA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,IAAA,EAAM,SAAA,CAAU,WAAW,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,IAAI,CAAA;AACjF;AAOO,SAAS,kBAAA,CAAmB,MAAc,MAAA,EAAwC;AACvF,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAC,WAAW,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC1E,KAAK,WAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,MAAA,CAAO,qBAAA,EAAsB;AAC7B,MAAA,OAAO,CAAC,YAAY,YAAA,CAAa,cAAA,CAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/D,KAAK,SAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;;"}
@@ -27,7 +27,7 @@ const COMPONENT_TRANSFORMS = {
27
27
  mediaTypes: mediaType.contentEntryType
28
28
  };
29
29
  function componentMember(kind, name, item, context) {
30
- const location = { path: jsonPointer.createRef(["components", kind, name]), schema: item };
30
+ const location = { path: jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, ["components", kind, name]), schema: item };
31
31
  const type = COMPONENT_TRANSFORMS[kind](item, location, context);
32
32
  const custom = context.callbacks.transform(item, location);
33
33
  const property = constructors.irProperty(propertyName.toPropertyName(name), custom?.type ?? type, {