openapi-typesafe 0.0.0 → 1.0.0-rc.1

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 (863) 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 +61 -0
  25. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
  26. package/dist/adapters/redocly-loader/redocly-config-source.mjs +54 -0
  27. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
  28. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +179 -0
  29. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +177 -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 +148 -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 +142 -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 +210 -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 +207 -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-conflict-warnings.cjs +25 -0
  105. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
  106. package/dist/api/discriminator-conflict-warnings.mjs +23 -0
  107. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
  108. package/dist/api/discriminator-enum-names.cjs +19 -0
  109. package/dist/api/discriminator-enum-names.cjs.map +1 -0
  110. package/dist/api/discriminator-enum-names.mjs +17 -0
  111. package/dist/api/discriminator-enum-names.mjs.map +1 -0
  112. package/dist/api/discriminator-enum-parent.cjs +59 -0
  113. package/dist/api/discriminator-enum-parent.cjs.map +1 -0
  114. package/dist/api/discriminator-enum-parent.mjs +57 -0
  115. package/dist/api/discriminator-enum-parent.mjs.map +1 -0
  116. package/dist/api/discriminator-enum.cjs +69 -0
  117. package/dist/api/discriminator-enum.cjs.map +1 -0
  118. package/dist/api/discriminator-enum.mjs +66 -0
  119. package/dist/api/discriminator-enum.mjs.map +1 -0
  120. package/dist/api/discriminator-other-owners.cjs +67 -0
  121. package/dist/api/discriminator-other-owners.cjs.map +1 -0
  122. package/dist/api/discriminator-other-owners.mjs +64 -0
  123. package/dist/api/discriminator-other-owners.mjs.map +1 -0
  124. package/dist/api/discriminator-patch.cjs +88 -0
  125. package/dist/api/discriminator-patch.cjs.map +1 -0
  126. package/dist/api/discriminator-patch.mjs +82 -0
  127. package/dist/api/discriminator-patch.mjs.map +1 -0
  128. package/dist/api/discriminator-scan.cjs +153 -0
  129. package/dist/api/discriminator-scan.cjs.map +1 -0
  130. package/dist/api/discriminator-scan.mjs +150 -0
  131. package/dist/api/discriminator-scan.mjs.map +1 -0
  132. package/dist/api/document-declarations.cjs +28 -0
  133. package/dist/api/document-declarations.cjs.map +1 -0
  134. package/dist/api/document-declarations.mjs +26 -0
  135. package/dist/api/document-declarations.mjs.map +1 -0
  136. package/dist/api/document-refs.cjs +53 -0
  137. package/dist/api/document-refs.cjs.map +1 -0
  138. package/dist/api/document-refs.mjs +50 -0
  139. package/dist/api/document-refs.mjs.map +1 -0
  140. package/dist/api/document-run.cjs +122 -0
  141. package/dist/api/document-run.cjs.map +1 -0
  142. package/dist/api/document-run.mjs +116 -0
  143. package/dist/api/document-run.mjs.map +1 -0
  144. package/dist/api/enum-values-warnings.cjs +16 -0
  145. package/dist/api/enum-values-warnings.cjs.map +1 -0
  146. package/dist/api/enum-values-warnings.mjs +14 -0
  147. package/dist/api/enum-values-warnings.mjs.map +1 -0
  148. package/dist/api/footer-entry.cjs +18 -0
  149. package/dist/api/footer-entry.cjs.map +1 -0
  150. package/dist/api/footer-entry.mjs +15 -0
  151. package/dist/api/footer-entry.mjs.map +1 -0
  152. package/dist/api/footer-sink.cjs +53 -0
  153. package/dist/api/footer-sink.cjs.map +1 -0
  154. package/dist/api/footer-sink.mjs +51 -0
  155. package/dist/api/footer-sink.mjs.map +1 -0
  156. package/dist/api/legacy-callback-warning.cjs +25 -0
  157. package/dist/api/legacy-callback-warning.cjs.map +1 -0
  158. package/dist/api/legacy-callback-warning.mjs +22 -0
  159. package/dist/api/legacy-callback-warning.mjs.map +1 -0
  160. package/dist/api/legacy-ts-helpers.cjs +203 -0
  161. package/dist/api/legacy-ts-helpers.cjs.map +1 -0
  162. package/dist/api/legacy-ts-helpers.mjs +187 -0
  163. package/dist/api/legacy-ts-helpers.mjs.map +1 -0
  164. package/dist/api/legacy-utils.cjs +65 -0
  165. package/dist/api/legacy-utils.cjs.map +1 -0
  166. package/dist/api/legacy-utils.mjs +50 -0
  167. package/dist/api/legacy-utils.mjs.map +1 -0
  168. package/dist/api/openapi-ts.cjs +40 -0
  169. package/dist/api/openapi-ts.cjs.map +1 -0
  170. package/dist/api/openapi-ts.mjs +34 -0
  171. package/dist/api/openapi-ts.mjs.map +1 -0
  172. package/dist/api/path-template-warnings.cjs +21 -0
  173. package/dist/api/path-template-warnings.cjs.map +1 -0
  174. package/dist/api/path-template-warnings.mjs +19 -0
  175. package/dist/api/path-template-warnings.mjs.map +1 -0
  176. package/dist/api/schema-callbacks.cjs +140 -0
  177. package/dist/api/schema-callbacks.cjs.map +1 -0
  178. package/dist/api/schema-callbacks.mjs +136 -0
  179. package/dist/api/schema-callbacks.mjs.map +1 -0
  180. package/dist/api/string-to-ast.cjs +21 -0
  181. package/dist/api/string-to-ast.cjs.map +1 -0
  182. package/dist/api/string-to-ast.mjs +18 -0
  183. package/dist/api/string-to-ast.mjs.map +1 -0
  184. package/dist/api/transform-context.cjs +84 -0
  185. package/dist/api/transform-context.cjs.map +1 -0
  186. package/dist/api/transform-context.mjs +67 -0
  187. package/dist/api/transform-context.mjs.map +1 -0
  188. package/dist/api/transform-schema.cjs +80 -0
  189. package/dist/api/transform-schema.cjs.map +1 -0
  190. package/dist/api/transform-schema.mjs +75 -0
  191. package/dist/api/transform-schema.mjs.map +1 -0
  192. package/dist/api/type-helpers.cjs +85 -0
  193. package/dist/api/type-helpers.cjs.map +1 -0
  194. package/dist/api/type-helpers.mjs +66 -0
  195. package/dist/api/type-helpers.mjs.map +1 -0
  196. package/dist/api/unsupported-feature-warnings.cjs +22 -0
  197. package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
  198. package/dist/api/unsupported-feature-warnings.mjs +20 -0
  199. package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
  200. package/dist/application/print/comment-writer.cjs +95 -0
  201. package/dist/application/print/comment-writer.cjs.map +1 -0
  202. package/dist/application/print/comment-writer.mjs +93 -0
  203. package/dist/application/print/comment-writer.mjs.map +1 -0
  204. package/dist/application/print/declaration-printer.cjs +83 -0
  205. package/dist/application/print/declaration-printer.cjs.map +1 -0
  206. package/dist/application/print/declaration-printer.mjs +81 -0
  207. package/dist/application/print/declaration-printer.mjs.map +1 -0
  208. package/dist/application/print/literal-text.cjs +52 -0
  209. package/dist/application/print/literal-text.cjs.map +1 -0
  210. package/dist/application/print/literal-text.mjs +48 -0
  211. package/dist/application/print/literal-text.mjs.map +1 -0
  212. package/dist/application/print/print-nodes.cjs +38 -0
  213. package/dist/application/print/print-nodes.cjs.map +1 -0
  214. package/dist/application/print/print-nodes.mjs +36 -0
  215. package/dist/application/print/print-nodes.mjs.map +1 -0
  216. package/dist/application/print/print-options.cjs +6 -0
  217. package/dist/application/print/print-options.cjs.map +1 -0
  218. package/dist/application/print/print-options.mjs +4 -0
  219. package/dist/application/print/print-options.mjs.map +1 -0
  220. package/dist/application/print/text-writer.cjs +63 -0
  221. package/dist/application/print/text-writer.cjs.map +1 -0
  222. package/dist/application/print/text-writer.mjs +60 -0
  223. package/dist/application/print/text-writer.mjs.map +1 -0
  224. package/dist/application/print/type-printer.cjs +219 -0
  225. package/dist/application/print/type-printer.cjs.map +1 -0
  226. package/dist/application/print/type-printer.mjs +215 -0
  227. package/dist/application/print/type-printer.mjs.map +1 -0
  228. package/dist/application/stack-overflow.cjs +36 -0
  229. package/dist/application/stack-overflow.cjs.map +1 -0
  230. package/dist/application/stack-overflow.mjs +31 -0
  231. package/dist/application/stack-overflow.mjs.map +1 -0
  232. package/dist/application/transform/document/assignability.cjs +144 -0
  233. package/dist/application/transform/document/assignability.cjs.map +1 -0
  234. package/dist/application/transform/document/assignability.mjs +138 -0
  235. package/dist/application/transform/document/assignability.mjs.map +1 -0
  236. package/dist/application/transform/document/components.cjs +104 -0
  237. package/dist/application/transform/document/components.cjs.map +1 -0
  238. package/dist/application/transform/document/components.mjs +102 -0
  239. package/dist/application/transform/document/components.mjs.map +1 -0
  240. package/dist/application/transform/document/declared-types.cjs +66 -0
  241. package/dist/application/transform/document/declared-types.cjs.map +1 -0
  242. package/dist/application/transform/document/declared-types.mjs +63 -0
  243. package/dist/application/transform/document/declared-types.mjs.map +1 -0
  244. package/dist/application/transform/document/defs-root.cjs +18 -0
  245. package/dist/application/transform/document/defs-root.cjs.map +1 -0
  246. package/dist/application/transform/document/defs-root.mjs +16 -0
  247. package/dist/application/transform/document/defs-root.mjs.map +1 -0
  248. package/dist/application/transform/document/document-member.cjs +13 -0
  249. package/dist/application/transform/document/document-member.cjs.map +1 -0
  250. package/dist/application/transform/document/document-member.mjs +11 -0
  251. package/dist/application/transform/document/document-member.mjs.map +1 -0
  252. package/dist/application/transform/document/document.cjs +109 -0
  253. package/dist/application/transform/document/document.cjs.map +1 -0
  254. package/dist/application/transform/document/document.mjs +106 -0
  255. package/dist/application/transform/document/document.mjs.map +1 -0
  256. package/dist/application/transform/document/exploded-query.cjs +46 -0
  257. package/dist/application/transform/document/exploded-query.cjs.map +1 -0
  258. package/dist/application/transform/document/exploded-query.mjs +43 -0
  259. package/dist/application/transform/document/exploded-query.mjs.map +1 -0
  260. package/dist/application/transform/document/global-type-references.cjs +63 -0
  261. package/dist/application/transform/document/global-type-references.cjs.map +1 -0
  262. package/dist/application/transform/document/global-type-references.mjs +61 -0
  263. package/dist/application/transform/document/global-type-references.mjs.map +1 -0
  264. package/dist/application/transform/document/header.cjs +27 -0
  265. package/dist/application/transform/document/header.cjs.map +1 -0
  266. package/dist/application/transform/document/header.mjs +25 -0
  267. package/dist/application/transform/document/header.mjs.map +1 -0
  268. package/dist/application/transform/document/kept-deprecated.cjs +96 -0
  269. package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
  270. package/dist/application/transform/document/kept-deprecated.mjs +94 -0
  271. package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
  272. package/dist/application/transform/document/list-assignability.cjs +54 -0
  273. package/dist/application/transform/document/list-assignability.cjs.map +1 -0
  274. package/dist/application/transform/document/list-assignability.mjs +52 -0
  275. package/dist/application/transform/document/list-assignability.mjs.map +1 -0
  276. package/dist/application/transform/document/media-type.cjs +42 -0
  277. package/dist/application/transform/document/media-type.cjs.map +1 -0
  278. package/dist/application/transform/document/media-type.mjs +38 -0
  279. package/dist/application/transform/document/media-type.mjs.map +1 -0
  280. package/dist/application/transform/document/operation.cjs +45 -0
  281. package/dist/application/transform/document/operation.cjs.map +1 -0
  282. package/dist/application/transform/document/operation.mjs +43 -0
  283. package/dist/application/transform/document/operation.mjs.map +1 -0
  284. package/dist/application/transform/document/parameter.cjs +25 -0
  285. package/dist/application/transform/document/parameter.cjs.map +1 -0
  286. package/dist/application/transform/document/parameter.mjs +23 -0
  287. package/dist/application/transform/document/parameter.mjs.map +1 -0
  288. package/dist/application/transform/document/parameters.cjs +146 -0
  289. package/dist/application/transform/document/parameters.cjs.map +1 -0
  290. package/dist/application/transform/document/parameters.mjs +144 -0
  291. package/dist/application/transform/document/parameters.mjs.map +1 -0
  292. package/dist/application/transform/document/path-item.cjs +82 -0
  293. package/dist/application/transform/document/path-item.cjs.map +1 -0
  294. package/dist/application/transform/document/path-item.mjs +80 -0
  295. package/dist/application/transform/document/path-item.mjs.map +1 -0
  296. package/dist/application/transform/document/path-key-overlaps.cjs +107 -0
  297. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
  298. package/dist/application/transform/document/path-key-overlaps.mjs +105 -0
  299. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
  300. package/dist/application/transform/document/path-template-replace.cjs +48 -0
  301. package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
  302. package/dist/application/transform/document/path-template-replace.mjs +45 -0
  303. package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
  304. package/dist/application/transform/document/paths-enum.cjs +75 -0
  305. package/dist/application/transform/document/paths-enum.cjs.map +1 -0
  306. package/dist/application/transform/document/paths-enum.mjs +72 -0
  307. package/dist/application/transform/document/paths-enum.mjs.map +1 -0
  308. package/dist/application/transform/document/paths.cjs +153 -0
  309. package/dist/application/transform/document/paths.cjs.map +1 -0
  310. package/dist/application/transform/document/paths.mjs +149 -0
  311. package/dist/application/transform/document/paths.mjs.map +1 -0
  312. package/dist/application/transform/document/request-body.cjs +36 -0
  313. package/dist/application/transform/document/request-body.cjs.map +1 -0
  314. package/dist/application/transform/document/request-body.mjs +34 -0
  315. package/dist/application/transform/document/request-body.mjs.map +1 -0
  316. package/dist/application/transform/document/response.cjs +59 -0
  317. package/dist/application/transform/document/response.cjs.map +1 -0
  318. package/dist/application/transform/document/response.mjs +57 -0
  319. package/dist/application/transform/document/response.mjs.map +1 -0
  320. package/dist/application/transform/document/responses.cjs +23 -0
  321. package/dist/application/transform/document/responses.cjs.map +1 -0
  322. package/dist/application/transform/document/responses.mjs +21 -0
  323. package/dist/application/transform/document/responses.mjs.map +1 -0
  324. package/dist/application/transform/document/root-type-aliases.cjs +70 -0
  325. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
  326. package/dist/application/transform/document/root-type-aliases.mjs +67 -0
  327. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
  328. package/dist/application/transform/document/template-key-match.cjs +128 -0
  329. package/dist/application/transform/document/template-key-match.cjs.map +1 -0
  330. package/dist/application/transform/document/template-key-match.mjs +125 -0
  331. package/dist/application/transform/document/template-key-match.mjs.map +1 -0
  332. package/dist/application/transform/document/type-assignability.cjs +192 -0
  333. package/dist/application/transform/document/type-assignability.cjs.map +1 -0
  334. package/dist/application/transform/document/type-assignability.mjs +190 -0
  335. package/dist/application/transform/document/type-assignability.mjs.map +1 -0
  336. package/dist/application/transform/document/type-key.cjs +70 -0
  337. package/dist/application/transform/document/type-key.cjs.map +1 -0
  338. package/dist/application/transform/document/type-key.mjs +68 -0
  339. package/dist/application/transform/document/type-key.mjs.map +1 -0
  340. package/dist/application/transform/document/type-resolution.cjs +131 -0
  341. package/dist/application/transform/document/type-resolution.cjs.map +1 -0
  342. package/dist/application/transform/document/type-resolution.mjs +125 -0
  343. package/dist/application/transform/document/type-resolution.mjs.map +1 -0
  344. package/dist/application/transform/document/webhooks.cjs +19 -0
  345. package/dist/application/transform/document/webhooks.cjs.map +1 -0
  346. package/dist/application/transform/document/webhooks.mjs +17 -0
  347. package/dist/application/transform/document/webhooks.mjs.map +1 -0
  348. package/dist/application/transform/document-entries.cjs +17 -0
  349. package/dist/application/transform/document-entries.cjs.map +1 -0
  350. package/dist/application/transform/document-entries.mjs +14 -0
  351. package/dist/application/transform/document-entries.mjs.map +1 -0
  352. package/dist/application/transform/footer/document-footer.cjs +150 -0
  353. package/dist/application/transform/footer/document-footer.cjs.map +1 -0
  354. package/dist/application/transform/footer/document-footer.mjs +148 -0
  355. package/dist/application/transform/footer/document-footer.mjs.map +1 -0
  356. package/dist/application/transform/footer/enum-naming.cjs +138 -0
  357. package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
  358. package/dist/application/transform/footer/enum-naming.mjs +131 -0
  359. package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
  360. package/dist/application/transform/footer/enum-values-check.cjs +129 -0
  361. package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
  362. package/dist/application/transform/footer/enum-values-check.mjs +127 -0
  363. package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
  364. package/dist/application/transform/footer/evaluation.cjs +33 -0
  365. package/dist/application/transform/footer/evaluation.cjs.map +1 -0
  366. package/dist/application/transform/footer/evaluation.mjs +26 -0
  367. package/dist/application/transform/footer/evaluation.mjs.map +1 -0
  368. package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
  369. package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
  370. package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
  371. package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
  372. package/dist/application/transform/footer/type-evaluation.cjs +246 -0
  373. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
  374. package/dist/application/transform/footer/type-evaluation.mjs +244 -0
  375. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
  376. package/dist/application/transform/footer/type-rules.cjs +172 -0
  377. package/dist/application/transform/footer/type-rules.cjs.map +1 -0
  378. package/dist/application/transform/footer/type-rules.mjs +166 -0
  379. package/dist/application/transform/footer/type-rules.mjs.map +1 -0
  380. package/dist/application/transform/helper-types.cjs +68 -0
  381. package/dist/application/transform/helper-types.cjs.map +1 -0
  382. package/dist/application/transform/helper-types.mjs +65 -0
  383. package/dist/application/transform/helper-types.mjs.map +1 -0
  384. package/dist/application/transform/literal-type.cjs +36 -0
  385. package/dist/application/transform/literal-type.cjs.map +1 -0
  386. package/dist/application/transform/literal-type.mjs +34 -0
  387. package/dist/application/transform/literal-type.mjs.map +1 -0
  388. package/dist/application/transform/numbered-names.cjs +18 -0
  389. package/dist/application/transform/numbered-names.cjs.map +1 -0
  390. package/dist/application/transform/numbered-names.mjs +16 -0
  391. package/dist/application/transform/numbered-names.mjs.map +1 -0
  392. package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
  393. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
  394. package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
  395. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
  396. package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
  397. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
  398. package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
  399. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
  400. package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
  401. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
  402. package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
  403. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
  404. package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
  405. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
  406. package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
  407. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
  408. package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
  409. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
  410. package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
  411. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
  412. package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
  413. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
  414. package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
  415. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
  416. package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
  417. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
  418. package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
  419. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
  420. package/dist/application/transform/ref-type.cjs +62 -0
  421. package/dist/application/transform/ref-type.cjs.map +1 -0
  422. package/dist/application/transform/ref-type.mjs +55 -0
  423. package/dist/application/transform/ref-type.mjs.map +1 -0
  424. package/dist/application/transform/schema/access-flags.cjs +38 -0
  425. package/dist/application/transform/schema/access-flags.cjs.map +1 -0
  426. package/dist/application/transform/schema/access-flags.mjs +36 -0
  427. package/dist/application/transform/schema/access-flags.mjs.map +1 -0
  428. package/dist/application/transform/schema/array-type.cjs +136 -0
  429. package/dist/application/transform/schema/array-type.cjs.map +1 -0
  430. package/dist/application/transform/schema/array-type.mjs +134 -0
  431. package/dist/application/transform/schema/array-type.mjs.map +1 -0
  432. package/dist/application/transform/schema/composition-type.cjs +142 -0
  433. package/dist/application/transform/schema/composition-type.cjs.map +1 -0
  434. package/dist/application/transform/schema/composition-type.mjs +140 -0
  435. package/dist/application/transform/schema/composition-type.mjs.map +1 -0
  436. package/dist/application/transform/schema/core-type.cjs +86 -0
  437. package/dist/application/transform/schema/core-type.cjs.map +1 -0
  438. package/dist/application/transform/schema/core-type.mjs +84 -0
  439. package/dist/application/transform/schema/core-type.mjs.map +1 -0
  440. package/dist/application/transform/schema/discriminated-union.cjs +30 -0
  441. package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
  442. package/dist/application/transform/schema/discriminated-union.mjs +27 -0
  443. package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
  444. package/dist/application/transform/schema/discriminator-property.cjs +22 -0
  445. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
  446. package/dist/application/transform/schema/discriminator-property.mjs +20 -0
  447. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
  448. package/dist/application/transform/schema/enum-rule.cjs +163 -0
  449. package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
  450. package/dist/application/transform/schema/enum-rule.mjs +160 -0
  451. package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
  452. package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
  453. package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
  454. package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
  455. package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
  456. package/dist/application/transform/schema/object-type.cjs +186 -0
  457. package/dist/application/transform/schema/object-type.cjs.map +1 -0
  458. package/dist/application/transform/schema/object-type.mjs +182 -0
  459. package/dist/application/transform/schema/object-type.mjs.map +1 -0
  460. package/dist/application/transform/schema/presence-members.cjs +59 -0
  461. package/dist/application/transform/schema/presence-members.cjs.map +1 -0
  462. package/dist/application/transform/schema/presence-members.mjs +57 -0
  463. package/dist/application/transform/schema/presence-members.mjs.map +1 -0
  464. package/dist/application/transform/schema/required-variants.cjs +45 -0
  465. package/dist/application/transform/schema/required-variants.cjs.map +1 -0
  466. package/dist/application/transform/schema/required-variants.mjs +42 -0
  467. package/dist/application/transform/schema/required-variants.mjs.map +1 -0
  468. package/dist/application/transform/schema/schema-transform.cjs +72 -0
  469. package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
  470. package/dist/application/transform/schema/schema-transform.mjs +68 -0
  471. package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
  472. package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
  473. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
  474. package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
  475. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
  476. package/dist/application/transform/schema-comment.cjs +130 -0
  477. package/dist/application/transform/schema-comment.cjs.map +1 -0
  478. package/dist/application/transform/schema-comment.mjs +125 -0
  479. package/dist/application/transform/schema-comment.mjs.map +1 -0
  480. package/dist/application/transform/shared-types.cjs +8 -0
  481. package/dist/application/transform/shared-types.cjs.map +1 -0
  482. package/dist/application/transform/shared-types.mjs +6 -0
  483. package/dist/application/transform/shared-types.mjs.map +1 -0
  484. package/dist/application/transform/type-combinators.cjs +49 -0
  485. package/dist/application/transform/type-combinators.cjs.map +1 -0
  486. package/dist/application/transform/type-combinators.mjs +42 -0
  487. package/dist/application/transform/type-combinators.mjs.map +1 -0
  488. package/dist/cli/cli-arguments.cjs +145 -0
  489. package/dist/cli/cli-arguments.cjs.map +1 -0
  490. package/dist/cli/cli-arguments.mjs +137 -0
  491. package/dist/cli/cli-arguments.mjs.map +1 -0
  492. package/dist/cli/cli-errors.cjs +81 -0
  493. package/dist/cli/cli-errors.cjs.map +1 -0
  494. package/dist/cli/cli-errors.mjs +77 -0
  495. package/dist/cli/cli-errors.mjs.map +1 -0
  496. package/dist/cli/cli-output.cjs +42 -0
  497. package/dist/cli/cli-output.cjs.map +1 -0
  498. package/dist/cli/cli-output.mjs +35 -0
  499. package/dist/cli/cli-output.mjs.map +1 -0
  500. package/dist/cli/docs-links.cjs +6 -0
  501. package/dist/cli/docs-links.cjs.map +1 -0
  502. package/dist/cli/docs-links.mjs +4 -0
  503. package/dist/cli/docs-links.mjs.map +1 -0
  504. package/dist/cli/fix-option.cjs +19 -0
  505. package/dist/cli/fix-option.cjs.map +1 -0
  506. package/dist/cli/fix-option.mjs +16 -0
  507. package/dist/cli/fix-option.mjs.map +1 -0
  508. package/dist/cli/help-text.cjs +44 -0
  509. package/dist/cli/help-text.cjs.map +1 -0
  510. package/dist/cli/help-text.mjs +42 -0
  511. package/dist/cli/help-text.mjs.map +1 -0
  512. package/dist/cli/main.cjs +67 -0
  513. package/dist/cli/main.cjs.map +1 -0
  514. package/dist/cli/main.d.cts +2 -0
  515. package/dist/cli/main.d.mts +2 -0
  516. package/dist/cli/main.d.ts +2 -0
  517. package/dist/cli/main.mjs +59 -0
  518. package/dist/cli/main.mjs.map +1 -0
  519. package/dist/cli/redocly-apis.cjs +69 -0
  520. package/dist/cli/redocly-apis.cjs.map +1 -0
  521. package/dist/cli/redocly-apis.mjs +66 -0
  522. package/dist/cli/redocly-apis.mjs.map +1 -0
  523. package/dist/cli/ref-limits.cjs +14 -0
  524. package/dist/cli/ref-limits.cjs.map +1 -0
  525. package/dist/cli/ref-limits.mjs +12 -0
  526. package/dist/cli/ref-limits.mjs.map +1 -0
  527. package/dist/cli/run-cli.cjs +113 -0
  528. package/dist/cli/run-cli.cjs.map +1 -0
  529. package/dist/cli/run-cli.mjs +111 -0
  530. package/dist/cli/run-cli.mjs.map +1 -0
  531. package/dist/domain/assert-never.cjs +8 -0
  532. package/dist/domain/assert-never.cjs.map +1 -0
  533. package/dist/domain/assert-never.mjs +6 -0
  534. package/dist/domain/assert-never.mjs.map +1 -0
  535. package/dist/domain/errors.cjs +52 -0
  536. package/dist/domain/errors.cjs.map +1 -0
  537. package/dist/domain/errors.mjs +48 -0
  538. package/dist/domain/errors.mjs.map +1 -0
  539. package/dist/domain/ir/constructors.cjs +93 -0
  540. package/dist/domain/ir/constructors.cjs.map +1 -0
  541. package/dist/domain/ir/constructors.mjs +74 -0
  542. package/dist/domain/ir/constructors.mjs.map +1 -0
  543. package/dist/domain/ir/identifier-text.cjs +29 -0
  544. package/dist/domain/ir/identifier-text.cjs.map +1 -0
  545. package/dist/domain/ir/identifier-text.mjs +25 -0
  546. package/dist/domain/ir/identifier-text.mjs.map +1 -0
  547. package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
  548. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
  549. package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
  550. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
  551. package/dist/domain/ir/normalize.cjs +32 -0
  552. package/dist/domain/ir/normalize.cjs.map +1 -0
  553. package/dist/domain/ir/normalize.mjs +29 -0
  554. package/dist/domain/ir/normalize.mjs.map +1 -0
  555. package/dist/domain/ir/property-name.cjs +19 -0
  556. package/dist/domain/ir/property-name.cjs.map +1 -0
  557. package/dist/domain/ir/property-name.mjs +16 -0
  558. package/dist/domain/ir/property-name.mjs.map +1 -0
  559. package/dist/domain/ir/raw-text-escapes.cjs +25 -0
  560. package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
  561. package/dist/domain/ir/raw-text-escapes.mjs +22 -0
  562. package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
  563. package/dist/domain/openapi/admitted-values.cjs +75 -0
  564. package/dist/domain/openapi/admitted-values.cjs.map +1 -0
  565. package/dist/domain/openapi/admitted-values.mjs +72 -0
  566. package/dist/domain/openapi/admitted-values.mjs.map +1 -0
  567. package/dist/domain/openapi/alias-expansion.cjs +50 -0
  568. package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
  569. package/dist/domain/openapi/alias-expansion.mjs +45 -0
  570. package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
  571. package/dist/domain/openapi/binary-content.cjs +48 -0
  572. package/dist/domain/openapi/binary-content.cjs.map +1 -0
  573. package/dist/domain/openapi/binary-content.mjs +45 -0
  574. package/dist/domain/openapi/binary-content.mjs.map +1 -0
  575. package/dist/domain/openapi/components-object.cjs +29 -0
  576. package/dist/domain/openapi/components-object.cjs.map +1 -0
  577. package/dist/domain/openapi/components-object.mjs +24 -0
  578. package/dist/domain/openapi/components-object.mjs.map +1 -0
  579. package/dist/domain/openapi/discriminated-union.cjs +68 -0
  580. package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
  581. package/dist/domain/openapi/discriminated-union.mjs +62 -0
  582. package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
  583. package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
  584. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
  585. package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
  586. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
  587. package/dist/domain/openapi/json-pointer.cjs +31 -0
  588. package/dist/domain/openapi/json-pointer.cjs.map +1 -0
  589. package/dist/domain/openapi/json-pointer.mjs +27 -0
  590. package/dist/domain/openapi/json-pointer.mjs.map +1 -0
  591. package/dist/domain/openapi/media-type-object.cjs +14 -0
  592. package/dist/domain/openapi/media-type-object.cjs.map +1 -0
  593. package/dist/domain/openapi/media-type-object.mjs +11 -0
  594. package/dist/domain/openapi/media-type-object.mjs.map +1 -0
  595. package/dist/domain/openapi/parameter-object.cjs +13 -0
  596. package/dist/domain/openapi/parameter-object.cjs.map +1 -0
  597. package/dist/domain/openapi/parameter-object.mjs +10 -0
  598. package/dist/domain/openapi/parameter-object.mjs.map +1 -0
  599. package/dist/domain/openapi/path-item-object.cjs +35 -0
  600. package/dist/domain/openapi/path-item-object.cjs.map +1 -0
  601. package/dist/domain/openapi/path-item-object.mjs +30 -0
  602. package/dist/domain/openapi/path-item-object.mjs.map +1 -0
  603. package/dist/domain/openapi/path-templates.cjs +23 -0
  604. package/dist/domain/openapi/path-templates.cjs.map +1 -0
  605. package/dist/domain/openapi/path-templates.mjs +21 -0
  606. package/dist/domain/openapi/path-templates.mjs.map +1 -0
  607. package/dist/domain/openapi/unsupported-features.cjs +87 -0
  608. package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
  609. package/dist/domain/openapi/unsupported-features.mjs +84 -0
  610. package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
  611. package/dist/domain/output-fixes.cjs +101 -0
  612. package/dist/domain/output-fixes.cjs.map +1 -0
  613. package/dist/domain/output-fixes.mjs +94 -0
  614. package/dist/domain/output-fixes.mjs.map +1 -0
  615. package/dist/domain/warnings.cjs +15 -0
  616. package/dist/domain/warnings.cjs.map +1 -0
  617. package/dist/domain/warnings.mjs +12 -0
  618. package/dist/domain/warnings.mjs.map +1 -0
  619. package/dist/index.cjs +98 -0
  620. package/dist/index.cjs.map +1 -0
  621. package/dist/index.d.cts +841 -0
  622. package/dist/index.d.mts +841 -0
  623. package/dist/index.d.ts +841 -0
  624. package/dist/index.mjs +27 -0
  625. package/dist/index.mjs.map +1 -0
  626. package/dist/transform/components-object.cjs +15 -0
  627. package/dist/transform/components-object.cjs.map +1 -0
  628. package/dist/transform/components-object.mjs +11 -0
  629. package/dist/transform/components-object.mjs.map +1 -0
  630. package/dist/transform/header-object.cjs +12 -0
  631. package/dist/transform/header-object.cjs.map +1 -0
  632. package/dist/transform/header-object.mjs +10 -0
  633. package/dist/transform/header-object.mjs.map +1 -0
  634. package/dist/transform/media-type-object.cjs +12 -0
  635. package/dist/transform/media-type-object.cjs.map +1 -0
  636. package/dist/transform/media-type-object.mjs +10 -0
  637. package/dist/transform/media-type-object.mjs.map +1 -0
  638. package/dist/transform/operation-object.cjs +26 -0
  639. package/dist/transform/operation-object.cjs.map +1 -0
  640. package/dist/transform/operation-object.mjs +21 -0
  641. package/dist/transform/operation-object.mjs.map +1 -0
  642. package/dist/transform/parameter-object.cjs +12 -0
  643. package/dist/transform/parameter-object.cjs.map +1 -0
  644. package/dist/transform/parameter-object.mjs +10 -0
  645. package/dist/transform/parameter-object.mjs.map +1 -0
  646. package/dist/transform/path-item-object.cjs +12 -0
  647. package/dist/transform/path-item-object.cjs.map +1 -0
  648. package/dist/transform/path-item-object.mjs +10 -0
  649. package/dist/transform/path-item-object.mjs.map +1 -0
  650. package/dist/transform/paths-object.cjs +11 -0
  651. package/dist/transform/paths-object.cjs.map +1 -0
  652. package/dist/transform/paths-object.mjs +9 -0
  653. package/dist/transform/paths-object.mjs.map +1 -0
  654. package/dist/transform/request-body-object.cjs +12 -0
  655. package/dist/transform/request-body-object.cjs.map +1 -0
  656. package/dist/transform/request-body-object.mjs +10 -0
  657. package/dist/transform/request-body-object.mjs.map +1 -0
  658. package/dist/transform/response-object.cjs +12 -0
  659. package/dist/transform/response-object.cjs.map +1 -0
  660. package/dist/transform/response-object.mjs +10 -0
  661. package/dist/transform/response-object.mjs.map +1 -0
  662. package/dist/transform/responses-object.cjs +12 -0
  663. package/dist/transform/responses-object.cjs.map +1 -0
  664. package/dist/transform/responses-object.mjs +10 -0
  665. package/dist/transform/responses-object.mjs.map +1 -0
  666. package/dist/transform/schema-object.cjs +21 -0
  667. package/dist/transform/schema-object.cjs.map +1 -0
  668. package/dist/transform/schema-object.mjs +16 -0
  669. package/dist/transform/schema-object.mjs.map +1 -0
  670. package/package.json +115 -4
  671. package/src/adapters/node-file-system/node-file-system.ts +44 -0
  672. package/src/adapters/redocly-loader/alias-limit.ts +20 -0
  673. package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
  674. package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
  675. package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
  676. package/src/adapters/redocly-loader/redocly-config-source.ts +78 -0
  677. package/src/adapters/redocly-loader/redocly-schema-loader.ts +262 -0
  678. package/src/adapters/redocly-loader/ref-access.ts +146 -0
  679. package/src/adapters/redocly-loader/ref-holders.ts +43 -0
  680. package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
  681. package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
  682. package/src/adapters/redocly-loader/schema-source.ts +151 -0
  683. package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
  684. package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
  685. package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
  686. package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
  687. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +223 -0
  688. package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
  689. package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
  690. package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
  691. package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
  692. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +294 -0
  693. package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
  694. package/src/api/ast-to-string.ts +59 -0
  695. package/src/api/comment-header.ts +7 -0
  696. package/src/api/default-ports.ts +44 -0
  697. package/src/api/discriminator-conflict-warnings.ts +43 -0
  698. package/src/api/discriminator-enum-names.ts +26 -0
  699. package/src/api/discriminator-enum-parent.ts +129 -0
  700. package/src/api/discriminator-enum.ts +115 -0
  701. package/src/api/discriminator-other-owners.ts +97 -0
  702. package/src/api/discriminator-patch.ts +147 -0
  703. package/src/api/discriminator-scan.ts +260 -0
  704. package/src/api/document-declarations.ts +41 -0
  705. package/src/api/document-refs.ts +71 -0
  706. package/src/api/document-run.ts +177 -0
  707. package/src/api/enum-values-warnings.ts +21 -0
  708. package/src/api/footer-entry.ts +23 -0
  709. package/src/api/footer-sink.ts +67 -0
  710. package/src/api/legacy-callback-warning.ts +29 -0
  711. package/src/api/legacy-ts-helpers.ts +311 -0
  712. package/src/api/legacy-utils.ts +118 -0
  713. package/src/api/openapi-ts.ts +62 -0
  714. package/src/api/path-template-warnings.ts +27 -0
  715. package/src/api/schema-callbacks.ts +211 -0
  716. package/src/api/string-to-ast.ts +27 -0
  717. package/src/api/transform-context.ts +93 -0
  718. package/src/api/transform-schema.ts +123 -0
  719. package/src/api/type-helpers.ts +130 -0
  720. package/src/api/unsupported-feature-warnings.ts +33 -0
  721. package/src/application/ports/file-system.ts +12 -0
  722. package/src/application/ports/logger.ts +16 -0
  723. package/src/application/ports/redocly-config-source.ts +20 -0
  724. package/src/application/ports/schema-loader.ts +32 -0
  725. package/src/application/print/comment-writer.ts +91 -0
  726. package/src/application/print/declaration-printer.ts +100 -0
  727. package/src/application/print/literal-text.ts +62 -0
  728. package/src/application/print/print-nodes.ts +62 -0
  729. package/src/application/print/print-options.ts +11 -0
  730. package/src/application/print/text-writer.ts +83 -0
  731. package/src/application/print/type-printer.ts +287 -0
  732. package/src/application/stack-overflow.ts +54 -0
  733. package/src/application/transform/document/assignability.ts +203 -0
  734. package/src/application/transform/document/components.ts +189 -0
  735. package/src/application/transform/document/declared-types.ts +93 -0
  736. package/src/application/transform/document/defs-root.ts +25 -0
  737. package/src/application/transform/document/document-member.ts +20 -0
  738. package/src/application/transform/document/document.ts +215 -0
  739. package/src/application/transform/document/exploded-query.ts +91 -0
  740. package/src/application/transform/document/global-type-references.ts +78 -0
  741. package/src/application/transform/document/header.ts +34 -0
  742. package/src/application/transform/document/kept-deprecated.ts +135 -0
  743. package/src/application/transform/document/list-assignability.ts +87 -0
  744. package/src/application/transform/document/media-type.ts +78 -0
  745. package/src/application/transform/document/operation.ts +64 -0
  746. package/src/application/transform/document/parameter.ts +45 -0
  747. package/src/application/transform/document/parameters.ts +265 -0
  748. package/src/application/transform/document/path-item.ts +168 -0
  749. package/src/application/transform/document/path-key-overlaps.ts +201 -0
  750. package/src/application/transform/document/path-template-replace.ts +90 -0
  751. package/src/application/transform/document/paths-enum.ts +127 -0
  752. package/src/application/transform/document/paths.ts +273 -0
  753. package/src/application/transform/document/request-body.ts +50 -0
  754. package/src/application/transform/document/response.ts +109 -0
  755. package/src/application/transform/document/responses.ts +29 -0
  756. package/src/application/transform/document/root-type-aliases.ts +107 -0
  757. package/src/application/transform/document/template-key-match.ts +183 -0
  758. package/src/application/transform/document/type-assignability.ts +268 -0
  759. package/src/application/transform/document/type-key.ts +80 -0
  760. package/src/application/transform/document/type-resolution.ts +163 -0
  761. package/src/application/transform/document/webhooks.ts +22 -0
  762. package/src/application/transform/document-entries.ts +28 -0
  763. package/src/application/transform/footer/document-footer.ts +212 -0
  764. package/src/application/transform/footer/enum-naming.ts +210 -0
  765. package/src/application/transform/footer/enum-values-check.ts +171 -0
  766. package/src/application/transform/footer/evaluation.ts +47 -0
  767. package/src/application/transform/footer/shared-enum-names.ts +86 -0
  768. package/src/application/transform/footer/type-evaluation.ts +294 -0
  769. package/src/application/transform/footer/type-rules.ts +269 -0
  770. package/src/application/transform/helper-types.ts +92 -0
  771. package/src/application/transform/literal-type.ts +54 -0
  772. package/src/application/transform/numbered-names.ts +20 -0
  773. package/src/application/transform/ref-pointer/generated-location.ts +211 -0
  774. package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
  775. package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
  776. package/src/application/transform/ref-pointer/original-index.ts +95 -0
  777. package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
  778. package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
  779. package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
  780. package/src/application/transform/ref-type.ts +102 -0
  781. package/src/application/transform/schema/access-flags.ts +63 -0
  782. package/src/application/transform/schema/array-type.ts +213 -0
  783. package/src/application/transform/schema/composition-type.ts +255 -0
  784. package/src/application/transform/schema/core-type.ts +119 -0
  785. package/src/application/transform/schema/discriminated-union.ts +58 -0
  786. package/src/application/transform/schema/discriminator-property.ts +33 -0
  787. package/src/application/transform/schema/enum-rule.ts +280 -0
  788. package/src/application/transform/schema/inherited-discriminator.ts +54 -0
  789. package/src/application/transform/schema/object-type.ts +289 -0
  790. package/src/application/transform/schema/presence-members.ts +96 -0
  791. package/src/application/transform/schema/required-variants.ts +88 -0
  792. package/src/application/transform/schema/schema-context.ts +136 -0
  793. package/src/application/transform/schema/schema-rule.ts +29 -0
  794. package/src/application/transform/schema/schema-transform.ts +99 -0
  795. package/src/application/transform/schema/unevaluated-properties.ts +105 -0
  796. package/src/application/transform/schema-comment.ts +196 -0
  797. package/src/application/transform/shared-types.ts +9 -0
  798. package/src/application/transform/transform-context.ts +51 -0
  799. package/src/application/transform/type-combinators.ts +57 -0
  800. package/src/cli/cli-arguments.ts +208 -0
  801. package/src/cli/cli-dependencies.ts +47 -0
  802. package/src/cli/cli-errors.ts +127 -0
  803. package/src/cli/cli-output.ts +67 -0
  804. package/src/cli/docs-links.ts +6 -0
  805. package/src/cli/fix-option.ts +29 -0
  806. package/src/cli/help-text.ts +52 -0
  807. package/src/cli/main.ts +73 -0
  808. package/src/cli/redocly-apis.ts +95 -0
  809. package/src/cli/ref-limits.ts +16 -0
  810. package/src/cli/run-cli.ts +131 -0
  811. package/src/domain/assert-never.ts +8 -0
  812. package/src/domain/errors.ts +76 -0
  813. package/src/domain/ir/constructors.ts +142 -0
  814. package/src/domain/ir/identifier-text.ts +49 -0
  815. package/src/domain/ir/newer-identifier-ranges.ts +109 -0
  816. package/src/domain/ir/nodes.ts +225 -0
  817. package/src/domain/ir/normalize.ts +51 -0
  818. package/src/domain/ir/property-name.ts +28 -0
  819. package/src/domain/ir/raw-text-escapes.ts +37 -0
  820. package/src/domain/openapi/admitted-values.ts +113 -0
  821. package/src/domain/openapi/alias-expansion.ts +72 -0
  822. package/src/domain/openapi/binary-content.ts +74 -0
  823. package/src/domain/openapi/components-object.ts +52 -0
  824. package/src/domain/openapi/discriminated-union.ts +109 -0
  825. package/src/domain/openapi/discriminator-conflicts.ts +251 -0
  826. package/src/domain/openapi/document-object.ts +12 -0
  827. package/src/domain/openapi/header-object.ts +9 -0
  828. package/src/domain/openapi/json-pointer.ts +46 -0
  829. package/src/domain/openapi/media-type-object.ts +26 -0
  830. package/src/domain/openapi/operation-object.ts +13 -0
  831. package/src/domain/openapi/parameter-object.ts +34 -0
  832. package/src/domain/openapi/path-item-object.ts +70 -0
  833. package/src/domain/openapi/path-templates.ts +31 -0
  834. package/src/domain/openapi/request-body-object.ts +7 -0
  835. package/src/domain/openapi/response-object.ts +14 -0
  836. package/src/domain/openapi/schema-object.ts +61 -0
  837. package/src/domain/openapi/unsupported-features.ts +139 -0
  838. package/src/domain/output-fixes.ts +136 -0
  839. package/src/domain/warnings.ts +20 -0
  840. package/src/index.ts +67 -0
  841. package/src/transform/components-object.ts +27 -0
  842. package/src/transform/header-object.ts +19 -0
  843. package/src/transform/media-type-object.ts +19 -0
  844. package/src/transform/operation-object.ts +36 -0
  845. package/src/transform/parameter-object.ts +19 -0
  846. package/src/transform/parameters-array.ts +19 -0
  847. package/src/transform/path-item-object.ts +22 -0
  848. package/src/transform/paths-enum.ts +8 -0
  849. package/src/transform/paths-object.ts +15 -0
  850. package/src/transform/request-body-object.ts +19 -0
  851. package/src/transform/response-object.ts +19 -0
  852. package/src/transform/responses-object.ts +19 -0
  853. package/src/transform/schema-object.ts +36 -0
  854. package/src/transform/webhooks-object.ts +15 -0
  855. package/src/types/generator-options.ts +278 -0
  856. package/src/types/openapi-common.ts +100 -0
  857. package/src/types/openapi-document.ts +196 -0
  858. package/src/types/openapi-path-item.ts +130 -0
  859. package/src/types/openapi-request.ts +209 -0
  860. package/src/types/openapi-response.ts +81 -0
  861. package/src/types/openapi-schema.ts +169 -0
  862. package/src/types/openapi-security.ts +116 -0
  863. package/src/types.ts +12 -0
