openapi-typesafe 0.0.0 → 1.0.0-rc.0

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 (678) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +71 -1
  3. package/bin/cli.js +4 -0
  4. package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
  5. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
  6. package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
  7. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
  8. package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
  9. package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
  10. package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
  11. package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
  12. package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
  13. package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
  14. package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
  15. package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
  16. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
  17. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
  19. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
  20. package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
  21. package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
  22. package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
  23. package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
  24. package/dist/adapters/redocly-loader/redocly-config-source.cjs +42 -0
  25. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
  27. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -0
  31. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
  32. package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
  33. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
  34. package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
  35. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
  36. package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
  37. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
  38. package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
  39. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
  40. package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
  41. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
  42. package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
  43. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
  44. package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
  45. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
  46. package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
  47. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
  48. package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
  49. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
  50. package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
  51. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
  52. package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
  53. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
  54. package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
  55. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
  56. package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
  57. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
  58. package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
  59. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
  60. package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
  61. package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
  62. package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
  63. package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
  64. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
  65. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
  66. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
  67. package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
  68. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +145 -0
  69. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
  70. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -0
  71. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
  72. package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
  73. package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
  74. package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
  75. package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
  76. package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
  77. package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
  78. package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
  79. package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
  80. package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
  81. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
  82. package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
  83. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
  84. package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
  85. package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
  86. package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
  87. package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
  88. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +204 -0
  89. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
  90. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -0
  91. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
  92. package/dist/api/ast-to-string.cjs +39 -0
  93. package/dist/api/ast-to-string.cjs.map +1 -0
  94. package/dist/api/ast-to-string.mjs +37 -0
  95. package/dist/api/ast-to-string.mjs.map +1 -0
  96. package/dist/api/comment-header.cjs +11 -0
  97. package/dist/api/comment-header.cjs.map +1 -0
  98. package/dist/api/comment-header.mjs +9 -0
  99. package/dist/api/comment-header.mjs.map +1 -0
  100. package/dist/api/default-ports.cjs +38 -0
  101. package/dist/api/default-ports.cjs.map +1 -0
  102. package/dist/api/default-ports.mjs +28 -0
  103. package/dist/api/default-ports.mjs.map +1 -0
  104. package/dist/api/discriminator-enum.cjs +44 -0
  105. package/dist/api/discriminator-enum.cjs.map +1 -0
  106. package/dist/api/discriminator-enum.mjs +42 -0
  107. package/dist/api/discriminator-enum.mjs.map +1 -0
  108. package/dist/api/discriminator-scan.cjs +168 -0
  109. package/dist/api/discriminator-scan.cjs.map +1 -0
  110. package/dist/api/discriminator-scan.mjs +165 -0
  111. package/dist/api/discriminator-scan.mjs.map +1 -0
  112. package/dist/api/document-declarations.cjs +28 -0
  113. package/dist/api/document-declarations.cjs.map +1 -0
  114. package/dist/api/document-declarations.mjs +26 -0
  115. package/dist/api/document-declarations.mjs.map +1 -0
  116. package/dist/api/document-refs.cjs +53 -0
  117. package/dist/api/document-refs.cjs.map +1 -0
  118. package/dist/api/document-refs.mjs +50 -0
  119. package/dist/api/document-refs.mjs.map +1 -0
  120. package/dist/api/document-run.cjs +107 -0
  121. package/dist/api/document-run.cjs.map +1 -0
  122. package/dist/api/document-run.mjs +101 -0
  123. package/dist/api/document-run.mjs.map +1 -0
  124. package/dist/api/footer-entry.cjs +18 -0
  125. package/dist/api/footer-entry.cjs.map +1 -0
  126. package/dist/api/footer-entry.mjs +15 -0
  127. package/dist/api/footer-entry.mjs.map +1 -0
  128. package/dist/api/footer-sink.cjs +53 -0
  129. package/dist/api/footer-sink.cjs.map +1 -0
  130. package/dist/api/footer-sink.mjs +51 -0
  131. package/dist/api/footer-sink.mjs.map +1 -0
  132. package/dist/api/legacy-callback-warning.cjs +25 -0
  133. package/dist/api/legacy-callback-warning.cjs.map +1 -0
  134. package/dist/api/legacy-callback-warning.mjs +22 -0
  135. package/dist/api/legacy-callback-warning.mjs.map +1 -0
  136. package/dist/api/legacy-ts-helpers.cjs +203 -0
  137. package/dist/api/legacy-ts-helpers.cjs.map +1 -0
  138. package/dist/api/legacy-ts-helpers.mjs +187 -0
  139. package/dist/api/legacy-ts-helpers.mjs.map +1 -0
  140. package/dist/api/legacy-utils.cjs +65 -0
  141. package/dist/api/legacy-utils.cjs.map +1 -0
  142. package/dist/api/legacy-utils.mjs +50 -0
  143. package/dist/api/legacy-utils.mjs.map +1 -0
  144. package/dist/api/openapi-ts.cjs +40 -0
  145. package/dist/api/openapi-ts.cjs.map +1 -0
  146. package/dist/api/openapi-ts.mjs +34 -0
  147. package/dist/api/openapi-ts.mjs.map +1 -0
  148. package/dist/api/schema-callbacks.cjs +140 -0
  149. package/dist/api/schema-callbacks.cjs.map +1 -0
  150. package/dist/api/schema-callbacks.mjs +136 -0
  151. package/dist/api/schema-callbacks.mjs.map +1 -0
  152. package/dist/api/string-to-ast.cjs +21 -0
  153. package/dist/api/string-to-ast.cjs.map +1 -0
  154. package/dist/api/string-to-ast.mjs +18 -0
  155. package/dist/api/string-to-ast.mjs.map +1 -0
  156. package/dist/api/transform-context.cjs +82 -0
  157. package/dist/api/transform-context.cjs.map +1 -0
  158. package/dist/api/transform-context.mjs +65 -0
  159. package/dist/api/transform-context.mjs.map +1 -0
  160. package/dist/api/transform-schema.cjs +31 -0
  161. package/dist/api/transform-schema.cjs.map +1 -0
  162. package/dist/api/transform-schema.mjs +26 -0
  163. package/dist/api/transform-schema.mjs.map +1 -0
  164. package/dist/api/type-helpers.cjs +85 -0
  165. package/dist/api/type-helpers.cjs.map +1 -0
  166. package/dist/api/type-helpers.mjs +66 -0
  167. package/dist/api/type-helpers.mjs.map +1 -0
  168. package/dist/api/unsupported-feature-warnings.cjs +17 -0
  169. package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
  170. package/dist/api/unsupported-feature-warnings.mjs +15 -0
  171. package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
  172. package/dist/application/print/comment-writer.cjs +95 -0
  173. package/dist/application/print/comment-writer.cjs.map +1 -0
  174. package/dist/application/print/comment-writer.mjs +93 -0
  175. package/dist/application/print/comment-writer.mjs.map +1 -0
  176. package/dist/application/print/declaration-printer.cjs +83 -0
  177. package/dist/application/print/declaration-printer.cjs.map +1 -0
  178. package/dist/application/print/declaration-printer.mjs +81 -0
  179. package/dist/application/print/declaration-printer.mjs.map +1 -0
  180. package/dist/application/print/literal-text.cjs +52 -0
  181. package/dist/application/print/literal-text.cjs.map +1 -0
  182. package/dist/application/print/literal-text.mjs +48 -0
  183. package/dist/application/print/literal-text.mjs.map +1 -0
  184. package/dist/application/print/print-nodes.cjs +38 -0
  185. package/dist/application/print/print-nodes.cjs.map +1 -0
  186. package/dist/application/print/print-nodes.mjs +36 -0
  187. package/dist/application/print/print-nodes.mjs.map +1 -0
  188. package/dist/application/print/print-options.cjs +6 -0
  189. package/dist/application/print/print-options.cjs.map +1 -0
  190. package/dist/application/print/print-options.mjs +4 -0
  191. package/dist/application/print/print-options.mjs.map +1 -0
  192. package/dist/application/print/text-writer.cjs +63 -0
  193. package/dist/application/print/text-writer.cjs.map +1 -0
  194. package/dist/application/print/text-writer.mjs +60 -0
  195. package/dist/application/print/text-writer.mjs.map +1 -0
  196. package/dist/application/print/type-printer.cjs +214 -0
  197. package/dist/application/print/type-printer.cjs.map +1 -0
  198. package/dist/application/print/type-printer.mjs +210 -0
  199. package/dist/application/print/type-printer.mjs.map +1 -0
  200. package/dist/application/stack-overflow.cjs +36 -0
  201. package/dist/application/stack-overflow.cjs.map +1 -0
  202. package/dist/application/stack-overflow.mjs +31 -0
  203. package/dist/application/stack-overflow.mjs.map +1 -0
  204. package/dist/application/transform/document/components.cjs +104 -0
  205. package/dist/application/transform/document/components.cjs.map +1 -0
  206. package/dist/application/transform/document/components.mjs +102 -0
  207. package/dist/application/transform/document/components.mjs.map +1 -0
  208. package/dist/application/transform/document/defs-root.cjs +18 -0
  209. package/dist/application/transform/document/defs-root.cjs.map +1 -0
  210. package/dist/application/transform/document/defs-root.mjs +16 -0
  211. package/dist/application/transform/document/defs-root.mjs.map +1 -0
  212. package/dist/application/transform/document/document-member.cjs +13 -0
  213. package/dist/application/transform/document/document-member.cjs.map +1 -0
  214. package/dist/application/transform/document/document-member.mjs +11 -0
  215. package/dist/application/transform/document/document-member.mjs.map +1 -0
  216. package/dist/application/transform/document/document.cjs +86 -0
  217. package/dist/application/transform/document/document.cjs.map +1 -0
  218. package/dist/application/transform/document/document.mjs +83 -0
  219. package/dist/application/transform/document/document.mjs.map +1 -0
  220. package/dist/application/transform/document/header.cjs +27 -0
  221. package/dist/application/transform/document/header.cjs.map +1 -0
  222. package/dist/application/transform/document/header.mjs +25 -0
  223. package/dist/application/transform/document/header.mjs.map +1 -0
  224. package/dist/application/transform/document/kept-deprecated.cjs +96 -0
  225. package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
  226. package/dist/application/transform/document/kept-deprecated.mjs +94 -0
  227. package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
  228. package/dist/application/transform/document/media-type.cjs +42 -0
  229. package/dist/application/transform/document/media-type.cjs.map +1 -0
  230. package/dist/application/transform/document/media-type.mjs +38 -0
  231. package/dist/application/transform/document/media-type.mjs.map +1 -0
  232. package/dist/application/transform/document/operation.cjs +45 -0
  233. package/dist/application/transform/document/operation.cjs.map +1 -0
  234. package/dist/application/transform/document/operation.mjs +43 -0
  235. package/dist/application/transform/document/operation.mjs.map +1 -0
  236. package/dist/application/transform/document/parameter.cjs +25 -0
  237. package/dist/application/transform/document/parameter.cjs.map +1 -0
  238. package/dist/application/transform/document/parameter.mjs +23 -0
  239. package/dist/application/transform/document/parameter.mjs.map +1 -0
  240. package/dist/application/transform/document/parameters.cjs +114 -0
  241. package/dist/application/transform/document/parameters.cjs.map +1 -0
  242. package/dist/application/transform/document/parameters.mjs +112 -0
  243. package/dist/application/transform/document/parameters.mjs.map +1 -0
  244. package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
  245. package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
  246. package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
  247. package/dist/application/transform/document/path-item-conflicts.mjs.map +1 -0
  248. package/dist/application/transform/document/path-item.cjs +82 -0
  249. package/dist/application/transform/document/path-item.cjs.map +1 -0
  250. package/dist/application/transform/document/path-item.mjs +80 -0
  251. package/dist/application/transform/document/path-item.mjs.map +1 -0
  252. package/dist/application/transform/document/path-key-overlaps.cjs +57 -0
  253. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
  254. package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
  255. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
  256. package/dist/application/transform/document/paths-enum.cjs +75 -0
  257. package/dist/application/transform/document/paths-enum.cjs.map +1 -0
  258. package/dist/application/transform/document/paths-enum.mjs +72 -0
  259. package/dist/application/transform/document/paths-enum.mjs.map +1 -0
  260. package/dist/application/transform/document/paths.cjs +127 -0
  261. package/dist/application/transform/document/paths.cjs.map +1 -0
  262. package/dist/application/transform/document/paths.mjs +125 -0
  263. package/dist/application/transform/document/paths.mjs.map +1 -0
  264. package/dist/application/transform/document/request-body.cjs +36 -0
  265. package/dist/application/transform/document/request-body.cjs.map +1 -0
  266. package/dist/application/transform/document/request-body.mjs +34 -0
  267. package/dist/application/transform/document/request-body.mjs.map +1 -0
  268. package/dist/application/transform/document/response.cjs +59 -0
  269. package/dist/application/transform/document/response.cjs.map +1 -0
  270. package/dist/application/transform/document/response.mjs +57 -0
  271. package/dist/application/transform/document/response.mjs.map +1 -0
  272. package/dist/application/transform/document/responses.cjs +23 -0
  273. package/dist/application/transform/document/responses.cjs.map +1 -0
  274. package/dist/application/transform/document/responses.mjs +21 -0
  275. package/dist/application/transform/document/responses.mjs.map +1 -0
  276. package/dist/application/transform/document/root-type-aliases.cjs +69 -0
  277. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
  278. package/dist/application/transform/document/root-type-aliases.mjs +65 -0
  279. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
  280. package/dist/application/transform/document/webhooks.cjs +19 -0
  281. package/dist/application/transform/document/webhooks.cjs.map +1 -0
  282. package/dist/application/transform/document/webhooks.mjs +17 -0
  283. package/dist/application/transform/document/webhooks.mjs.map +1 -0
  284. package/dist/application/transform/document-entries.cjs +17 -0
  285. package/dist/application/transform/document-entries.cjs.map +1 -0
  286. package/dist/application/transform/document-entries.mjs +14 -0
  287. package/dist/application/transform/document-entries.mjs.map +1 -0
  288. package/dist/application/transform/footer/document-footer.cjs +88 -0
  289. package/dist/application/transform/footer/document-footer.cjs.map +1 -0
  290. package/dist/application/transform/footer/document-footer.mjs +86 -0
  291. package/dist/application/transform/footer/document-footer.mjs.map +1 -0
  292. package/dist/application/transform/footer/enum-naming.cjs +121 -0
  293. package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
  294. package/dist/application/transform/footer/enum-naming.mjs +115 -0
  295. package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
  296. package/dist/application/transform/helper-types.cjs +68 -0
  297. package/dist/application/transform/helper-types.cjs.map +1 -0
  298. package/dist/application/transform/helper-types.mjs +65 -0
  299. package/dist/application/transform/helper-types.mjs.map +1 -0
  300. package/dist/application/transform/literal-type.cjs +36 -0
  301. package/dist/application/transform/literal-type.cjs.map +1 -0
  302. package/dist/application/transform/literal-type.mjs +34 -0
  303. package/dist/application/transform/literal-type.mjs.map +1 -0
  304. package/dist/application/transform/numbered-names.cjs +18 -0
  305. package/dist/application/transform/numbered-names.cjs.map +1 -0
  306. package/dist/application/transform/numbered-names.mjs +16 -0
  307. package/dist/application/transform/numbered-names.mjs.map +1 -0
  308. package/dist/application/transform/ref-type.cjs +57 -0
  309. package/dist/application/transform/ref-type.cjs.map +1 -0
  310. package/dist/application/transform/ref-type.mjs +54 -0
  311. package/dist/application/transform/ref-type.mjs.map +1 -0
  312. package/dist/application/transform/schema/array-type.cjs +105 -0
  313. package/dist/application/transform/schema/array-type.cjs.map +1 -0
  314. package/dist/application/transform/schema/array-type.mjs +103 -0
  315. package/dist/application/transform/schema/array-type.mjs.map +1 -0
  316. package/dist/application/transform/schema/composition-type.cjs +107 -0
  317. package/dist/application/transform/schema/composition-type.cjs.map +1 -0
  318. package/dist/application/transform/schema/composition-type.mjs +105 -0
  319. package/dist/application/transform/schema/composition-type.mjs.map +1 -0
  320. package/dist/application/transform/schema/core-type.cjs +84 -0
  321. package/dist/application/transform/schema/core-type.cjs.map +1 -0
  322. package/dist/application/transform/schema/core-type.mjs +82 -0
  323. package/dist/application/transform/schema/core-type.mjs.map +1 -0
  324. package/dist/application/transform/schema/discriminator-property.cjs +21 -0
  325. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
  326. package/dist/application/transform/schema/discriminator-property.mjs +19 -0
  327. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
  328. package/dist/application/transform/schema/enum-rule.cjs +107 -0
  329. package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
  330. package/dist/application/transform/schema/enum-rule.mjs +105 -0
  331. package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
  332. package/dist/application/transform/schema/object-type.cjs +173 -0
  333. package/dist/application/transform/schema/object-type.cjs.map +1 -0
  334. package/dist/application/transform/schema/object-type.mjs +170 -0
  335. package/dist/application/transform/schema/object-type.mjs.map +1 -0
  336. package/dist/application/transform/schema/presence-members.cjs +59 -0
  337. package/dist/application/transform/schema/presence-members.cjs.map +1 -0
  338. package/dist/application/transform/schema/presence-members.mjs +57 -0
  339. package/dist/application/transform/schema/presence-members.mjs.map +1 -0
  340. package/dist/application/transform/schema/schema-transform.cjs +72 -0
  341. package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
  342. package/dist/application/transform/schema/schema-transform.mjs +68 -0
  343. package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
  344. package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
  345. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
  346. package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
  347. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
  348. package/dist/application/transform/schema-comment.cjs +84 -0
  349. package/dist/application/transform/schema-comment.cjs.map +1 -0
  350. package/dist/application/transform/schema-comment.mjs +81 -0
  351. package/dist/application/transform/schema-comment.mjs.map +1 -0
  352. package/dist/application/transform/shared-types.cjs +8 -0
  353. package/dist/application/transform/shared-types.cjs.map +1 -0
  354. package/dist/application/transform/shared-types.mjs +6 -0
  355. package/dist/application/transform/shared-types.mjs.map +1 -0
  356. package/dist/application/transform/type-combinators.cjs +49 -0
  357. package/dist/application/transform/type-combinators.cjs.map +1 -0
  358. package/dist/application/transform/type-combinators.mjs +42 -0
  359. package/dist/application/transform/type-combinators.mjs.map +1 -0
  360. package/dist/cli/cli-arguments.cjs +137 -0
  361. package/dist/cli/cli-arguments.cjs.map +1 -0
  362. package/dist/cli/cli-arguments.mjs +129 -0
  363. package/dist/cli/cli-arguments.mjs.map +1 -0
  364. package/dist/cli/cli-errors.cjs +80 -0
  365. package/dist/cli/cli-errors.cjs.map +1 -0
  366. package/dist/cli/cli-errors.mjs +76 -0
  367. package/dist/cli/cli-errors.mjs.map +1 -0
  368. package/dist/cli/cli-output.cjs +37 -0
  369. package/dist/cli/cli-output.cjs.map +1 -0
  370. package/dist/cli/cli-output.mjs +30 -0
  371. package/dist/cli/cli-output.mjs.map +1 -0
  372. package/dist/cli/docs-links.cjs +6 -0
  373. package/dist/cli/docs-links.cjs.map +1 -0
  374. package/dist/cli/docs-links.mjs +4 -0
  375. package/dist/cli/docs-links.mjs.map +1 -0
  376. package/dist/cli/fix-option.cjs +19 -0
  377. package/dist/cli/fix-option.cjs.map +1 -0
  378. package/dist/cli/fix-option.mjs +16 -0
  379. package/dist/cli/fix-option.mjs.map +1 -0
  380. package/dist/cli/help-text.cjs +44 -0
  381. package/dist/cli/help-text.cjs.map +1 -0
  382. package/dist/cli/help-text.mjs +42 -0
  383. package/dist/cli/help-text.mjs.map +1 -0
  384. package/dist/cli/main.cjs +62 -0
  385. package/dist/cli/main.cjs.map +1 -0
  386. package/dist/cli/main.d.cts +2 -0
  387. package/dist/cli/main.d.mts +2 -0
  388. package/dist/cli/main.d.ts +2 -0
  389. package/dist/cli/main.mjs +54 -0
  390. package/dist/cli/main.mjs.map +1 -0
  391. package/dist/cli/redocly-apis.cjs +65 -0
  392. package/dist/cli/redocly-apis.cjs.map +1 -0
  393. package/dist/cli/redocly-apis.mjs +62 -0
  394. package/dist/cli/redocly-apis.mjs.map +1 -0
  395. package/dist/cli/ref-limits.cjs +14 -0
  396. package/dist/cli/ref-limits.cjs.map +1 -0
  397. package/dist/cli/ref-limits.mjs +12 -0
  398. package/dist/cli/ref-limits.mjs.map +1 -0
  399. package/dist/cli/run-cli.cjs +100 -0
  400. package/dist/cli/run-cli.cjs.map +1 -0
  401. package/dist/cli/run-cli.mjs +98 -0
  402. package/dist/cli/run-cli.mjs.map +1 -0
  403. package/dist/domain/assert-never.cjs +8 -0
  404. package/dist/domain/assert-never.cjs.map +1 -0
  405. package/dist/domain/assert-never.mjs +6 -0
  406. package/dist/domain/assert-never.mjs.map +1 -0
  407. package/dist/domain/errors.cjs +50 -0
  408. package/dist/domain/errors.cjs.map +1 -0
  409. package/dist/domain/errors.mjs +46 -0
  410. package/dist/domain/errors.mjs.map +1 -0
  411. package/dist/domain/ir/constructors.cjs +89 -0
  412. package/dist/domain/ir/constructors.cjs.map +1 -0
  413. package/dist/domain/ir/constructors.mjs +71 -0
  414. package/dist/domain/ir/constructors.mjs.map +1 -0
  415. package/dist/domain/ir/identifier-text.cjs +29 -0
  416. package/dist/domain/ir/identifier-text.cjs.map +1 -0
  417. package/dist/domain/ir/identifier-text.mjs +25 -0
  418. package/dist/domain/ir/identifier-text.mjs.map +1 -0
  419. package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
  420. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
  421. package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
  422. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
  423. package/dist/domain/ir/normalize.cjs +32 -0
  424. package/dist/domain/ir/normalize.cjs.map +1 -0
  425. package/dist/domain/ir/normalize.mjs +29 -0
  426. package/dist/domain/ir/normalize.mjs.map +1 -0
  427. package/dist/domain/ir/property-name.cjs +19 -0
  428. package/dist/domain/ir/property-name.cjs.map +1 -0
  429. package/dist/domain/ir/property-name.mjs +16 -0
  430. package/dist/domain/ir/property-name.mjs.map +1 -0
  431. package/dist/domain/ir/raw-text-escapes.cjs +25 -0
  432. package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
  433. package/dist/domain/ir/raw-text-escapes.mjs +22 -0
  434. package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
  435. package/dist/domain/openapi/alias-expansion.cjs +50 -0
  436. package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
  437. package/dist/domain/openapi/alias-expansion.mjs +45 -0
  438. package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
  439. package/dist/domain/openapi/binary-content.cjs +48 -0
  440. package/dist/domain/openapi/binary-content.cjs.map +1 -0
  441. package/dist/domain/openapi/binary-content.mjs +45 -0
  442. package/dist/domain/openapi/binary-content.mjs.map +1 -0
  443. package/dist/domain/openapi/components-object.cjs +29 -0
  444. package/dist/domain/openapi/components-object.cjs.map +1 -0
  445. package/dist/domain/openapi/components-object.mjs +24 -0
  446. package/dist/domain/openapi/components-object.mjs.map +1 -0
  447. package/dist/domain/openapi/json-pointer.cjs +31 -0
  448. package/dist/domain/openapi/json-pointer.cjs.map +1 -0
  449. package/dist/domain/openapi/json-pointer.mjs +27 -0
  450. package/dist/domain/openapi/json-pointer.mjs.map +1 -0
  451. package/dist/domain/openapi/media-type-object.cjs +14 -0
  452. package/dist/domain/openapi/media-type-object.cjs.map +1 -0
  453. package/dist/domain/openapi/media-type-object.mjs +11 -0
  454. package/dist/domain/openapi/media-type-object.mjs.map +1 -0
  455. package/dist/domain/openapi/parameter-object.cjs +13 -0
  456. package/dist/domain/openapi/parameter-object.cjs.map +1 -0
  457. package/dist/domain/openapi/parameter-object.mjs +10 -0
  458. package/dist/domain/openapi/parameter-object.mjs.map +1 -0
  459. package/dist/domain/openapi/path-item-object.cjs +35 -0
  460. package/dist/domain/openapi/path-item-object.cjs.map +1 -0
  461. package/dist/domain/openapi/path-item-object.mjs +30 -0
  462. package/dist/domain/openapi/path-item-object.mjs.map +1 -0
  463. package/dist/domain/openapi/unsupported-features.cjs +87 -0
  464. package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
  465. package/dist/domain/openapi/unsupported-features.mjs +84 -0
  466. package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
  467. package/dist/domain/output-fixes.cjs +66 -0
  468. package/dist/domain/output-fixes.cjs.map +1 -0
  469. package/dist/domain/output-fixes.mjs +59 -0
  470. package/dist/domain/output-fixes.mjs.map +1 -0
  471. package/dist/index.cjs +98 -0
  472. package/dist/index.cjs.map +1 -0
  473. package/dist/index.d.cts +812 -0
  474. package/dist/index.d.mts +812 -0
  475. package/dist/index.d.ts +812 -0
  476. package/dist/index.mjs +27 -0
  477. package/dist/index.mjs.map +1 -0
  478. package/dist/transform/components-object.cjs +14 -0
  479. package/dist/transform/components-object.cjs.map +1 -0
  480. package/dist/transform/components-object.mjs +10 -0
  481. package/dist/transform/components-object.mjs.map +1 -0
  482. package/dist/transform/header-object.cjs +12 -0
  483. package/dist/transform/header-object.cjs.map +1 -0
  484. package/dist/transform/header-object.mjs +10 -0
  485. package/dist/transform/header-object.mjs.map +1 -0
  486. package/dist/transform/media-type-object.cjs +12 -0
  487. package/dist/transform/media-type-object.cjs.map +1 -0
  488. package/dist/transform/media-type-object.mjs +10 -0
  489. package/dist/transform/media-type-object.mjs.map +1 -0
  490. package/dist/transform/operation-object.cjs +26 -0
  491. package/dist/transform/operation-object.cjs.map +1 -0
  492. package/dist/transform/operation-object.mjs +21 -0
  493. package/dist/transform/operation-object.mjs.map +1 -0
  494. package/dist/transform/parameter-object.cjs +12 -0
  495. package/dist/transform/parameter-object.cjs.map +1 -0
  496. package/dist/transform/parameter-object.mjs +10 -0
  497. package/dist/transform/parameter-object.mjs.map +1 -0
  498. package/dist/transform/path-item-object.cjs +12 -0
  499. package/dist/transform/path-item-object.cjs.map +1 -0
  500. package/dist/transform/path-item-object.mjs +10 -0
  501. package/dist/transform/path-item-object.mjs.map +1 -0
  502. package/dist/transform/paths-object.cjs +11 -0
  503. package/dist/transform/paths-object.cjs.map +1 -0
  504. package/dist/transform/paths-object.mjs +9 -0
  505. package/dist/transform/paths-object.mjs.map +1 -0
  506. package/dist/transform/request-body-object.cjs +12 -0
  507. package/dist/transform/request-body-object.cjs.map +1 -0
  508. package/dist/transform/request-body-object.mjs +10 -0
  509. package/dist/transform/request-body-object.mjs.map +1 -0
  510. package/dist/transform/response-object.cjs +12 -0
  511. package/dist/transform/response-object.cjs.map +1 -0
  512. package/dist/transform/response-object.mjs +10 -0
  513. package/dist/transform/response-object.mjs.map +1 -0
  514. package/dist/transform/responses-object.cjs +12 -0
  515. package/dist/transform/responses-object.cjs.map +1 -0
  516. package/dist/transform/responses-object.mjs +10 -0
  517. package/dist/transform/responses-object.mjs.map +1 -0
  518. package/dist/transform/schema-object.cjs +21 -0
  519. package/dist/transform/schema-object.cjs.map +1 -0
  520. package/dist/transform/schema-object.mjs +16 -0
  521. package/dist/transform/schema-object.mjs.map +1 -0
  522. package/package.json +115 -4
  523. package/src/adapters/node-file-system/node-file-system.ts +44 -0
  524. package/src/adapters/redocly-loader/alias-limit.ts +20 -0
  525. package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
  526. package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
  527. package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
  528. package/src/adapters/redocly-loader/redocly-config-source.ts +43 -0
  529. package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -0
  530. package/src/adapters/redocly-loader/ref-access.ts +146 -0
  531. package/src/adapters/redocly-loader/ref-holders.ts +43 -0
  532. package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
  533. package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
  534. package/src/adapters/redocly-loader/schema-source.ts +151 -0
  535. package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
  536. package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
  537. package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
  538. package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
  539. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +220 -0
  540. package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
  541. package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
  542. package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
  543. package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
  544. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +280 -0
  545. package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
  546. package/src/api/ast-to-string.ts +59 -0
  547. package/src/api/comment-header.ts +7 -0
  548. package/src/api/default-ports.ts +44 -0
  549. package/src/api/discriminator-enum.ts +76 -0
  550. package/src/api/discriminator-scan.ts +272 -0
  551. package/src/api/document-declarations.ts +41 -0
  552. package/src/api/document-refs.ts +71 -0
  553. package/src/api/document-run.ts +159 -0
  554. package/src/api/footer-entry.ts +23 -0
  555. package/src/api/footer-sink.ts +67 -0
  556. package/src/api/legacy-callback-warning.ts +29 -0
  557. package/src/api/legacy-ts-helpers.ts +311 -0
  558. package/src/api/legacy-utils.ts +118 -0
  559. package/src/api/openapi-ts.ts +62 -0
  560. package/src/api/schema-callbacks.ts +211 -0
  561. package/src/api/string-to-ast.ts +27 -0
  562. package/src/api/transform-context.ts +87 -0
  563. package/src/api/transform-schema.ts +39 -0
  564. package/src/api/type-helpers.ts +130 -0
  565. package/src/api/unsupported-feature-warnings.ts +26 -0
  566. package/src/application/ports/file-system.ts +12 -0
  567. package/src/application/ports/logger.ts +16 -0
  568. package/src/application/ports/redocly-config-source.ts +16 -0
  569. package/src/application/ports/schema-loader.ts +32 -0
  570. package/src/application/print/comment-writer.ts +91 -0
  571. package/src/application/print/declaration-printer.ts +100 -0
  572. package/src/application/print/literal-text.ts +62 -0
  573. package/src/application/print/print-nodes.ts +62 -0
  574. package/src/application/print/print-options.ts +11 -0
  575. package/src/application/print/text-writer.ts +83 -0
  576. package/src/application/print/type-printer.ts +281 -0
  577. package/src/application/stack-overflow.ts +54 -0
  578. package/src/application/transform/document/components.ts +189 -0
  579. package/src/application/transform/document/defs-root.ts +25 -0
  580. package/src/application/transform/document/document-member.ts +20 -0
  581. package/src/application/transform/document/document.ts +157 -0
  582. package/src/application/transform/document/header.ts +34 -0
  583. package/src/application/transform/document/kept-deprecated.ts +135 -0
  584. package/src/application/transform/document/media-type.ts +78 -0
  585. package/src/application/transform/document/operation.ts +64 -0
  586. package/src/application/transform/document/parameter.ts +45 -0
  587. package/src/application/transform/document/parameters.ts +200 -0
  588. package/src/application/transform/document/path-item-conflicts.ts +79 -0
  589. package/src/application/transform/document/path-item.ts +168 -0
  590. package/src/application/transform/document/path-key-overlaps.ts +112 -0
  591. package/src/application/transform/document/paths-enum.ts +127 -0
  592. package/src/application/transform/document/paths.ts +211 -0
  593. package/src/application/transform/document/request-body.ts +50 -0
  594. package/src/application/transform/document/response.ts +109 -0
  595. package/src/application/transform/document/responses.ts +29 -0
  596. package/src/application/transform/document/root-type-aliases.ts +106 -0
  597. package/src/application/transform/document/webhooks.ts +22 -0
  598. package/src/application/transform/document-entries.ts +28 -0
  599. package/src/application/transform/footer/document-footer.ts +127 -0
  600. package/src/application/transform/footer/enum-naming.ts +181 -0
  601. package/src/application/transform/helper-types.ts +92 -0
  602. package/src/application/transform/literal-type.ts +54 -0
  603. package/src/application/transform/numbered-names.ts +20 -0
  604. package/src/application/transform/ref-type.ts +97 -0
  605. package/src/application/transform/schema/array-type.ts +152 -0
  606. package/src/application/transform/schema/composition-type.ts +183 -0
  607. package/src/application/transform/schema/core-type.ts +115 -0
  608. package/src/application/transform/schema/discriminator-property.ts +28 -0
  609. package/src/application/transform/schema/enum-rule.ts +157 -0
  610. package/src/application/transform/schema/object-type.ts +271 -0
  611. package/src/application/transform/schema/presence-members.ts +96 -0
  612. package/src/application/transform/schema/schema-context.ts +110 -0
  613. package/src/application/transform/schema/schema-rule.ts +29 -0
  614. package/src/application/transform/schema/schema-transform.ts +99 -0
  615. package/src/application/transform/schema/unevaluated-properties.ts +105 -0
  616. package/src/application/transform/schema-comment.ts +116 -0
  617. package/src/application/transform/shared-types.ts +9 -0
  618. package/src/application/transform/transform-context.ts +51 -0
  619. package/src/application/transform/type-combinators.ts +57 -0
  620. package/src/cli/cli-arguments.ts +198 -0
  621. package/src/cli/cli-dependencies.ts +42 -0
  622. package/src/cli/cli-errors.ts +125 -0
  623. package/src/cli/cli-output.ts +53 -0
  624. package/src/cli/docs-links.ts +6 -0
  625. package/src/cli/fix-option.ts +29 -0
  626. package/src/cli/help-text.ts +52 -0
  627. package/src/cli/main.ts +67 -0
  628. package/src/cli/redocly-apis.ts +91 -0
  629. package/src/cli/ref-limits.ts +16 -0
  630. package/src/cli/run-cli.ts +114 -0
  631. package/src/domain/assert-never.ts +8 -0
  632. package/src/domain/errors.ts +74 -0
  633. package/src/domain/ir/constructors.ts +137 -0
  634. package/src/domain/ir/identifier-text.ts +49 -0
  635. package/src/domain/ir/newer-identifier-ranges.ts +109 -0
  636. package/src/domain/ir/nodes.ts +224 -0
  637. package/src/domain/ir/normalize.ts +51 -0
  638. package/src/domain/ir/property-name.ts +28 -0
  639. package/src/domain/ir/raw-text-escapes.ts +37 -0
  640. package/src/domain/openapi/alias-expansion.ts +72 -0
  641. package/src/domain/openapi/binary-content.ts +74 -0
  642. package/src/domain/openapi/components-object.ts +52 -0
  643. package/src/domain/openapi/document-object.ts +12 -0
  644. package/src/domain/openapi/header-object.ts +9 -0
  645. package/src/domain/openapi/json-pointer.ts +46 -0
  646. package/src/domain/openapi/media-type-object.ts +26 -0
  647. package/src/domain/openapi/operation-object.ts +13 -0
  648. package/src/domain/openapi/parameter-object.ts +30 -0
  649. package/src/domain/openapi/path-item-object.ts +70 -0
  650. package/src/domain/openapi/request-body-object.ts +7 -0
  651. package/src/domain/openapi/response-object.ts +14 -0
  652. package/src/domain/openapi/schema-object.ts +59 -0
  653. package/src/domain/openapi/unsupported-features.ts +139 -0
  654. package/src/domain/output-fixes.ts +95 -0
  655. package/src/index.ts +67 -0
  656. package/src/transform/components-object.ts +25 -0
  657. package/src/transform/header-object.ts +19 -0
  658. package/src/transform/media-type-object.ts +19 -0
  659. package/src/transform/operation-object.ts +36 -0
  660. package/src/transform/parameter-object.ts +19 -0
  661. package/src/transform/parameters-array.ts +19 -0
  662. package/src/transform/path-item-object.ts +22 -0
  663. package/src/transform/paths-enum.ts +8 -0
  664. package/src/transform/paths-object.ts +15 -0
  665. package/src/transform/request-body-object.ts +19 -0
  666. package/src/transform/response-object.ts +19 -0
  667. package/src/transform/responses-object.ts +19 -0
  668. package/src/transform/schema-object.ts +36 -0
  669. package/src/transform/webhooks-object.ts +15 -0
  670. package/src/types/generator-options.ts +267 -0
  671. package/src/types/openapi-common.ts +100 -0
  672. package/src/types/openapi-document.ts +196 -0
  673. package/src/types/openapi-path-item.ts +130 -0
  674. package/src/types/openapi-request.ts +209 -0
  675. package/src/types/openapi-response.ts +81 -0
  676. package/src/types/openapi-schema.ts +169 -0
  677. package/src/types/openapi-security.ts +116 -0
  678. package/src/types.ts +12 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Drew Powers
