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":"openapi-ts.mjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n const { schema, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const result = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return result;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading.\n */\nexport async function defaultGeneratorPorts(options: GeneratorOptions): Promise<GeneratorPorts> {\n const logger = defaultLogger(options.silent ?? false);\n const redoc = options.redocly ?? (await defaultRedoclyConfig());\n const loader = createRedoclySchemaLoader({\n redoc,\n logger,\n now: monotonicNow,\n remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,\n remoteDocumentLimits: DEFAULT_REMOTE_DOCUMENT_LIMITS,\n });\n return { loader, logger, deprecations: defaultDeprecationReporter(), redoc, now: monotonicNow };\n}\n\n/**\n * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)\n * @param {string|URL|object|Readable} source OpenAPI schema source:\n * - YAML: string\n * - JSON: parsed object\n * - URL: URL to a YAML or JSON file (local or remote)\n * - Readable: Readable stream of YAML or JSON\n */\nexport default async function openapiTS(\n source: SchemaSource,\n options: GeneratorOptions = {},\n): Promise<IrDeclaration[]> {\n return generateDeclarations(source, options, await defaultGeneratorPorts(options));\n}\n"],"names":[],"mappings":";;;;;;AAqBA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,EAAE,QAAQ,GAAA,EAAI,GAAI,MAAM,iBAAA,CAAkB,MAAA,EAAQ,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,SAAS,yBAAA,CAA0B,WAAA,EAAa,MAAM,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AACxF,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,IACX,kDAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,CAAM,KAAI,GAAI;AAAA,GAChB;AACA,EAAA,OAAO,MAAA;AACT;AAMA,eAAsB,sBAAsB,OAAA,EAAoD;AAC9F,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAM,oBAAA,EAAqB;AAC7D,EAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK,YAAA;AAAA,IACL,kBAAA,EAAoB,qBAAA;AAAA,IACpB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAc,4BAA2B,EAAG,KAAA,EAAO,KAAK,YAAA,EAAa;AAChG;AAUA,eAA8B,SAAA,CAC5B,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAO,qBAAqB,MAAA,EAAQ,OAAA,EAAS,MAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AACnF;;"}
1
+ {"version":3,"file":"openapi-ts.mjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading. A given `logger` takes every line, the loader's included.\n */\nexport async function defaultGeneratorPorts(\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): Promise<GeneratorPorts> {\n const redoc = options.redocly ?? (await defaultRedoclyConfig());\n const loader = createRedoclySchemaLoader({\n redoc,\n logger,\n now: monotonicNow,\n remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,\n remoteDocumentLimits: DEFAULT_REMOTE_DOCUMENT_LIMITS,\n });\n return { loader, logger, deprecations: defaultDeprecationReporter(), redoc, now: monotonicNow };\n}\n\n/**\n * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)\n * @param {string|URL|object|Readable} source OpenAPI schema source:\n * - YAML: string\n * - JSON: parsed object\n * - URL: URL to a YAML or JSON file (local or remote)\n * - Readable: Readable stream of YAML or JSON\n */\nexport default async function openapiTS(\n source: SchemaSource,\n options: GeneratorOptions = {},\n): Promise<IrDeclaration[]> {\n return generateDeclarations(source, options, await defaultGeneratorPorts(options));\n}\n"],"names":[],"mappings":";;;;;;AA4BA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,GAAA,KAAQ,MAAM,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,eAAe,yBAAA,CAA0B,WAAA,EAAa,MAAM,eAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC9F,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,IACX,kDAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,CAAM,KAAI,GAAI;AAAA,GAChB;AACA,EAAA,OAAO,EAAE,cAAc,UAAA,EAAW;AACpC;AAGA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG,YAAA;AAC1D;AAMA,eAAsB,sBACpB,OAAA,EACA,MAAA,GAAiB,cAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAC7B;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAM,oBAAA,EAAqB;AAC7D,EAAA,MAAM,SAAS,yBAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAK,YAAA;AAAA,IACL,kBAAA,EAAoB,qBAAA;AAAA,IACpB,oBAAA,EAAsB;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAc,4BAA2B,EAAG,KAAA,EAAO,KAAK,YAAA,EAAa;AAChG;AAUA,eAA8B,SAAA,CAC5B,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAO,qBAAqB,MAAA,EAAQ,OAAA,EAAS,MAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AACnF;;"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ const path = require('node:path');
4
+ const node_url = require('node:url');
5
+ const errors = require('../domain/errors.cjs');
6
+ const locationText = require('../domain/location-text.cjs');
7
+
8
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
9
+
10
+ const path__default = /*#__PURE__*/_interopDefaultCompat(path);
11
+
12
+ const FILE_PROTOCOL = "file:";
13
+ function kindOf(value) {
14
+ if (value instanceof URL) {
15
+ return `a ${value.protocol} URL`;
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return "a list";
19
+ }
20
+ return value === null ? "null" : `a ${typeof value}`;
21
+ }
22
+ function optionInvalid(option, expected, got) {
23
+ return new errors.OpenAPITypesafeError({
24
+ code: errors.ERROR_CODES.OPTION_INVALID,
25
+ message: `The ${option} option must be ${expected}; got ${got}.`,
26
+ details: { option }
27
+ });
28
+ }
29
+ const LOCAL_ROOT_EXPECTED = "a directory path or a file: URL";
30
+ function localRootUrlOf(value, cwd) {
31
+ if (!locationText.hasUrlScheme(value)) {
32
+ return node_url.pathToFileURL(path__default.resolve(node_url.fileURLToPath(cwd), value));
33
+ }
34
+ return URL.parse(value, cwd.href) ?? void 0;
35
+ }
36
+ function localRootOf(value, cwd) {
37
+ const root = typeof value === "string" ? localRootUrlOf(value, cwd) : value;
38
+ if (root instanceof URL && root.protocol === FILE_PROTOCOL) {
39
+ return root;
40
+ }
41
+ const got = root === void 0 ? "a string that is no valid URL" : kindOf(root);
42
+ throw optionInvalid("localRefRoot", LOCAL_ROOT_EXPECTED, got);
43
+ }
44
+ function remoteHostsOf(value) {
45
+ if (!Array.isArray(value)) {
46
+ throw optionInvalid("remoteRefHosts", "a list of hosts", kindOf(value));
47
+ }
48
+ const other = value.find((entry) => typeof entry !== "string");
49
+ if (other !== void 0) {
50
+ throw optionInvalid("remoteRefHosts", "a list of hosts", `a list with ${kindOf(other)}`);
51
+ }
52
+ return value;
53
+ }
54
+ function refAccessOf(options, cwd) {
55
+ const { localRefRoot, remoteRefHosts } = options;
56
+ return {
57
+ ...localRefRoot === void 0 ? {} : { localRoot: localRootOf(localRefRoot, cwd) },
58
+ ...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteHostsOf(remoteRefHosts) }
59
+ };
60
+ }
61
+
62
+ exports.refAccessOf = refAccessOf;
63
+ //# sourceMappingURL=ref-limit-options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-limit-options.cjs","sources":["../../src/api/ref-limit-options.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { RefAccess } from \"../application/ports/schema-loader.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { hasUrlScheme } from \"../domain/location-text.js\";\nimport type { GeneratorOptions } from \"../types.js\";\n\n/**\n * The `$ref` limits of the options (threat model R1, R2, ADR-017), checked before anything loads.\n * A value of another type from JavaScript (`remoteRefHosts: \"a.com\"`, `localRefRoot: new\n * URL(\"https://…\")`) used to fail later as an error of the document.\n */\n\nconst FILE_PROTOCOL = \"file:\";\n\n/** What a value is, for the error; a URL is named by its protocol only, as it may hold secrets. */\nfunction kindOf(value: unknown): string {\n if (value instanceof URL) {\n return `a ${value.protocol} URL`;\n }\n if (Array.isArray(value)) {\n return \"a list\";\n }\n return value === null ? \"null\" : `a ${typeof value}`;\n}\n\nfunction optionInvalid(option: string, expected: string, got: string): OpenAPITypesafeError {\n return new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_INVALID,\n message: `The ${option} option must be ${expected}; got ${got}.`,\n details: { option },\n });\n}\n\nconst LOCAL_ROOT_EXPECTED = \"a directory path or a file: URL\";\n\n/**\n * A string as the CLI reads `--local-ref-root`: a URL when it has a scheme (`file:///specs/`),\n * else a path that resolves against the cwd. Undefined when it does not parse as a URL.\n */\nfunction localRootUrlOf(value: string, cwd: URL): URL | undefined {\n if (!hasUrlScheme(value)) {\n return pathToFileURL(path.resolve(fileURLToPath(cwd), value));\n }\n return URL.parse(value, cwd.href) ?? undefined;\n}\n\n/** The local root as a `file:` URL; the option is set, so it is not undefined. */\nfunction localRootOf(value: unknown, cwd: URL): URL {\n const root = typeof value === \"string\" ? localRootUrlOf(value, cwd) : value;\n if (root instanceof URL && root.protocol === FILE_PROTOCOL) {\n return root;\n }\n const got = root === undefined ? \"a string that is no valid URL\" : kindOf(root);\n throw optionInvalid(\"localRefRoot\", LOCAL_ROOT_EXPECTED, got);\n}\n\nfunction remoteHostsOf(value: unknown): readonly string[] {\n if (!Array.isArray(value)) {\n throw optionInvalid(\"remoteRefHosts\", \"a list of hosts\", kindOf(value));\n }\n const other = value.find((entry) => typeof entry !== \"string\");\n if (other !== undefined) {\n throw optionInvalid(\"remoteRefHosts\", \"a list of hosts\", `a list with ${kindOf(other)}`);\n }\n return value;\n}\n\n/** The limits of the options; fails with `OPTION_INVALID` for a value of another type. */\nexport function refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n return {\n ...(localRefRoot === undefined ? {} : { localRoot: localRootOf(localRefRoot, cwd) }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteHostsOf(remoteRefHosts) }),\n };\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","hasUrlScheme","pathToFileURL","path","fileURLToPath"],"mappings":";;;;;;;;;;;AAaA,MAAM,aAAA,GAAgB,OAAA;AAGtB,SAAS,OAAO,KAAA,EAAwB;AACtC,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,OAAO,CAAA,EAAA,EAAK,MAAM,QAAQ,CAAA,IAAA,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,KAAU,IAAA,GAAO,MAAA,GAAS,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,CAAA;AACpD;AAEA,SAAS,aAAA,CAAc,MAAA,EAAgB,QAAA,EAAkB,GAAA,EAAmC;AAC1F,EAAA,OAAO,IAAIA,2BAAA,CAAqB;AAAA,IAC9B,MAAMC,kBAAA,CAAY,cAAA;AAAA,IAClB,SAAS,CAAA,IAAA,EAAO,MAAM,CAAA,gBAAA,EAAmB,QAAQ,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,IAC7D,OAAA,EAAS,EAAE,MAAA;AAAO,GACnB,CAAA;AACH;AAEA,MAAM,mBAAA,GAAsB,iCAAA;AAM5B,SAAS,cAAA,CAAe,OAAe,GAAA,EAA2B;AAChE,EAAA,IAAI,CAACC,yBAAA,CAAa,KAAK,CAAA,EAAG;AACxB,IAAA,OAAOC,uBAAcC,aAAA,CAAK,OAAA,CAAQC,uBAAc,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AACvC;AAGA,SAAS,WAAA,CAAY,OAAgB,GAAA,EAAe;AAClD,EAAA,MAAM,OAAO,OAAO,KAAA,KAAU,WAAW,cAAA,CAAe,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AACtE,EAAA,IAAI,IAAA,YAAgB,GAAA,IAAO,IAAA,CAAK,QAAA,KAAa,aAAA,EAAe;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,MAAA,GAAY,+BAAA,GAAkC,OAAO,IAAI,CAAA;AAC9E,EAAA,MAAM,aAAA,CAAc,cAAA,EAAgB,mBAAA,EAAqB,GAAG,CAAA;AAC9D;AAEA,SAAS,cAAc,KAAA,EAAmC;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,aAAA,CAAc,gBAAA,EAAkB,iBAAA,EAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,KAAU,OAAO,UAAU,QAAQ,CAAA;AAC7D,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,cAAc,gBAAA,EAAkB,iBAAA,EAAmB,eAAe,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,WAAA,CAAY,SAA2B,GAAA,EAAqB;AAC1E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,OAAA;AACzC,EAAA,OAAO;AAAA,IACL,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,WAAA,CAAY,YAAA,EAAc,GAAG,CAAA,EAAE;AAAA,IAClF,GAAI,mBAAmB,MAAA,GAAY,KAAK,EAAE,WAAA,EAAa,aAAA,CAAc,cAAc,CAAA;AAAE,GACvF;AACF;;"}
@@ -0,0 +1,57 @@
1
+ import path from 'node:path';
2
+ import { pathToFileURL, fileURLToPath } from 'node:url';
3
+ import { OpenAPITypesafeError, ERROR_CODES } from '../domain/errors.mjs';
4
+ import { hasUrlScheme } from '../domain/location-text.mjs';
5
+
6
+ const FILE_PROTOCOL = "file:";
7
+ function kindOf(value) {
8
+ if (value instanceof URL) {
9
+ return `a ${value.protocol} URL`;
10
+ }
11
+ if (Array.isArray(value)) {
12
+ return "a list";
13
+ }
14
+ return value === null ? "null" : `a ${typeof value}`;
15
+ }
16
+ function optionInvalid(option, expected, got) {
17
+ return new OpenAPITypesafeError({
18
+ code: ERROR_CODES.OPTION_INVALID,
19
+ message: `The ${option} option must be ${expected}; got ${got}.`,
20
+ details: { option }
21
+ });
22
+ }
23
+ const LOCAL_ROOT_EXPECTED = "a directory path or a file: URL";
24
+ function localRootUrlOf(value, cwd) {
25
+ if (!hasUrlScheme(value)) {
26
+ return pathToFileURL(path.resolve(fileURLToPath(cwd), value));
27
+ }
28
+ return URL.parse(value, cwd.href) ?? void 0;
29
+ }
30
+ function localRootOf(value, cwd) {
31
+ const root = typeof value === "string" ? localRootUrlOf(value, cwd) : value;
32
+ if (root instanceof URL && root.protocol === FILE_PROTOCOL) {
33
+ return root;
34
+ }
35
+ const got = root === void 0 ? "a string that is no valid URL" : kindOf(root);
36
+ throw optionInvalid("localRefRoot", LOCAL_ROOT_EXPECTED, got);
37
+ }
38
+ function remoteHostsOf(value) {
39
+ if (!Array.isArray(value)) {
40
+ throw optionInvalid("remoteRefHosts", "a list of hosts", kindOf(value));
41
+ }
42
+ const other = value.find((entry) => typeof entry !== "string");
43
+ if (other !== void 0) {
44
+ throw optionInvalid("remoteRefHosts", "a list of hosts", `a list with ${kindOf(other)}`);
45
+ }
46
+ return value;
47
+ }
48
+ function refAccessOf(options, cwd) {
49
+ const { localRefRoot, remoteRefHosts } = options;
50
+ return {
51
+ ...localRefRoot === void 0 ? {} : { localRoot: localRootOf(localRefRoot, cwd) },
52
+ ...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteHostsOf(remoteRefHosts) }
53
+ };
54
+ }
55
+
56
+ export { refAccessOf };
57
+ //# sourceMappingURL=ref-limit-options.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-limit-options.mjs","sources":["../../src/api/ref-limit-options.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { RefAccess } from \"../application/ports/schema-loader.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { hasUrlScheme } from \"../domain/location-text.js\";\nimport type { GeneratorOptions } from \"../types.js\";\n\n/**\n * The `$ref` limits of the options (threat model R1, R2, ADR-017), checked before anything loads.\n * A value of another type from JavaScript (`remoteRefHosts: \"a.com\"`, `localRefRoot: new\n * URL(\"https://…\")`) used to fail later as an error of the document.\n */\n\nconst FILE_PROTOCOL = \"file:\";\n\n/** What a value is, for the error; a URL is named by its protocol only, as it may hold secrets. */\nfunction kindOf(value: unknown): string {\n if (value instanceof URL) {\n return `a ${value.protocol} URL`;\n }\n if (Array.isArray(value)) {\n return \"a list\";\n }\n return value === null ? \"null\" : `a ${typeof value}`;\n}\n\nfunction optionInvalid(option: string, expected: string, got: string): OpenAPITypesafeError {\n return new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_INVALID,\n message: `The ${option} option must be ${expected}; got ${got}.`,\n details: { option },\n });\n}\n\nconst LOCAL_ROOT_EXPECTED = \"a directory path or a file: URL\";\n\n/**\n * A string as the CLI reads `--local-ref-root`: a URL when it has a scheme (`file:///specs/`),\n * else a path that resolves against the cwd. Undefined when it does not parse as a URL.\n */\nfunction localRootUrlOf(value: string, cwd: URL): URL | undefined {\n if (!hasUrlScheme(value)) {\n return pathToFileURL(path.resolve(fileURLToPath(cwd), value));\n }\n return URL.parse(value, cwd.href) ?? undefined;\n}\n\n/** The local root as a `file:` URL; the option is set, so it is not undefined. */\nfunction localRootOf(value: unknown, cwd: URL): URL {\n const root = typeof value === \"string\" ? localRootUrlOf(value, cwd) : value;\n if (root instanceof URL && root.protocol === FILE_PROTOCOL) {\n return root;\n }\n const got = root === undefined ? \"a string that is no valid URL\" : kindOf(root);\n throw optionInvalid(\"localRefRoot\", LOCAL_ROOT_EXPECTED, got);\n}\n\nfunction remoteHostsOf(value: unknown): readonly string[] {\n if (!Array.isArray(value)) {\n throw optionInvalid(\"remoteRefHosts\", \"a list of hosts\", kindOf(value));\n }\n const other = value.find((entry) => typeof entry !== \"string\");\n if (other !== undefined) {\n throw optionInvalid(\"remoteRefHosts\", \"a list of hosts\", `a list with ${kindOf(other)}`);\n }\n return value;\n}\n\n/** The limits of the options; fails with `OPTION_INVALID` for a value of another type. */\nexport function refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n return {\n ...(localRefRoot === undefined ? {} : { localRoot: localRootOf(localRefRoot, cwd) }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteHostsOf(remoteRefHosts) }),\n };\n}\n"],"names":[],"mappings":";;;;;AAaA,MAAM,aAAA,GAAgB,OAAA;AAGtB,SAAS,OAAO,KAAA,EAAwB;AACtC,EAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,IAAA,OAAO,CAAA,EAAA,EAAK,MAAM,QAAQ,CAAA,IAAA,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,KAAU,IAAA,GAAO,MAAA,GAAS,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,CAAA;AACpD;AAEA,SAAS,aAAA,CAAc,MAAA,EAAgB,QAAA,EAAkB,GAAA,EAAmC;AAC1F,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,MAAM,WAAA,CAAY,cAAA;AAAA,IAClB,SAAS,CAAA,IAAA,EAAO,MAAM,CAAA,gBAAA,EAAmB,QAAQ,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,IAC7D,OAAA,EAAS,EAAE,MAAA;AAAO,GACnB,CAAA;AACH;AAEA,MAAM,mBAAA,GAAsB,iCAAA;AAM5B,SAAS,cAAA,CAAe,OAAe,GAAA,EAA2B;AAChE,EAAA,IAAI,CAAC,YAAA,CAAa,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,cAAc,IAAA,CAAK,OAAA,CAAQ,cAAc,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AACvC;AAGA,SAAS,WAAA,CAAY,OAAgB,GAAA,EAAe;AAClD,EAAA,MAAM,OAAO,OAAO,KAAA,KAAU,WAAW,cAAA,CAAe,KAAA,EAAO,GAAG,CAAA,GAAI,KAAA;AACtE,EAAA,IAAI,IAAA,YAAgB,GAAA,IAAO,IAAA,CAAK,QAAA,KAAa,aAAA,EAAe;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,IAAA,KAAS,MAAA,GAAY,+BAAA,GAAkC,OAAO,IAAI,CAAA;AAC9E,EAAA,MAAM,aAAA,CAAc,cAAA,EAAgB,mBAAA,EAAqB,GAAG,CAAA;AAC9D;AAEA,SAAS,cAAc,KAAA,EAAmC;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,aAAA,CAAc,gBAAA,EAAkB,iBAAA,EAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,KAAU,OAAO,UAAU,QAAQ,CAAA;AAC7D,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,cAAc,gBAAA,EAAkB,iBAAA,EAAmB,eAAe,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACzF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,WAAA,CAAY,SAA2B,GAAA,EAAqB;AAC1E,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,OAAA;AACzC,EAAA,OAAO;AAAA,IACL,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAW,WAAA,CAAY,YAAA,EAAc,GAAG,CAAA,EAAE;AAAA,IAClF,GAAI,mBAAmB,MAAA,GAAY,KAAK,EAAE,WAAA,EAAa,aAAA,CAAc,cAAc,CAAA;AAAE,GACvF;AACF;;"}
@@ -5,58 +5,82 @@ const loadTypescript = require('../adapters/type-ast-bridge/load-typescript.cjs'
5
5
  const typescriptToIr = require('../adapters/type-ast-bridge/typescript-to-ir.cjs');
6
6
  const errors = require('../domain/errors.cjs');
7
7
  const constructors = require('../domain/ir/constructors.cjs');
8
+ const irShape = require('../domain/ir/ir-shape.cjs');
8
9
  const legacyCallbackWarning = require('./legacy-callback-warning.cjs');
9
10
  const typeHelpers = require('./type-helpers.cjs');
10
11
 
12
+ const LEGACY_PROPERTY_PROBLEM = "a property with syntax the generator cannot read";
11
13
  class UnreadablePropertyError extends errors.OpenAPITypesafeError {
12
- constructor(path) {
14
+ constructor(path, problem = LEGACY_PROPERTY_PROBLEM) {
13
15
  super({
14
16
  code: errors.ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
15
- message: `transformProperty at ${path} returned a property with syntax the generator cannot read`,
17
+ message: `transformProperty at ${path} returned ${problem}`,
16
18
  details: { callback: "transformProperty", path }
17
19
  });
18
20
  this.name = "UnreadablePropertyError";
19
21
  }
20
22
  }
21
23
  class UnreadableTypeError extends errors.OpenAPITypesafeError {
22
- constructor(callback, path) {
24
+ constructor(callback, path, expected = "a TypeScript node") {
23
25
  super({
24
26
  code: errors.ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
25
- message: `${callback} at ${path} returned a value that is not a TypeScript node`,
27
+ message: `${callback} at ${path} returned a value that is not ${expected}`,
26
28
  details: { callback, path }
27
29
  });
28
30
  this.name = "UnreadableTypeError";
29
31
  }
30
32
  }
33
+ const IR_TYPE_EXPECTED = "an IR type or non-empty type text";
34
+ const IR_PROPERTY_PROBLEM = "a value that is not an IR property the generator can print";
31
35
  function nodeOptions(ctx, location) {
32
36
  return { ...location, ctx };
33
37
  }
34
38
  function schemaCallbacks(ctx) {
35
39
  return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);
36
40
  }
37
- function fromCallbackType(type) {
38
- return typeof type === "string" ? constructors.irRaw(type) : type;
41
+ function fromCallbackType(callback, type, location) {
42
+ const candidate = typeof type === "string" ? constructors.irRaw(type) : type;
43
+ if (!irShape.isPrintableIrType(candidate)) {
44
+ throw new UnreadableTypeError(callback, location.path, IR_TYPE_EXPECTED);
45
+ }
46
+ return candidate;
39
47
  }
40
- function irCustomType(result) {
48
+ function irCustomType(result, location) {
41
49
  if (result === void 0 || result === null) {
42
50
  return null;
43
51
  }
44
52
  if (typeof result === "object" && "schema" in result) {
45
- return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };
53
+ const { schema, questionToken } = result;
54
+ return {
55
+ type: fromCallbackType("transform", schema, location),
56
+ isOptional: Boolean(questionToken)
57
+ };
58
+ }
59
+ return { type: fromCallbackType("transform", result, location), isOptional: false };
60
+ }
61
+ function irProperty(result, location) {
62
+ if (result === void 0 || result === null) {
63
+ return null;
64
+ }
65
+ if (!irShape.isPrintableIrProperty(result)) {
66
+ throw new UnreadablePropertyError(location.path, IR_PROPERTY_PROBLEM);
46
67
  }
47
- return { type: fromCallbackType(result), isOptional: false };
68
+ return result;
48
69
  }
49
70
  function irSchemaCallbacks(ctx) {
50
71
  const transform = ctx.transform;
51
72
  const postTransform = ctx.postTransform;
52
73
  const transformProperty = ctx.transformProperty;
53
74
  return {
54
- transform: (schema, location) => transform ? irCustomType(transform(schema, nodeOptions(ctx, location))) : null,
75
+ transform: (schema, location) => transform ? irCustomType(transform(schema, nodeOptions(ctx, location)), location) : null,
55
76
  postTransform(type, location) {
56
77
  const result = postTransform?.(type, nodeOptions(ctx, location));
57
- return result === void 0 ? null : fromCallbackType(result);
78
+ return result === void 0 ? null : fromCallbackType("postTransform", result, location);
58
79
  },
59
- transformProperty: (property, schema, location) => transformProperty?.(property, schema, nodeOptions(ctx, location)) ?? null
80
+ transformProperty: (property, schema, location) => transformProperty ? irProperty(
81
+ transformProperty(property, schema, nodeOptions(ctx, location)),
82
+ location
83
+ ) : null
60
84
  };
61
85
  }
62
86
  function readResultType(callback, result, location) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema-callbacks.cjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrCallbackType,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message:\n `transformProperty at ${path} returned a property ` +\n \"with syntax the generator cannot read\",\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(callback: \"transform\" | \"postTransform\", path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not a TypeScript node`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/** An IR callback type; text is a raw type, printed as written. */\nfunction fromCallbackType(type: IrCallbackType): IrType {\n return typeof type === \"string\" ? irRaw(type) : type;\n}\n\nfunction irCustomType(result: ReturnType<IrTransform>): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };\n }\n return { type: fromCallbackType(result), isOptional: false };\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)))\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(result);\n },\n transformProperty: (property, schema, location) =>\n transformProperty?.(property, schema as SchemaObject, nodeOptions(ctx, location)) ?? null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irRaw","toIrType","warnLegacyCallback","toTypeNode","loadTypeScript","toPropertySignature","fromPropertySignature"],"mappings":"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"}
1
+ {"version":3,"file":"schema-callbacks.cjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport { isPrintableIrProperty, isPrintableIrType } from \"../domain/ir/ir-shape.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\n/** What a legacy `transformProperty` result fails to be. */\nconst LEGACY_PROPERTY_PROBLEM = \"a property with syntax the generator cannot read\";\n\n/** A `transformProperty` result the generator cannot print as a property. */\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, problem = LEGACY_PROPERTY_PROBLEM) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `transformProperty at ${path} returned ${problem}`,\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(\n callback: \"transform\" | \"postTransform\",\n path: string | undefined,\n expected = \"a TypeScript node\",\n ) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not ${expected}`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\n/** What an IR type result must be (docs/node.md, IR callbacks). */\nconst IR_TYPE_EXPECTED = \"an IR type or non-empty type text\";\n\n/** What an IR property result must be. */\nconst IR_PROPERTY_PROBLEM = \"a value that is not an IR property the generator can print\";\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/**\n * An IR callback type; text is a raw type, printed as written. Any other value, and IR the\n * printer cannot write as TypeScript, fails with `CALLBACK_RESULT_UNREADABLE` (`ir-shape.ts`).\n */\nfunction fromCallbackType(\n callback: \"transform\" | \"postTransform\",\n type: unknown,\n location: SchemaLocation,\n): IrType {\n const candidate = typeof type === \"string\" ? irRaw(type) : type;\n if (!isPrintableIrType(candidate)) {\n throw new UnreadableTypeError(callback, location.path, IR_TYPE_EXPECTED);\n }\n return candidate;\n}\n\nfunction irCustomType(result: unknown, location: SchemaLocation): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n const { schema, questionToken } = result as { schema: unknown; questionToken?: unknown };\n return {\n type: fromCallbackType(\"transform\", schema, location),\n isOptional: Boolean(questionToken),\n };\n }\n return { type: fromCallbackType(\"transform\", result, location), isOptional: false };\n}\n\nfunction irProperty(result: unknown, location: SchemaLocation): IrPropertySignature | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (!isPrintableIrProperty(result)) {\n throw new UnreadablePropertyError(location.path, IR_PROPERTY_PROBLEM);\n }\n return result;\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`. The results are checked, since\n * JavaScript callers can return any value.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)), location)\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(\"postTransform\", result, location);\n },\n transformProperty: (property, schema, location) =>\n transformProperty\n ? irProperty(\n transformProperty(property, schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irRaw","isPrintableIrType","isPrintableIrProperty","toIrType","warnLegacyCallback","toTypeNode","loadTypeScript","toPropertySignature","fromPropertySignature"],"mappings":"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"}
@@ -3,58 +3,82 @@ import { loadTypeScript } from '../adapters/type-ast-bridge/load-typescript.mjs'
3
3
  import { fromPropertySignature } from '../adapters/type-ast-bridge/typescript-to-ir.mjs';