@@ -0,0 +1,67 @@
1
+ import { irRaw } from '../../../domain/ir/constructors.mjs';
2
+ import { escapeSingleQuotedText } from '../../../domain/ir/raw-text-escapes.mjs';
3
+ import { globalTypeReferences } from './global-type-references.mjs';
4
+
5
+ const REFERENCE_PREFIX = "components['";
6
+ function rootTypeAlias(name, kind, item) {
7
+ return {
8
+ kind: "typeAlias",
9
+ name,
10
+ isExported: true,
11
+ // The original writes the reference as text, with single quotes, and did not escape the
12
+ // name: a quote in it could add code to the generated file (intentional fix).
13
+ type: irRaw(`${REFERENCE_PREFIX}${kind}']['${escapeSingleQuotedText(item)}']`),
14
+ comments: []
15
+ };
16
+ }
17
+ function isRootTypeAlias(declaration) {
18
+ return declaration.kind === "typeAlias" && declaration.type.kind === "raw" && declaration.type.text.startsWith(REFERENCE_PREFIX);
19
+ }
20
+ function footerTypeNames(declarations) {
21
+ return new Set(
22
+ declarations.flatMap((declaration) => {
23
+ if (declaration.kind === "enum") {
24
+ return [declaration.name];
25
+ }
26
+ return declaration.kind === "rawDeclaration" && declaration.name !== void 0 ? [declaration.name] : [];
27
+ })
28
+ );
29
+ }
30
+ function declaredNames(declarations) {
31
+ return new Set(
32
+ declarations.flatMap(
33
+ (declaration) => "name" in declaration && declaration.name !== void 0 ? [declaration.name] : []
34
+ )
35
+ );
36
+ }
37
+ function freeName(name, taken) {
38
+ let candidate = `${name}_2`;
39
+ for (let counter = 3; taken.has(candidate); counter++) {
40
+ candidate = `${name}_${counter}`;
41
+ }
42
+ return candidate;
43
+ }
44
+ function renameTakenAliases(body, footer, closing = []) {
45
+ const reserved = footerTypeNames(footer);
46
+ for (const name of globalTypeReferences([...body, ...footer, ...closing])) {
47
+ reserved.add(name);
48
+ }
49
+ const taken = declaredNames([...body, ...footer, ...closing]);
50
+ const aliasNames = /* @__PURE__ */ new Set();
51
+ return body.map((declaration) => {
52
+ if (!isRootTypeAlias(declaration)) {
53
+ return declaration;
54
+ }
55
+ const isRepeated = aliasNames.has(declaration.name);
56
+ aliasNames.add(declaration.name);
57
+ if (!isRepeated && !reserved.has(declaration.name)) {
58
+ return declaration;
59
+ }
60
+ const name = freeName(declaration.name, taken);
61
+ taken.add(name);
62
+ return { ...declaration, name };
63
+ });
64
+ }
65
+
66
+ export { renameTakenAliases, rootTypeAlias };
67
+ //# sourceMappingURL=root-type-aliases.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-type-aliases.mjs","sources":["../../../../src/application/transform/document/root-type-aliases.ts"],"sourcesContent":["import { irRaw } from \"../../../domain/ir/constructors.js\";\nimport type { IrDeclaration, IrTypeAliasDeclaration } from \"../../../domain/ir/nodes.js\";\nimport { escapeSingleQuotedText } from \"../../../domain/ir/raw-text-escapes.js\";\nimport type { ComponentKind } from \"../../../domain/openapi/components-object.js\";\nimport { globalTypeReferences } from \"./global-type-references.js\";\n\n/** The `--root-types` aliases: `export type Pet = components['schemas']['Pet'];`. */\n\nconst REFERENCE_PREFIX = \"components['\";\n\n/** The alias of one component. */\nexport function rootTypeAlias(\n name: string,\n kind: ComponentKind,\n item: string,\n): IrTypeAliasDeclaration {\n return {\n kind: \"typeAlias\",\n name,\n isExported: true,\n // The original writes the reference as text, with single quotes, and did not escape the\n // name: a quote in it could add code to the generated file (intentional fix).\n type: irRaw(`${REFERENCE_PREFIX}${kind}']['${escapeSingleQuotedText(item)}']`),\n comments: [],\n };\n}\n\nfunction isRootTypeAlias(declaration: IrDeclaration): declaration is IrTypeAliasDeclaration {\n return (\n declaration.kind === \"typeAlias\" &&\n declaration.type.kind === \"raw\" &&\n declaration.type.text.startsWith(REFERENCE_PREFIX)\n );\n}\n\n/**\n * The type names the footer declares that an alias must not take: enums, and helper types such as\n * `WithRequired`. Value declarations (`--enum-values` arrays) live in another namespace.\n */\nfunction footerTypeNames(declarations: readonly IrDeclaration[]): Set<string> {\n return new Set(\n declarations.flatMap((declaration) => {\n if (declaration.kind === \"enum\") {\n return [declaration.name];\n }\n return declaration.kind === \"rawDeclaration\" && declaration.name !== undefined\n ? [declaration.name]\n : [];\n }),\n );\n}\n\nfunction declaredNames(declarations: readonly IrDeclaration[]): Set<string> {\n return new Set(\n declarations.flatMap((declaration) =>\n \"name\" in declaration && declaration.name !== undefined ? [declaration.name] : [],\n ),\n );\n}\n\nfunction freeName(name: string, taken: ReadonlySet<string>): string {\n let candidate = `${name}_2`;\n for (let counter = 3; taken.has(candidate); counter++) {\n candidate = `${name}_${counter}`;\n }\n return candidate;\n}\n\n/**\n * Rename each root alias whose name an enum or a helper type of the footer also declares, or that\n * shadows a TypeScript global type the output refers to (`Record` in `Record<string, never>`), to\n * the next free `Name_2`, `Name_3`, … (the suffix `--root-types` uses for its own conflicts). The\n * footer and the globals keep their names, because the generated types refer to them. Before, the\n * output did not compile (enums: upstream #2099, #2341, #2206; helpers: a schema named\n * `WithRequired`, roadmap R11; globals: TS2315). Other declarations are returned unchanged.\n *\n * With the `root-type-numbering` fix (ADR-021, roadmap R13, backlog 30) the body also holds the\n * aliases a later schema of one exported name took the name from, after the other aliases and\n * under that same name. Each gets the next free number in body order, after the alias that kept\n * the name got its own: so the fix only adds exports, and every other alias keeps the name it has\n * without the fix.\n */\nexport function renameTakenAliases<T extends IrDeclaration>(\n body: readonly T[],\n footer: readonly IrDeclaration[],\n closing: readonly IrDeclaration[] = [],\n): T[] {\n const reserved = footerTypeNames(footer);\n for (const name of globalTypeReferences([...body, ...footer, ...closing])) {\n reserved.add(name);\n }\n const taken = declaredNames([...body, ...footer, ...closing]);\n const aliasNames = new Set<string>();\n return body.map((declaration) => {\n if (!isRootTypeAlias(declaration)) {\n return declaration;\n }\n const isRepeated = aliasNames.has(declaration.name);\n aliasNames.add(declaration.name);\n if (!isRepeated && !reserved.has(declaration.name)) {\n return declaration;\n }\n const name = freeName(declaration.name, taken);\n taken.add(name);\n return { ...declaration, name };\n });\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ 'use strict';
2
+
3
+ function textAt(shape, index) {
4
+ return shape.texts[index];
5
+ }
6
+ function isNumberText(text) {
7
+ return text !== "" && Number.isFinite(Number(text));
8
+ }
9
+ function isValidMatch(match, placeholder) {
10
+ if (placeholder === "string") {
11
+ return true;
12
+ }
13
+ if (match.kind === "text") {
14
+ return isNumberText(match.text);
15
+ }
16
+ const { texts, types } = match.shape;
17
+ return texts.length === 2 && texts[0] === "" && texts[1] === "" && types[0] === "number";
18
+ }
19
+ class LiteralPartsScan {
20
+ matches = [];
21
+ cursor;
22
+ source;
23
+ lastSourceIndex;
24
+ remainingEndText;
25
+ constructor(source, startPosition, endTextLength) {
26
+ this.source = source;
27
+ this.lastSourceIndex = source.texts.length - 1;
28
+ const endText = textAt(source, this.lastSourceIndex);
29
+ this.remainingEndText = endText.slice(0, endText.length - endTextLength);
30
+ this.cursor = { segment: 0, position: startPosition };
31
+ }
32
+ /** The matches for the target's texts between its first and last; null when one is missing. */
33
+ run(delimiters) {
34
+ for (const delimiter of delimiters) {
35
+ if (!this.matchDelimiter(delimiter)) {
36
+ return null;
37
+ }
38
+ }
39
+ this.addMatch(this.lastSourceIndex, this.sourceText(this.lastSourceIndex).length);
40
+ return this.matches;
41
+ }
42
+ matchDelimiter(delimiter) {
43
+ const { segment, position } = this.cursor;
44
+ if (delimiter.length > 0) {
45
+ const found = this.find(delimiter);
46
+ if (found === null) {
47
+ return false;
48
+ }
49
+ this.addMatch(found.segment, found.position);
50
+ this.cursor = { ...this.cursor, position: this.cursor.position + delimiter.length };
51
+ return true;
52
+ }
53
+ if (position < this.sourceText(segment).length) {
54
+ this.addMatch(segment, position + 1);
55
+ return true;
56
+ }
57
+ if (segment < this.lastSourceIndex) {
58
+ this.addMatch(segment + 1, 0);
59
+ return true;
60
+ }
61
+ return false;
62
+ }
63
+ /** The first occurrence of the delimiter at or after the cursor, in this or a later text. */
64
+ find(delimiter) {
65
+ let { segment, position } = this.cursor;
66
+ while (segment < this.source.texts.length) {
67
+ const index = this.sourceText(segment).indexOf(delimiter, position);
68
+ if (index >= 0) {
69
+ return { segment, position: index };
70
+ }
71
+ segment += 1;
72
+ position = 0;
73
+ }
74
+ return null;
75
+ }
76
+ sourceText(index) {
77
+ return index < this.lastSourceIndex ? textAt(this.source, index) : this.remainingEndText;
78
+ }
79
+ addMatch(segment, position) {
80
+ const start = this.cursor;
81
+ if (segment === start.segment) {
82
+ const text = this.sourceText(segment).slice(start.position, position);
83
+ this.matches.push({ kind: "text", text });
84
+ } else {
85
+ const texts = [
86
+ textAt(this.source, start.segment).slice(start.position),
87
+ ...this.source.texts.slice(start.segment + 1, segment),
88
+ this.sourceText(segment).slice(0, position)
89
+ ];
90
+ const types = this.source.types.slice(start.segment, segment);
91
+ this.matches.push({ kind: "template", shape: { texts, types } });
92
+ }
93
+ this.cursor = { segment, position };
94
+ }
95
+ }
96
+ function inferMatches(source, target) {
97
+ const sourceStart = textAt(source, 0);
98
+ const sourceEnd = textAt(source, source.texts.length - 1);
99
+ const targetStart = textAt(target, 0);
100
+ const targetEnd = textAt(target, target.texts.length - 1);
101
+ const isTooShort = source.texts.length === 1 && sourceStart.length < targetStart.length + targetEnd.length;
102
+ if (isTooShort || !sourceStart.startsWith(targetStart) || !sourceEnd.endsWith(targetEnd)) {
103
+ return null;
104
+ }
105
+ const scan = new LiteralPartsScan(source, targetStart.length, targetEnd.length);
106
+ return scan.run(target.texts.slice(1, -1));
107
+ }
108
+ function haveSameTexts(source, target) {
109
+ return source.texts.length === target.texts.length && source.texts.every((text, index) => text === target.texts[index]);
110
+ }
111
+ function isAssignableToTemplate(source, target) {
112
+ if (source.types.length > 0 && haveSameTexts(source, target)) {
113
+ return source.types.every((type, index) => {
114
+ const placeholder = target.types[index];
115
+ return placeholder === "string" || type === placeholder;
116
+ });
117
+ }
118
+ const matches = inferMatches(source, target);
119
+ const isEveryMatchValid = matches?.every((match, index) => {
120
+ const placeholder = target.types[index];
121
+ return placeholder !== void 0 && isValidMatch(match, placeholder);
122
+ });
123
+ return isEveryMatchValid === true;
124
+ }
125
+
126
+ exports.isAssignableToTemplate = isAssignableToTemplate;
127
+ exports.isNumberText = isNumberText;
128
+ //# sourceMappingURL=template-key-match.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-key-match.cjs","sources":["../../../../src/application/transform/document/template-key-match.ts"],"sourcesContent":["/**\n * Whether a key type is assignable to a template literal key type, decided the way TypeScript's\n * checker decides it (`inferFromLiteralPartsToTemplateLiteral` and\n * `isValidTypeForTemplateLiteralPlaceholder` in TypeScript 5 and 6). An index signature checks\n * exactly the keys that are assignable to its key type, so the overlap check must match the\n * checker, not the strings a template stands for: the checker matches each text of the target at\n * its first occurrence, so it misses some keys a regular expression would match, and a key it\n * misses is never checked against the signature.\n */\n\n/** A placeholder type of a template, after `${boolean}` became the texts `true` and `false`. */\nexport type TemplatePlaceholder = \"string\" | \"number\";\n\n/**\n * A key type as TypeScript stores a template literal: texts around placeholders, one more text\n * than placeholders. A string literal is one text and no placeholder.\n */\nexport interface TemplateShape {\n readonly texts: readonly string[];\n readonly types: readonly TemplatePlaceholder[];\n}\n\n/** The text at an index of the shape; every caller passes one of `0 .. types.length`. */\nfunction textAt(shape: TemplateShape, index: number): string {\n return shape.texts[index] as string;\n}\n\n/** The type the checker infers for one target placeholder: a text, or a slice of the source. */\ntype InferredMatch =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"template\"; readonly shape: TemplateShape };\n\n/** TypeScript's `isValidNumberString(text, false)`: a text that converts to a finite number. */\nexport function isNumberText(text: string): boolean {\n return text !== \"\" && Number.isFinite(Number(text));\n}\n\n/** Whether the inferred type fits a placeholder: any string for `string`, a number for `number`. */\nfunction isValidMatch(match: InferredMatch, placeholder: TemplatePlaceholder): boolean {\n if (placeholder === \"string\") {\n return true;\n }\n if (match.kind === \"text\") {\n return isNumberText(match.text);\n }\n const { texts, types } = match.shape;\n return texts.length === 2 && texts[0] === \"\" && texts[1] === \"\" && types[0] === \"number\";\n}\n\n/** The state of the scan through the source: the current text and the position in it. */\ninterface Cursor {\n readonly segment: number;\n readonly position: number;\n}\n\n/** The scan of `inferFromLiteralPartsToTemplateLiteral`, over one source and one target. */\nclass LiteralPartsScan {\n private readonly matches: InferredMatch[] = [];\n private cursor: Cursor;\n private readonly source: TemplateShape;\n private readonly lastSourceIndex: number;\n private readonly remainingEndText: string;\n\n constructor(source: TemplateShape, startPosition: number, endTextLength: number) {\n this.source = source;\n this.lastSourceIndex = source.texts.length - 1;\n const endText = textAt(source, this.lastSourceIndex);\n this.remainingEndText = endText.slice(0, endText.length - endTextLength);\n this.cursor = { segment: 0, position: startPosition };\n }\n\n /** The matches for the target's texts between its first and last; null when one is missing. */\n run(delimiters: readonly string[]): readonly InferredMatch[] | null {\n for (const delimiter of delimiters) {\n if (!this.matchDelimiter(delimiter)) {\n return null;\n }\n }\n this.addMatch(this.lastSourceIndex, this.sourceText(this.lastSourceIndex).length);\n return this.matches;\n }\n\n private matchDelimiter(delimiter: string): boolean {\n const { segment, position } = this.cursor;\n if (delimiter.length > 0) {\n const found = this.find(delimiter);\n if (found === null) {\n return false;\n }\n this.addMatch(found.segment, found.position);\n this.cursor = { ...this.cursor, position: this.cursor.position + delimiter.length };\n return true;\n }\n if (position < this.sourceText(segment).length) {\n this.addMatch(segment, position + 1);\n return true;\n }\n if (segment < this.lastSourceIndex) {\n this.addMatch(segment + 1, 0);\n return true;\n }\n return false;\n }\n\n /** The first occurrence of the delimiter at or after the cursor, in this or a later text. */\n private find(delimiter: string): Cursor | null {\n let { segment, position } = this.cursor;\n while (segment < this.source.texts.length) {\n const index = this.sourceText(segment).indexOf(delimiter, position);\n if (index >= 0) {\n return { segment, position: index };\n }\n segment += 1;\n position = 0;\n }\n return null;\n }\n\n private sourceText(index: number): string {\n return index < this.lastSourceIndex ? textAt(this.source, index) : this.remainingEndText;\n }\n\n private addMatch(segment: number, position: number): void {\n const start = this.cursor;\n if (segment === start.segment) {\n const text = this.sourceText(segment).slice(start.position, position);\n this.matches.push({ kind: \"text\", text });\n } else {\n const texts = [\n textAt(this.source, start.segment).slice(start.position),\n ...this.source.texts.slice(start.segment + 1, segment),\n this.sourceText(segment).slice(0, position),\n ];\n const types = this.source.types.slice(start.segment, segment);\n this.matches.push({ kind: \"template\", shape: { texts, types } });\n }\n this.cursor = { segment, position };\n }\n}\n\n/** The checker's inferences for the target's placeholders; null when the texts do not fit. */\nfunction inferMatches(\n source: TemplateShape,\n target: TemplateShape,\n): readonly InferredMatch[] | null {\n const sourceStart = textAt(source, 0);\n const sourceEnd = textAt(source, source.texts.length - 1);\n const targetStart = textAt(target, 0);\n const targetEnd = textAt(target, target.texts.length - 1);\n const isTooShort =\n source.texts.length === 1 && sourceStart.length < targetStart.length + targetEnd.length;\n if (isTooShort || !sourceStart.startsWith(targetStart) || !sourceEnd.endsWith(targetEnd)) {\n return null;\n }\n const scan = new LiteralPartsScan(source, targetStart.length, targetEnd.length);\n return scan.run(target.texts.slice(1, -1));\n}\n\nfunction haveSameTexts(source: TemplateShape, target: TemplateShape): boolean {\n return (\n source.texts.length === target.texts.length &&\n source.texts.every((text, index) => text === target.texts[index])\n );\n}\n\n/**\n * Whether the source key type is assignable to the target template. Templates with the same texts\n * compare placeholder by placeholder (`inferTypesFromTemplateLiteralType`).\n */\nexport function isAssignableToTemplate(source: TemplateShape, target: TemplateShape): boolean {\n if (source.types.length > 0 && haveSameTexts(source, target)) {\n return source.types.every((type, index) => {\n const placeholder = target.types[index];\n return placeholder === \"string\" || type === placeholder;\n });\n }\n const matches = inferMatches(source, target);\n const isEveryMatchValid = matches?.every((match, index) => {\n const placeholder = target.types[index];\n return placeholder !== undefined && isValidMatch(match, placeholder);\n });\n return isEveryMatchValid === true;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ function textAt(shape, index) {
2
+ return shape.texts[index];
3
+ }
4
+ function isNumberText(text) {
5
+ return text !== "" && Number.isFinite(Number(text));
6
+ }
7
+ function isValidMatch(match, placeholder) {
8
+ if (placeholder === "string") {
9
+ return true;
10
+ }
11
+ if (match.kind === "text") {
12
+ return isNumberText(match.text);
13
+ }
14
+ const { texts, types } = match.shape;
15
+ return texts.length === 2 && texts[0] === "" && texts[1] === "" && types[0] === "number";
16
+ }
17
+ class LiteralPartsScan {
18
+ matches = [];
19
+ cursor;
20
+ source;
21
+ lastSourceIndex;
22
+ remainingEndText;
23
+ constructor(source, startPosition, endTextLength) {
24
+ this.source = source;
25
+ this.lastSourceIndex = source.texts.length - 1;
26
+ const endText = textAt(source, this.lastSourceIndex);
27
+ this.remainingEndText = endText.slice(0, endText.length - endTextLength);
28
+ this.cursor = { segment: 0, position: startPosition };
29
+ }
30
+ /** The matches for the target's texts between its first and last; null when one is missing. */
31
+ run(delimiters) {
32
+ for (const delimiter of delimiters) {
33
+ if (!this.matchDelimiter(delimiter)) {
34
+ return null;
35
+ }
36
+ }
37
+ this.addMatch(this.lastSourceIndex, this.sourceText(this.lastSourceIndex).length);
38
+ return this.matches;
39
+ }
40
+ matchDelimiter(delimiter) {
41
+ const { segment, position } = this.cursor;
42
+ if (delimiter.length > 0) {
43
+ const found = this.find(delimiter);
44
+ if (found === null) {
45
+ return false;
46
+ }
47
+ this.addMatch(found.segment, found.position);
48
+ this.cursor = { ...this.cursor, position: this.cursor.position + delimiter.length };
49
+ return true;
50
+ }
51
+ if (position < this.sourceText(segment).length) {
52
+ this.addMatch(segment, position + 1);
53
+ return true;
54
+ }
55
+ if (segment < this.lastSourceIndex) {
56
+ this.addMatch(segment + 1, 0);
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+ /** The first occurrence of the delimiter at or after the cursor, in this or a later text. */
62
+ find(delimiter) {
63
+ let { segment, position } = this.cursor;
64
+ while (segment < this.source.texts.length) {
65
+ const index = this.sourceText(segment).indexOf(delimiter, position);
66
+ if (index >= 0) {
67
+ return { segment, position: index };
68
+ }
69
+ segment += 1;
70
+ position = 0;
71
+ }
72
+ return null;
73
+ }
74
+ sourceText(index) {
75
+ return index < this.lastSourceIndex ? textAt(this.source, index) : this.remainingEndText;
76
+ }
77
+ addMatch(segment, position) {
78
+ const start = this.cursor;
79
+ if (segment === start.segment) {
80
+ const text = this.sourceText(segment).slice(start.position, position);
81
+ this.matches.push({ kind: "text", text });
82
+ } else {
83
+ const texts = [
84
+ textAt(this.source, start.segment).slice(start.position),
85
+ ...this.source.texts.slice(start.segment + 1, segment),
86
+ this.sourceText(segment).slice(0, position)
87
+ ];
88
+ const types = this.source.types.slice(start.segment, segment);
89
+ this.matches.push({ kind: "template", shape: { texts, types } });
90
+ }
91
+ this.cursor = { segment, position };
92
+ }
93
+ }
94
+ function inferMatches(source, target) {
95
+ const sourceStart = textAt(source, 0);
96
+ const sourceEnd = textAt(source, source.texts.length - 1);
97
+ const targetStart = textAt(target, 0);
98
+ const targetEnd = textAt(target, target.texts.length - 1);
99
+ const isTooShort = source.texts.length === 1 && sourceStart.length < targetStart.length + targetEnd.length;
100
+ if (isTooShort || !sourceStart.startsWith(targetStart) || !sourceEnd.endsWith(targetEnd)) {
101
+ return null;
102
+ }
103
+ const scan = new LiteralPartsScan(source, targetStart.length, targetEnd.length);
104
+ return scan.run(target.texts.slice(1, -1));
105
+ }
106
+ function haveSameTexts(source, target) {
107
+ return source.texts.length === target.texts.length && source.texts.every((text, index) => text === target.texts[index]);
108
+ }
109
+ function isAssignableToTemplate(source, target) {
110
+ if (source.types.length > 0 && haveSameTexts(source, target)) {
111
+ return source.types.every((type, index) => {
112
+ const placeholder = target.types[index];
113
+ return placeholder === "string" || type === placeholder;
114
+ });
115
+ }
116
+ const matches = inferMatches(source, target);
117
+ const isEveryMatchValid = matches?.every((match, index) => {
118
+ const placeholder = target.types[index];
119
+ return placeholder !== void 0 && isValidMatch(match, placeholder);
120
+ });
121
+ return isEveryMatchValid === true;
122
+ }
123
+
124
+ export { isAssignableToTemplate, isNumberText };
125
+ //# sourceMappingURL=template-key-match.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-key-match.mjs","sources":["../../../../src/application/transform/document/template-key-match.ts"],"sourcesContent":["/**\n * Whether a key type is assignable to a template literal key type, decided the way TypeScript's\n * checker decides it (`inferFromLiteralPartsToTemplateLiteral` and\n * `isValidTypeForTemplateLiteralPlaceholder` in TypeScript 5 and 6). An index signature checks\n * exactly the keys that are assignable to its key type, so the overlap check must match the\n * checker, not the strings a template stands for: the checker matches each text of the target at\n * its first occurrence, so it misses some keys a regular expression would match, and a key it\n * misses is never checked against the signature.\n */\n\n/** A placeholder type of a template, after `${boolean}` became the texts `true` and `false`. */\nexport type TemplatePlaceholder = \"string\" | \"number\";\n\n/**\n * A key type as TypeScript stores a template literal: texts around placeholders, one more text\n * than placeholders. A string literal is one text and no placeholder.\n */\nexport interface TemplateShape {\n readonly texts: readonly string[];\n readonly types: readonly TemplatePlaceholder[];\n}\n\n/** The text at an index of the shape; every caller passes one of `0 .. types.length`. */\nfunction textAt(shape: TemplateShape, index: number): string {\n return shape.texts[index] as string;\n}\n\n/** The type the checker infers for one target placeholder: a text, or a slice of the source. */\ntype InferredMatch =\n | { readonly kind: \"text\"; readonly text: string }\n | { readonly kind: \"template\"; readonly shape: TemplateShape };\n\n/** TypeScript's `isValidNumberString(text, false)`: a text that converts to a finite number. */\nexport function isNumberText(text: string): boolean {\n return text !== \"\" && Number.isFinite(Number(text));\n}\n\n/** Whether the inferred type fits a placeholder: any string for `string`, a number for `number`. */\nfunction isValidMatch(match: InferredMatch, placeholder: TemplatePlaceholder): boolean {\n if (placeholder === \"string\") {\n return true;\n }\n if (match.kind === \"text\") {\n return isNumberText(match.text);\n }\n const { texts, types } = match.shape;\n return texts.length === 2 && texts[0] === \"\" && texts[1] === \"\" && types[0] === \"number\";\n}\n\n/** The state of the scan through the source: the current text and the position in it. */\ninterface Cursor {\n readonly segment: number;\n readonly position: number;\n}\n\n/** The scan of `inferFromLiteralPartsToTemplateLiteral`, over one source and one target. */\nclass LiteralPartsScan {\n private readonly matches: InferredMatch[] = [];\n private cursor: Cursor;\n private readonly source: TemplateShape;\n private readonly lastSourceIndex: number;\n private readonly remainingEndText: string;\n\n constructor(source: TemplateShape, startPosition: number, endTextLength: number) {\n this.source = source;\n this.lastSourceIndex = source.texts.length - 1;\n const endText = textAt(source, this.lastSourceIndex);\n this.remainingEndText = endText.slice(0, endText.length - endTextLength);\n this.cursor = { segment: 0, position: startPosition };\n }\n\n /** The matches for the target's texts between its first and last; null when one is missing. */\n run(delimiters: readonly string[]): readonly InferredMatch[] | null {\n for (const delimiter of delimiters) {\n if (!this.matchDelimiter(delimiter)) {\n return null;\n }\n }\n this.addMatch(this.lastSourceIndex, this.sourceText(this.lastSourceIndex).length);\n return this.matches;\n }\n\n private matchDelimiter(delimiter: string): boolean {\n const { segment, position } = this.cursor;\n if (delimiter.length > 0) {\n const found = this.find(delimiter);\n if (found === null) {\n return false;\n }\n this.addMatch(found.segment, found.position);\n this.cursor = { ...this.cursor, position: this.cursor.position + delimiter.length };\n return true;\n }\n if (position < this.sourceText(segment).length) {\n this.addMatch(segment, position + 1);\n return true;\n }\n if (segment < this.lastSourceIndex) {\n this.addMatch(segment + 1, 0);\n return true;\n }\n return false;\n }\n\n /** The first occurrence of the delimiter at or after the cursor, in this or a later text. */\n private find(delimiter: string): Cursor | null {\n let { segment, position } = this.cursor;\n while (segment < this.source.texts.length) {\n const index = this.sourceText(segment).indexOf(delimiter, position);\n if (index >= 0) {\n return { segment, position: index };\n }\n segment += 1;\n position = 0;\n }\n return null;\n }\n\n private sourceText(index: number): string {\n return index < this.lastSourceIndex ? textAt(this.source, index) : this.remainingEndText;\n }\n\n private addMatch(segment: number, position: number): void {\n const start = this.cursor;\n if (segment === start.segment) {\n const text = this.sourceText(segment).slice(start.position, position);\n this.matches.push({ kind: \"text\", text });\n } else {\n const texts = [\n textAt(this.source, start.segment).slice(start.position),\n ...this.source.texts.slice(start.segment + 1, segment),\n this.sourceText(segment).slice(0, position),\n ];\n const types = this.source.types.slice(start.segment, segment);\n this.matches.push({ kind: \"template\", shape: { texts, types } });\n }\n this.cursor = { segment, position };\n }\n}\n\n/** The checker's inferences for the target's placeholders; null when the texts do not fit. */\nfunction inferMatches(\n source: TemplateShape,\n target: TemplateShape,\n): readonly InferredMatch[] | null {\n const sourceStart = textAt(source, 0);\n const sourceEnd = textAt(source, source.texts.length - 1);\n const targetStart = textAt(target, 0);\n const targetEnd = textAt(target, target.texts.length - 1);\n const isTooShort =\n source.texts.length === 1 && sourceStart.length < targetStart.length + targetEnd.length;\n if (isTooShort || !sourceStart.startsWith(targetStart) || !sourceEnd.endsWith(targetEnd)) {\n return null;\n }\n const scan = new LiteralPartsScan(source, targetStart.length, targetEnd.length);\n return scan.run(target.texts.slice(1, -1));\n}\n\nfunction haveSameTexts(source: TemplateShape, target: TemplateShape): boolean {\n return (\n source.texts.length === target.texts.length &&\n source.texts.every((text, index) => text === target.texts[index])\n );\n}\n\n/**\n * Whether the source key type is assignable to the target template. Templates with the same texts\n * compare placeholder by placeholder (`inferTypesFromTemplateLiteralType`).\n */\nexport function isAssignableToTemplate(source: TemplateShape, target: TemplateShape): boolean {\n if (source.types.length > 0 && haveSameTexts(source, target)) {\n return source.types.every((type, index) => {\n const placeholder = target.types[index];\n return placeholder === \"string\" || type === placeholder;\n });\n }\n const matches = inferMatches(source, target);\n const isEveryMatchValid = matches?.every((match, index) => {\n const placeholder = target.types[index];\n return placeholder !== undefined && isValidMatch(match, placeholder);\n });\n return isEveryMatchValid === true;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const assignability = require('./assignability.cjs');
5
+ const listAssignability = require('./list-assignability.cjs');
6
+ const typeKey = require('./type-key.cjs');
7
+ const typeResolution = require('./type-resolution.cjs');
8
+
9
+ function resultOf(results, source, target) {
10
+ return results.get(source)?.get(target);
11
+ }
12
+ function setResult(results, pair, value) {
13
+ const byTarget = results.get(pair.source) ?? /* @__PURE__ */ new Map();
14
+ byTarget.set(pair.target, value);
15
+ results.set(pair.source, byTarget);
16
+ }
17
+ function isWeakTypeRejected(source, target) {
18
+ const targetProperties = [...typeResolution.propertiesOf(target).values()];
19
+ const isWeak = targetProperties.length > 0 && typeResolution.indexSignaturesOf(target).length === 0 && targetProperties.every((property) => property.isOptional);
20
+ const sourceNames = [...typeResolution.propertiesOf(source).keys()];
21
+ return isWeak && sourceNames.length > 0 && !sourceNames.some((name) => targetProperties.some((property) => typeResolution.nameOf(property) === name));
22
+ }
23
+ function isStringIndex(signature) {
24
+ return signature.parameterType.kind === "keyword" && signature.parameterType.keyword === "string";
25
+ }
26
+ const BOOLEAN_MEMBERS = [constructors.irBoolean(true), constructors.irBoolean(false)];
27
+ function sourceUnionMembers(source, target) {
28
+ if (source.kind === "union") {
29
+ return source.types;
30
+ }
31
+ const isBoolean = source.kind === "keyword" && source.keyword === "boolean";
32
+ return isBoolean && target.kind === "union" ? BOOLEAN_MEMBERS : null;
33
+ }
34
+ class AssignabilityCheck {
35
+ inProgress = /* @__PURE__ */ new Map();
36
+ results = /* @__PURE__ */ new Map();
37
+ typeKeyOf = typeKey.createTypeKey();
38
+ resolution;
39
+ /** How often a pair being compared was assumed related, and how deep the comparison is. */
40
+ assumptions = 0;
41
+ depth = 0;
42
+ constructor(lookup) {
43
+ this.resolution = new typeResolution.TypeResolution(lookup);
44
+ }
45
+ relate(source, target) {
46
+ const pair = {
47
+ source: this.resolution.resolved(source),
48
+ target: this.resolution.resolved(target)
49
+ };
50
+ if (pair.source === pair.target || this.typeKeyOf(pair.source) === this.typeKeyOf(pair.target)) {
51
+ return "assignable";
52
+ }
53
+ const known = resultOf(this.results, pair.source, pair.target);
54
+ if (known !== void 0) {
55
+ return known;
56
+ }
57
+ if (resultOf(this.inProgress, pair.source, pair.target) !== void 0) {
58
+ this.assumptions += 1;
59
+ return "assignable";
60
+ }
61
+ const assumedBefore = this.assumptions;
62
+ setResult(this.inProgress, pair, "assignable");
63
+ this.depth += 1;
64
+ const result = this.compare(pair.source, pair.target);
65
+ this.depth -= 1;
66
+ this.inProgress.get(pair.source)?.delete(pair.target);
67
+ if (result !== "assignable" || this.assumptions === assumedBefore || this.depth === 0) {
68
+ setResult(this.results, pair, result);
69
+ }
70
+ return result;
71
+ }
72
+ compare(source, target) {
73
+ if (target.kind === "keyword" && target.keyword === "unknown") {
74
+ return "assignable";
75
+ }
76
+ if (source.kind === "keyword" && source.keyword === "never") {
77
+ return "assignable";
78
+ }
79
+ const sourceMembers = sourceUnionMembers(source, target);
80
+ if (sourceMembers !== null) {
81
+ return assignability.everyOf(sourceMembers, (member) => this.relate(member, target));
82
+ }
83
+ if (target.kind === "intersection") {
84
+ return assignability.everyOf(target.types, (member) => this.relateToIntersectionPart(source, member));
85
+ }
86
+ if (target.kind === "union") {
87
+ return this.relateToUnion(source, target);
88
+ }
89
+ if (source.kind === "intersection") {
90
+ const fits = source.types.some((part) => this.relate(part, target) === "assignable");
91
+ return fits ? "assignable" : "undecided";
92
+ }
93
+ return this.compareSingle(source, target);
94
+ }
95
+ /**
96
+ * A part of an intersection the check cannot merge into one object. The checker skips the weak
97
+ * type check for such a part, so a rejection that may rest on it decides nothing.
98
+ */
99
+ relateToIntersectionPart(source, part) {
100
+ const result = this.relate(source, part);
101
+ const from = this.resolution.resolved(source);
102
+ const to = this.resolution.resolved(part);
103
+ const isWeakRejection = from.kind === "object" && to.kind === "object" && isWeakTypeRejected(from, to);
104
+ return result === "rejected" && isWeakRejection ? "undecided" : result;
105
+ }
106
+ /**
107
+ * An object may fit a union of objects that none of its members accepts alone, through a
108
+ * discriminant property (`{ k: "a" | "b" }` fits `{ k: "a" } | { k: "b" }`); not modelled.
109
+ */
110
+ relateToUnion(source, target) {
111
+ const result = assignability.someOf(target.types, (member) => this.relate(source, member));
112
+ const objectMembers = target.types.filter(
113
+ (member) => this.resolution.resolved(member).kind === "object"
114
+ );
115
+ const mayBeDiscriminated = source.kind === "object" && objectMembers.length > 1;
116
+ return result === "rejected" && mayBeDiscriminated ? "undecided" : result;
117
+ }
118
+ compareSingle(source, target) {
119
+ const crossCategory = assignability.crossCategoryRelation(source, target);
120
+ if (crossCategory !== null) {
121
+ return crossCategory;
122
+ }
123
+ switch (source.kind) {
124
+ case "array":
125
+ case "tuple":
126
+ case "readonly":
127
+ return listAssignability.relateLists(source, target, (from, to) => this.relate(from, to));
128
+ case "object":
129
+ return this.relateObjects(source, target);
130
+ default:
131
+ return assignability.primitiveRelation(source, target);
132
+ }
133
+ }
134
+ relateObjects(source, target) {
135
+ if (isWeakTypeRejected(source, target)) {
136
+ return "rejected";
137
+ }
138
+ const sourceProperties = typeResolution.propertiesOf(source);
139
+ const indexes = assignability.everyOf(
140
+ typeResolution.indexSignaturesOf(target),
141
+ (signature) => this.relateToIndex(source, signature)
142
+ );
143
+ if (indexes === "rejected") {
144
+ return indexes;
145
+ }
146
+ const properties = assignability.everyOf(
147
+ [...typeResolution.propertiesOf(target).values()],
148
+ (property) => this.relateProperty(sourceProperties.get(typeResolution.nameOf(property)), property)
149
+ );
150
+ return assignability.everyOf([indexes, properties], (result) => result);
151
+ }
152
+ /**
153
+ * A string index signature of the target. A string index of the source is compared with it;
154
+ * without one, every property and index signature of the source is. An optional property is
155
+ * compared without the `undefined` its optionality adds, as the checker does.
156
+ */
157
+ relateToIndex(source, signature) {
158
+ if (!isStringIndex(signature)) {
159
+ return "undecided";
160
+ }
161
+ const indexes = typeResolution.indexSignaturesOf(source);
162
+ const own = indexes.find(isStringIndex);
163
+ if (own !== void 0) {
164
+ return this.relate(own.type, signature.type);
165
+ }
166
+ const types = [
167
+ ...[...typeResolution.propertiesOf(source).values()].map((property) => property.type),
168
+ ...indexes.map((index) => index.type)
169
+ ];
170
+ return assignability.everyOf(types, (type) => this.relate(type, signature.type));
171
+ }
172
+ /**
173
+ * A property of the target. A missing optional one is not checked, not even against a string
174
+ * index of the source; a missing or optional source property fails a required one (TS2741).
175
+ */
176
+ relateProperty(source, target) {
177
+ if (source === void 0) {
178
+ return target.isOptional ? "assignable" : "rejected";
179
+ }
180
+ if (source.isOptional && !target.isOptional) {
181
+ return "rejected";
182
+ }
183
+ return this.relate(typeResolution.readType(source), typeResolution.readType(target));
184
+ }
185
+ }
186
+ function assignabilityProof(lookup) {
187
+ const check = new AssignabilityCheck(lookup);
188
+ return (source, target) => check.relate(source, target);
189
+ }
190
+
191
+ exports.assignabilityProof = assignabilityProof;
192
+ //# sourceMappingURL=type-assignability.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-assignability.cjs","sources":["../../../../src/application/transform/document/type-assignability.ts"],"sourcesContent":["import { irBoolean } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrIndexSignature,\n IrObjectType,\n IrPropertySignature,\n IrType,\n IrUnionType,\n} from \"../../../domain/ir/nodes.js\";\nimport {\n type Assignability,\n crossCategoryRelation,\n everyOf,\n primitiveRelation,\n someOf,\n} from \"./assignability.js\";\nimport type { DeclaredTypeLookup } from \"./declared-types.js\";\nimport { type IrListType, relateLists } from \"./list-assignability.js\";\nimport { createTypeKey } from \"./type-key.js\";\nimport {\n indexSignaturesOf,\n nameOf,\n propertiesOf,\n readType,\n TypeResolution,\n} from \"./type-resolution.js\";\n\n/**\n * Whether TypeScript accepts one type where another is expected (`strict`, without\n * `exactOptionalPropertyTypes`), for the `--path-params-as-types` overlap check. It follows the\n * checker's rules for the types the generator writes: unions, intersections, objects with optional\n * properties and index signatures, weak types, arrays, tuples, literals and keywords, and the\n * references to declarations of the document. A pair it does not model (a utility type, raw text)\n * is undecided unless both are the same type, and an undecided pair keeps the original output.\n */\n\n/** Results by source type, then by target type. */\ntype PairResults = Map<IrType, Map<IrType, Assignability>>;\n\nfunction resultOf(results: PairResults, source: IrType, target: IrType): Assignability | undefined {\n return results.get(source)?.get(target);\n}\n\nfunction setResult(\n results: PairResults,\n pair: { readonly source: IrType; readonly target: IrType },\n value: Assignability,\n): void {\n const byTarget = results.get(pair.source) ?? new Map<IrType, Assignability>();\n byTarget.set(pair.target, value);\n results.set(pair.source, byTarget);\n}\n\n/** A weak type has only optional properties; TypeScript rejects a source sharing none (TS2559). */\nfunction isWeakTypeRejected(source: IrObjectType, target: IrObjectType): boolean {\n const targetProperties = [...propertiesOf(target).values()];\n const isWeak =\n targetProperties.length > 0 &&\n indexSignaturesOf(target).length === 0 &&\n targetProperties.every((property) => property.isOptional);\n const sourceNames = [...propertiesOf(source).keys()];\n return (\n isWeak &&\n sourceNames.length > 0 &&\n !sourceNames.some((name) => targetProperties.some((property) => nameOf(property) === name))\n );\n}\n\nfunction isStringIndex(signature: IrIndexSignature): boolean {\n return signature.parameterType.kind === \"keyword\" && signature.parameterType.keyword === \"string\";\n}\n\n/** `boolean` as the checker stores it: the union `true | false`. */\nconst BOOLEAN_MEMBERS: readonly IrType[] = [irBoolean(true), irBoolean(false)];\n\n/**\n * The members a source is compared by, one by one, or null for a source compared as a whole.\n * `boolean` counts as `true | false` against a union, which it fits though it fits neither member\n * alone; `string` and `number` are no finite unions, so no literal union holds all their values.\n */\nfunction sourceUnionMembers(source: IrType, target: IrType): readonly IrType[] | null {\n if (source.kind === \"union\") {\n return source.types;\n }\n const isBoolean = source.kind === \"keyword\" && source.keyword === \"boolean\";\n return isBoolean && target.kind === \"union\" ? BOOLEAN_MEMBERS : null;\n}\n\n/** The memoized check over the declarations of one generated file. */\nclass AssignabilityCheck {\n private readonly inProgress: PairResults = new Map();\n private readonly results: PairResults = new Map();\n private readonly typeKeyOf = createTypeKey();\n private readonly resolution: TypeResolution;\n /** How often a pair being compared was assumed related, and how deep the comparison is. */\n private assumptions = 0;\n private depth = 0;\n\n constructor(lookup: DeclaredTypeLookup) {\n this.resolution = new TypeResolution(lookup);\n }\n\n relate(source: IrType, target: IrType): Assignability {\n const pair = {\n source: this.resolution.resolved(source),\n target: this.resolution.resolved(target),\n };\n if (\n pair.source === pair.target ||\n this.typeKeyOf(pair.source) === this.typeKeyOf(pair.target)\n ) {\n return \"assignable\";\n }\n const known = resultOf(this.results, pair.source, pair.target);\n if (known !== undefined) {\n return known;\n }\n // A pair being compared is assumed related, as the checker does for recursive types.\n if (resultOf(this.inProgress, pair.source, pair.target) !== undefined) {\n this.assumptions += 1;\n return \"assignable\";\n }\n const assumedBefore = this.assumptions;\n setResult(this.inProgress, pair, \"assignable\");\n this.depth += 1;\n const result = this.compare(pair.source, pair.target);\n this.depth -= 1;\n this.inProgress.get(pair.source)?.delete(pair.target);\n // \"Assignable\" that rests on an assumption about an outer pair holds only if that pair does,\n // so it is kept only once no outer pair is open. The assumption can only make a pair more\n // related, so a rejection or an undecided pair reached under it is safe to keep.\n if (result !== \"assignable\" || this.assumptions === assumedBefore || this.depth === 0) {\n setResult(this.results, pair, result);\n }\n return result;\n }\n\n private compare(source: IrType, target: IrType): Assignability {\n if (target.kind === \"keyword\" && target.keyword === \"unknown\") {\n return \"assignable\";\n }\n if (source.kind === \"keyword\" && source.keyword === \"never\") {\n return \"assignable\";\n }\n const sourceMembers = sourceUnionMembers(source, target);\n if (sourceMembers !== null) {\n return everyOf(sourceMembers, (member) => this.relate(member, target));\n }\n if (target.kind === \"intersection\") {\n return everyOf(target.types, (member) => this.relateToIntersectionPart(source, member));\n }\n if (target.kind === \"union\") {\n return this.relateToUnion(source, target);\n }\n if (source.kind === \"intersection\") {\n // A part that fits is enough; the parts as one type are not modelled (see `merged`).\n const fits = source.types.some((part) => this.relate(part, target) === \"assignable\");\n return fits ? \"assignable\" : \"undecided\";\n }\n return this.compareSingle(source, target);\n }\n\n /**\n * A part of an intersection the check cannot merge into one object. The checker skips the weak\n * type check for such a part, so a rejection that may rest on it decides nothing.\n */\n private relateToIntersectionPart(source: IrType, part: IrType): Assignability {\n const result = this.relate(source, part);\n const from = this.resolution.resolved(source);\n const to = this.resolution.resolved(part);\n const isWeakRejection =\n from.kind === \"object\" && to.kind === \"object\" && isWeakTypeRejected(from, to);\n return result === \"rejected\" && isWeakRejection ? \"undecided\" : result;\n }\n\n /**\n * An object may fit a union of objects that none of its members accepts alone, through a\n * discriminant property (`{ k: \"a\" | \"b\" }` fits `{ k: \"a\" } | { k: \"b\" }`); not modelled.\n */\n private relateToUnion(source: IrType, target: IrUnionType): Assignability {\n const result = someOf(target.types, (member) => this.relate(source, member));\n const objectMembers = target.types.filter(\n (member) => this.resolution.resolved(member).kind === \"object\",\n );\n const mayBeDiscriminated = source.kind === \"object\" && objectMembers.length > 1;\n return result === \"rejected\" && mayBeDiscriminated ? \"undecided\" : result;\n }\n\n private compareSingle(source: IrType, target: IrType): Assignability {\n const crossCategory = crossCategoryRelation(source, target);\n if (crossCategory !== null) {\n return crossCategory;\n }\n switch (source.kind) {\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return relateLists(source, target as IrListType, (from, to) => this.relate(from, to));\n case \"object\":\n return this.relateObjects(source, target as IrObjectType);\n default:\n return primitiveRelation(source, target);\n }\n }\n\n private relateObjects(source: IrObjectType, target: IrObjectType): Assignability {\n if (isWeakTypeRejected(source, target)) {\n return \"rejected\";\n }\n const sourceProperties = propertiesOf(source);\n const indexes = everyOf(indexSignaturesOf(target), (signature) =>\n this.relateToIndex(source, signature),\n );\n if (indexes === \"rejected\") {\n return indexes;\n }\n const properties = everyOf([...propertiesOf(target).values()], (property) =>\n this.relateProperty(sourceProperties.get(nameOf(property)), property),\n );\n return everyOf([indexes, properties], (result) => result);\n }\n\n /**\n * A string index signature of the target. A string index of the source is compared with it;\n * without one, every property and index signature of the source is. An optional property is\n * compared without the `undefined` its optionality adds, as the checker does.\n */\n private relateToIndex(source: IrObjectType, signature: IrIndexSignature): Assignability {\n if (!isStringIndex(signature)) {\n return \"undecided\";\n }\n const indexes = indexSignaturesOf(source);\n const own = indexes.find(isStringIndex);\n if (own !== undefined) {\n return this.relate(own.type, signature.type);\n }\n const types = [\n ...[...propertiesOf(source).values()].map((property) => property.type),\n ...indexes.map((index) => index.type),\n ];\n return everyOf(types, (type) => this.relate(type, signature.type));\n }\n\n /**\n * A property of the target. A missing optional one is not checked, not even against a string\n * index of the source; a missing or optional source property fails a required one (TS2741).\n */\n private relateProperty(\n source: IrPropertySignature | undefined,\n target: IrPropertySignature,\n ): Assignability {\n if (source === undefined) {\n return target.isOptional ? \"assignable\" : \"rejected\";\n }\n if (source.isOptional && !target.isOptional) {\n return \"rejected\";\n }\n return this.relate(readType(source), readType(target));\n }\n}\n\n/** What the check proves about a source type where a target is expected. */\nexport type AssignabilityProof = (source: IrType, target: IrType) => Assignability;\n\n/** One memoized check, for all the comparisons of a `paths` type. */\nexport function assignabilityProof(lookup: DeclaredTypeLookup): AssignabilityProof {\n const check = new AssignabilityCheck(lookup);\n return (source, target) => check.relate(source, target);\n}\n"],"names":["propertiesOf","indexSignaturesOf","nameOf","irBoolean","createTypeKey","TypeResolution","everyOf","someOf","crossCategoryRelation","relateLists","primitiveRelation","readType"],"mappings":"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"}