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
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ const BOOLEAN_TEXTS = ["true", "false"];
4
+ const SAMPLE_TEXTS = {
5
+ string: "",
6
+ number: "0",
7
+ boolean: "true"
8
+ };
9
+ function isNumberText(text) {
10
+ return text !== "" && Number.isFinite(Number(text));
11
+ }
12
+ function isPlaceholderText(type, text) {
13
+ if (type === "number") {
14
+ return isNumberText(text);
15
+ }
16
+ return type === "boolean" ? BOOLEAN_TEXTS.includes(text) : true;
17
+ }
18
+ function matchesFrom(text, start, parts, index) {
19
+ const part = parts[index];
20
+ if (part === void 0) {
21
+ return start === text.length;
22
+ }
23
+ if (part.kind === "text") {
24
+ return text.startsWith(part.text, start) && matchesFrom(text, start + part.text.length, parts, index + 1);
25
+ }
26
+ for (let end = start; end <= text.length; end += 1) {
27
+ if (isPlaceholderText(part.type, text.slice(start, end)) && matchesFrom(text, end, parts, index + 1)) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ function sampleOf(key) {
34
+ if (key.kind === "literal") {
35
+ return key.url;
36
+ }
37
+ return key.parts.map((part) => part.kind === "text" ? part.text : SAMPLE_TEXTS[part.type]).join("");
38
+ }
39
+ const EVERY_COVER_REJECTED = () => true;
40
+ function coveringTemplateKeys(keys, isRejected = EVERY_COVER_REJECTED) {
41
+ const covering = /* @__PURE__ */ new Set();
42
+ keys.forEach((key, index) => {
43
+ if (key.kind !== "template") {
44
+ return;
45
+ }
46
+ const isCovering = keys.some(
47
+ (other, otherIndex) => otherIndex !== index && matchesFrom(sampleOf(other), 0, key.parts, 0) && isRejected(index, otherIndex)
48
+ );
49
+ if (isCovering) {
50
+ covering.add(index);
51
+ }
52
+ });
53
+ return covering;
54
+ }
55
+
56
+ exports.coveringTemplateKeys = coveringTemplateKeys;
57
+ //# sourceMappingURL=path-key-overlaps.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-key-overlaps.cjs","sources":["../../../../src/application/transform/document/path-key-overlaps.ts"],"sourcesContent":["/**\n * `--path-params-as-types` overlaps (roadmap R10.2, backlog 28). A path key with parameters is an\n * index signature over a template literal type, such as `` `/apps/${string}` ``. `${string}` also\n * matches `/`, so that signature covers `/apps/regions` and `` `/apps/${string}/restart` `` as\n * well, and TypeScript requires the covered keys' types to be assignable to its type (TS2411,\n * TS2413). These functions find the signatures that cover another key the checker rejects.\n */\n\n/** A placeholder of a template literal type, by the type it stands for. */\nexport type PathPlaceholder = \"string\" | \"number\" | \"boolean\";\n\n/** One part of a path key: text, or a placeholder. */\nexport type PathKeyPart =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"placeholder\"; readonly type: PathPlaceholder };\n\n/** A path key: a URL written as a property, or a template literal type of an index signature. */\nexport type PathKey =\n | { readonly kind: \"literal\"; readonly url: string }\n | { readonly kind: \"template\"; readonly parts: readonly PathKeyPart[] };\n\nconst BOOLEAN_TEXTS: readonly string[] = [\"true\", \"false\"];\n\n/** The text one placeholder stands for in a sample of a template key. */\nconst SAMPLE_TEXTS: Readonly<Record<PathPlaceholder, string>> = {\n string: \"\",\n number: \"0\",\n boolean: \"true\",\n};\n\n/** TypeScript's rule for `${number}`: a text that converts to a finite number. */\nfunction isNumberText(text: string): boolean {\n return text !== \"\" && Number.isFinite(Number(text));\n}\n\nfunction isPlaceholderText(type: PathPlaceholder, text: string): boolean {\n if (type === \"number\") {\n return isNumberText(text);\n }\n return type === \"boolean\" ? BOOLEAN_TEXTS.includes(text) : true;\n}\n\n/** Whether `text` from `start` on is one of the strings the parts from `index` on describe. */\nfunction matchesFrom(\n text: string,\n start: number,\n parts: readonly PathKeyPart[],\n index: number,\n): boolean {\n const part = parts[index];\n if (part === undefined) {\n return start === text.length;\n }\n if (part.kind === \"text\") {\n return (\n text.startsWith(part.text, start) &&\n matchesFrom(text, start + part.text.length, parts, index + 1)\n );\n }\n for (let end = start; end <= text.length; end += 1) {\n if (\n isPlaceholderText(part.type, text.slice(start, end)) &&\n matchesFrom(text, end, parts, index + 1)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * One string of the key. If a template key is covered, every string of it is, so a sample that is\n * not covered proves the key is not; a sample that is covered may over-report, which only moves a\n * signature that did not need it (the types stay the same, see `pathsObjectType`).\n */\nfunction sampleOf(key: PathKey): string {\n if (key.kind === \"literal\") {\n return key.url;\n }\n return key.parts\n .map((part) => (part.kind === \"text\" ? part.text : SAMPLE_TEXTS[part.type]))\n .join(\"\");\n}\n\n/** Whether TypeScript rejects the key at `covered` for the signature at `covering`. */\nexport type CoverRejection = (covering: number, covered: number) => boolean;\n\n/** Without type information every covered key counts. */\nconst EVERY_COVER_REJECTED: CoverRejection = () => true;\n\n/** The indexes of the template keys that cover another key of the list, where it is rejected. */\nexport function coveringTemplateKeys(\n keys: readonly PathKey[],\n isRejected: CoverRejection = EVERY_COVER_REJECTED,\n): ReadonlySet<number> {\n const covering = new Set<number>();\n keys.forEach((key, index) => {\n if (key.kind !== \"template\") {\n return;\n }\n const isCovering = keys.some(\n (other, otherIndex) =>\n otherIndex !== index &&\n matchesFrom(sampleOf(other), 0, key.parts, 0) &&\n isRejected(index, otherIndex),\n );\n if (isCovering) {\n covering.add(index);\n }\n });\n return covering;\n}\n"],"names":[],"mappings":";;AAqBA,MAAM,aAAA,GAAmC,CAAC,MAAA,EAAQ,OAAO,CAAA;AAGzD,MAAM,YAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAGA,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,OAAO,SAAS,EAAA,IAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AACpD;AAEA,SAAS,iBAAA,CAAkB,MAAuB,IAAA,EAAuB;AACvE,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,KAAS,SAAA,GAAY,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAC7D;AAGA,SAAS,WAAA,CACP,IAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,UAAU,IAAA,CAAK,MAAA;AAAA,EACxB;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OACE,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA,IAChC,WAAA,CAAY,IAAA,EAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EAEhE;AACA,EAAA,KAAA,IAAS,MAAM,KAAA,EAAO,GAAA,IAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IACE,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,KAAA,EAAO,GAAG,CAAC,CAAA,IACnD,YAAY,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,EACvC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,IAAA,OAAO,GAAA,CAAI,GAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAI,KAAA,CACR,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,IAAA,GAAO,aAAa,IAAA,CAAK,IAAI,CAAE,CAAA,CAC1E,KAAK,EAAE,CAAA;AACZ;AAMA,MAAM,uBAAuC,MAAM,IAAA;AAG5C,SAAS,oBAAA,CACd,IAAA,EACA,UAAA,GAA6B,oBAAA,EACR;AACrB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAa,IAAA,CAAK,IAAA;AAAA,MACtB,CAAC,KAAA,EAAO,UAAA,KACN,UAAA,KAAe,KAAA,IACf,YAAY,QAAA,CAAS,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,KAAA,EAAO,CAAC,CAAA,IAC5C,UAAA,CAAW,OAAO,UAAU;AAAA,KAChC;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;;"}
@@ -0,0 +1,55 @@
1
+ const BOOLEAN_TEXTS = ["true", "false"];
2
+ const SAMPLE_TEXTS = {
3
+ string: "",
4
+ number: "0",
5
+ boolean: "true"
6
+ };
7
+ function isNumberText(text) {
8
+ return text !== "" && Number.isFinite(Number(text));
9
+ }
10
+ function isPlaceholderText(type, text) {
11
+ if (type === "number") {
12
+ return isNumberText(text);
13
+ }
14
+ return type === "boolean" ? BOOLEAN_TEXTS.includes(text) : true;
15
+ }
16
+ function matchesFrom(text, start, parts, index) {
17
+ const part = parts[index];
18
+ if (part === void 0) {
19
+ return start === text.length;
20
+ }
21
+ if (part.kind === "text") {
22
+ return text.startsWith(part.text, start) && matchesFrom(text, start + part.text.length, parts, index + 1);
23
+ }
24
+ for (let end = start; end <= text.length; end += 1) {
25
+ if (isPlaceholderText(part.type, text.slice(start, end)) && matchesFrom(text, end, parts, index + 1)) {
26
+ return true;
27
+ }
28
+ }
29
+ return false;
30
+ }
31
+ function sampleOf(key) {
32
+ if (key.kind === "literal") {
33
+ return key.url;
34
+ }
35
+ return key.parts.map((part) => part.kind === "text" ? part.text : SAMPLE_TEXTS[part.type]).join("");
36
+ }
37
+ const EVERY_COVER_REJECTED = () => true;
38
+ function coveringTemplateKeys(keys, isRejected = EVERY_COVER_REJECTED) {
39
+ const covering = /* @__PURE__ */ new Set();
40
+ keys.forEach((key, index) => {
41
+ if (key.kind !== "template") {
42
+ return;
43
+ }
44
+ const isCovering = keys.some(
45
+ (other, otherIndex) => otherIndex !== index && matchesFrom(sampleOf(other), 0, key.parts, 0) && isRejected(index, otherIndex)
46
+ );
47
+ if (isCovering) {
48
+ covering.add(index);
49
+ }
50
+ });
51
+ return covering;
52
+ }
53
+
54
+ export { coveringTemplateKeys };
55
+ //# sourceMappingURL=path-key-overlaps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-key-overlaps.mjs","sources":["../../../../src/application/transform/document/path-key-overlaps.ts"],"sourcesContent":["/**\n * `--path-params-as-types` overlaps (roadmap R10.2, backlog 28). A path key with parameters is an\n * index signature over a template literal type, such as `` `/apps/${string}` ``. `${string}` also\n * matches `/`, so that signature covers `/apps/regions` and `` `/apps/${string}/restart` `` as\n * well, and TypeScript requires the covered keys' types to be assignable to its type (TS2411,\n * TS2413). These functions find the signatures that cover another key the checker rejects.\n */\n\n/** A placeholder of a template literal type, by the type it stands for. */\nexport type PathPlaceholder = \"string\" | \"number\" | \"boolean\";\n\n/** One part of a path key: text, or a placeholder. */\nexport type PathKeyPart =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"placeholder\"; readonly type: PathPlaceholder };\n\n/** A path key: a URL written as a property, or a template literal type of an index signature. */\nexport type PathKey =\n | { readonly kind: \"literal\"; readonly url: string }\n | { readonly kind: \"template\"; readonly parts: readonly PathKeyPart[] };\n\nconst BOOLEAN_TEXTS: readonly string[] = [\"true\", \"false\"];\n\n/** The text one placeholder stands for in a sample of a template key. */\nconst SAMPLE_TEXTS: Readonly<Record<PathPlaceholder, string>> = {\n string: \"\",\n number: \"0\",\n boolean: \"true\",\n};\n\n/** TypeScript's rule for `${number}`: a text that converts to a finite number. */\nfunction isNumberText(text: string): boolean {\n return text !== \"\" && Number.isFinite(Number(text));\n}\n\nfunction isPlaceholderText(type: PathPlaceholder, text: string): boolean {\n if (type === \"number\") {\n return isNumberText(text);\n }\n return type === \"boolean\" ? BOOLEAN_TEXTS.includes(text) : true;\n}\n\n/** Whether `text` from `start` on is one of the strings the parts from `index` on describe. */\nfunction matchesFrom(\n text: string,\n start: number,\n parts: readonly PathKeyPart[],\n index: number,\n): boolean {\n const part = parts[index];\n if (part === undefined) {\n return start === text.length;\n }\n if (part.kind === \"text\") {\n return (\n text.startsWith(part.text, start) &&\n matchesFrom(text, start + part.text.length, parts, index + 1)\n );\n }\n for (let end = start; end <= text.length; end += 1) {\n if (\n isPlaceholderText(part.type, text.slice(start, end)) &&\n matchesFrom(text, end, parts, index + 1)\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * One string of the key. If a template key is covered, every string of it is, so a sample that is\n * not covered proves the key is not; a sample that is covered may over-report, which only moves a\n * signature that did not need it (the types stay the same, see `pathsObjectType`).\n */\nfunction sampleOf(key: PathKey): string {\n if (key.kind === \"literal\") {\n return key.url;\n }\n return key.parts\n .map((part) => (part.kind === \"text\" ? part.text : SAMPLE_TEXTS[part.type]))\n .join(\"\");\n}\n\n/** Whether TypeScript rejects the key at `covered` for the signature at `covering`. */\nexport type CoverRejection = (covering: number, covered: number) => boolean;\n\n/** Without type information every covered key counts. */\nconst EVERY_COVER_REJECTED: CoverRejection = () => true;\n\n/** The indexes of the template keys that cover another key of the list, where it is rejected. */\nexport function coveringTemplateKeys(\n keys: readonly PathKey[],\n isRejected: CoverRejection = EVERY_COVER_REJECTED,\n): ReadonlySet<number> {\n const covering = new Set<number>();\n keys.forEach((key, index) => {\n if (key.kind !== \"template\") {\n return;\n }\n const isCovering = keys.some(\n (other, otherIndex) =>\n otherIndex !== index &&\n matchesFrom(sampleOf(other), 0, key.parts, 0) &&\n isRejected(index, otherIndex),\n );\n if (isCovering) {\n covering.add(index);\n }\n });\n return covering;\n}\n"],"names":[],"mappings":"AAqBA,MAAM,aAAA,GAAmC,CAAC,MAAA,EAAQ,OAAO,CAAA;AAGzD,MAAM,YAAA,GAA0D;AAAA,EAC9D,MAAA,EAAQ,EAAA;AAAA,EACR,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAGA,SAAS,aAAa,IAAA,EAAuB;AAC3C,EAAA,OAAO,SAAS,EAAA,IAAM,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AACpD;AAEA,SAAS,iBAAA,CAAkB,MAAuB,IAAA,EAAuB;AACvE,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,aAAa,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA,KAAS,SAAA,GAAY,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AAC7D;AAGA,SAAS,WAAA,CACP,IAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AACxB,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,UAAU,IAAA,CAAK,MAAA;AAAA,EACxB;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OACE,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA,IAChC,WAAA,CAAY,IAAA,EAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EAEhE;AACA,EAAA,KAAA,IAAS,MAAM,KAAA,EAAO,GAAA,IAAO,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IACE,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,MAAM,KAAA,EAAO,GAAG,CAAC,CAAA,IACnD,YAAY,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,EACvC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,IAAA,OAAO,GAAA,CAAI,GAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAI,KAAA,CACR,GAAA,CAAI,CAAC,IAAA,KAAU,KAAK,IAAA,KAAS,MAAA,GAAS,IAAA,CAAK,IAAA,GAAO,aAAa,IAAA,CAAK,IAAI,CAAE,CAAA,CAC1E,KAAK,EAAE,CAAA;AACZ;AAMA,MAAM,uBAAuC,MAAM,IAAA;AAG5C,SAAS,oBAAA,CACd,IAAA,EACA,UAAA,GAA6B,oBAAA,EACR;AACrB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAC3B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,aAAa,IAAA,CAAK,IAAA;AAAA,MACtB,CAAC,KAAA,EAAO,UAAA,KACN,UAAA,KAAe,KAAA,IACf,YAAY,QAAA,CAAS,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,KAAA,EAAO,CAAC,CAAA,IAC5C,UAAA,CAAW,OAAO,UAAU;AAAA,KAChC;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,QAAA;AACT;;"}
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ const pathItemObject = require('../../../domain/openapi/path-item-object.cjs');
4
+ const enumNaming = require('../footer/enum-naming.cjs');
5
+ const numberedNames = require('../numbered-names.cjs');
6
+
7
+ const PARAMETER_SEGMENT_RE = /^(?:{(.+)}|:(.+))$/;
8
+ const INVALID_KEY_PART_RE = /{.*}|:.*|[^a-zA-Z\d_]+/;
9
+ const API_PATHS_NAME = "ApiPaths";
10
+ const METHODS = /* @__PURE__ */ new Set([...pathItemObject.HTTP_METHODS, pathItemObject.QUERY_METHOD]);
11
+ function keyFromUrl(method, url) {
12
+ return `${method}${url}`.split("/").map((part) => {
13
+ const capitalized = part.charAt(0).toUpperCase() + part.slice(1);
14
+ return capitalized.replace(INVALID_KEY_PART_RE, "");
15
+ }).join("");
16
+ }
17
+ function parameterWord(name) {
18
+ return name.split(/[^a-zA-Z\d]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
19
+ }
20
+ function keyWithParameters(method, url) {
21
+ const parts = url.split("/").map((part) => {
22
+ const parameter = PARAMETER_SEGMENT_RE.exec(part);
23
+ const name = parameter?.[1] ?? parameter?.[2];
24
+ return name === void 0 ? part : `By${parameterWord(name)}`;
25
+ });
26
+ return keyFromUrl(method, parts.join("/"));
27
+ }
28
+ function pathItemEntries(pathItem) {
29
+ return Object.entries(pathItem).flatMap(([key, value]) => {
30
+ if (key === pathItemObject.ADDITIONAL_OPERATIONS_KEY) {
31
+ return typeof value === "object" && value !== null ? Object.entries(value) : [];
32
+ }
33
+ return METHODS.has(key) ? [[key, value]] : [];
34
+ });
35
+ }
36
+ function pathOperations(paths) {
37
+ return Object.entries(paths).flatMap(
38
+ ([url, pathItem]) => pathItemEntries(pathItem).map(([method, operation]) => {
39
+ const operationId = operation.operationId || void 0;
40
+ return { url, method, operationId };
41
+ })
42
+ );
43
+ }
44
+ function countOf(names) {
45
+ const counts = /* @__PURE__ */ new Map();
46
+ for (const name of names) {
47
+ counts.set(name, (counts.get(name) ?? 0) + 1);
48
+ }
49
+ return counts;
50
+ }
51
+ function uniqueNames(operations) {
52
+ const keys = operations.map((op) => op.operationId ?? keyFromUrl(op.method, op.url));
53
+ const counts = countOf(keys);
54
+ const named = operations.map((op, index) => {
55
+ const isCollidingUrlKey = op.operationId === void 0 && (counts.get(keys[index]) ?? 0) > 1;
56
+ return isCollidingUrlKey ? keyWithParameters(op.method, op.url) : keys[index];
57
+ });
58
+ return numberedNames.withNumberedRepeats(named, (name, count) => `${name}${count}`);
59
+ }
60
+ function apiPathsEnum(paths) {
61
+ const operations = pathOperations(paths);
62
+ const names = uniqueNames(operations);
63
+ return {
64
+ values: operations.map((operation) => operation.url),
65
+ metadata: names.map((name) => ({ name, description: void 0 }))
66
+ };
67
+ }
68
+ function apiPathsEnumDeclaration(paths) {
69
+ const naming = new enumNaming.EnumNaming();
70
+ return enumNaming.enumDeclaration(naming.enumName(API_PATHS_NAME), apiPathsEnum(paths), naming);
71
+ }
72
+
73
+ exports.apiPathsEnum = apiPathsEnum;
74
+ exports.apiPathsEnumDeclaration = apiPathsEnumDeclaration;
75
+ //# sourceMappingURL=paths-enum.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-enum.cjs","sources":["../../../../src/application/transform/document/paths-enum.ts"],"sourcesContent":["import type { IrEnumDeclaration } from \"../../../domain/ir/nodes.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type PathItemMethod,\n type PathsObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { EnumNaming, enumDeclaration } from \"../footer/enum-naming.js\";\nimport { withNumberedRepeats } from \"../numbered-names.js\";\nimport type { EnumMemberMetadata } from \"../schema/schema-context.js\";\n\n/** A path segment that is one parameter: `{user_id}` or `:user_id`. */\nconst PARAMETER_SEGMENT_RE = /^(?:{(.+)}|:(.+))$/;\n/** Characters not allowed in an enum key, or a `{param}` / `:param` part (first match only). */\nconst INVALID_KEY_PART_RE = /{.*}|:.*|[^a-zA-Z\\d_]+/;\nconst API_PATHS_NAME = \"ApiPaths\";\nconst METHODS: ReadonlySet<string> = new Set<PathItemMethod>([...HTTP_METHODS, QUERY_METHOD]);\n\n/** The members of the `ApiPaths` enum (`--make-paths-enum`). */\nexport interface ApiPathsEnum {\n readonly values: readonly string[];\n readonly metadata: readonly EnumMemberMetadata[];\n}\n\n/** `getUsersById` style key from the method and URL, when the operation has no ID. */\nfunction keyFromUrl(method: string, url: string): string {\n return `${method}${url}`\n .split(\"/\")\n .map((part) => {\n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n return capitalized.replace(INVALID_KEY_PART_RE, \"\");\n })\n .join(\"\");\n}\n\n/** `user_id` and `order-id` as `UserId` and `OrderId`. */\nfunction parameterWord(name: string): string {\n return name\n .split(/[^a-zA-Z\\d]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n\n/** The key with parameters named, `GetUserByUserId`, for keys that collide without them. */\nfunction keyWithParameters(method: string, url: string): string {\n const parts = url.split(\"/\").map((part) => {\n const parameter = PARAMETER_SEGMENT_RE.exec(part);\n const name = parameter?.[1] ?? parameter?.[2];\n return name === undefined ? part : `By${parameterWord(name)}`;\n });\n return keyFromUrl(method, parts.join(\"/\"));\n}\n\ninterface PathOperation {\n readonly url: string;\n readonly method: string;\n readonly operationId: string | undefined;\n}\n\n/**\n * The operations of one path item in document order; `additionalOperations` (OpenAPI 3.2) adds\n * its methods where the key stands.\n */\nfunction pathItemEntries(pathItem: object): [string, unknown][] {\n return Object.entries(pathItem).flatMap(([key, value]): [string, unknown][] => {\n if (key === ADDITIONAL_OPERATIONS_KEY) {\n return typeof value === \"object\" && value !== null ? Object.entries(value) : [];\n }\n return METHODS.has(key) ? [[key, value]] : [];\n });\n}\n\nfunction pathOperations(paths: PathsObject): PathOperation[] {\n return Object.entries(paths).flatMap(([url, pathItem]) =>\n pathItemEntries(pathItem).map(([method, operation]) => {\n const operationId = (operation as OperationObject).operationId || undefined;\n return { url, method, operationId };\n }),\n );\n}\n\nfunction countOf(names: readonly string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const name of names) {\n counts.set(name, (counts.get(name) ?? 0) + 1);\n }\n return counts;\n}\n\n/**\n * Names that are unique, so the enum compiles (upstream #2194). A URL key that collides names\n * its parameters; a name that still collides gets 2, 3… after its first use.\n */\nfunction uniqueNames(operations: readonly PathOperation[]): string[] {\n const keys = operations.map((op) => op.operationId ?? keyFromUrl(op.method, op.url));\n const counts = countOf(keys);\n const named = operations.map((op, index) => {\n const isCollidingUrlKey =\n op.operationId === undefined && (counts.get(keys[index] as string) ?? 0) > 1;\n return isCollidingUrlKey ? keyWithParameters(op.method, op.url) : (keys[index] as string);\n });\n return withNumberedRepeats(named, (name, count) => `${name}${count}`);\n}\n\n/**\n * One enum member per operation: the URL as the value, the operation ID (or a key built from the\n * method and URL) as the name. Paths are in document order; `--alphabetize` does not apply.\n */\nexport function apiPathsEnum(paths: PathsObject): ApiPathsEnum {\n const operations = pathOperations(paths);\n const names = uniqueNames(operations);\n return {\n values: operations.map((operation) => operation.url),\n metadata: names.map((name) => ({ name, description: undefined })),\n };\n}\n\n/**\n * The `ApiPaths` enum declaration. Its own naming state is equivalent to the run's: the name is a\n * valid identifier, and member names only reset the state, never read it.\n */\nexport function apiPathsEnumDeclaration(paths: PathsObject): IrEnumDeclaration {\n const naming = new EnumNaming();\n return enumDeclaration(naming.enumName(API_PATHS_NAME), apiPathsEnum(paths), naming);\n}\n"],"names":["HTTP_METHODS","QUERY_METHOD","ADDITIONAL_OPERATIONS_KEY","withNumberedRepeats","EnumNaming","enumDeclaration"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { HTTP_METHODS, QUERY_METHOD, ADDITIONAL_OPERATIONS_KEY } from '../../../domain/openapi/path-item-object.mjs';
2
+ import { enumDeclaration, EnumNaming } from '../footer/enum-naming.mjs';
3
+ import { withNumberedRepeats } from '../numbered-names.mjs';
4
+
5
+ const PARAMETER_SEGMENT_RE = /^(?:{(.+)}|:(.+))$/;
6
+ const INVALID_KEY_PART_RE = /{.*}|:.*|[^a-zA-Z\d_]+/;
7
+ const API_PATHS_NAME = "ApiPaths";
8
+ const METHODS = /* @__PURE__ */ new Set([...HTTP_METHODS, QUERY_METHOD]);
9
+ function keyFromUrl(method, url) {
10
+ return `${method}${url}`.split("/").map((part) => {
11
+ const capitalized = part.charAt(0).toUpperCase() + part.slice(1);
12
+ return capitalized.replace(INVALID_KEY_PART_RE, "");
13
+ }).join("");
14
+ }
15
+ function parameterWord(name) {
16
+ return name.split(/[^a-zA-Z\d]+/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
17
+ }
18
+ function keyWithParameters(method, url) {
19
+ const parts = url.split("/").map((part) => {
20
+ const parameter = PARAMETER_SEGMENT_RE.exec(part);
21
+ const name = parameter?.[1] ?? parameter?.[2];
22
+ return name === void 0 ? part : `By${parameterWord(name)}`;
23
+ });
24
+ return keyFromUrl(method, parts.join("/"));
25
+ }
26
+ function pathItemEntries(pathItem) {
27
+ return Object.entries(pathItem).flatMap(([key, value]) => {
28
+ if (key === ADDITIONAL_OPERATIONS_KEY) {
29
+ return typeof value === "object" && value !== null ? Object.entries(value) : [];
30
+ }
31
+ return METHODS.has(key) ? [[key, value]] : [];
32
+ });
33
+ }
34
+ function pathOperations(paths) {
35
+ return Object.entries(paths).flatMap(
36
+ ([url, pathItem]) => pathItemEntries(pathItem).map(([method, operation]) => {
37
+ const operationId = operation.operationId || void 0;
38
+ return { url, method, operationId };
39
+ })
40
+ );
41
+ }
42
+ function countOf(names) {
43
+ const counts = /* @__PURE__ */ new Map();
44
+ for (const name of names) {
45
+ counts.set(name, (counts.get(name) ?? 0) + 1);
46
+ }
47
+ return counts;
48
+ }
49
+ function uniqueNames(operations) {
50
+ const keys = operations.map((op) => op.operationId ?? keyFromUrl(op.method, op.url));
51
+ const counts = countOf(keys);
52
+ const named = operations.map((op, index) => {
53
+ const isCollidingUrlKey = op.operationId === void 0 && (counts.get(keys[index]) ?? 0) > 1;
54
+ return isCollidingUrlKey ? keyWithParameters(op.method, op.url) : keys[index];
55
+ });
56
+ return withNumberedRepeats(named, (name, count) => `${name}${count}`);
57
+ }
58
+ function apiPathsEnum(paths) {
59
+ const operations = pathOperations(paths);
60
+ const names = uniqueNames(operations);
61
+ return {
62
+ values: operations.map((operation) => operation.url),
63
+ metadata: names.map((name) => ({ name, description: void 0 }))
64
+ };
65
+ }
66
+ function apiPathsEnumDeclaration(paths) {
67
+ const naming = new EnumNaming();
68
+ return enumDeclaration(naming.enumName(API_PATHS_NAME), apiPathsEnum(paths), naming);
69
+ }
70
+
71
+ export { apiPathsEnum, apiPathsEnumDeclaration };
72
+ //# sourceMappingURL=paths-enum.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths-enum.mjs","sources":["../../../../src/application/transform/document/paths-enum.ts"],"sourcesContent":["import type { IrEnumDeclaration } from \"../../../domain/ir/nodes.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type PathItemMethod,\n type PathsObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { EnumNaming, enumDeclaration } from \"../footer/enum-naming.js\";\nimport { withNumberedRepeats } from \"../numbered-names.js\";\nimport type { EnumMemberMetadata } from \"../schema/schema-context.js\";\n\n/** A path segment that is one parameter: `{user_id}` or `:user_id`. */\nconst PARAMETER_SEGMENT_RE = /^(?:{(.+)}|:(.+))$/;\n/** Characters not allowed in an enum key, or a `{param}` / `:param` part (first match only). */\nconst INVALID_KEY_PART_RE = /{.*}|:.*|[^a-zA-Z\\d_]+/;\nconst API_PATHS_NAME = \"ApiPaths\";\nconst METHODS: ReadonlySet<string> = new Set<PathItemMethod>([...HTTP_METHODS, QUERY_METHOD]);\n\n/** The members of the `ApiPaths` enum (`--make-paths-enum`). */\nexport interface ApiPathsEnum {\n readonly values: readonly string[];\n readonly metadata: readonly EnumMemberMetadata[];\n}\n\n/** `getUsersById` style key from the method and URL, when the operation has no ID. */\nfunction keyFromUrl(method: string, url: string): string {\n return `${method}${url}`\n .split(\"/\")\n .map((part) => {\n const capitalized = part.charAt(0).toUpperCase() + part.slice(1);\n return capitalized.replace(INVALID_KEY_PART_RE, \"\");\n })\n .join(\"\");\n}\n\n/** `user_id` and `order-id` as `UserId` and `OrderId`. */\nfunction parameterWord(name: string): string {\n return name\n .split(/[^a-zA-Z\\d]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n\n/** The key with parameters named, `GetUserByUserId`, for keys that collide without them. */\nfunction keyWithParameters(method: string, url: string): string {\n const parts = url.split(\"/\").map((part) => {\n const parameter = PARAMETER_SEGMENT_RE.exec(part);\n const name = parameter?.[1] ?? parameter?.[2];\n return name === undefined ? part : `By${parameterWord(name)}`;\n });\n return keyFromUrl(method, parts.join(\"/\"));\n}\n\ninterface PathOperation {\n readonly url: string;\n readonly method: string;\n readonly operationId: string | undefined;\n}\n\n/**\n * The operations of one path item in document order; `additionalOperations` (OpenAPI 3.2) adds\n * its methods where the key stands.\n */\nfunction pathItemEntries(pathItem: object): [string, unknown][] {\n return Object.entries(pathItem).flatMap(([key, value]): [string, unknown][] => {\n if (key === ADDITIONAL_OPERATIONS_KEY) {\n return typeof value === \"object\" && value !== null ? Object.entries(value) : [];\n }\n return METHODS.has(key) ? [[key, value]] : [];\n });\n}\n\nfunction pathOperations(paths: PathsObject): PathOperation[] {\n return Object.entries(paths).flatMap(([url, pathItem]) =>\n pathItemEntries(pathItem).map(([method, operation]) => {\n const operationId = (operation as OperationObject).operationId || undefined;\n return { url, method, operationId };\n }),\n );\n}\n\nfunction countOf(names: readonly string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const name of names) {\n counts.set(name, (counts.get(name) ?? 0) + 1);\n }\n return counts;\n}\n\n/**\n * Names that are unique, so the enum compiles (upstream #2194). A URL key that collides names\n * its parameters; a name that still collides gets 2, 3… after its first use.\n */\nfunction uniqueNames(operations: readonly PathOperation[]): string[] {\n const keys = operations.map((op) => op.operationId ?? keyFromUrl(op.method, op.url));\n const counts = countOf(keys);\n const named = operations.map((op, index) => {\n const isCollidingUrlKey =\n op.operationId === undefined && (counts.get(keys[index] as string) ?? 0) > 1;\n return isCollidingUrlKey ? keyWithParameters(op.method, op.url) : (keys[index] as string);\n });\n return withNumberedRepeats(named, (name, count) => `${name}${count}`);\n}\n\n/**\n * One enum member per operation: the URL as the value, the operation ID (or a key built from the\n * method and URL) as the name. Paths are in document order; `--alphabetize` does not apply.\n */\nexport function apiPathsEnum(paths: PathsObject): ApiPathsEnum {\n const operations = pathOperations(paths);\n const names = uniqueNames(operations);\n return {\n values: operations.map((operation) => operation.url),\n metadata: names.map((name) => ({ name, description: undefined })),\n };\n}\n\n/**\n * The `ApiPaths` enum declaration. Its own naming state is equivalent to the run's: the name is a\n * valid identifier, and member names only reset the state, never read it.\n */\nexport function apiPathsEnumDeclaration(paths: PathsObject): IrEnumDeclaration {\n const naming = new EnumNaming();\n return enumDeclaration(naming.enumName(API_PATHS_NAME), apiPathsEnum(paths), naming);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const propertyName = require('../../../domain/ir/property-name.cjs');
5
+ const rawTextEscapes = require('../../../domain/ir/raw-text-escapes.cjs');
6
+ const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
7
+ const pathItemObject = require('../../../domain/openapi/path-item-object.cjs');
8
+ const documentEntries = require('../document-entries.cjs');
9
+ const refType = require('../ref-type.cjs');
10
+ const documentMember = require('./document-member.cjs');
11
+ const pathItem = require('./path-item.cjs');
12
+ const pathItemConflicts = require('./path-item-conflicts.cjs');
13
+ const pathKeyOverlaps = require('./path-key-overlaps.cjs');
14
+
15
+ const PATH_PARAMETER_RE = /\{[^}]+\}/g;
16
+ const PLACEHOLDERS = /* @__PURE__ */ new Map([
17
+ ["number", "number"],
18
+ ["integer", "number"],
19
+ ["boolean", "boolean"]
20
+ ]);
21
+ const STRING_PLACEHOLDER = "string";
22
+ function placeholderText(type) {
23
+ return `\${${type}}`;
24
+ }
25
+ function resolvedParameter(parameter, context) {
26
+ return "$ref" in parameter && parameter.$ref ? context.refs.resolve(parameter.$ref) : parameter;
27
+ }
28
+ function addPathParameters(parameters, byName, context) {
29
+ for (const parameter of parameters) {
30
+ const resolved = resolvedParameter(parameter, context);
31
+ if (resolved && resolved.in === "path") {
32
+ byName.set(resolved.name, resolved);
33
+ }
34
+ }
35
+ }
36
+ function pathParameters(pathItem, context) {
37
+ const byName = /* @__PURE__ */ new Map();
38
+ addPathParameters(pathItem.parameters ?? [], byName, context);
39
+ for (const { operation: entry } of pathItemObject.pathItemOperations(pathItem)) {
40
+ const operation = entry.$ref ? context.refs.resolve(entry.$ref) : entry;
41
+ addPathParameters(operation?.parameters ?? [], byName, context);
42
+ }
43
+ return byName;
44
+ }
45
+ function pathTemplateParts(url, pathItem, context) {
46
+ const matches = url.match(PATH_PARAMETER_RE);
47
+ if (!matches) {
48
+ return null;
49
+ }
50
+ const parameters = pathParameters(pathItem, context);
51
+ const placeholders = matches.map((match) => {
52
+ const schema = parameters.get(match.slice(1, -1))?.schema;
53
+ return PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER;
54
+ });
55
+ return url.split(PATH_PARAMETER_RE).flatMap((text, index) => {
56
+ const type = placeholders[index];
57
+ const textPart = { kind: "text", text };
58
+ return type === void 0 ? [textPart] : [textPart, { kind: "placeholder", type }];
59
+ });
60
+ }
61
+ function templateText(parts) {
62
+ const text = parts.map(
63
+ (part) => part.kind === "text" ? rawTextEscapes.escapeTemplateText(part.text) : placeholderText(part.type)
64
+ ).join("");
65
+ return `\`${text}\``;
66
+ }
67
+ function pathItemMember(url, pathItem$1, context) {
68
+ const isReadonly = context.options.immutable;
69
+ const type = pathItem.pathItemType(pathItem$1, { path: jsonPointer.createRef(["paths", url]) }, context);
70
+ const parts = context.options.pathParamsAsTypes && url.includes("{") ? pathTemplateParts(url, pathItem$1, context) : null;
71
+ if (parts === null) {
72
+ const member2 = constructors.irProperty(propertyName.toPropertyName(url), type, { isReadonly });
73
+ return { member: member2, key: literalKey(url), type };
74
+ }
75
+ const member = {
76
+ kind: "indexSignature",
77
+ parameterName: "path",
78
+ parameterType: constructors.irRaw(templateText(parts)),
79
+ type,
80
+ isReadonly,
81
+ comments: []
82
+ };
83
+ return { member, key: { kind: "template", parts }, type };
84
+ }
85
+ function literalKey(url) {
86
+ return { kind: "literal", url };
87
+ }
88
+ function pathsObjectType(paths) {
89
+ const covering = pathKeyOverlaps.coveringTemplateKeys(
90
+ paths.map(({ key }) => key),
91
+ (coveringIndex, coveredIndex) => {
92
+ const coveringPath = paths[coveringIndex];
93
+ const coveredPath = paths[coveredIndex];
94
+ return coveringPath !== void 0 && coveredPath !== void 0 && pathItemConflicts.isCoveredPathItemRejected(coveredPath.type, coveringPath.type);
95
+ }
96
+ );
97
+ if (covering.size === 0) {
98
+ return constructors.irObject(paths.map(({ member }) => member));
99
+ }
100
+ const rest = paths.filter((_, index) => !covering.has(index)).map(({ member }) => member);
101
+ const own = paths.filter((_, index) => covering.has(index)).map(({ member }) => constructors.irObject([member]));
102
+ return constructors.irIntersection([constructors.irObject(rest), ...own]);
103
+ }
104
+ function pathsType(paths, context) {
105
+ const members = [];
106
+ for (const [url, pathItem] of documentEntries.documentEntries(paths, context.options)) {
107
+ if (!pathItem || typeof pathItem !== "object") {
108
+ continue;
109
+ }
110
+ if ("$ref" in pathItem) {
111
+ const options = { isReadonly: context.options.immutable };
112
+ const member = documentMember.documentMember(url, refType.refType(pathItem.$ref), pathItem, options);
113
+ members.push({ member, key: literalKey(url), type: member.type });
114
+ continue;
115
+ }
116
+ const startedAt = context.diagnostics.now();
117
+ const path = pathItemMember(url, pathItem, context);
118
+ members.push(path);
119
+ if (path.member.kind === "property") {
120
+ context.diagnostics.debug(`Transformed path "${url}"`, context.diagnostics.now() - startedAt);
121
+ }
122
+ }
123
+ return pathsObjectType(members);
124
+ }
125
+
126
+ exports.pathsType = pathsType;
127
+ //# sourceMappingURL=paths.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.cjs","sources":["../../../../src/application/transform/document/paths.ts"],"sourcesContent":["import { irIntersection, irObject, irProperty, irRaw } from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { escapeTemplateText } from \"../../../domain/ir/raw-text-escapes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport type {\n ParameterObject,\n ParameterOrReference,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport {\n type PathItemObject,\n type PathsObject,\n pathItemOperations,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport type { ReferenceSchema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { documentMember } from \"./document-member.js\";\nimport { pathItemType } from \"./path-item.js\";\nimport { isCoveredPathItemRejected } from \"./path-item-conflicts.js\";\nimport {\n coveringTemplateKeys,\n type PathKey,\n type PathKeyPart,\n type PathPlaceholder,\n} from \"./path-key-overlaps.js\";\n\nconst PATH_PARAMETER_RE = /\\{[^}]+\\}/g;\n\n/** Placeholders by parameter schema type; anything else is a string placeholder. */\nconst PLACEHOLDERS: ReadonlyMap<unknown, PathPlaceholder> = new Map([\n [\"number\", \"number\"],\n [\"integer\", \"number\"],\n [\"boolean\", \"boolean\"],\n]);\nconst STRING_PLACEHOLDER: PathPlaceholder = \"string\";\n\n/** `${type}`: the text of a template literal type placeholder. */\nfunction placeholderText(type: PathPlaceholder): string {\n return `\\${${type}}`;\n}\n\nfunction resolvedParameter(\n parameter: ParameterOrReference,\n context: TransformContext,\n): ParameterObject | undefined {\n return \"$ref\" in parameter && parameter.$ref\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : (parameter as ParameterObject);\n}\n\nfunction addPathParameters(\n parameters: readonly ParameterOrReference[],\n byName: Map<string, ParameterObject>,\n context: TransformContext,\n): void {\n for (const parameter of parameters) {\n const resolved = resolvedParameter(parameter, context);\n if (resolved && resolved.in === \"path\") {\n byName.set(resolved.name, resolved);\n }\n }\n}\n\n/** Path parameters of the path item and of its operations; later definitions win. */\nfunction pathParameters(\n pathItem: PathItemObject,\n context: TransformContext,\n): Map<string, ParameterObject> {\n const byName = new Map<string, ParameterObject>();\n addPathParameters(pathItem.parameters ?? [], byName, context);\n for (const { operation: entry } of pathItemOperations(pathItem)) {\n const operation = (entry as ReferenceSchema).$ref\n ? (context.refs.resolve((entry as ReferenceSchema).$ref) as OperationObject | undefined)\n : (entry as OperationObject);\n addPathParameters(operation?.parameters ?? [], byName, context);\n }\n return byName;\n}\n\n/**\n * `--path-params-as-types`: the URL as template parts, each `{name}` replaced by a placeholder for\n * its parameter's type. Null when the URL has no complete `{…}` placeholder.\n */\nfunction pathTemplateParts(\n url: string,\n pathItem: PathItemObject,\n context: TransformContext,\n): PathKeyPart[] | null {\n const matches = url.match(PATH_PARAMETER_RE);\n if (!matches) {\n return null;\n }\n const parameters = pathParameters(pathItem, context);\n const placeholders = matches.map((match) => {\n const schema = parameters.get(match.slice(1, -1))?.schema as SchemaObject | undefined;\n return PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER;\n });\n return url.split(PATH_PARAMETER_RE).flatMap((text, index): PathKeyPart[] => {\n const type = placeholders[index];\n const textPart: PathKeyPart = { kind: \"text\", text };\n return type === undefined ? [textPart] : [textPart, { kind: \"placeholder\", type }];\n });\n}\n\n/**\n * The template literal type of the parts. The original escaped only backticks: a backslash or\n * `${` in the URL could end the literal or open a placeholder, and add code to the generated file\n * (intentional fix). So the text parts are escaped.\n */\nfunction templateText(parts: readonly PathKeyPart[]): string {\n const text = parts\n .map((part) =>\n part.kind === \"text\" ? escapeTemplateText(part.text) : placeholderText(part.type),\n )\n .join(\"\");\n return `\\`${text}\\``;\n}\n\n/** A path's member, its key and its path item type for the overlap check. */\ninterface PathMember {\n readonly member: IrMember;\n readonly key: PathKey;\n readonly type: IrType;\n}\n\nfunction pathItemMember(\n url: string,\n pathItem: PathItemObject,\n context: TransformContext,\n): PathMember {\n const isReadonly = context.options.immutable;\n const type = pathItemType(pathItem, { path: createRef([\"paths\", url]) }, context);\n const parts =\n context.options.pathParamsAsTypes && url.includes(\"{\")\n ? pathTemplateParts(url, pathItem, context)\n : null;\n if (parts === null) {\n const member = irProperty(toPropertyName(url), type, { isReadonly });\n return { member, key: literalKey(url), type };\n }\n const member: IrMember = {\n kind: \"indexSignature\",\n parameterName: \"path\",\n parameterType: irRaw(templateText(parts)),\n type,\n isReadonly,\n comments: [],\n };\n return { member, key: { kind: \"template\", parts }, type };\n}\n\nfunction literalKey(url: string): PathKey {\n return { kind: \"literal\", url };\n}\n\n/**\n * The members as one object type. When an index signature covers another key, TypeScript checks\n * the covered key's type against it. Where that check surely fails (TS2411, TS2413), each such\n * signature gets an object of its own in an intersection: an intersection does not check its parts\n * against each other, and every key has the type it had in the one object. Output that compiles\n * keeps the one object.\n */\nfunction pathsObjectType(paths: readonly PathMember[]): IrType {\n const covering = coveringTemplateKeys(\n paths.map(({ key }) => key),\n (coveringIndex, coveredIndex) => {\n const coveringPath = paths[coveringIndex];\n const coveredPath = paths[coveredIndex];\n return (\n coveringPath !== undefined &&\n coveredPath !== undefined &&\n isCoveredPathItemRejected(coveredPath.type, coveringPath.type)\n );\n },\n );\n if (covering.size === 0) {\n return irObject(paths.map(({ member }) => member));\n }\n const rest = paths.filter((_, index) => !covering.has(index)).map(({ member }) => member);\n const own = paths\n .filter((_, index) => covering.has(index))\n .map(({ member }) => irObject([member]));\n return irIntersection([irObject(rest), ...own]);\n}\n\n/** The `paths` interface body (OpenAPI 3.1 §4.8.8): one member per path, by URL. */\nexport function pathsType(paths: PathsObject, context: TransformContext): IrType {\n const members: PathMember[] = [];\n for (const [url, pathItem] of documentEntries(paths, context.options)) {\n if (!pathItem || typeof pathItem !== \"object\") {\n continue;\n }\n if (\"$ref\" in pathItem) {\n const options = { isReadonly: context.options.immutable };\n const member = documentMember(url, refType(pathItem.$ref), pathItem, options);\n members.push({ member, key: literalKey(url), type: member.type });\n continue;\n }\n const startedAt = context.diagnostics.now();\n const path = pathItemMember(url, pathItem, context);\n members.push(path);\n // The original reports only paths written as properties.\n if (path.member.kind === \"property\") {\n context.diagnostics.debug(`Transformed path \"${url}\"`, context.diagnostics.now() - startedAt);\n }\n }\n return pathsObjectType(members);\n}\n"],"names":["pathItemOperations","escapeTemplateText","pathItem","pathItemType","createRef","member","irProperty","toPropertyName","irRaw","coveringTemplateKeys","isCoveredPathItemRejected","irObject","irIntersection","documentEntries","documentMember","refType"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { irProperty, irRaw, irObject, irIntersection } from '../../../domain/ir/constructors.mjs';
2
+ import { toPropertyName } from '../../../domain/ir/property-name.mjs';
3
+ import { escapeTemplateText } from '../../../domain/ir/raw-text-escapes.mjs';
4
+ import { createRef } from '../../../domain/openapi/json-pointer.mjs';
5
+ import { pathItemOperations } from '../../../domain/openapi/path-item-object.mjs';
6
+ import { documentEntries } from '../document-entries.mjs';
7
+ import { refType } from '../ref-type.mjs';
8
+ import { documentMember } from './document-member.mjs';
9
+ import { pathItemType } from './path-item.mjs';
10
+ import { isCoveredPathItemRejected } from './path-item-conflicts.mjs';
11
+ import { coveringTemplateKeys } from './path-key-overlaps.mjs';
12
+
13
+ const PATH_PARAMETER_RE = /\{[^}]+\}/g;
14
+ const PLACEHOLDERS = /* @__PURE__ */ new Map([
15
+ ["number", "number"],
16
+ ["integer", "number"],
17
+ ["boolean", "boolean"]
18
+ ]);
19
+ const STRING_PLACEHOLDER = "string";
20
+ function placeholderText(type) {
21
+ return `\${${type}}`;
22
+ }
23
+ function resolvedParameter(parameter, context) {
24
+ return "$ref" in parameter && parameter.$ref ? context.refs.resolve(parameter.$ref) : parameter;
25
+ }
26
+ function addPathParameters(parameters, byName, context) {
27
+ for (const parameter of parameters) {
28
+ const resolved = resolvedParameter(parameter, context);
29
+ if (resolved && resolved.in === "path") {
30
+ byName.set(resolved.name, resolved);
31
+ }
32
+ }
33
+ }
34
+ function pathParameters(pathItem, context) {
35
+ const byName = /* @__PURE__ */ new Map();
36
+ addPathParameters(pathItem.parameters ?? [], byName, context);
37
+ for (const { operation: entry } of pathItemOperations(pathItem)) {
38
+ const operation = entry.$ref ? context.refs.resolve(entry.$ref) : entry;
39
+ addPathParameters(operation?.parameters ?? [], byName, context);
40
+ }
41
+ return byName;
42
+ }
43
+ function pathTemplateParts(url, pathItem, context) {
44
+ const matches = url.match(PATH_PARAMETER_RE);
45
+ if (!matches) {
46
+ return null;
47
+ }
48
+ const parameters = pathParameters(pathItem, context);
49
+ const placeholders = matches.map((match) => {
50
+ const schema = parameters.get(match.slice(1, -1))?.schema;
51
+ return PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER;
52
+ });
53
+ return url.split(PATH_PARAMETER_RE).flatMap((text, index) => {
54
+ const type = placeholders[index];
55
+ const textPart = { kind: "text", text };
56
+ return type === void 0 ? [textPart] : [textPart, { kind: "placeholder", type }];
57
+ });
58
+ }
59
+ function templateText(parts) {
60
+ const text = parts.map(
61
+ (part) => part.kind === "text" ? escapeTemplateText(part.text) : placeholderText(part.type)
62
+ ).join("");
63
+ return `\`${text}\``;
64
+ }
65
+ function pathItemMember(url, pathItem, context) {
66
+ const isReadonly = context.options.immutable;
67
+ const type = pathItemType(pathItem, { path: createRef(["paths", url]) }, context);
68
+ const parts = context.options.pathParamsAsTypes && url.includes("{") ? pathTemplateParts(url, pathItem, context) : null;
69
+ if (parts === null) {
70
+ const member2 = irProperty(toPropertyName(url), type, { isReadonly });
71
+ return { member: member2, key: literalKey(url), type };
72
+ }
73
+ const member = {
74
+ kind: "indexSignature",
75
+ parameterName: "path",
76
+ parameterType: irRaw(templateText(parts)),
77
+ type,
78
+ isReadonly,
79
+ comments: []
80
+ };
81
+ return { member, key: { kind: "template", parts }, type };
82
+ }
83
+ function literalKey(url) {
84
+ return { kind: "literal", url };
85
+ }
86
+ function pathsObjectType(paths) {
87
+ const covering = coveringTemplateKeys(
88
+ paths.map(({ key }) => key),
89
+ (coveringIndex, coveredIndex) => {
90
+ const coveringPath = paths[coveringIndex];
91
+ const coveredPath = paths[coveredIndex];
92
+ return coveringPath !== void 0 && coveredPath !== void 0 && isCoveredPathItemRejected(coveredPath.type, coveringPath.type);
93
+ }
94
+ );
95
+ if (covering.size === 0) {
96
+ return irObject(paths.map(({ member }) => member));
97
+ }
98
+ const rest = paths.filter((_, index) => !covering.has(index)).map(({ member }) => member);
99
+ const own = paths.filter((_, index) => covering.has(index)).map(({ member }) => irObject([member]));
100
+ return irIntersection([irObject(rest), ...own]);
101
+ }
102
+ function pathsType(paths, context) {
103
+ const members = [];
104
+ for (const [url, pathItem] of documentEntries(paths, context.options)) {
105
+ if (!pathItem || typeof pathItem !== "object") {
106
+ continue;
107
+ }
108
+ if ("$ref" in pathItem) {
109
+ const options = { isReadonly: context.options.immutable };
110
+ const member = documentMember(url, refType(pathItem.$ref), pathItem, options);
111
+ members.push({ member, key: literalKey(url), type: member.type });
112
+ continue;
113
+ }
114
+ const startedAt = context.diagnostics.now();
115
+ const path = pathItemMember(url, pathItem, context);
116
+ members.push(path);
117
+ if (path.member.kind === "property") {
118
+ context.diagnostics.debug(`Transformed path "${url}"`, context.diagnostics.now() - startedAt);
119
+ }
120
+ }
121
+ return pathsObjectType(members);
122
+ }
123
+
124
+ export { pathsType };
125
+ //# sourceMappingURL=paths.mjs.map