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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (448) hide show
  1. package/CHANGELOG.md +1831 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +90 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +90 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +75 -0
  15. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +72 -0
  17. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  19. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  20. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  21. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  22. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  23. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  25. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +14 -15
  27. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +12 -13
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/ref-access.cjs +31 -3
  31. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/ref-access.mjs +31 -3
  33. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/ref-holders.cjs +2 -2
  35. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/ref-holders.mjs +3 -3
  37. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  39. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  41. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/remote-fetch.cjs +35 -6
  43. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/remote-fetch.mjs +35 -6
  45. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-node-limit.cjs +47 -0
  47. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  48. package/dist/adapters/redocly-loader/remote-node-limit.mjs +44 -0
  49. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  50. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  51. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  53. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +11 -7
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +12 -8
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  59. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  61. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  62. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  63. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  64. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  65. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  66. package/dist/api/default-ports.cjs +14 -2
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -2
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/discriminator-enum-parent.cjs +2 -2
  71. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  72. package/dist/api/discriminator-enum-parent.mjs +3 -3
  73. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  74. package/dist/api/discriminator-other-owners.cjs +5 -3
  75. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  76. package/dist/api/discriminator-other-owners.mjs +5 -3
  77. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  78. package/dist/api/discriminator-patch.cjs +5 -1
  79. package/dist/api/discriminator-patch.cjs.map +1 -1
  80. package/dist/api/discriminator-patch.mjs +5 -1
  81. package/dist/api/discriminator-patch.mjs.map +1 -1
  82. package/dist/api/discriminator-scan.cjs +15 -8
  83. package/dist/api/discriminator-scan.cjs.map +1 -1
  84. package/dist/api/discriminator-scan.mjs +15 -8
  85. package/dist/api/discriminator-scan.mjs.map +1 -1
  86. package/dist/api/document-run.cjs +2 -2
  87. package/dist/api/document-run.cjs.map +1 -1
  88. package/dist/api/document-run.mjs +2 -2
  89. package/dist/api/document-run.mjs.map +1 -1
  90. package/dist/api/legacy-utils.cjs.map +1 -1
  91. package/dist/api/legacy-utils.mjs.map +1 -1
  92. package/dist/api/openapi-ts.cjs +8 -4
  93. package/dist/api/openapi-ts.cjs.map +1 -1
  94. package/dist/api/openapi-ts.mjs +8 -5
  95. package/dist/api/openapi-ts.mjs.map +1 -1
  96. package/dist/api/schema-callbacks.cjs +36 -12
  97. package/dist/api/schema-callbacks.cjs.map +1 -1
  98. package/dist/api/schema-callbacks.mjs +36 -12
  99. package/dist/api/schema-callbacks.mjs.map +1 -1
  100. package/dist/api/transform-context.cjs +7 -3
  101. package/dist/api/transform-context.cjs.map +1 -1
  102. package/dist/api/transform-context.mjs +7 -3
  103. package/dist/api/transform-context.mjs.map +1 -1
  104. package/dist/api/transform-schema.cjs +40 -10
  105. package/dist/api/transform-schema.cjs.map +1 -1
  106. package/dist/api/transform-schema.mjs +41 -11
  107. package/dist/api/transform-schema.mjs.map +1 -1
  108. package/dist/application/print/text-writer.cjs +10 -3
  109. package/dist/application/print/text-writer.cjs.map +1 -1
  110. package/dist/application/print/text-writer.mjs +10 -3
  111. package/dist/application/print/text-writer.mjs.map +1 -1
  112. package/dist/application/stack-overflow.cjs +2 -1
  113. package/dist/application/stack-overflow.cjs.map +1 -1
  114. package/dist/application/stack-overflow.mjs +2 -1
  115. package/dist/application/stack-overflow.mjs.map +1 -1
  116. package/dist/application/transform/document/components.cjs +1 -1
  117. package/dist/application/transform/document/components.cjs.map +1 -1
  118. package/dist/application/transform/document/components.mjs +2 -2
  119. package/dist/application/transform/document/components.mjs.map +1 -1
  120. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  121. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  122. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  123. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  124. package/dist/application/transform/document/defs-root.cjs +1 -1
  125. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  126. package/dist/application/transform/document/defs-root.mjs +2 -2
  127. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  128. package/dist/application/transform/document/document.cjs +4 -1
  129. package/dist/application/transform/document/document.cjs.map +1 -1
  130. package/dist/application/transform/document/document.mjs +3 -2
  131. package/dist/application/transform/document/document.mjs.map +1 -1
  132. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  133. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  134. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  135. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  136. package/dist/application/transform/document/global-type-references.cjs +1 -0
  137. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  138. package/dist/application/transform/document/global-type-references.mjs +1 -1
  139. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  140. package/dist/application/transform/document/media-type.cjs +2 -2
  141. package/dist/application/transform/document/media-type.cjs.map +1 -1
  142. package/dist/application/transform/document/media-type.mjs +3 -3
  143. package/dist/application/transform/document/media-type.mjs.map +1 -1
  144. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  145. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  146. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  147. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  148. package/dist/application/transform/document/operation.cjs +1 -1
  149. package/dist/application/transform/document/operation.cjs.map +1 -1
  150. package/dist/application/transform/document/operation.mjs +2 -2
  151. package/dist/application/transform/document/operation.mjs.map +1 -1
  152. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  153. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  154. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  155. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  156. package/dist/application/transform/document/parameter.cjs +12 -4
  157. package/dist/application/transform/document/parameter.cjs.map +1 -1
  158. package/dist/application/transform/document/parameter.mjs +13 -5
  159. package/dist/application/transform/document/parameter.mjs.map +1 -1
  160. package/dist/application/transform/document/parameters.cjs +6 -29
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +6 -29
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-item.cjs +11 -14
  165. package/dist/application/transform/document/path-item.cjs.map +1 -1
  166. package/dist/application/transform/document/path-item.mjs +12 -16
  167. package/dist/application/transform/document/path-item.mjs.map +1 -1
  168. package/dist/application/transform/document/paths-enum.cjs +1 -0
  169. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  170. package/dist/application/transform/document/paths-enum.mjs +1 -1
  171. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  172. package/dist/application/transform/document/paths.cjs +5 -1
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +6 -2
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  177. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  178. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  179. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  180. package/dist/application/transform/document/request-body.cjs +1 -1
  181. package/dist/application/transform/document/request-body.cjs.map +1 -1
  182. package/dist/application/transform/document/request-body.mjs +2 -2
  183. package/dist/application/transform/document/request-body.mjs.map +1 -1
  184. package/dist/application/transform/document/response.cjs +2 -2
  185. package/dist/application/transform/document/response.cjs.map +1 -1
  186. package/dist/application/transform/document/response.mjs +3 -3
  187. package/dist/application/transform/document/response.mjs.map +1 -1
  188. package/dist/application/transform/document/responses.cjs +1 -1
  189. package/dist/application/transform/document/responses.cjs.map +1 -1
  190. package/dist/application/transform/document/responses.mjs +2 -2
  191. package/dist/application/transform/document/responses.mjs.map +1 -1
  192. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  193. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  194. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  195. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  196. package/dist/application/transform/document/type-resolution.cjs +3 -1
  197. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  198. package/dist/application/transform/document/type-resolution.mjs +3 -1
  199. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  200. package/dist/application/transform/document/webhooks.cjs +1 -1
  201. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  202. package/dist/application/transform/document/webhooks.mjs +2 -2
  203. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  204. package/dist/application/transform/footer/document-footer.cjs +10 -2
  205. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  206. package/dist/application/transform/footer/document-footer.mjs +10 -2
  207. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  208. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  209. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  210. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  211. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  212. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  213. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  214. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  215. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  218. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  220. package/dist/application/transform/helper-types.cjs +1 -1
  221. package/dist/application/transform/helper-types.cjs.map +1 -1
  222. package/dist/application/transform/helper-types.mjs +1 -1
  223. package/dist/application/transform/helper-types.mjs.map +1 -1
  224. package/dist/application/transform/numbered-names.cjs +9 -0
  225. package/dist/application/transform/numbered-names.cjs.map +1 -1
  226. package/dist/application/transform/numbered-names.mjs +9 -1
  227. package/dist/application/transform/numbered-names.mjs.map +1 -1
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +1 -1
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +2 -2
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  232. package/dist/application/transform/ref-type.cjs +2 -1
  233. package/dist/application/transform/ref-type.cjs.map +1 -1
  234. package/dist/application/transform/ref-type.mjs +2 -1
  235. package/dist/application/transform/ref-type.mjs.map +1 -1
  236. package/dist/application/transform/schema/composition-type.cjs +1 -1
  237. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  238. package/dist/application/transform/schema/composition-type.mjs +2 -2
  239. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  240. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  241. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  242. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  243. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  244. package/dist/application/transform/schema/object-type.cjs +3 -3
  245. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  246. package/dist/application/transform/schema/object-type.mjs +4 -4
  247. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  248. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  249. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  250. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  251. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  252. package/dist/application/transform/schema/schema-transform.cjs +4 -2
  253. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  254. package/dist/application/transform/schema/schema-transform.mjs +4 -2
  255. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  256. package/dist/application/transform/schema-comment.cjs +5 -1
  257. package/dist/application/transform/schema-comment.cjs.map +1 -1
  258. package/dist/application/transform/schema-comment.mjs +5 -1
  259. package/dist/application/transform/schema-comment.mjs.map +1 -1
  260. package/dist/cli/api-settings.cjs +62 -6
  261. package/dist/cli/api-settings.cjs.map +1 -1
  262. package/dist/cli/api-settings.mjs +60 -7
  263. package/dist/cli/api-settings.mjs.map +1 -1
  264. package/dist/cli/api-writes.cjs +72 -0
  265. package/dist/cli/api-writes.cjs.map +1 -0
  266. package/dist/cli/api-writes.mjs +69 -0
  267. package/dist/cli/api-writes.mjs.map +1 -0
  268. package/dist/cli/cli-errors.cjs +12 -1
  269. package/dist/cli/cli-errors.cjs.map +1 -1
  270. package/dist/cli/cli-errors.mjs +12 -1
  271. package/dist/cli/cli-errors.mjs.map +1 -1
  272. package/dist/cli/cli-output.cjs +106 -1
  273. package/dist/cli/cli-output.cjs.map +1 -1
  274. package/dist/cli/cli-output.mjs +99 -2
  275. package/dist/cli/cli-output.mjs.map +1 -1
  276. package/dist/cli/main.cjs +5 -1
  277. package/dist/cli/main.cjs.map +1 -1
  278. package/dist/cli/main.mjs +6 -2
  279. package/dist/cli/main.mjs.map +1 -1
  280. package/dist/cli/redocly-apis.cjs +82 -36
  281. package/dist/cli/redocly-apis.cjs.map +1 -1
  282. package/dist/cli/redocly-apis.mjs +85 -39
  283. package/dist/cli/redocly-apis.mjs.map +1 -1
  284. package/dist/cli/run-cli.cjs +13 -7
  285. package/dist/cli/run-cli.cjs.map +1 -1
  286. package/dist/cli/run-cli.mjs +14 -8
  287. package/dist/cli/run-cli.mjs.map +1 -1
  288. package/dist/domain/append-all.cjs +10 -0
  289. package/dist/domain/append-all.cjs.map +1 -0
  290. package/dist/domain/append-all.mjs +8 -0
  291. package/dist/domain/append-all.mjs.map +1 -0
  292. package/dist/domain/cause-secrets.cjs +37 -0
  293. package/dist/domain/cause-secrets.cjs.map +1 -0
  294. package/dist/domain/cause-secrets.mjs +35 -0
  295. package/dist/domain/cause-secrets.mjs.map +1 -0
  296. package/dist/domain/errors.cjs +9 -3
  297. package/dist/domain/errors.cjs.map +1 -1
  298. package/dist/domain/errors.mjs +9 -3
  299. package/dist/domain/errors.mjs.map +1 -1
  300. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  301. package/dist/domain/ir/identifier-text.mjs +1 -1
  302. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  303. package/dist/domain/ir/ir-shape.cjs +187 -0
  304. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  305. package/dist/domain/ir/ir-shape.mjs +184 -0
  306. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  307. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  308. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  309. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  310. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  311. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  312. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  313. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  314. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  315. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  316. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  317. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  318. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  319. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  320. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  321. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  322. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  323. package/dist/domain/openapi/json-pointer.cjs +43 -1
  324. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  325. package/dist/domain/openapi/json-pointer.mjs +40 -2
  326. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  327. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  328. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  329. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  330. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  331. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  332. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  333. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  334. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  335. package/dist/domain/output-fixes.cjs +14 -0
  336. package/dist/domain/output-fixes.cjs.map +1 -1
  337. package/dist/domain/output-fixes.mjs +14 -0
  338. package/dist/domain/output-fixes.mjs.map +1 -1
  339. package/dist/domain/url-secrets.cjs +48 -0
  340. package/dist/domain/url-secrets.cjs.map +1 -0
  341. package/dist/domain/url-secrets.mjs +45 -0
  342. package/dist/domain/url-secrets.mjs.map +1 -0
  343. package/dist/index.d.cts +22 -4
  344. package/dist/index.d.mts +22 -4
  345. package/dist/index.d.ts +22 -4
  346. package/package.json +4 -5
  347. package/src/adapters/node-file-system/file-claims.ts +138 -0
  348. package/src/adapters/node-file-system/file-identity.ts +137 -0
  349. package/src/adapters/node-file-system/node-file-system.ts +145 -18
  350. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +95 -0
  351. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  352. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  353. package/src/adapters/redocly-loader/redocly-schema-loader.ts +18 -24
  354. package/src/adapters/redocly-loader/ref-access.ts +37 -3
  355. package/src/adapters/redocly-loader/ref-holders.ts +3 -3
  356. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  357. package/src/adapters/redocly-loader/remote-fetch.ts +74 -11
  358. package/src/adapters/redocly-loader/remote-node-limit.ts +62 -0
  359. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  360. package/src/adapters/redocly-loader/schema-source.ts +20 -8
  361. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  362. package/src/adapters/terminal-logger/terminal-logger.ts +10 -5
  363. package/src/api/default-ports.ts +33 -4
  364. package/src/api/discriminator-enum-parent.ts +3 -3
  365. package/src/api/discriminator-other-owners.ts +5 -3
  366. package/src/api/discriminator-patch.ts +5 -1
  367. package/src/api/discriminator-scan.ts +16 -8
  368. package/src/api/document-run.ts +4 -3
  369. package/src/api/legacy-utils.ts +5 -1
  370. package/src/api/openapi-ts.ts +20 -5
  371. package/src/api/run-context.ts +3 -0
  372. package/src/api/schema-callbacks.ts +60 -17
  373. package/src/api/transform-context.ts +7 -3
  374. package/src/api/transform-schema.ts +64 -12
  375. package/src/application/ports/file-system.ts +39 -0
  376. package/src/application/ports/schema-loader.ts +11 -1
  377. package/src/application/print/text-writer.ts +10 -3
  378. package/src/application/stack-overflow.ts +9 -5
  379. package/src/application/transform/document/components.ts +2 -2
  380. package/src/application/transform/document/declared-type-names.ts +36 -0
  381. package/src/application/transform/document/defs-root.ts +2 -2
  382. package/src/application/transform/document/document.ts +4 -3
  383. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  384. package/src/application/transform/document/global-type-references.ts +1 -1
  385. package/src/application/transform/document/media-type.ts +4 -3
  386. package/src/application/transform/document/operation-keys-written.ts +27 -0
  387. package/src/application/transform/document/operation.ts +2 -2
  388. package/src/application/transform/document/parameter-entries.ts +70 -0
  389. package/src/application/transform/document/parameter.ts +21 -9
  390. package/src/application/transform/document/parameters.ts +11 -56
  391. package/src/application/transform/document/path-item.ts +13 -31
  392. package/src/application/transform/document/paths-enum.ts +1 -1
  393. package/src/application/transform/document/paths.ts +6 -2
  394. package/src/application/transform/document/referenced-parameter.ts +146 -0
  395. package/src/application/transform/document/request-body.ts +2 -2
  396. package/src/application/transform/document/response.ts +3 -3
  397. package/src/application/transform/document/responses.ts +2 -2
  398. package/src/application/transform/document/root-type-aliases.ts +17 -38
  399. package/src/application/transform/document/type-resolution.ts +2 -1
  400. package/src/application/transform/document/webhooks.ts +2 -2
  401. package/src/application/transform/footer/document-footer.ts +18 -1
  402. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  403. package/src/application/transform/footer/operation-keys.ts +28 -0
  404. package/src/application/transform/footer/type-evaluation.ts +4 -4
  405. package/src/application/transform/helper-types.ts +6 -5
  406. package/src/application/transform/numbered-names.ts +15 -0
  407. package/src/application/transform/ref-pointer/generated-location.ts +2 -2
  408. package/src/application/transform/ref-type.ts +2 -1
  409. package/src/application/transform/schema/composition-type.ts +2 -2
  410. package/src/application/transform/schema/enum-rule.ts +6 -2
  411. package/src/application/transform/schema/object-type.ts +4 -4
  412. package/src/application/transform/schema/ref-siblings.ts +76 -0
  413. package/src/application/transform/schema/schema-context.ts +3 -0
  414. package/src/application/transform/schema/schema-transform.ts +4 -2
  415. package/src/application/transform/schema-comment.ts +5 -1
  416. package/src/application/transform/transform-context.ts +5 -0
  417. package/src/cli/api-settings.ts +82 -7
  418. package/src/cli/api-writes.ts +117 -0
  419. package/src/cli/cli-dependencies.ts +21 -4
  420. package/src/cli/cli-errors.ts +20 -1
  421. package/src/cli/cli-output.ts +186 -7
  422. package/src/cli/main.ts +6 -3
  423. package/src/cli/redocly-apis.ts +153 -48
  424. package/src/cli/run-cli.ts +37 -8
  425. package/src/domain/append-all.ts +10 -0
  426. package/src/domain/cause-secrets.ts +52 -0
  427. package/src/domain/errors.ts +14 -5
  428. package/src/domain/ir/identifier-text.ts +6 -5
  429. package/src/domain/ir/ir-shape.ts +299 -0
  430. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  431. package/src/domain/openapi/alias-expansion.ts +4 -1
  432. package/src/domain/openapi/discriminated-union.ts +6 -4
  433. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  434. package/src/domain/openapi/document-object.ts +2 -0
  435. package/src/domain/openapi/json-pointer.ts +96 -7
  436. package/src/domain/openapi/schema-dialect.ts +22 -0
  437. package/src/domain/openapi/unsupported-features.ts +2 -2
  438. package/src/domain/output-fixes.ts +21 -2
  439. package/src/domain/url-secrets.ts +72 -0
  440. package/src/types/generator-options.ts +1 -1
  441. package/dist/cli/main.d.cts +0 -2
  442. package/dist/cli/main.d.mts +0 -2
  443. package/dist/cli/main.d.ts +0 -2
  444. package/dist/domain/url-credentials.cjs +0 -10
  445. package/dist/domain/url-credentials.cjs.map +0 -1
  446. package/dist/domain/url-credentials.mjs +0 -8
  447. package/dist/domain/url-credentials.mjs.map +0 -1
  448. package/src/domain/url-credentials.ts +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-ts.cjs","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":["createDocumentRun","withStackOverflowReported","transformSchema","defaultLogger","defaultRedoclyConfig","createRedoclySchemaLoader","monotonicNow","REMOTE_REF_TIMEOUT_MS","DEFAULT_REMOTE_DOCUMENT_LIMITS","defaultDeprecationReporter"],"mappings":";;;;;;;;;;AAqBA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,EAAE,QAAQ,GAAA,EAAI,GAAI,MAAMA,6BAAA,CAAkB,MAAA,EAAQ,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,SAASC,uCAAA,CAA0B,WAAA,EAAa,MAAMC,uBAAA,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,GAASC,0BAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAMC,iCAAA,EAAqB;AAC7D,EAAA,MAAM,SAASC,6CAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAKC,yBAAA;AAAA,IACL,kBAAA,EAAoBC,kCAAA;AAAA,IACpB,oBAAA,EAAsBC;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAcC,yCAA2B,EAAG,KAAA,EAAO,KAAKH,yBAAA,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.cjs","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/** 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.\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":["createDocumentRun","withStackOverflowReported","transformSchema","defaultLogger","defaultRedoclyConfig","createRedoclySchemaLoader","monotonicNow","REMOTE_REF_TIMEOUT_MS","DEFAULT_REMOTE_DOCUMENT_LIMITS","defaultDeprecationReporter"],"mappings":";;;;;;;;;;AA2BA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,GAAA,KAAQ,MAAMA,6BAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,eAAeC,uCAAA,CAA0B,WAAA,EAAa,MAAMC,uBAAA,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,sBAAsB,OAAA,EAAoD;AAC9F,EAAA,MAAM,MAAA,GAASC,0BAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAMC,iCAAA,EAAqB;AAC7D,EAAA,MAAM,SAASC,6CAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAKC,yBAAA;AAAA,IACL,kBAAA,EAAoBC,kCAAA;AAAA,IACpB,oBAAA,EAAsBC;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAcC,yCAA2B,EAAG,KAAA,EAAO,KAAKH,yBAAA,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;;;;;"}
@@ -4,16 +4,19 @@ import { defaultLogger, defaultRedoclyConfig, monotonicNow, defaultDeprecationRe
4
4
  import { createDocumentRun } from './document-run.mjs';
5
5
  import transformSchema from './transform-schema.mjs';
6
6
 
7
- async function generateDeclarations(source, options, ports) {
8
- const { schema, ctx } = await createDocumentRun(source, options, ports);
7
+ async function generateDocument(source, options, ports) {
8
+ const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);
9
9
  const startedAt = ports.now();
10
- const result = withStackOverflowReported("transform", () => transformSchema(schema, ctx));
10
+ const declarations = withStackOverflowReported("transform", () => transformSchema(schema, ctx));
11
11
  ports.logger.debug(
12
12
  "Completed AST transformation for entire document",
13
13
  "ts",
14
14
  ports.now() - startedAt
15
15
  );
16
- return result;
16
+ return { declarations, localFiles };
17
+ }
18
+ async function generateDeclarations(source, options, ports) {
19
+ return (await generateDocument(source, options, ports)).declarations;
17
20
  }
18
21
  async function defaultGeneratorPorts(options) {
19
22
  const logger = defaultLogger(options.silent ?? false);
@@ -31,5 +34,5 @@ async function openapiTS(source, options = {}) {
31
34
  return generateDeclarations(source, options, await defaultGeneratorPorts(options));
32
35
  }
33
36
 
34
- export { openapiTS as default, defaultGeneratorPorts, generateDeclarations };
37
+ export { openapiTS as default, defaultGeneratorPorts, generateDeclarations, generateDocument };
35
38
  //# sourceMappingURL=openapi-ts.mjs.map
@@ -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 { 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.\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":";;;;;;AA2BA,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,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;;"}
@@ -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":"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"}
@@ -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),
@@ -1 +1 @@
1
- {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n objectAt: (ref) => ctx.discriminators.objects[ref],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(ref),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[ref] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-context.mjs","sources":["../../src/api/transform-context.ts"],"sourcesContent":["import * as changeCase from \"change-case\";\nimport { RunFooter } from \"../application/transform/footer/document-footer.js\";\nimport type {\n DiscriminatorEnumParent,\n SchemaLocation,\n} from \"../application/transform/schema/schema-context.js\";\nimport type {\n DocumentFooter,\n NameCasing,\n TransformContext,\n TransformDiagnostics,\n TransformOptions,\n} from \"../application/transform/transform-context.js\";\nimport { canonicalRef } from \"../domain/openapi/json-pointer.js\";\nimport { SCHEMA_DIALECTS } from \"../domain/openapi/schema-dialect.js\";\nimport type { TransformNodeOptions } from \"../types.js\";\nimport { defaultLogger, monotonicNow } from \"./default-ports.js\";\nimport { ContextFooterSink } from \"./footer-sink.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { schemaCallbacks } from \"./schema-callbacks.js\";\n\n/**\n * Builds the ported transformers' context from the original `GlobalContext` (in a run, a\n * `RunContext`): options, refs, discriminators, the run footer and the user callbacks (see\n * `schema-callbacks.ts`).\n */\n\nfunction transformOptions(ctx: RunContext): TransformOptions {\n return {\n additionalProperties: ctx.additionalProperties,\n alphabetize: ctx.alphabetize,\n arrayLength: ctx.arrayLength,\n binaryAsBlob: ctx.binaryAsBlob ?? false,\n conditionalEnums: ctx.conditionalEnums,\n dedupeEnums: ctx.dedupeEnums,\n defaultNonNullable: ctx.defaultNonNullable,\n emptyObjectsUnknown: ctx.emptyObjectsUnknown,\n enum: ctx.enum,\n enumValues: ctx.enumValues,\n excludeDeprecated: ctx.excludeDeprecated,\n fixes: new Set(ctx.fix ?? []),\n immutable: ctx.immutable,\n propertiesRequiredByDefault: ctx.propertiesRequiredByDefault,\n readWriteMarkers: ctx.readWriteMarkers,\n schemaDialect: ctx.schemaDialect ?? SCHEMA_DIALECTS.OPENAPI_3_0,\n generatePathParams: ctx.generatePathParams,\n pathParamsAsTypes: ctx.pathParamsAsTypes,\n rootTypes: ctx.rootTypes,\n rootTypesNoSchemaPrefix: ctx.rootTypesNoSchemaPrefix,\n rootTypesKeepCasing: ctx.rootTypesKeepCasing,\n exportType: ctx.exportType,\n inject: ctx.inject,\n makePathsEnum: ctx.makePathsEnum,\n };\n}\n\n/** One footer per run: it holds the enum registry, so it lives on the run's context. */\nfunction runFooter(ctx: RunContext): DocumentFooter {\n ctx.runFooter ??= new RunFooter(new ContextFooterSink(ctx.injectFooter), ctx.dedupeEnums);\n return ctx.runFooter;\n}\n\nconst CASING: NameCasing = { pascalCase: (text) => changeCase.pascalCase(text) };\n\n/**\n * A monotonic clock and the run's logger (the default one for a user's own context), \"ts\" group.\n */\nfunction diagnostics(ctx: RunContext): TransformDiagnostics {\n const logger = ctx.logger ?? defaultLogger(ctx.silent);\n return {\n now: monotonicNow,\n debug: (message, durationMs) => logger.debug(message, \"ts\", durationMs),\n };\n}\n\n/** The ported transformers' context for one call from a legacy transformer. */\nexport function createTransformContext(ctx: RunContext): TransformContext {\n return {\n options: transformOptions(ctx),\n refs: { resolve: (ref) => ctx.resolve(ref) },\n discriminators: {\n // The scan keys pointers canonically; a caller may pass a `$ref` as the document writes it.\n objectAt: (ref) => ctx.discriminators.objects[canonicalRef(ref)],\n isHandled: (ref) => ctx.discriminators.refsHandled.includes(canonicalRef(ref)),\n otherPropertiesAt: (ref) => ctx.discriminators.otherProperties?.[canonicalRef(ref)] ?? [],\n enumParentOf: (schema) =>\n ctx.discriminators.enumParents?.get(schema) as DiscriminatorEnumParent | undefined,\n },\n footer: runFooter(ctx),\n callbacks: schemaCallbacks(ctx),\n diagnostics: diagnostics(ctx),\n casing: CASING,\n };\n}\n\n/** The transformer's location for the original options object. */\nexport function schemaLocation(options: TransformNodeOptions): SchemaLocation {\n return { path: options.path, schema: options.schema };\n}\n"],"names":[],"mappings":"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"}