4
+ Copyright (c) 2026 Fedor Chishchin and openapi-typesafe contributors
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,73 @@
1
1
  # openapi-typesafe
2
2
 
3
- This name is reserved for openapi-typesafe. This version contains no code.
3
+ Generate TypeScript types from [OpenAPI 3.0 and 3.1](https://spec.openapis.org/oas/latest.html) schemas.
4
+ Runs on Node.js; no Java, no running server, no runtime code in the output.
5
+
6
+ A maintained, drop-in successor to `openapi-typescript` (see the [repository README](../../README.md)).
7
+
8
+ > **Status: in development; not published to npm yet.**
9
+
10
+ ## Features
11
+
12
+ - OpenAPI 3.0 and 3.1, including discriminators, `oneOf` / `anyOf` / `allOf`, and `$ref` across files.
13
+ - Runtime-free output: only types.
14
+ - Local or remote schemas, YAML or JSON.
15
+ - Swagger 2.0 is not supported.
16
+
17
+ ## Setup
18
+
19
+ Requires Node.js 22 or newer.
20
+
21
+ ```sh
22
+ npm i -D openapi-typesafe typescript
23
+ ```
24
+
25
+ Recommended `tsconfig.json` settings:
26
+
27
+ ```jsonc
28
+ {
29
+ "compilerOptions": {
30
+ "module": "ESNext", // or "NodeNext"
31
+ "moduleResolution": "Bundler", // or "NodeNext"
32
+ "noUncheckedIndexedAccess": true
33
+ }
34
+ }
35
+ ```
36
+
37
+ ## Usage
38
+
39
+ ```sh
40
+ # Local schema
41
+ npx openapi-typesafe ./path/to/schema.yaml -o ./path/to/schema.d.ts
42
+
43
+ # Remote schema
44
+ npx openapi-typesafe https://example.com/api/v1/openapi.yaml -o ./path/to/schema.d.ts
45
+ ```
46
+
47
+ Then import the types:
48
+
49
+ ```ts
50
+ import type { components, paths } from "./path/to/schema";
51
+
52
+ type User = components["schemas"]["User"];
53
+ type GetUserResponse = paths["/users/{id}"]["get"]["responses"][200]["content"]["application/json"];
54
+ ```
55
+
56
+ With `"moduleResolution": "NodeNext"`, write the extension: `"./path/to/schema.js"`.
57
+
58
+ Run `npx openapi-typesafe --help` for all options. Generated examples for real APIs are in [`examples/`](./examples).
59
+
60
+ ## Migrating from openapi-typescript
61
+
62
+ Replace the package and the binary name; options and output are the same.
63
+
64
+ ```diff
65
+ - npx openapi-typescript ./schema.yaml -o ./schema.d.ts
66
+ + npx openapi-typesafe ./schema.yaml -o ./schema.d.ts
67
+ ```
68
+
69
+ The header of generated files names the new generator, so regenerate and commit the output once.
70
+
71
+ ## License
72
+
73
+ [MIT](./LICENSE)
package/bin/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ // The CLI is built from src/cli/main.ts (ADR-012).
4
+ import "../dist/cli/main.mjs";
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const node_url = require('node:url');
5
+ const errors = require('../../domain/errors.cjs');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
8
+
9
+ const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
10
+
11
+ function causeMessage(cause) {
12
+ return cause instanceof Error ? cause.message : String(cause);
13
+ }
14
+ class NodeFileSystem {
15
+ readText(file) {
16
+ try {
17
+ return fs__default.readFileSync(file, "utf8");
18
+ } catch (cause) {
19
+ throw new errors.OpenAPITypesafeError({
20
+ code: errors.ERROR_CODES.OUTPUT_READ_FAILED,
21
+ message: `Cannot read ${node_url.fileURLToPath(file)}: ${causeMessage(cause)}`,
22
+ details: { file: node_url.fileURLToPath(file) },
23
+ cause
24
+ });
25
+ }
26
+ }
27
+ writeText(file, contents) {
28
+ try {
29
+ fs__default.mkdirSync(new URL(".", file), { recursive: true });
30
+ fs__default.writeFileSync(file, contents, "utf8");
31
+ } catch (cause) {
32
+ throw new errors.OpenAPITypesafeError({
33
+ code: errors.ERROR_CODES.OUTPUT_WRITE_FAILED,
34
+ message: `Cannot write ${node_url.fileURLToPath(file)}: ${causeMessage(cause)}`,
35
+ details: { file: node_url.fileURLToPath(file) },
36
+ cause
37
+ });
38
+ }
39
+ }
40
+ }
41
+ function createNodeFileSystem() {
42
+ return new NodeFileSystem();
43
+ }
44
+
45
+ exports.createNodeFileSystem = createNodeFileSystem;
46
+ //# sourceMappingURL=node-file-system.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-file-system.cjs","sources":["../../../src/adapters/node-file-system/node-file-system.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type { FileReader, FileWriter } from \"../../application/ports/file-system.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/** The file ports on Node's `fs`, with the failures as typed errors (ADR-011). */\n\nfunction causeMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nclass NodeFileSystem implements FileReader, FileWriter {\n readText(file: URL): string {\n try {\n return fs.readFileSync(file, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_READ_FAILED,\n message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n\n writeText(file: URL, contents: string): void {\n try {\n fs.mkdirSync(new URL(\".\", file), { recursive: true });\n fs.writeFileSync(file, contents, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_WRITE_FAILED,\n message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n}\n\n/** File access for the CLI. */\nexport function createNodeFileSystem(): FileReader & FileWriter {\n return new NodeFileSystem();\n}\n"],"names":["fs","OpenAPITypesafeError","ERROR_CODES","fileURLToPath"],"mappings":";;;;;;;;;;AAOA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAEA,MAAM,cAAA,CAAiD;AAAA,EACrD,SAAS,IAAA,EAAmB;AAC1B,IAAA,IAAI;AACF,MAAA,OAAOA,WAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIC,2BAAA,CAAqB;AAAA,QAC7B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,QAClB,OAAA,EAAS,eAAeC,sBAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACnE,OAAA,EAAS,EAAE,IAAA,EAAMA,sBAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,MAAW,QAAA,EAAwB;AAC3C,IAAA,IAAI;AACF,MAAAH,WAAA,CAAG,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,MAAAA,WAAA,CAAG,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIC,2BAAA,CAAqB;AAAA,QAC7B,MAAMC,kBAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,gBAAgBC,sBAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACpE,OAAA,EAAS,EAAE,IAAA,EAAMA,sBAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;;"}
@@ -0,0 +1,40 @@
1
+ import fs from 'node:fs';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
4
+
5
+ function causeMessage(cause) {
6
+ return cause instanceof Error ? cause.message : String(cause);
7
+ }
8
+ class NodeFileSystem {
9
+ readText(file) {
10
+ try {
11
+ return fs.readFileSync(file, "utf8");
12
+ } catch (cause) {
13
+ throw new OpenAPITypesafeError({
14
+ code: ERROR_CODES.OUTPUT_READ_FAILED,
15
+ message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,
16
+ details: { file: fileURLToPath(file) },
17
+ cause
18
+ });
19
+ }
20
+ }
21
+ writeText(file, contents) {
22
+ try {
23
+ fs.mkdirSync(new URL(".", file), { recursive: true });
24
+ fs.writeFileSync(file, contents, "utf8");
25
+ } catch (cause) {
26
+ throw new OpenAPITypesafeError({
27
+ code: ERROR_CODES.OUTPUT_WRITE_FAILED,
28
+ message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,
29
+ details: { file: fileURLToPath(file) },
30
+ cause
31
+ });
32
+ }
33
+ }
34
+ }
35
+ function createNodeFileSystem() {
36
+ return new NodeFileSystem();
37
+ }
38
+
39
+ export { createNodeFileSystem };
40
+ //# sourceMappingURL=node-file-system.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-file-system.mjs","sources":["../../../src/adapters/node-file-system/node-file-system.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type { FileReader, FileWriter } from \"../../application/ports/file-system.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/** The file ports on Node's `fs`, with the failures as typed errors (ADR-011). */\n\nfunction causeMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nclass NodeFileSystem implements FileReader, FileWriter {\n readText(file: URL): string {\n try {\n return fs.readFileSync(file, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_READ_FAILED,\n message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n\n writeText(file: URL, contents: string): void {\n try {\n fs.mkdirSync(new URL(\".\", file), { recursive: true });\n fs.writeFileSync(file, contents, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_WRITE_FAILED,\n message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n}\n\n/** File access for the CLI. */\nexport function createNodeFileSystem(): FileReader & FileWriter {\n return new NodeFileSystem();\n}\n"],"names":[],"mappings":";;;;AAOA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAEA,MAAM,cAAA,CAAiD;AAAA,EACrD,SAAS,IAAA,EAAmB;AAC1B,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,MAAM,WAAA,CAAY,kBAAA;AAAA,QAClB,OAAA,EAAS,eAAe,aAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACnE,OAAA,EAAS,EAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,MAAW,QAAA,EAAwB;AAC3C,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,MAAA,EAAA,CAAG,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,MAAM,WAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,gBAAgB,aAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACpE,OAAA,EAAS,EAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;;"}
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const aliasExpansion = require('../../domain/openapi/alias-expansion.cjs');
4
+
5
+ function aliasExpansionFailure(parsed) {
6
+ const counts = aliasExpansion.countNodes(parsed);
7
+ if (!aliasExpansion.isAliasExpansionExcessive(counts)) {
8
+ return void 0;
9
+ }
10
+ return new Error(
11
+ `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, more than ${aliasExpansion.ALIAS_EXPANSION_MAX_RATIO} times its size`
12
+ );
13
+ }
14
+
15
+ exports.aliasExpansionFailure = aliasExpansionFailure;
16
+ //# sourceMappingURL=alias-limit.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alias-limit.cjs","sources":["../../../src/adapters/redocly-loader/alias-limit.ts"],"sourcesContent":["import {\n ALIAS_EXPANSION_MAX_RATIO,\n countNodes,\n isAliasExpansionExcessive,\n} from \"../../domain/openapi/alias-expansion.js\";\n\n/**\n * The reason a parsed YAML document is refused, if its aliases expand it too far. The check runs\n * right after parsing, before Redocly or the generator walk the document (pre-beta test plan 10.2).\n */\nexport function aliasExpansionFailure(parsed: unknown): Error | undefined {\n const counts = countNodes(parsed);\n if (!isAliasExpansionExcessive(counts)) {\n return undefined;\n }\n return new Error(\n `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, ` +\n `more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`,\n );\n}\n"],"names":["countNodes","isAliasExpansionExcessive","ALIAS_EXPANSION_MAX_RATIO"],"mappings":";;;;AAUO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,MAAM,MAAA,GAASA,0BAAW,MAAM,CAAA;AAChC,EAAA,IAAI,CAACC,wCAAA,CAA0B,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,yCAAyC,MAAA,CAAO,MAAM,OAAO,MAAA,CAAO,QAAQ,qBAC7DC,wCAAyB,CAAA,eAAA;AAAA,GAC1C;AACF;;"}
@@ -0,0 +1,14 @@
1
+ import { countNodes, isAliasExpansionExcessive, ALIAS_EXPANSION_MAX_RATIO } from '../../domain/openapi/alias-expansion.mjs';
2
+
3
+ function aliasExpansionFailure(parsed) {
4
+ const counts = countNodes(parsed);
5
+ if (!isAliasExpansionExcessive(counts)) {
6
+ return void 0;
7
+ }
8
+ return new Error(
9
+ `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`
10
+ );
11
+ }
12
+
13
+ export { aliasExpansionFailure };
14
+ //# sourceMappingURL=alias-limit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alias-limit.mjs","sources":["../../../src/adapters/redocly-loader/alias-limit.ts"],"sourcesContent":["import {\n ALIAS_EXPANSION_MAX_RATIO,\n countNodes,\n isAliasExpansionExcessive,\n} from \"../../domain/openapi/alias-expansion.js\";\n\n/**\n * The reason a parsed YAML document is refused, if its aliases expand it too far. The check runs\n * right after parsing, before Redocly or the generator walk the document (pre-beta test plan 10.2).\n */\nexport function aliasExpansionFailure(parsed: unknown): Error | undefined {\n const counts = countNodes(parsed);\n if (!isAliasExpansionExcessive(counts)) {\n return undefined;\n }\n return new Error(\n `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, ` +\n `more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`,\n );\n}\n"],"names":[],"mappings":";;AAUO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,MAAM,MAAA,GAAS,WAAW,MAAM,CAAA;AAChC,EAAA,IAAI,CAAC,yBAAA,CAA0B,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,yCAAyC,MAAA,CAAO,MAAM,OAAO,MAAA,CAAO,QAAQ,qBAC7D,yBAAyB,CAAA,eAAA;AAAA,GAC1C;AACF;;"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const DEFAULT_PORTS = { "http:": "80", "https:": "443" };
4
+ const FULLY_QUALIFIED_DOT = /\.$/;
5
+ const PORT_SUFFIX = /:(\d+)$/;
6
+ const NOT_A_HOST = /[/?#@\\]/;
7
+ function withBrackets(entry) {
8
+ const isBareIPv6 = !entry.startsWith("[") && entry.split(":").length > 2;
9
+ return isBareIPv6 ? `[${entry}]` : entry;
10
+ }
11
+ function hostnameOf(url) {
12
+ return url.hostname.replace(FULLY_QUALIFIED_DOT, "");
13
+ }
14
+ function portOf(url) {
15
+ return url.port === "" ? DEFAULT_PORTS[url.protocol] ?? "" : url.port;
16
+ }
17
+ function writtenPort(entry) {
18
+ const match = PORT_SUFFIX.exec(entry);
19
+ return match === null ? void 0 : String(Number(match[1]));
20
+ }
21
+ function parseHostEntry(entry) {
22
+ const written = withBrackets(entry.trim());
23
+ const candidate = `http://${written}`;
24
+ if (written === "" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {
25
+ return void 0;
26
+ }
27
+ return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };
28
+ }
29
+ function isHostAllowed(url, hosts) {
30
+ const hostname = hostnameOf(url);
31
+ if (hostname === "") {
32
+ return false;
33
+ }
34
+ const port = portOf(url);
35
+ return hosts.map(parseHostEntry).some((entry) => {
36
+ const isAnyPort = entry?.port === void 0;
37
+ return entry?.hostname === hostname && (isAnyPort || entry.port === port);
38
+ });
39
+ }
40
+
41
+ exports.isHostAllowed = isHostAllowed;
42
+ //# sourceMappingURL=allowed-hosts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-hosts.cjs","sources":["../../../src/adapters/redocly-loader/allowed-hosts.ts"],"sourcesContent":["/**\n * Matching URLs against the `--remote-ref-hosts` list (threat model R2, ADR-017). Both sides are\n * compared as the WHATWG URL parser writes hosts (lower case, Punycode, dotted IPv4, compressed\n * IPv6 in brackets), so `bücher.example`, `::1` and `api.example.com.` match the hosts they name.\n */\n\nconst DEFAULT_PORTS: Readonly<Record<string, string>> = { \"http:\": \"80\", \"https:\": \"443\" };\nconst FULLY_QUALIFIED_DOT = /\\.$/;\nconst PORT_SUFFIX = /:(\\d+)$/;\n/** Characters that end a host in a URL: an entry with them would match a different host. */\nconst NOT_A_HOST = /[/?#@\\\\]/;\n\ninterface HostEntry {\n readonly hostname: string;\n /** Undefined when the entry allows any port. */\n readonly port: string | undefined;\n}\n\n/** A bare IPv6 address has two colons or more and cannot carry a port; brackets add one. */\nfunction withBrackets(entry: string): string {\n const isBareIPv6 = !entry.startsWith(\"[\") && entry.split(\":\").length > 2;\n return isBareIPv6 ? `[${entry}]` : entry;\n}\n\nfunction hostnameOf(url: URL): string {\n return url.hostname.replace(FULLY_QUALIFIED_DOT, \"\");\n}\n\nfunction portOf(url: URL): string {\n return url.port === \"\" ? (DEFAULT_PORTS[url.protocol] ?? \"\") : url.port;\n}\n\n/** The written port without leading zeros, as the URL parser writes it; undefined when none. */\nfunction writtenPort(entry: string): string | undefined {\n const match = PORT_SUFFIX.exec(entry);\n return match === null ? undefined : String(Number(match[1]));\n}\n\n/** The entry as the URL parser reads it, or undefined when it is not a bare host or host:port. */\nfunction parseHostEntry(entry: string): HostEntry | undefined {\n const written = withBrackets(entry.trim());\n const candidate = `http://${written}`;\n if (written === \"\" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {\n return undefined;\n }\n // The port is read from the text: the parser drops a default port (`:80`), which must still\n // limit the entry to that port.\n return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };\n}\n\n/** Whether the URL's host is listed, by host name alone (any port) or with its port. */\nexport function isHostAllowed(url: URL, hosts: readonly string[]): boolean {\n const hostname = hostnameOf(url);\n if (hostname === \"\") {\n return false;\n }\n const port = portOf(url);\n return hosts.map(parseHostEntry).some((entry) => {\n const isAnyPort = entry?.port === undefined;\n return entry?.hostname === hostname && (isAnyPort || entry.port === port);\n });\n}\n"],"names":[],"mappings":";;AAMA,MAAM,aAAA,GAAkD,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAM;AACzF,MAAM,mBAAA,GAAsB,KAAA;AAC5B,MAAM,WAAA,GAAc,SAAA;AAEpB,MAAM,UAAA,GAAa,UAAA;AASnB,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AACvE,EAAA,OAAO,UAAA,GAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,KAAA;AACrC;AAEA,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AACrD;AAEA,SAAS,OAAO,GAAA,EAAkB;AAChC,EAAA,OAAO,GAAA,CAAI,SAAS,EAAA,GAAM,aAAA,CAAc,IAAI,QAAQ,CAAA,IAAK,KAAM,GAAA,CAAI,IAAA;AACrE;AAGA,SAAS,YAAY,KAAA,EAAmC;AACtD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA,KAAU,OAAO,MAAA,GAAY,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC7D;AAGA,SAAS,eAAe,KAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,UAAU,OAAO,CAAA,CAAA;AACnC,EAAA,IAAI,OAAA,KAAY,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,OAAO,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA,EAAE;AAChF;AAGO,SAAS,aAAA,CAAc,KAAU,KAAA,EAAmC;AACzE,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,OAAO,MAAM,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,KAAS,MAAA;AAClC,IAAA,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,MAAM,IAAA,KAAS,IAAA,CAAA;AAAA,EACtE,CAAC,CAAA;AACH;;"}
@@ -0,0 +1,40 @@
1
+ const DEFAULT_PORTS = { "http:": "80", "https:": "443" };
2
+ const FULLY_QUALIFIED_DOT = /\.$/;
3
+ const PORT_SUFFIX = /:(\d+)$/;
4
+ const NOT_A_HOST = /[/?#@\\]/;
5
+ function withBrackets(entry) {
6
+ const isBareIPv6 = !entry.startsWith("[") && entry.split(":").length > 2;
7
+ return isBareIPv6 ? `[${entry}]` : entry;
8
+ }
9
+ function hostnameOf(url) {
10
+ return url.hostname.replace(FULLY_QUALIFIED_DOT, "");
11
+ }
12
+ function portOf(url) {
13
+ return url.port === "" ? DEFAULT_PORTS[url.protocol] ?? "" : url.port;
14
+ }
15
+ function writtenPort(entry) {
16
+ const match = PORT_SUFFIX.exec(entry);
17
+ return match === null ? void 0 : String(Number(match[1]));
18
+ }
19
+ function parseHostEntry(entry) {
20
+ const written = withBrackets(entry.trim());
21
+ const candidate = `http://${written}`;
22
+ if (written === "" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {
23
+ return void 0;
24
+ }
25
+ return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };
26
+ }
27
+ function isHostAllowed(url, hosts) {
28
+ const hostname = hostnameOf(url);
29
+ if (hostname === "") {
30
+ return false;
31
+ }
32
+ const port = portOf(url);
33
+ return hosts.map(parseHostEntry).some((entry) => {
34
+ const isAnyPort = entry?.port === void 0;
35
+ return entry?.hostname === hostname && (isAnyPort || entry.port === port);
36
+ });
37
+ }
38
+
39
+ export { isHostAllowed };
40
+ //# sourceMappingURL=allowed-hosts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowed-hosts.mjs","sources":["../../../src/adapters/redocly-loader/allowed-hosts.ts"],"sourcesContent":["/**\n * Matching URLs against the `--remote-ref-hosts` list (threat model R2, ADR-017). Both sides are\n * compared as the WHATWG URL parser writes hosts (lower case, Punycode, dotted IPv4, compressed\n * IPv6 in brackets), so `bücher.example`, `::1` and `api.example.com.` match the hosts they name.\n */\n\nconst DEFAULT_PORTS: Readonly<Record<string, string>> = { \"http:\": \"80\", \"https:\": \"443\" };\nconst FULLY_QUALIFIED_DOT = /\\.$/;\nconst PORT_SUFFIX = /:(\\d+)$/;\n/** Characters that end a host in a URL: an entry with them would match a different host. */\nconst NOT_A_HOST = /[/?#@\\\\]/;\n\ninterface HostEntry {\n readonly hostname: string;\n /** Undefined when the entry allows any port. */\n readonly port: string | undefined;\n}\n\n/** A bare IPv6 address has two colons or more and cannot carry a port; brackets add one. */\nfunction withBrackets(entry: string): string {\n const isBareIPv6 = !entry.startsWith(\"[\") && entry.split(\":\").length > 2;\n return isBareIPv6 ? `[${entry}]` : entry;\n}\n\nfunction hostnameOf(url: URL): string {\n return url.hostname.replace(FULLY_QUALIFIED_DOT, \"\");\n}\n\nfunction portOf(url: URL): string {\n return url.port === \"\" ? (DEFAULT_PORTS[url.protocol] ?? \"\") : url.port;\n}\n\n/** The written port without leading zeros, as the URL parser writes it; undefined when none. */\nfunction writtenPort(entry: string): string | undefined {\n const match = PORT_SUFFIX.exec(entry);\n return match === null ? undefined : String(Number(match[1]));\n}\n\n/** The entry as the URL parser reads it, or undefined when it is not a bare host or host:port. */\nfunction parseHostEntry(entry: string): HostEntry | undefined {\n const written = withBrackets(entry.trim());\n const candidate = `http://${written}`;\n if (written === \"\" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {\n return undefined;\n }\n // The port is read from the text: the parser drops a default port (`:80`), which must still\n // limit the entry to that port.\n return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };\n}\n\n/** Whether the URL's host is listed, by host name alone (any port) or with its port. */\nexport function isHostAllowed(url: URL, hosts: readonly string[]): boolean {\n const hostname = hostnameOf(url);\n if (hostname === \"\") {\n return false;\n }\n const port = portOf(url);\n return hosts.map(parseHostEntry).some((entry) => {\n const isAnyPort = entry?.port === undefined;\n return entry?.hostname === hostname && (isAnyPort || entry.port === port);\n });\n}\n"],"names":[],"mappings":"AAMA,MAAM,aAAA,GAAkD,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAM;AACzF,MAAM,mBAAA,GAAsB,KAAA;AAC5B,MAAM,WAAA,GAAc,SAAA;AAEpB,MAAM,UAAA,GAAa,UAAA;AASnB,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AACvE,EAAA,OAAO,UAAA,GAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,KAAA;AACrC;AAEA,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AACrD;AAEA,SAAS,OAAO,GAAA,EAAkB;AAChC,EAAA,OAAO,GAAA,CAAI,SAAS,EAAA,GAAM,aAAA,CAAc,IAAI,QAAQ,CAAA,IAAK,KAAM,GAAA,CAAI,IAAA;AACrE;AAGA,SAAS,YAAY,KAAA,EAAmC;AACtD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA,KAAU,OAAO,MAAA,GAAY,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC7D;AAGA,SAAS,eAAe,KAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,UAAU,OAAO,CAAA,CAAA;AACnC,EAAA,IAAI,OAAA,KAAY,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,OAAO,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA,EAAE;AAChF;AAGO,SAAS,aAAA,CAAc,KAAU,KAAA,EAAmC;AACzE,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,OAAO,MAAM,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,KAAS,MAAA;AAClC,IAAA,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,MAAM,IAAA,KAAS,IAAA,CAAA;AAAA,EACtE,CAAC,CAAA;AACH;;"}
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
4
+ const refHolders = require('./ref-holders.cjs');
5
+
6
+ const LOCAL_REF_PREFIX = "#/";
7
+ function isContainer(value) {
8
+ return typeof value === "object" && value !== null;
9
+ }
10
+ function childAt(node, segment) {
11
+ if (!isContainer(node) || !Object.hasOwn(node, segment)) {
12
+ return void 0;
13
+ }
14
+ return node[segment];
15
+ }
16
+ function resolves(document, segments) {
17
+ return segments.reduce(childAt, document) !== void 0;
18
+ }
19
+ function decodedSegments(ref) {
20
+ try {
21
+ return jsonPointer.parseRefPointer(ref);
22
+ } catch (error) {
23
+ if (error instanceof URIError) {
24
+ return null;
25
+ }
26
+ throw error;
27
+ }
28
+ }
29
+ function repairedRef(document, ref) {
30
+ const decoded = decodedSegments(ref);
31
+ if (decoded && resolves(document, decoded)) {
32
+ return null;
33
+ }
34
+ const raw = ref.slice(LOCAL_REF_PREFIX.length).split("/").filter(Boolean);
35
+ if (!resolves(document, raw)) {
36
+ return null;
37
+ }
38
+ return `${LOCAL_REF_PREFIX}${raw.map(jsonPointer.escapePointerSegment).join("/")}`;
39
+ }
40
+ function repairBundledRefs(document) {
41
+ for (const { node } of refHolders.findRefHolders(document)) {
42
+ if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {
43
+ continue;
44
+ }
45
+ const repaired = repairedRef(document, node.$ref);
46
+ if (repaired !== null) {
47
+ node.$ref = repaired;
48
+ }
49
+ }
50
+ }
51
+
52
+ exports.repairBundledRefs = repairBundledRefs;
53
+ //# sourceMappingURL=bundled-ref-repair.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-ref-repair.cjs","sources":["../../../src/adapters/redocly-loader/bundled-ref-repair.ts"],"sourcesContent":["import { escapePointerSegment, parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the raw segment of the\n * original pointer (`a~0b`, `50%`), and writes the new local `$ref` without escaping it. Read as a\n * JSON Pointer, `#/components/schemas/a~0b` names the key `a~b`, which does not exist, and\n * `#/components/schemas/50%` is malformed, so the generator failed on it. This rewrites every\n * local `$ref` that does not resolve as a pointer but does resolve segment by segment as written.\n */\n\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isContainer(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction childAt(node: unknown, segment: string): unknown {\n if (!isContainer(node) || !Object.hasOwn(node, segment)) {\n return undefined;\n }\n return (node as Record<string, unknown>)[segment];\n}\n\nfunction resolves(document: unknown, segments: readonly string[]): boolean {\n return segments.reduce<unknown>(childAt, document) !== undefined;\n}\n\n/** The pointer's segments, or null when the pointer has a malformed percent escape. */\nfunction decodedSegments(ref: string): string[] | null {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (error instanceof URIError) {\n return null;\n }\n throw error;\n }\n}\n\n/** The repaired `$ref`, or null when the ref resolves already or cannot be repaired. */\nfunction repairedRef(document: unknown, ref: string): string | null {\n const decoded = decodedSegments(ref);\n if (decoded && resolves(document, decoded)) {\n return null;\n }\n const raw = ref.slice(LOCAL_REF_PREFIX.length).split(\"/\").filter(Boolean);\n if (!resolves(document, raw)) {\n return null;\n }\n return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join(\"/\")}`;\n}\n\n/** Repair the local `$ref`s of a bundled document in place, as Redocly's bundle edits it. */\nexport function repairBundledRefs(document: unknown): void {\n for (const { node } of findRefHolders(document)) {\n if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {\n continue;\n }\n const repaired = repairedRef(document, node.$ref);\n if (repaired !== null) {\n node.$ref = repaired;\n }\n }\n}\n"],"names":["parseRefPointer","escapePointerSegment","findRefHolders"],"mappings":";;;;;AAWA,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,YAAY,KAAA,EAAiC;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,OAAA,CAAQ,MAAe,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,YAAY,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,KAAiC,OAAO,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,UAAmB,QAAA,EAAsC;AACzE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA,KAAM,MAAA;AACzD;AAGA,SAAS,gBAAgB,GAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,OAAOA,4BAAgB,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,SAAS,WAAA,CAAY,UAAmB,GAAA,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,GAAA,CAAI,IAAIC,gCAAoB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACtE;AAGO,SAAS,kBAAkB,QAAA,EAAyB;AACzD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAKC,yBAAA,CAAe,QAAQ,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,IACd;AAAA,EACF;AACF;;"}
@@ -0,0 +1,51 @@
1
+ import { escapePointerSegment, parseRefPointer } from '../../domain/openapi/json-pointer.mjs';
2
+ import { findRefHolders } from './ref-holders.mjs';
3
+
4
+ const LOCAL_REF_PREFIX = "#/";
5
+ function isContainer(value) {
6
+ return typeof value === "object" && value !== null;
7
+ }
8
+ function childAt(node, segment) {
9
+ if (!isContainer(node) || !Object.hasOwn(node, segment)) {
10
+ return void 0;
11
+ }
12
+ return node[segment];
13
+ }
14
+ function resolves(document, segments) {
15
+ return segments.reduce(childAt, document) !== void 0;
16
+ }
17
+ function decodedSegments(ref) {
18
+ try {
19
+ return parseRefPointer(ref);
20
+ } catch (error) {
21
+ if (error instanceof URIError) {
22
+ return null;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ function repairedRef(document, ref) {
28
+ const decoded = decodedSegments(ref);
29
+ if (decoded && resolves(document, decoded)) {
30
+ return null;
31
+ }
32
+ const raw = ref.slice(LOCAL_REF_PREFIX.length).split("/").filter(Boolean);
33
+ if (!resolves(document, raw)) {
34
+ return null;
35
+ }
36
+ return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join("/")}`;
37
+ }
38
+ function repairBundledRefs(document) {
39
+ for (const { node } of findRefHolders(document)) {
40
+ if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {
41
+ continue;
42
+ }
43
+ const repaired = repairedRef(document, node.$ref);
44
+ if (repaired !== null) {
45
+ node.$ref = repaired;
46
+ }
47
+ }
48
+ }
49
+
50
+ export { repairBundledRefs };
51
+ //# sourceMappingURL=bundled-ref-repair.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-ref-repair.mjs","sources":["../../../src/adapters/redocly-loader/bundled-ref-repair.ts"],"sourcesContent":["import { escapePointerSegment, parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the raw segment of the\n * original pointer (`a~0b`, `50%`), and writes the new local `$ref` without escaping it. Read as a\n * JSON Pointer, `#/components/schemas/a~0b` names the key `a~b`, which does not exist, and\n * `#/components/schemas/50%` is malformed, so the generator failed on it. This rewrites every\n * local `$ref` that does not resolve as a pointer but does resolve segment by segment as written.\n */\n\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isContainer(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction childAt(node: unknown, segment: string): unknown {\n if (!isContainer(node) || !Object.hasOwn(node, segment)) {\n return undefined;\n }\n return (node as Record<string, unknown>)[segment];\n}\n\nfunction resolves(document: unknown, segments: readonly string[]): boolean {\n return segments.reduce<unknown>(childAt, document) !== undefined;\n}\n\n/** The pointer's segments, or null when the pointer has a malformed percent escape. */\nfunction decodedSegments(ref: string): string[] | null {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (error instanceof URIError) {\n return null;\n }\n throw error;\n }\n}\n\n/** The repaired `$ref`, or null when the ref resolves already or cannot be repaired. */\nfunction repairedRef(document: unknown, ref: string): string | null {\n const decoded = decodedSegments(ref);\n if (decoded && resolves(document, decoded)) {\n return null;\n }\n const raw = ref.slice(LOCAL_REF_PREFIX.length).split(\"/\").filter(Boolean);\n if (!resolves(document, raw)) {\n return null;\n }\n return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join(\"/\")}`;\n}\n\n/** Repair the local `$ref`s of a bundled document in place, as Redocly's bundle edits it. */\nexport function repairBundledRefs(document: unknown): void {\n for (const { node } of findRefHolders(document)) {\n if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {\n continue;\n }\n const repaired = repairedRef(document, node.$ref);\n if (repaired !== null) {\n node.$ref = repaired;\n }\n }\n}\n"],"names":[],"mappings":";;;AAWA,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,YAAY,KAAA,EAAiC;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,OAAA,CAAQ,MAAe,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,YAAY,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,KAAiC,OAAO,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,UAAmB,QAAA,EAAsC;AACzE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA,KAAM,MAAA;AACzD;AAGA,SAAS,gBAAgB,GAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,SAAS,WAAA,CAAY,UAAmB,GAAA,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,GAAA,CAAI,IAAI,oBAAoB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACtE;AAGO,SAAS,kBAAkB,QAAA,EAAyB;AACzD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,IACd;AAAA,EACF;AACF;;"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ const errors = require('../../domain/errors.cjs');
4
+ const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
5
+ const refHolders = require('./ref-holders.cjs');
6
+
7
+ const REFS_IN_MESSAGE = 5;
8
+ function isMalformed(ref) {
9
+ try {
10
+ jsonPointer.parseRefPointer(ref);
11
+ return false;
12
+ } catch (error) {
13
+ if (error instanceof URIError) {
14
+ return true;
15
+ }
16
+ throw error;
17
+ }
18
+ }
19
+ function findMalformedRefs(documents) {
20
+ return documents.flatMap(
21
+ (document) => refHolders.findRefHolders(document.parsed).filter(({ node }) => isMalformed(node.$ref)).map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source }))
22
+ );
23
+ }
24
+ function describeRef(found) {
25
+ return `"${found.ref}" at ${found.pointer} in ${found.source}`;
26
+ }
27
+ function malformedRefsError(refs, cause) {
28
+ const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);
29
+ const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : "";
30
+ const where = listed.length === 0 ? "" : `: ${listed.join(", ")}${more}`;
31
+ return new errors.OpenAPITypesafeError({
32
+ code: errors.ERROR_CODES.SCHEMA_REF_INVALID,
33
+ message: `A $ref has a malformed percent escape; write "%" as "%25" in a JSON Pointer${where}.`,
34
+ details: { reason: "malformed", refs: refs.map((found) => ({ ...found })) },
35
+ cause
36
+ });
37
+ }
38
+
39
+ exports.findMalformedRefs = findMalformedRefs;
40
+ exports.malformedRefsError = malformedRefsError;
41
+ //# sourceMappingURL=malformed-refs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malformed-refs.cjs","sources":["../../../src/adapters/redocly-loader/malformed-refs.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly percent-decodes every JSON Pointer in a `$ref` and throws a bare `URIError` for a\n * malformed escape such as `#/components/schemas/50%` (`%` must be written `%25`). The loader\n * looks for these refs only after Redocly threw, and names them.\n */\n\n/** Enough refs in the message to act on; `details.refs` has all of them. */\nconst REFS_IN_MESSAGE = 5;\n\n/** A `$ref` whose pointer has a malformed percent escape, and where it is. */\nexport interface MalformedRef {\n readonly ref: string;\n readonly pointer: string;\n readonly source: string;\n}\n\nfunction isMalformed(ref: string): boolean {\n try {\n parseRefPointer(ref);\n return false;\n } catch (error) {\n if (error instanceof URIError) {\n return true;\n }\n throw error;\n }\n}\n\n/** Every malformed `$ref` of the given documents. */\nexport function findMalformedRefs(documents: readonly LoadedDocument[]): MalformedRef[] {\n return documents.flatMap((document) =>\n findRefHolders(document.parsed)\n .filter(({ node }) => isMalformed(node.$ref))\n .map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source })),\n );\n}\n\nfunction describeRef(found: MalformedRef): string {\n return `\"${found.ref}\" at ${found.pointer} in ${found.source}`;\n}\n\n/** The typed error for Redocly's `URIError`; `cause` is that error. */\nexport function malformedRefsError(\n refs: readonly MalformedRef[],\n cause: unknown,\n): OpenAPITypesafeError {\n const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);\n const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : \"\";\n const where = listed.length === 0 ? \"\" : `: ${listed.join(\", \")}${more}`;\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `A $ref has a malformed percent escape; write \"%\" as \"%25\" in a JSON Pointer${where}.`,\n details: { reason: \"malformed\", refs: refs.map((found) => ({ ...found })) },\n cause,\n });\n}\n"],"names":["parseRefPointer","findRefHolders","OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;;;AAYA,MAAM,eAAA,GAAkB,CAAA;AASxB,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI;AACF,IAAAA,2BAAA,CAAgB,GAAG,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGO,SAAS,kBAAkB,SAAA,EAAsD;AACtF,EAAA,OAAO,SAAA,CAAU,OAAA;AAAA,IAAQ,CAAC,QAAA,KACxBC,yBAAA,CAAe,QAAA,CAAS,MAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,WAAA,CAAY,KAAK,IAAI,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAA,EAAQ,MAAO,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,CAAS,QAAO,CAAE;AAAA,GACtF;AACF;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA,IAAA,EAAO,MAAM,MAAM,CAAA,CAAA;AAC9D;AAGO,SAAS,kBAAA,CACd,MACA,KAAA,EACsB;AACtB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA,CAAE,IAAI,WAAW,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,eAAA,GAAkB,QAAQ,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA,KAAA,CAAA,GAAU,EAAA;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA;AACtE,EAAA,OAAO,IAAIC,2BAAA,CAAqB;AAAA,IAC9B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,IAClB,OAAA,EAAS,8EAA8E,KAAK,CAAA,CAAA,CAAA;AAAA,IAC5F,OAAA,EAAS,EAAE,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,GAAQ,CAAA,EAAE;AAAA,IAC1E;AAAA,GACD,CAAA;AACH;;;"}
@@ -0,0 +1,38 @@
1
+ import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
2
+ import { parseRefPointer } from '../../domain/openapi/json-pointer.mjs';
3
+ import { findRefHolders } from './ref-holders.mjs';
4
+
5
+ const REFS_IN_MESSAGE = 5;
6
+ function isMalformed(ref) {
7
+ try {
8
+ parseRefPointer(ref);
9
+ return false;
10
+ } catch (error) {
11
+ if (error instanceof URIError) {
12
+ return true;
13
+ }
14
+ throw error;
15
+ }
16
+ }
17
+ function findMalformedRefs(documents) {
18
+ return documents.flatMap(
19
+ (document) => findRefHolders(document.parsed).filter(({ node }) => isMalformed(node.$ref)).map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source }))
20
+ );
21
+ }
22
+ function describeRef(found) {
23
+ return `"${found.ref}" at ${found.pointer} in ${found.source}`;
24
+ }
25
+ function malformedRefsError(refs, cause) {
26
+ const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);
27
+ const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : "";
28
+ const where = listed.length === 0 ? "" : `: ${listed.join(", ")}${more}`;
29
+ return new OpenAPITypesafeError({
30
+ code: ERROR_CODES.SCHEMA_REF_INVALID,
31
+ message: `A $ref has a malformed percent escape; write "%" as "%25" in a JSON Pointer${where}.`,
32
+ details: { reason: "malformed", refs: refs.map((found) => ({ ...found })) },
33
+ cause
34
+ });
35
+ }
36
+
37
+ export { findMalformedRefs, malformedRefsError };
38
+ //# sourceMappingURL=malformed-refs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"malformed-refs.mjs","sources":["../../../src/adapters/redocly-loader/malformed-refs.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly percent-decodes every JSON Pointer in a `$ref` and throws a bare `URIError` for a\n * malformed escape such as `#/components/schemas/50%` (`%` must be written `%25`). The loader\n * looks for these refs only after Redocly threw, and names them.\n */\n\n/** Enough refs in the message to act on; `details.refs` has all of them. */\nconst REFS_IN_MESSAGE = 5;\n\n/** A `$ref` whose pointer has a malformed percent escape, and where it is. */\nexport interface MalformedRef {\n readonly ref: string;\n readonly pointer: string;\n readonly source: string;\n}\n\nfunction isMalformed(ref: string): boolean {\n try {\n parseRefPointer(ref);\n return false;\n } catch (error) {\n if (error instanceof URIError) {\n return true;\n }\n throw error;\n }\n}\n\n/** Every malformed `$ref` of the given documents. */\nexport function findMalformedRefs(documents: readonly LoadedDocument[]): MalformedRef[] {\n return documents.flatMap((document) =>\n findRefHolders(document.parsed)\n .filter(({ node }) => isMalformed(node.$ref))\n .map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source })),\n );\n}\n\nfunction describeRef(found: MalformedRef): string {\n return `\"${found.ref}\" at ${found.pointer} in ${found.source}`;\n}\n\n/** The typed error for Redocly's `URIError`; `cause` is that error. */\nexport function malformedRefsError(\n refs: readonly MalformedRef[],\n cause: unknown,\n): OpenAPITypesafeError {\n const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);\n const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : \"\";\n const where = listed.length === 0 ? \"\" : `: ${listed.join(\", \")}${more}`;\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `A $ref has a malformed percent escape; write \"%\" as \"%25\" in a JSON Pointer${where}.`,\n details: { reason: \"malformed\", refs: refs.map((found) => ({ ...found })) },\n cause,\n });\n}\n"],"names":[],"mappings":";;;;AAYA,MAAM,eAAA,GAAkB,CAAA;AASxB,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI;AACF,IAAA,eAAA,CAAgB,GAAG,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGO,SAAS,kBAAkB,SAAA,EAAsD;AACtF,EAAA,OAAO,SAAA,CAAU,OAAA;AAAA,IAAQ,CAAC,QAAA,KACxB,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,WAAA,CAAY,KAAK,IAAI,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAA,EAAQ,MAAO,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,CAAS,QAAO,CAAE;AAAA,GACtF;AACF;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA,IAAA,EAAO,MAAM,MAAM,CAAA,CAAA;AAC9D;AAGO,SAAS,kBAAA,CACd,MACA,KAAA,EACsB;AACtB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA,CAAE,IAAI,WAAW,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,eAAA,GAAkB,QAAQ,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA,KAAA,CAAA,GAAU,EAAA;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA;AACtE,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,MAAM,WAAA,CAAY,kBAAA;AAAA,IAClB,OAAA,EAAS,8EAA8E,KAAK,CAAA,CAAA,CAAA;AAAA,IAC5F,OAAA,EAAS,EAAE,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,GAAQ,CAAA,EAAE;AAAA,IAC1E;AAAA,GACD,CAAA;AACH;;"}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const openapiCore = require('@redocly/openapi-core');
6
+
7
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
8
+
9
+ const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
10
+ const path__default = /*#__PURE__*/_interopDefaultCompat(path);
11
+
12
+ class RedoclyConfigFiles {
13
+ #cwd;
14
+ constructor(cwd) {
15
+ this.#cwd = cwd;
16
+ }
17
+ find(explicitPath) {
18
+ if (!explicitPath) {
19
+ return openapiCore.findConfig(this.#cwd);
20
+ }
21
+ const resolved = path__default.resolve(this.#cwd, explicitPath);
22
+ if (!fs__default.existsSync(resolved)) {
23
+ return void 0;
24
+ }
25
+ return fs__default.statSync(resolved).isDirectory() ? openapiCore.findConfig(resolved) : resolved;
26
+ }
27
+ load(configPath) {
28
+ return openapiCore.loadConfig({ configPath });
29
+ }
30
+ createDefault() {
31
+ return openapiCore.createConfig(
32
+ { rules: { "operation-operationId-unique": { severity: "warn" } } },
33
+ { extends: ["minimal"] }
34
+ );
35
+ }
36
+ }
37
+ function createRedoclyConfigSource(cwd) {
38
+ return new RedoclyConfigFiles(cwd);
39
+ }
40
+
41
+ exports.createRedoclyConfigSource = createRedoclyConfigSource;
42
+ //# sourceMappingURL=redocly-config-source.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redocly-config-source.cjs","sources":["../../../src/adapters/redocly-loader/redocly-config-source.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createConfig, findConfig, loadConfig } from \"@redocly/openapi-core\";\nimport type {\n RedoclyConfig,\n RedoclyConfigSource,\n} from \"../../application/ports/redocly-config-source.js\";\n\n/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */\nclass RedoclyConfigFiles implements RedoclyConfigSource {\n readonly #cwd: string;\n\n constructor(cwd: string) {\n this.#cwd = cwd;\n }\n\n find(explicitPath: string | undefined): string | undefined {\n if (!explicitPath) {\n return findConfig(this.#cwd);\n }\n const resolved = path.resolve(this.#cwd, explicitPath);\n if (!fs.existsSync(resolved)) {\n return undefined;\n }\n return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;\n }\n\n load(configPath: string): Promise<RedoclyConfig> {\n return loadConfig({ configPath });\n }\n\n createDefault(): Promise<RedoclyConfig> {\n return createConfig(\n { rules: { \"operation-operationId-unique\": { severity: \"warn\" } } },\n { extends: [\"minimal\"] },\n );\n }\n}\n\n/** Find and load `redocly.yaml` relative to the directory `cwd`. */\nexport function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {\n return new RedoclyConfigFiles(cwd);\n}\n"],"names":["findConfig","path","fs","loadConfig","createConfig"],"mappings":";;;;;;;;;;;AASA,MAAM,kBAAA,CAAkD;AAAA,EAC7C,IAAA;AAAA,EAET,YAAY,GAAA,EAAa;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EACd;AAAA,EAEA,KAAK,YAAA,EAAsD;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAOA,sBAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,QAAA,GAAWC,aAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,YAAY,CAAA;AACrD,IAAA,IAAI,CAACC,WAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAOA,WAAA,CAAG,SAAS,QAAQ,CAAA,CAAE,aAAY,GAAIF,sBAAA,CAAW,QAAQ,CAAA,GAAI,QAAA;AAAA,EACtE;AAAA,EAEA,KAAK,UAAA,EAA4C;AAC/C,IAAA,OAAOG,sBAAA,CAAW,EAAE,UAAA,EAAY,CAAA;AAAA,EAClC;AAAA,EAEA,aAAA,GAAwC;AACtC,IAAA,OAAOC,wBAAA;AAAA,MACL,EAAE,OAAO,EAAE,8BAAA,EAAgC,EAAE,QAAA,EAAU,MAAA,IAAS,EAAE;AAAA,MAClE,EAAE,OAAA,EAAS,CAAC,SAAS,CAAA;AAAE,KACzB;AAAA,EACF;AACF;AAGO,SAAS,0BAA0B,GAAA,EAAkC;AAC1E,EAAA,OAAO,IAAI,mBAAmB,GAAG,CAAA;AACnC;;"}