4
4
  import { OpenAPITypesafeError, ERROR_CODES } from '../domain/errors.mjs';
5
5
  import { irRaw } from '../domain/ir/constructors.mjs';
6
+ import { isPrintableIrProperty, isPrintableIrType } from '../domain/ir/ir-shape.mjs';
6
7
  import { warnLegacyCallback } from './legacy-callback-warning.mjs';
7
8
  import { toIrType } from './type-helpers.mjs';
8
9
 
10
+ const LEGACY_PROPERTY_PROBLEM = "a property with syntax the generator cannot read";
9
11
  class UnreadablePropertyError extends OpenAPITypesafeError {
10
- constructor(path) {
12
+ constructor(path, problem = LEGACY_PROPERTY_PROBLEM) {
11
13
  super({
12
14
  code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
13
- message: `transformProperty at ${path} returned a property with syntax the generator cannot read`,
15
+ message: `transformProperty at ${path} returned ${problem}`,
14
16
  details: { callback: "transformProperty", path }
15
17
  });
16
18
  this.name = "UnreadablePropertyError";
17
19
  }
18
20
  }
19
21
  class UnreadableTypeError extends OpenAPITypesafeError {
20
- constructor(callback, path) {
22
+ constructor(callback, path, expected = "a TypeScript node") {
21
23
  super({
22
24
  code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,
23
- message: `${callback} at ${path} returned a value that is not a TypeScript node`,
25
+ message: `${callback} at ${path} returned a value that is not ${expected}`,
24
26
  details: { callback, path }
25
27
  });
26
28
  this.name = "UnreadableTypeError";
27
29
  }
28
30
  }
31
+ const IR_TYPE_EXPECTED = "an IR type or non-empty type text";
32
+ const IR_PROPERTY_PROBLEM = "a value that is not an IR property the generator can print";
29
33
  function nodeOptions(ctx, location) {
30
34
  return { ...location, ctx };
31
35
  }
32
36
  function schemaCallbacks(ctx) {
33
37
  return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);
34
38
  }
35
- function fromCallbackType(type) {
36
- return typeof type === "string" ? irRaw(type) : type;
39
+ function fromCallbackType(callback, type, location) {
40
+ const candidate = typeof type === "string" ? irRaw(type) : type;
41
+ if (!isPrintableIrType(candidate)) {
42
+ throw new UnreadableTypeError(callback, location.path, IR_TYPE_EXPECTED);
43
+ }
44
+ return candidate;
37
45
  }
38
- function irCustomType(result) {
46
+ function irCustomType(result, location) {
39
47
  if (result === void 0 || result === null) {
40
48
  return null;
41
49
  }
42
50
  if (typeof result === "object" && "schema" in result) {
43
- return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };
51
+ const { schema, questionToken } = result;
52
+ return {
53
+ type: fromCallbackType("transform", schema, location),
54
+ isOptional: Boolean(questionToken)
55
+ };
56
+ }
57
+ return { type: fromCallbackType("transform", result, location), isOptional: false };
58
+ }
59
+ function irProperty(result, location) {
60
+ if (result === void 0 || result === null) {
61
+ return null;
62
+ }
63
+ if (!isPrintableIrProperty(result)) {
64
+ throw new UnreadablePropertyError(location.path, IR_PROPERTY_PROBLEM);
44
65
  }
45
- return { type: fromCallbackType(result), isOptional: false };
66
+ return result;
46
67
  }
47
68
  function irSchemaCallbacks(ctx) {
48
69
  const transform = ctx.transform;
49
70
  const postTransform = ctx.postTransform;
50
71
  const transformProperty = ctx.transformProperty;
51
72
  return {
52
- transform: (schema, location) => transform ? irCustomType(transform(schema, nodeOptions(ctx, location))) : null,
73
+ transform: (schema, location) => transform ? irCustomType(transform(schema, nodeOptions(ctx, location)), location) : null,
53
74
  postTransform(type, location) {
54
75
  const result = postTransform?.(type, nodeOptions(ctx, location));
55
- return result === void 0 ? null : fromCallbackType(result);
76
+ return result === void 0 ? null : fromCallbackType("postTransform", result, location);
56
77
  },
57
- transformProperty: (property, schema, location) => transformProperty?.(property, schema, nodeOptions(ctx, location)) ?? null
78
+ transformProperty: (property, schema, location) => transformProperty ? irProperty(
79
+ transformProperty(property, schema, nodeOptions(ctx, location)),
80
+ location
81
+ ) : null
58
82
  };
59
83
  }
60
84
  function readResultType(callback, result, location) {
@@ -1 +1 @@
1
- {"version":3,"file":"schema-callbacks.mjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrCallbackType,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message:\n `transformProperty at ${path} returned a property ` +\n \"with syntax the generator cannot read\",\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(callback: \"transform\" | \"postTransform\", path: string | undefined) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not a TypeScript node`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/** An IR callback type; text is a raw type, printed as written. */\nfunction fromCallbackType(type: IrCallbackType): IrType {\n return typeof type === \"string\" ? irRaw(type) : type;\n}\n\nfunction irCustomType(result: ReturnType<IrTransform>): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n return { type: fromCallbackType(result.schema), isOptional: Boolean(result.questionToken) };\n }\n return { type: fromCallbackType(result), isOptional: false };\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)))\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(result);\n },\n transformProperty: (property, schema, location) =>\n transformProperty?.(property, schema as SchemaObject, nodeOptions(ctx, location)) ?? null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema-callbacks.mjs","sources":["../../src/api/schema-callbacks.ts"],"sourcesContent":["import { toPropertySignature, toTypeNode } from \"../adapters/type-ast-bridge/ir-to-typescript.js\";\nimport { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { fromPropertySignature } from \"../adapters/type-ast-bridge/typescript-to-ir.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type {\n CustomType,\n SchemaCallbacks,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../domain/errors.js\";\nimport { irRaw } from \"../domain/ir/constructors.js\";\nimport { isPrintableIrProperty, isPrintableIrType } from \"../domain/ir/ir-shape.js\";\nimport type { IrPropertySignature, IrType } from \"../domain/ir/nodes.js\";\nimport type {\n GlobalContext,\n IrPostTransform,\n IrTransform,\n IrTransformProperty,\n LegacyCallbackOptions,\n SchemaObject,\n TransformNodeOptions,\n} from \"../types.js\";\nimport { warnLegacyCallback } from \"./legacy-callback-warning.js\";\nimport { toIrType } from \"./type-helpers.js\";\n\n/**\n * The user's schema callbacks as the transformers call them (ENGINEERING_PLAN 6.3, ADR-004).\n * With `irCallbacks: true` they receive and return IR; otherwise they receive TypeScript nodes and\n * their results are read by the bridge.\n */\n\n/** What a legacy `transformProperty` result fails to be. */\nconst LEGACY_PROPERTY_PROBLEM = \"a property with syntax the generator cannot read\";\n\n/** A `transformProperty` result the generator cannot print as a property. */\nexport class UnreadablePropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, problem = LEGACY_PROPERTY_PROBLEM) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `transformProperty at ${path} returned ${problem}`,\n details: { callback: \"transformProperty\", path },\n });\n this.name = \"UnreadablePropertyError\";\n }\n}\n\n/** A `transform` or `postTransform` result that is neither IR nor a TypeScript node. */\nexport class UnreadableTypeError extends OpenAPITypesafeError {\n constructor(\n callback: \"transform\" | \"postTransform\",\n path: string | undefined,\n expected = \"a TypeScript node\",\n ) {\n super({\n code: ERROR_CODES.CALLBACK_RESULT_UNREADABLE,\n message: `${callback} at ${path} returned a value that is not ${expected}`,\n details: { callback, path },\n });\n this.name = \"UnreadableTypeError\";\n }\n}\n\n/** What an IR type result must be (docs/node.md, IR callbacks). */\nconst IR_TYPE_EXPECTED = \"an IR type or non-empty type text\";\n\n/** What an IR property result must be. */\nconst IR_PROPERTY_PROBLEM = \"a value that is not an IR property the generator can print\";\n\nfunction nodeOptions(ctx: GlobalContext, location: SchemaLocation): TransformNodeOptions {\n return { ...location, ctx } as TransformNodeOptions;\n}\n\n/** The callbacks of the run: IR callbacks when the run asks for them, legacy ones otherwise. */\nexport function schemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n return ctx.irCallbacks ? irSchemaCallbacks(ctx) : legacySchemaCallbacks(ctx);\n}\n\n/**\n * An IR callback type; text is a raw type, printed as written. Any other value, and IR the\n * printer cannot write as TypeScript, fails with `CALLBACK_RESULT_UNREADABLE` (`ir-shape.ts`).\n */\nfunction fromCallbackType(\n callback: \"transform\" | \"postTransform\",\n type: unknown,\n location: SchemaLocation,\n): IrType {\n const candidate = typeof type === \"string\" ? irRaw(type) : type;\n if (!isPrintableIrType(candidate)) {\n throw new UnreadableTypeError(callback, location.path, IR_TYPE_EXPECTED);\n }\n return candidate;\n}\n\nfunction irCustomType(result: unknown, location: SchemaLocation): CustomType | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (typeof result === \"object\" && \"schema\" in result) {\n const { schema, questionToken } = result as { schema: unknown; questionToken?: unknown };\n return {\n type: fromCallbackType(\"transform\", schema, location),\n isOptional: Boolean(questionToken),\n };\n }\n return { type: fromCallbackType(\"transform\", result, location), isOptional: false };\n}\n\nfunction irProperty(result: unknown, location: SchemaLocation): IrPropertySignature | null {\n if (result === undefined || result === null) {\n return null;\n }\n if (!isPrintableIrProperty(result)) {\n throw new UnreadablePropertyError(location.path, IR_PROPERTY_PROBLEM);\n }\n return result;\n}\n\n/**\n * The context fields hold either callback form; `irCallbacks` says which one, so the casts below\n * only name the form the user declared with `OpenAPITSIrOptions`. The results are checked, since\n * JavaScript callers can return any value.\n */\nfunction irSchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as IrTransform | undefined;\n const postTransform = ctx.postTransform as IrPostTransform | undefined;\n const transformProperty = ctx.transformProperty as IrTransformProperty | undefined;\n return {\n transform: (schema, location) =>\n transform\n ? irCustomType(transform(schema as SchemaObject, nodeOptions(ctx, location)), location)\n : null,\n postTransform(type, location) {\n const result = postTransform?.(type, nodeOptions(ctx, location));\n return result === undefined ? null : fromCallbackType(\"postTransform\", result, location);\n },\n transformProperty: (property, schema, location) =>\n transformProperty\n ? irProperty(\n transformProperty(property, schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n };\n}\n\ntype LegacyTransform = NonNullable<LegacyCallbackOptions[\"transform\"]>;\ntype LegacyPostTransform = NonNullable<LegacyCallbackOptions[\"postTransform\"]>;\ntype LegacyTransformProperty = NonNullable<LegacyCallbackOptions[\"transformProperty\"]>;\n\n/** A legacy result type: IR from the helpers as it is; a TypeScript node through the bridge. */\n/**\n * IR nodes have a string `kind`, TypeScript nodes a number. JavaScript callers can return any\n * value, and anything else would crash the TypeScript printer later.\n */\nfunction readResultType(\n callback: \"transform\" | \"postTransform\",\n result: unknown,\n location: SchemaLocation,\n): IrType {\n const kind = (result as { kind?: unknown }).kind;\n if (typeof kind !== \"string\" && typeof kind !== \"number\") {\n throw new UnreadableTypeError(callback, location.path);\n }\n return toIrType(result as IrType | ts.TypeNode);\n}\n\nfunction legacyResultType(ctx: GlobalContext, type: unknown, location: SchemaLocation): IrType {\n const result = readResultType(\"transform\", type, location);\n if (typeof (type as { kind: unknown }).kind !== \"string\") {\n warnLegacyCallback(ctx, \"transform\");\n }\n return result;\n}\n\nfunction legacyCustomType(\n ctx: GlobalContext,\n result: ReturnType<LegacyTransform>,\n location: SchemaLocation,\n): CustomType | null {\n if (!result || typeof result !== \"object\") {\n return null;\n }\n if (\"schema\" in result) {\n return {\n type: legacyResultType(ctx, result.schema, location),\n isOptional: Boolean(result.questionToken),\n };\n }\n return { type: legacyResultType(ctx, result, location), isOptional: false };\n}\n\n/** See `irSchemaCallbacks` for the casts; `typeof` checks keep the original's tolerance. */\nfunction legacySchemaCallbacks(ctx: GlobalContext): SchemaCallbacks {\n const transform = ctx.transform as LegacyTransform | undefined;\n const postTransform = ctx.postTransform as LegacyPostTransform | undefined;\n return {\n transform: (schema, location) =>\n typeof transform === \"function\"\n ? legacyCustomType(\n ctx,\n transform(schema as SchemaObject, nodeOptions(ctx, location)),\n location,\n )\n : null,\n postTransform(type, location) {\n if (typeof postTransform !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"postTransform\");\n const result = postTransform(toTypeNode(loadTypeScript(), type), nodeOptions(ctx, location));\n return result ? readResultType(\"postTransform\", result, location) : null;\n },\n transformProperty: (property, schema, location) =>\n legacyTransformProperty(ctx, property, schema, location),\n };\n}\n\nfunction isIrProperty(\n property: IrPropertySignature | ts.PropertySignature,\n): property is IrPropertySignature {\n return typeof property.kind === \"string\";\n}\n\nfunction legacyTransformProperty(\n ctx: GlobalContext,\n property: IrPropertySignature,\n schema: unknown,\n location: SchemaLocation,\n): IrPropertySignature | null {\n const transformProperty = ctx.transformProperty as LegacyTransformProperty | undefined;\n if (typeof transformProperty !== \"function\") {\n return null;\n }\n warnLegacyCallback(ctx, \"transformProperty\");\n const ts = loadTypeScript();\n const options = nodeOptions(ctx, location);\n const result = transformProperty(\n toPropertySignature(ts, property),\n schema as SchemaObject,\n options,\n );\n if (!result) {\n return null;\n }\n if (isIrProperty(result)) {\n return result;\n }\n // JavaScript callers can return any value, so check the node kind before reading it.\n const converted = ts.isPropertySignature(result) ? fromPropertySignature(ts, result) : null;\n if (converted === null) {\n throw new UnreadablePropertyError(location.path);\n }\n return converted;\n}\n"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@
2
2
 
3
3
  const changeCase = require('change-case');
4
4
  const documentFooter = require('../application/transform/footer/document-footer.cjs');
5
+ const jsonPointer = require('../domain/openapi/json-pointer.cjs');
6
+ const schemaDialect = require('../domain/openapi/schema-dialect.cjs');
5
7
  const defaultPorts = require('./default-ports.cjs');
6
8
  const footerSink = require('./footer-sink.cjs');
7
9
  const schemaCallbacks = require('./schema-callbacks.cjs');
@@ -37,6 +39,7 @@ function transformOptions(ctx) {
37
39
  immutable: ctx.immutable,
38
40
  propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,
39
41
  readWriteMarkers: ctx.readWriteMarkers,
42
+ schemaDialect: ctx.schemaDialect ?? schemaDialect.SCHEMA_DIALECTS.OPENAPI_3_0,
40
43
  generatePathParams: ctx.generatePathParams,
41
44
  pathParamsAsTypes: ctx.pathParamsAsTypes,
42
45
  rootTypes: ctx.rootTypes,
@@ -64,9 +67,10 @@ function createTransformContext(ctx) {
64
67
  options: transformOptions(ctx),
65
68
  refs: { resolve: (ref) => ctx.resolve(ref) },
66
69
  discriminators: {
67
- objectAt: (ref) => ctx.discriminators.objects[ref],
68
- isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),
69
- otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],
70
+ // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.
71
+ objectAt: (ref) => ctx.discriminators.objects[jsonPointer.canonicalRef(ref)],
72
+ isHandled: (ref) => ctx.discriminators.refsHandled.includes(jsonPointer.canonicalRef(ref)),
73
+ otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[jsonPointer.canonicalRef(ref)] ?? [],
70
74
  enumParentOf: (schema) => ctx.discriminators.enumParents?.get(schema)
71
75
  },
72
76
  footer: runFooter(ctx),
@@ -1 +1 @@
1
- {"version":3,"file":"transform-context.cjs","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":["RunFooter","ContextFooterSink","changeCase","defaultLogger","monotonicNow","schemaCallbacks"],"mappings":"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"}
1
+ {"version":3,"file":"transform-context.cjs","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":["SCHEMA_DIALECTS","RunFooter","ContextFooterSink","changeCase","defaultLogger","monotonicNow","canonicalRef","schemaCallbacks"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAS,iBAAiB,GAAA,EAAmC;AAC3D,EAAA,OAAO;AAAA,IACL,sBAAsB,GAAA,CAAI,oBAAA;AAAA,IAC1B,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,YAAA,EAAc,IAAI,YAAA,IAAgB,KAAA;AAAA,IAClC,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,oBAAoB,GAAA,CAAI,kBAAA;AAAA,IACxB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,IACzB,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,IACvB,OAAO,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,IAAO,EAAE,CAAA;AAAA,IAC5B,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,6BAA6B,GAAA,CAAI,2BAAA;AAAA,IACjC,kBAAkB,GAAA,CAAI,gBAAA;AAAA,IACtB,aAAA,EAAe,GAAA,CAAI,aAAA,IAAiBA,6BAAA,CAAgB,WAAA;AAAA,IACpD,oBAAoB,GAAA,CAAI,kBAAA;AAAA,IACxB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,IACvB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,yBAAyB,GAAA,CAAI,uBAAA;AAAA,IAC7B,qBAAqB,GAAA,CAAI,mBAAA;AAAA,IACzB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,eAAe,GAAA,CAAI;AAAA,GACrB;AACF;AAGA,SAAS,UAAU,GAAA,EAAiC;AAClD,EAAA,GAAA,CAAI,SAAA,KAAc,IAAIC,wBAAA,CAAU,IAAIC,6BAAkB,GAAA,CAAI,YAAY,CAAA,EAAG,GAAA,CAAI,WAAW,CAAA;AACxF,EAAA,OAAO,GAAA,CAAI,SAAA;AACb;AAEA,MAAM,MAAA,GAAqB,EAAE,UAAA,EAAY,CAAC,SAASC,qBAAA,CAAW,UAAA,CAAW,IAAI,CAAA,EAAE;AAK/E,SAAS,YAAY,GAAA,EAAuC;AAC1D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,IAAUC,0BAAA,CAAc,IAAI,MAAM,CAAA;AACrD,EAAA,OAAO;AAAA,IACL,GAAA,EAAKC,yBAAA;AAAA,IACL,KAAA,EAAO,CAAC,OAAA,EAAS,UAAA,KAAe,OAAO,KAAA,CAAM,OAAA,EAAS,MAAM,UAAU;AAAA,GACxE;AACF;AAGO,SAAS,uBAAuB,GAAA,EAAmC;AACxE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,iBAAiB,GAAG,CAAA;AAAA,IAC7B,IAAA,EAAM,EAAE,OAAA,EAAS,CAAC,QAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,EAAE;AAAA,IAC3C,cAAA,EAAgB;AAAA;AAAA,MAEd,QAAA,EAAU,CAAC,GAAA,KAAQ,GAAA,CAAI,eAAe,OAAA,CAAQC,wBAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAC/D,SAAA,EAAW,CAAC,GAAA,KAAQ,GAAA,CAAI,eAAe,WAAA,CAAY,QAAA,CAASA,wBAAA,CAAa,GAAG,CAAC,CAAA;AAAA,MAC7E,iBAAA,EAAmB,CAAC,GAAA,KAAQ,GAAA,CAAI,cAAA,CAAe,kBAAkBA,wBAAA,CAAa,GAAG,CAAC,CAAA,IAAK,EAAC;AAAA,MACxF,cAAc,CAAC,MAAA,KACb,IAAI,cAAA,CAAe,WAAA,EAAa,IAAI,MAAM;AAAA,KAC9C;AAAA,IACA,MAAA,EAAQ,UAAU,GAAG,CAAA;AAAA,IACrB,SAAA,EAAWC,gCAAgB,GAAG,CAAA;AAAA,IAC9B,WAAA,EAAa,YAAY,GAAG,CAAA;AAAA,IAC5B,MAAA,EAAQ;AAAA,GACV;AACF;AAGO,SAAS,eAAe,OAAA,EAA+C;AAC5E,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,QAAQ,MAAA,EAAO;AACtD;;;"}
@@ -1,5 +1,7 @@
1
1
  import * as changeCase from 'change-case';
2
2
  import { RunFooter } from '../application/transform/footer/document-footer.mjs';
3
+ import { canonicalRef } from '../domain/openapi/json-pointer.mjs';
4
+ import { SCHEMA_DIALECTS } from '../domain/openapi/schema-dialect.mjs';
3
5
  import { defaultLogger, monotonicNow } from './default-ports.mjs';
4
6
  import { ContextFooterSink } from './footer-sink.mjs';
5
7
  import { schemaCallbacks } from './schema-callbacks.mjs';
@@ -21,6 +23,7 @@ function transformOptions(ctx) {
21
23
  immutable: ctx.immutable,
22
24
  propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,
23
25
  readWriteMarkers: ctx.readWriteMarkers,
26
+ schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,
24
27
  generatePathParams: ctx.generatePathParams,
25
28
  pathParamsAsTypes: ctx.pathParamsAsTypes,
26
29
  rootTypes: ctx.rootTypes,
@@ -48,9 +51,10 @@ function createTransformContext(ctx) {
48
51
  options: transformOptions(ctx),
49
52
  refs: { resolve: (ref) => ctx.resolve(ref) },
50
53
  discriminators: {
51
- objectAt: (ref) => ctx.discriminators.objects[ref],
52
- isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),
53
- otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],
54
+ // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.
55
+ objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],
56
+ isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),
57
+ otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],
54
58
  enumParentOf: (schema) => ctx.discriminators.enumParents?.get(schema)
55
59
  },
56
60
  footer: runFooter(ctx),