openapi-typesafe 1.0.0-rc.0 → 1.0.0-rc.2

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 (513) hide show
  1. package/README.md +12 -5
  2. package/dist/adapters/redocly-loader/configured-headers.cjs +32 -0
  3. package/dist/adapters/redocly-loader/configured-headers.cjs.map +1 -0
  4. package/dist/adapters/redocly-loader/configured-headers.mjs +30 -0
  5. package/dist/adapters/redocly-loader/configured-headers.mjs.map +1 -0
  6. package/dist/adapters/redocly-loader/redocly-config-source.cjs +21 -2
  7. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  8. package/dist/adapters/redocly-loader/redocly-config-source.mjs +22 -3
  9. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  10. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +34 -11
  11. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +33 -10
  13. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/ref-access.cjs +37 -4
  15. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  16. package/dist/adapters/redocly-loader/ref-access.mjs +37 -4
  17. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  18. package/dist/adapters/redocly-loader/ref-resolution-check.cjs +191 -0
  19. package/dist/adapters/redocly-loader/ref-resolution-check.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/ref-resolution-check.mjs +189 -0
  21. package/dist/adapters/redocly-loader/ref-resolution-check.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs +73 -0
  23. package/dist/adapters/redocly-loader/ref-resolution-steps.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs +60 -0
  25. package/dist/adapters/redocly-loader/ref-resolution-steps.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/remote-fetch.cjs +41 -14
  27. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  28. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -14
  29. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  30. package/dist/adapters/redocly-loader/schema-load-errors.cjs +23 -5
  31. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/schema-load-errors.mjs +23 -5
  33. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/unsupported-keys.cjs +9 -1
  35. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/unsupported-keys.mjs +9 -1
  37. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  38. package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
  39. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  40. package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
  41. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  42. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +5 -1
  43. package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -1
  44. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +5 -1
  45. package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -1
  46. package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -1
  47. package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -1
  48. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +15 -9
  49. package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -1
  50. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +15 -9
  51. package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -1
  52. package/dist/api/default-ports.cjs +9 -0
  53. package/dist/api/default-ports.cjs.map +1 -1
  54. package/dist/api/default-ports.mjs +8 -1
  55. package/dist/api/default-ports.mjs.map +1 -1
  56. package/dist/api/discriminator-conflict-warnings.cjs +25 -0
  57. package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
  58. package/dist/api/discriminator-conflict-warnings.mjs +23 -0
  59. package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
  60. package/dist/api/discriminator-enum-names.cjs +19 -0
  61. package/dist/api/discriminator-enum-names.cjs.map +1 -0
  62. package/dist/api/discriminator-enum-names.mjs +17 -0
  63. package/dist/api/discriminator-enum-names.mjs.map +1 -0
  64. package/dist/api/discriminator-enum-parent.cjs +59 -0
  65. package/dist/api/discriminator-enum-parent.cjs.map +1 -0
  66. package/dist/api/discriminator-enum-parent.mjs +57 -0
  67. package/dist/api/discriminator-enum-parent.mjs.map +1 -0
  68. package/dist/api/discriminator-enum.cjs +25 -0
  69. package/dist/api/discriminator-enum.cjs.map +1 -1
  70. package/dist/api/discriminator-enum.mjs +25 -1
  71. package/dist/api/discriminator-enum.mjs.map +1 -1
  72. package/dist/api/discriminator-other-owners.cjs +67 -0
  73. package/dist/api/discriminator-other-owners.cjs.map +1 -0
  74. package/dist/api/discriminator-other-owners.mjs +64 -0
  75. package/dist/api/discriminator-other-owners.mjs.map +1 -0
  76. package/dist/api/discriminator-patch.cjs +92 -0
  77. package/dist/api/discriminator-patch.cjs.map +1 -0
  78. package/dist/api/discriminator-patch.mjs +86 -0
  79. package/dist/api/discriminator-patch.mjs.map +1 -0
  80. package/dist/api/discriminator-scan.cjs +50 -65
  81. package/dist/api/discriminator-scan.cjs.map +1 -1
  82. package/dist/api/discriminator-scan.mjs +44 -59
  83. package/dist/api/discriminator-scan.mjs.map +1 -1
  84. package/dist/api/document-refs.cjs +15 -12
  85. package/dist/api/document-refs.cjs.map +1 -1
  86. package/dist/api/document-refs.mjs +15 -12
  87. package/dist/api/document-refs.mjs.map +1 -1
  88. package/dist/api/document-run.cjs +21 -4
  89. package/dist/api/document-run.cjs.map +1 -1
  90. package/dist/api/document-run.mjs +22 -5
  91. package/dist/api/document-run.mjs.map +1 -1
  92. package/dist/api/enum-values-warnings.cjs +16 -0
  93. package/dist/api/enum-values-warnings.cjs.map +1 -0
  94. package/dist/api/enum-values-warnings.mjs +14 -0
  95. package/dist/api/enum-values-warnings.mjs.map +1 -0
  96. package/dist/api/footer-sink.cjs +25 -2
  97. package/dist/api/footer-sink.cjs.map +1 -1
  98. package/dist/api/footer-sink.mjs +25 -2
  99. package/dist/api/footer-sink.mjs.map +1 -1
  100. package/dist/api/legacy-callback-warning.cjs +4 -1
  101. package/dist/api/legacy-callback-warning.cjs.map +1 -1
  102. package/dist/api/legacy-callback-warning.mjs +4 -1
  103. package/dist/api/legacy-callback-warning.mjs.map +1 -1
  104. package/dist/api/legacy-ts-helpers.cjs.map +1 -1
  105. package/dist/api/legacy-ts-helpers.mjs.map +1 -1
  106. package/dist/api/legacy-utils.cjs.map +1 -1
  107. package/dist/api/legacy-utils.mjs.map +1 -1
  108. package/dist/api/openapi-ts.cjs +2 -1
  109. package/dist/api/openapi-ts.cjs.map +1 -1
  110. package/dist/api/openapi-ts.mjs +3 -2
  111. package/dist/api/openapi-ts.mjs.map +1 -1
  112. package/dist/api/path-template-warnings.cjs +21 -0
  113. package/dist/api/path-template-warnings.cjs.map +1 -0
  114. package/dist/api/path-template-warnings.mjs +19 -0
  115. package/dist/api/path-template-warnings.mjs.map +1 -0
  116. package/dist/api/transform-context.cjs +4 -2
  117. package/dist/api/transform-context.cjs.map +1 -1
  118. package/dist/api/transform-context.mjs +4 -2
  119. package/dist/api/transform-context.mjs.map +1 -1
  120. package/dist/api/transform-schema.cjs +52 -3
  121. package/dist/api/transform-schema.cjs.map +1 -1
  122. package/dist/api/transform-schema.mjs +53 -4
  123. package/dist/api/transform-schema.mjs.map +1 -1
  124. package/dist/api/unsupported-feature-warnings.cjs +6 -1
  125. package/dist/api/unsupported-feature-warnings.cjs.map +1 -1
  126. package/dist/api/unsupported-feature-warnings.mjs +6 -1
  127. package/dist/api/unsupported-feature-warnings.mjs.map +1 -1
  128. package/dist/application/print/type-printer.cjs +7 -1
  129. package/dist/application/print/type-printer.cjs.map +1 -1
  130. package/dist/application/print/type-printer.mjs +7 -1
  131. package/dist/application/print/type-printer.mjs.map +1 -1
  132. package/dist/application/transform/document/assignability.cjs +144 -0
  133. package/dist/application/transform/document/assignability.cjs.map +1 -0
  134. package/dist/application/transform/document/assignability.mjs +138 -0
  135. package/dist/application/transform/document/assignability.mjs.map +1 -0
  136. package/dist/application/transform/document/components.cjs +2 -2
  137. package/dist/application/transform/document/components.cjs.map +1 -1
  138. package/dist/application/transform/document/components.mjs +4 -4
  139. package/dist/application/transform/document/components.mjs.map +1 -1
  140. package/dist/application/transform/document/declared-types.cjs +66 -0
  141. package/dist/application/transform/document/declared-types.cjs.map +1 -0
  142. package/dist/application/transform/document/declared-types.mjs +63 -0
  143. package/dist/application/transform/document/declared-types.mjs.map +1 -0
  144. package/dist/application/transform/document/document.cjs +32 -9
  145. package/dist/application/transform/document/document.cjs.map +1 -1
  146. package/dist/application/transform/document/document.mjs +34 -11
  147. package/dist/application/transform/document/document.mjs.map +1 -1
  148. package/dist/application/transform/document/exploded-query.cjs +46 -0
  149. package/dist/application/transform/document/exploded-query.cjs.map +1 -0
  150. package/dist/application/transform/document/exploded-query.mjs +43 -0
  151. package/dist/application/transform/document/exploded-query.mjs.map +1 -0
  152. package/dist/application/transform/document/global-type-references.cjs +63 -0
  153. package/dist/application/transform/document/global-type-references.cjs.map +1 -0
  154. package/dist/application/transform/document/global-type-references.mjs +61 -0
  155. package/dist/application/transform/document/global-type-references.mjs.map +1 -0
  156. package/dist/application/transform/document/list-assignability.cjs +54 -0
  157. package/dist/application/transform/document/list-assignability.cjs.map +1 -0
  158. package/dist/application/transform/document/list-assignability.mjs +52 -0
  159. package/dist/application/transform/document/list-assignability.mjs.map +1 -0
  160. package/dist/application/transform/document/parameters.cjs +41 -9
  161. package/dist/application/transform/document/parameters.cjs.map +1 -1
  162. package/dist/application/transform/document/parameters.mjs +42 -10
  163. package/dist/application/transform/document/parameters.mjs.map +1 -1
  164. package/dist/application/transform/document/path-key-overlaps.cjs +83 -33
  165. package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -1
  166. package/dist/application/transform/document/path-key-overlaps.mjs +83 -33
  167. package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -1
  168. package/dist/application/transform/document/path-template-replace.cjs +48 -0
  169. package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
  170. package/dist/application/transform/document/path-template-replace.mjs +45 -0
  171. package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
  172. package/dist/application/transform/document/paths.cjs +55 -29
  173. package/dist/application/transform/document/paths.cjs.map +1 -1
  174. package/dist/application/transform/document/paths.mjs +54 -30
  175. package/dist/application/transform/document/paths.mjs.map +1 -1
  176. package/dist/application/transform/document/root-type-aliases.cjs +15 -14
  177. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  178. package/dist/application/transform/document/root-type-aliases.mjs +15 -13
  179. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  180. package/dist/application/transform/document/template-key-match.cjs +128 -0
  181. package/dist/application/transform/document/template-key-match.cjs.map +1 -0
  182. package/dist/application/transform/document/template-key-match.mjs +125 -0
  183. package/dist/application/transform/document/template-key-match.mjs.map +1 -0
  184. package/dist/application/transform/document/type-assignability.cjs +192 -0
  185. package/dist/application/transform/document/type-assignability.cjs.map +1 -0
  186. package/dist/application/transform/document/type-assignability.mjs +190 -0
  187. package/dist/application/transform/document/type-assignability.mjs.map +1 -0
  188. package/dist/application/transform/document/type-key.cjs +70 -0
  189. package/dist/application/transform/document/type-key.cjs.map +1 -0
  190. package/dist/application/transform/document/type-key.mjs +68 -0
  191. package/dist/application/transform/document/type-key.mjs.map +1 -0
  192. package/dist/application/transform/document/type-resolution.cjs +131 -0
  193. package/dist/application/transform/document/type-resolution.cjs.map +1 -0
  194. package/dist/application/transform/document/type-resolution.mjs +125 -0
  195. package/dist/application/transform/document/type-resolution.mjs.map +1 -0
  196. package/dist/application/transform/footer/document-footer.cjs +66 -4
  197. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  198. package/dist/application/transform/footer/document-footer.mjs +67 -5
  199. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  200. package/dist/application/transform/footer/enum-naming.cjs +17 -0
  201. package/dist/application/transform/footer/enum-naming.cjs.map +1 -1
  202. package/dist/application/transform/footer/enum-naming.mjs +17 -1
  203. package/dist/application/transform/footer/enum-naming.mjs.map +1 -1
  204. package/dist/application/transform/footer/enum-values-check.cjs +129 -0
  205. package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
  206. package/dist/application/transform/footer/enum-values-check.mjs +127 -0
  207. package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
  208. package/dist/application/transform/footer/evaluation.cjs +42 -0
  209. package/dist/application/transform/footer/evaluation.cjs.map +1 -0
  210. package/dist/application/transform/footer/evaluation.mjs +33 -0
  211. package/dist/application/transform/footer/evaluation.mjs.map +1 -0
  212. package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
  213. package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
  214. package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
  215. package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
  216. package/dist/application/transform/footer/type-evaluation.cjs +138 -0
  217. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
  218. package/dist/application/transform/footer/type-evaluation.mjs +136 -0
  219. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
  220. package/dist/application/transform/footer/type-indexing.cjs +107 -0
  221. package/dist/application/transform/footer/type-indexing.cjs.map +1 -0
  222. package/dist/application/transform/footer/type-indexing.mjs +105 -0
  223. package/dist/application/transform/footer/type-indexing.mjs.map +1 -0
  224. package/dist/application/transform/footer/type-rules.cjs +172 -0
  225. package/dist/application/transform/footer/type-rules.cjs.map +1 -0
  226. package/dist/application/transform/footer/type-rules.mjs +166 -0
  227. package/dist/application/transform/footer/type-rules.mjs.map +1 -0
  228. package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
  229. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
  230. package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
  231. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
  232. package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
  233. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
  234. package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
  235. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
  236. package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
  237. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
  238. package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
  239. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
  240. package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
  241. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
  242. package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
  243. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
  244. package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
  245. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
  246. package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
  247. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
  248. package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
  249. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
  250. package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
  251. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
  252. package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
  253. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
  254. package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
  255. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
  256. package/dist/application/transform/ref-type.cjs +7 -2
  257. package/dist/application/transform/ref-type.cjs.map +1 -1
  258. package/dist/application/transform/ref-type.mjs +3 -2
  259. package/dist/application/transform/ref-type.mjs.map +1 -1
  260. package/dist/application/transform/schema/access-flags.cjs +38 -0
  261. package/dist/application/transform/schema/access-flags.cjs.map +1 -0
  262. package/dist/application/transform/schema/access-flags.mjs +36 -0
  263. package/dist/application/transform/schema/access-flags.mjs.map +1 -0
  264. package/dist/application/transform/schema/array-type.cjs +32 -1
  265. package/dist/application/transform/schema/array-type.cjs.map +1 -1
  266. package/dist/application/transform/schema/array-type.mjs +33 -2
  267. package/dist/application/transform/schema/array-type.mjs.map +1 -1
  268. package/dist/application/transform/schema/composition-type.cjs +50 -15
  269. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  270. package/dist/application/transform/schema/composition-type.mjs +50 -15
  271. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  272. package/dist/application/transform/schema/core-type.cjs +3 -1
  273. package/dist/application/transform/schema/core-type.cjs.map +1 -1
  274. package/dist/application/transform/schema/core-type.mjs +3 -1
  275. package/dist/application/transform/schema/core-type.mjs.map +1 -1
  276. package/dist/application/transform/schema/discriminated-union.cjs +30 -0
  277. package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
  278. package/dist/application/transform/schema/discriminated-union.mjs +27 -0
  279. package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
  280. package/dist/application/transform/schema/discriminator-property.cjs +3 -2
  281. package/dist/application/transform/schema/discriminator-property.cjs.map +1 -1
  282. package/dist/application/transform/schema/discriminator-property.mjs +3 -2
  283. package/dist/application/transform/schema/discriminator-property.mjs.map +1 -1
  284. package/dist/application/transform/schema/enum-rule.cjs +66 -10
  285. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  286. package/dist/application/transform/schema/enum-rule.mjs +67 -12
  287. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  288. package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
  289. package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
  290. package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
  291. package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
  292. package/dist/application/transform/schema/object-type.cjs +38 -25
  293. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  294. package/dist/application/transform/schema/object-type.mjs +39 -27
  295. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  296. package/dist/application/transform/schema/required-variants.cjs +45 -0
  297. package/dist/application/transform/schema/required-variants.cjs.map +1 -0
  298. package/dist/application/transform/schema/required-variants.mjs +42 -0
  299. package/dist/application/transform/schema/required-variants.mjs.map +1 -0
  300. package/dist/application/transform/schema/schema-transform.cjs +2 -2
  301. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  302. package/dist/application/transform/schema/schema-transform.mjs +2 -2
  303. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  304. package/dist/application/transform/schema-comment.cjs +51 -5
  305. package/dist/application/transform/schema-comment.cjs.map +1 -1
  306. package/dist/application/transform/schema-comment.mjs +50 -6
  307. package/dist/application/transform/schema-comment.mjs.map +1 -1
  308. package/dist/application/transform/type-combinators.mjs +1 -1
  309. package/dist/cli/api-settings.cjs +78 -0
  310. package/dist/cli/api-settings.cjs.map +1 -0
  311. package/dist/cli/api-settings.mjs +73 -0
  312. package/dist/cli/api-settings.mjs.map +1 -0
  313. package/dist/cli/cli-arguments.cjs +12 -3
  314. package/dist/cli/cli-arguments.cjs.map +1 -1
  315. package/dist/cli/cli-arguments.mjs +12 -4
  316. package/dist/cli/cli-arguments.mjs.map +1 -1
  317. package/dist/cli/cli-errors.cjs +3 -2
  318. package/dist/cli/cli-errors.cjs.map +1 -1
  319. package/dist/cli/cli-errors.mjs +3 -2
  320. package/dist/cli/cli-errors.mjs.map +1 -1
  321. package/dist/cli/cli-output.cjs +8 -3
  322. package/dist/cli/cli-output.cjs.map +1 -1
  323. package/dist/cli/cli-output.mjs +9 -4
  324. package/dist/cli/cli-output.mjs.map +1 -1
  325. package/dist/cli/help-text.cjs +3 -3
  326. package/dist/cli/help-text.cjs.map +1 -1
  327. package/dist/cli/help-text.mjs +3 -3
  328. package/dist/cli/help-text.mjs.map +1 -1
  329. package/dist/cli/main.cjs +5 -0
  330. package/dist/cli/main.cjs.map +1 -1
  331. package/dist/cli/main.mjs +5 -0
  332. package/dist/cli/main.mjs.map +1 -1
  333. package/dist/cli/redocly-apis.cjs +15 -7
  334. package/dist/cli/redocly-apis.cjs.map +1 -1
  335. package/dist/cli/redocly-apis.mjs +15 -7
  336. package/dist/cli/redocly-apis.mjs.map +1 -1
  337. package/dist/cli/ref-limits.cjs +1 -1
  338. package/dist/cli/ref-limits.cjs.map +1 -1
  339. package/dist/cli/ref-limits.mjs +2 -2
  340. package/dist/cli/ref-limits.mjs.map +1 -1
  341. package/dist/cli/run-cli.cjs +20 -3
  342. package/dist/cli/run-cli.cjs.map +1 -1
  343. package/dist/cli/run-cli.mjs +21 -4
  344. package/dist/cli/run-cli.mjs.map +1 -1
  345. package/dist/domain/errors.cjs +6 -1
  346. package/dist/domain/errors.cjs.map +1 -1
  347. package/dist/domain/errors.mjs +6 -1
  348. package/dist/domain/errors.mjs.map +1 -1
  349. package/dist/domain/ir/constructors.cjs +7 -1
  350. package/dist/domain/ir/constructors.cjs.map +1 -1
  351. package/dist/domain/ir/constructors.mjs +6 -2
  352. package/dist/domain/ir/constructors.mjs.map +1 -1
  353. package/dist/domain/openapi/admitted-values.cjs +75 -0
  354. package/dist/domain/openapi/admitted-values.cjs.map +1 -0
  355. package/dist/domain/openapi/admitted-values.mjs +72 -0
  356. package/dist/domain/openapi/admitted-values.mjs.map +1 -0
  357. package/dist/domain/openapi/discriminated-union.cjs +68 -0
  358. package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
  359. package/dist/domain/openapi/discriminated-union.mjs +62 -0
  360. package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
  361. package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
  362. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
  363. package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
  364. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
  365. package/dist/domain/openapi/parameter-object.cjs.map +1 -1
  366. package/dist/domain/openapi/parameter-object.mjs.map +1 -1
  367. package/dist/domain/openapi/path-templates.cjs +23 -0
  368. package/dist/domain/openapi/path-templates.cjs.map +1 -0
  369. package/dist/domain/openapi/path-templates.mjs +21 -0
  370. package/dist/domain/openapi/path-templates.mjs.map +1 -0
  371. package/dist/domain/output-fixes.cjs +36 -1
  372. package/dist/domain/output-fixes.cjs.map +1 -1
  373. package/dist/domain/output-fixes.mjs +36 -1
  374. package/dist/domain/output-fixes.mjs.map +1 -1
  375. package/dist/domain/url-credentials.cjs +10 -0
  376. package/dist/domain/url-credentials.cjs.map +1 -0
  377. package/dist/domain/url-credentials.mjs +8 -0
  378. package/dist/domain/url-credentials.mjs.map +1 -0
  379. package/dist/domain/warnings.cjs +23 -0
  380. package/dist/domain/warnings.cjs.map +1 -0
  381. package/dist/domain/warnings.mjs +20 -0
  382. package/dist/domain/warnings.mjs.map +1 -0
  383. package/dist/index.cjs +2 -0
  384. package/dist/index.cjs.map +1 -1
  385. package/dist/index.d.cts +1182 -46
  386. package/dist/index.d.mts +1182 -46
  387. package/dist/index.d.ts +1182 -46
  388. package/dist/index.mjs +1 -0
  389. package/dist/index.mjs.map +1 -1
  390. package/dist/transform/components-object.cjs +2 -1
  391. package/dist/transform/components-object.cjs.map +1 -1
  392. package/dist/transform/components-object.mjs +2 -1
  393. package/dist/transform/components-object.mjs.map +1 -1
  394. package/dist/transform/path-item-object.cjs.map +1 -1
  395. package/dist/transform/path-item-object.mjs.map +1 -1
  396. package/package.json +6 -5
  397. package/src/adapters/redocly-loader/configured-headers.ts +65 -0
  398. package/src/adapters/redocly-loader/redocly-config-source.ts +41 -6
  399. package/src/adapters/redocly-loader/redocly-schema-loader.ts +44 -13
  400. package/src/adapters/redocly-loader/ref-access.ts +60 -5
  401. package/src/adapters/redocly-loader/ref-resolution-check.ts +257 -0
  402. package/src/adapters/redocly-loader/ref-resolution-steps.ts +113 -0
  403. package/src/adapters/redocly-loader/remote-fetch.ts +77 -21
  404. package/src/adapters/redocly-loader/schema-load-errors.ts +33 -11
  405. package/src/adapters/redocly-loader/unsupported-keys.ts +17 -2
  406. package/src/adapters/terminal-logger/terminal-logger.ts +9 -5
  407. package/src/adapters/type-ast-bridge/ir-to-typescript.ts +5 -1
  408. package/src/adapters/type-ast-bridge/print-typescript.ts +3 -1
  409. package/src/adapters/type-ast-bridge/typescript-to-ir.ts +26 -12
  410. package/src/adapters/type-ast-bridge/typescript-types.ts +57 -5
  411. package/src/api/default-ports.ts +16 -0
  412. package/src/api/discriminator-conflict-warnings.ts +43 -0
  413. package/src/api/discriminator-enum-names.ts +26 -0
  414. package/src/api/discriminator-enum-parent.ts +129 -0
  415. package/src/api/discriminator-enum.ts +39 -0
  416. package/src/api/discriminator-other-owners.ts +97 -0
  417. package/src/api/discriminator-patch.ts +152 -0
  418. package/src/api/discriminator-scan.ts +78 -90
  419. package/src/api/document-refs.ts +19 -15
  420. package/src/api/document-run.ts +32 -11
  421. package/src/api/enum-values-warnings.ts +21 -0
  422. package/src/api/footer-sink.ts +34 -2
  423. package/src/api/legacy-callback-warning.ts +7 -3
  424. package/src/api/legacy-ts-helpers.ts +7 -5
  425. package/src/api/legacy-utils.ts +1 -1
  426. package/src/api/openapi-ts.ts +2 -0
  427. package/src/api/path-template-warnings.ts +27 -0
  428. package/src/api/run-context.ts +34 -0
  429. package/src/api/transform-context.ts +17 -9
  430. package/src/api/transform-schema.ts +90 -5
  431. package/src/api/unsupported-feature-warnings.ts +8 -1
  432. package/src/application/ports/redocly-config-source.ts +5 -1
  433. package/src/application/print/type-printer.ts +8 -1
  434. package/src/application/transform/document/assignability.ts +203 -0
  435. package/src/application/transform/document/components.ts +6 -6
  436. package/src/application/transform/document/declared-types.ts +93 -0
  437. package/src/application/transform/document/document.ts +71 -13
  438. package/src/application/transform/document/exploded-query.ts +91 -0
  439. package/src/application/transform/document/global-type-references.ts +78 -0
  440. package/src/application/transform/document/list-assignability.ts +87 -0
  441. package/src/application/transform/document/parameters.ts +78 -12
  442. package/src/application/transform/document/path-key-overlaps.ts +148 -59
  443. package/src/application/transform/document/path-template-replace.ts +90 -0
  444. package/src/application/transform/document/paths.ts +101 -38
  445. package/src/application/transform/document/root-type-aliases.ts +29 -28
  446. package/src/application/transform/document/template-key-match.ts +183 -0
  447. package/src/application/transform/document/type-assignability.ts +268 -0
  448. package/src/application/transform/document/type-key.ts +80 -0
  449. package/src/application/transform/document/type-resolution.ts +163 -0
  450. package/src/application/transform/footer/document-footer.ts +91 -6
  451. package/src/application/transform/footer/enum-naming.ts +29 -0
  452. package/src/application/transform/footer/enum-values-check.ts +171 -0
  453. package/src/application/transform/footer/evaluation.ts +57 -0
  454. package/src/application/transform/footer/shared-enum-names.ts +86 -0
  455. package/src/application/transform/footer/type-evaluation.ts +167 -0
  456. package/src/application/transform/footer/type-indexing.ts +152 -0
  457. package/src/application/transform/footer/type-rules.ts +269 -0
  458. package/src/application/transform/ref-pointer/generated-location.ts +211 -0
  459. package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
  460. package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
  461. package/src/application/transform/ref-pointer/original-index.ts +95 -0
  462. package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
  463. package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
  464. package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
  465. package/src/application/transform/ref-type.ts +11 -6
  466. package/src/application/transform/schema/access-flags.ts +63 -0
  467. package/src/application/transform/schema/array-type.ts +66 -5
  468. package/src/application/transform/schema/composition-type.ts +96 -24
  469. package/src/application/transform/schema/core-type.ts +8 -4
  470. package/src/application/transform/schema/discriminated-union.ts +58 -0
  471. package/src/application/transform/schema/discriminator-property.ts +8 -3
  472. package/src/application/transform/schema/enum-rule.ts +136 -13
  473. package/src/application/transform/schema/inherited-discriminator.ts +54 -0
  474. package/src/application/transform/schema/object-type.ts +51 -33
  475. package/src/application/transform/schema/required-variants.ts +88 -0
  476. package/src/application/transform/schema/schema-context.ts +26 -0
  477. package/src/application/transform/schema/schema-transform.ts +2 -2
  478. package/src/application/transform/schema-comment.ts +84 -4
  479. package/src/cli/api-settings.ts +109 -0
  480. package/src/cli/cli-arguments.ts +18 -5
  481. package/src/cli/cli-dependencies.ts +5 -0
  482. package/src/cli/cli-errors.ts +4 -2
  483. package/src/cli/cli-output.ts +18 -4
  484. package/src/cli/help-text.ts +4 -4
  485. package/src/cli/main.ts +6 -0
  486. package/src/cli/redocly-apis.ts +21 -11
  487. package/src/cli/ref-limits.ts +2 -2
  488. package/src/cli/run-cli.ts +25 -4
  489. package/src/domain/errors.ts +10 -2
  490. package/src/domain/ir/constructors.ts +9 -1
  491. package/src/domain/ir/nodes.ts +11 -7
  492. package/src/domain/openapi/admitted-values.ts +113 -0
  493. package/src/domain/openapi/discriminated-union.ts +109 -0
  494. package/src/domain/openapi/discriminator-conflicts.ts +251 -0
  495. package/src/domain/openapi/parameter-object.ts +4 -0
  496. package/src/domain/openapi/path-templates.ts +32 -0
  497. package/src/domain/openapi/schema-object.ts +2 -0
  498. package/src/domain/output-fixes.ts +43 -2
  499. package/src/domain/url-credentials.ts +18 -0
  500. package/src/domain/warnings.ts +28 -0
  501. package/src/index.ts +1 -0
  502. package/src/transform/components-object.ts +3 -1
  503. package/src/transform/path-item-object.ts +6 -2
  504. package/src/types/generator-options.ts +12 -21
  505. package/src/types/openapi-common.ts +1 -0
  506. package/src/types/openapi-request.ts +3 -0
  507. package/src/types/openapi-schema.ts +2 -0
  508. package/src/types/openapi-security.ts +1 -0
  509. package/dist/application/transform/document/path-item-conflicts.cjs +0 -51
  510. package/dist/application/transform/document/path-item-conflicts.cjs.map +0 -1
  511. package/dist/application/transform/document/path-item-conflicts.mjs +0 -49
  512. package/dist/application/transform/document/path-item-conflicts.mjs.map +0 -1
  513. package/src/application/transform/document/path-item-conflicts.ts +0 -79
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ const evaluation = require('./evaluation.cjs');
4
+ const typeRules = require('./type-rules.cjs');
5
+
6
+ function indexType(types, value, index) {
7
+ const owner = types.expand(value);
8
+ if (owner.kind !== "type") {
9
+ return owner;
10
+ }
11
+ if (types.membersOf(owner).length > 1) {
12
+ return unionIndex(types, owner, index);
13
+ }
14
+ const { type } = owner;
15
+ switch (type.kind) {
16
+ case "object":
17
+ return memberType(types, owner, type.members, index);
18
+ case "intersection":
19
+ return partsIndex(types, owner, type.types, index);
20
+ case "union":
21
+ return unionIndex(types, owner, index);
22
+ case "array":
23
+ return isNumberIndex(index) ? flattened(types, owner, type.element) : builtInIndex(index);
24
+ case "keyword":
25
+ return type.keyword === "never" ? owner : builtInIndex(index);
26
+ default:
27
+ return builtInIndex(index);
28
+ }
29
+ }
30
+ function memberType(types, owner, members, index) {
31
+ const key = indexKey(index);
32
+ const property = members.find(
33
+ (member) => member.kind === "property" && key !== null && evaluation.propertyKey(member.name) === key
34
+ );
35
+ if (property !== void 0) {
36
+ return flattened(types, owner, property.type);
37
+ }
38
+ const signature = members.find((member) => member.kind === "indexSignature");
39
+ if (signature !== void 0) {
40
+ return flattened(types, owner, signature.type);
41
+ }
42
+ return key === null || isObjectBuiltIn(key) ? evaluation.OPAQUE : evaluation.MISSING;
43
+ }
44
+ function partsIndex(types, owner, parts, index) {
45
+ if (typeRules.isNeverIntersection(types, owner, parts)) {
46
+ return { ...owner, type: evaluation.NEVER };
47
+ }
48
+ const found = parts.map((type) => types.index({ ...owner, type }, index));
49
+ if (found.some((part) => part.kind === "opaque")) {
50
+ return evaluation.OPAQUE;
51
+ }
52
+ const read = parts.map((type, at) => ({ type, found: found[at] }));
53
+ const kept = typeRules.declaredFirst(types, owner, indexKey(index), read).flatMap(
54
+ (part) => part.kind === "type" ? [part.type] : []
55
+ );
56
+ return kept.length === 0 ? evaluation.MISSING : { ...owner, type: evaluation.intersectionType(kept) };
57
+ }
58
+ function unionIndex(types, owner, index) {
59
+ const found = types.membersOf(owner).map((member) => member.kind === "type" ? types.index(member, index) : member);
60
+ if (found.some((member) => member.kind === "missing")) {
61
+ return evaluation.MISSING;
62
+ }
63
+ if (found.some((member) => member.kind === "opaque")) {
64
+ return evaluation.OPAQUE;
65
+ }
66
+ return { ...owner, type: evaluation.unionType(found.map((member) => member.type)) };
67
+ }
68
+ function flattened(types, owner, type) {
69
+ const member = { ...owner, type };
70
+ if (!owner.deep) {
71
+ return types.expand(member);
72
+ }
73
+ const members = types.membersOf(member);
74
+ if (members.some((candidate) => candidate.kind !== "type")) {
75
+ return evaluation.OPAQUE;
76
+ }
77
+ const present = members.filter((candidate) => !evaluation.isNullish(candidate.type));
78
+ const elements = present.map((candidate) => arrayElement(candidate.type));
79
+ if (present.length > 0 && elements.every((element) => element !== null)) {
80
+ return types.expand({ ...owner, type: evaluation.unionType(elements) });
81
+ }
82
+ return { ...owner, type: evaluation.unionType(present.map((candidate) => candidate.type)) };
83
+ }
84
+ function arrayElement(type) {
85
+ return type.kind === "array" ? type.element : null;
86
+ }
87
+ function indexKey(index) {
88
+ if (index.kind === "stringLiteral") {
89
+ return index.value;
90
+ }
91
+ return index.kind === "numberLiteral" ? String(index.value) : null;
92
+ }
93
+ function isNumberIndex(index) {
94
+ const key = indexKey(index);
95
+ return index.kind === "keyword" && index.keyword === "number" || /^\d+$/.test(key ?? "");
96
+ }
97
+ function isObjectBuiltIn(key) {
98
+ return key in {};
99
+ }
100
+ function builtInIndex(index) {
101
+ const key = indexKey(index);
102
+ const isBuiltIn = key === null || key in String.prototype || key in Array.prototype;
103
+ return isBuiltIn || key in Number.prototype ? evaluation.OPAQUE : evaluation.MISSING;
104
+ }
105
+
106
+ exports.indexType = indexType;
107
+ //# sourceMappingURL=type-indexing.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-indexing.cjs","sources":["../../../../src/application/transform/footer/type-indexing.ts"],"sourcesContent":["import type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n MISSING,\n NEVER,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { declaredFirst, isNeverIntersection, type TypeExpansion } from \"./type-rules.js\";\n\n/**\n * Indexed access (`T[\"key\"]`, `T[number]`) on the generated types, as TypeScript reads it, for\n * the evaluator of the `--enum-values` check (ADR-027).\n */\n\n/** The part of the evaluator that indexed access uses. */\nexport interface IndexedTypes extends TypeExpansion {\n expand(value: Evaluated): Evaluation;\n index(value: Evaluated, index: IrType): Evaluation;\n}\n\n/** `value[index]` for a string literal, `string` or `number` index. */\nexport function indexType(types: IndexedTypes, value: Evaluated, index: IrType): Evaluation {\n const owner = types.expand(value);\n if (owner.kind !== \"type\") {\n return owner;\n }\n if (types.membersOf(owner).length > 1) {\n return unionIndex(types, owner, index);\n }\n const { type } = owner;\n switch (type.kind) {\n case \"object\":\n return memberType(types, owner, type.members, index);\n case \"intersection\":\n return partsIndex(types, owner, type.types, index);\n case \"union\":\n return unionIndex(types, owner, index);\n case \"array\":\n return isNumberIndex(index) ? flattened(types, owner, type.element) : builtInIndex(index);\n case \"keyword\":\n return type.keyword === \"never\" ? owner : builtInIndex(index);\n default:\n return builtInIndex(index);\n }\n}\n\nfunction memberType(\n types: IndexedTypes,\n owner: Evaluated,\n members: readonly IrMember[],\n index: IrType,\n): Evaluation {\n const key = indexKey(index);\n const property = members.find(\n (member) => member.kind === \"property\" && key !== null && propertyKey(member.name) === key,\n );\n if (property !== undefined) {\n return flattened(types, owner, property.type);\n }\n const signature = members.find((member) => member.kind === \"indexSignature\");\n if (signature !== undefined) {\n return flattened(types, owner, signature.type);\n }\n return key === null || isObjectBuiltIn(key) ? OPAQUE : MISSING;\n}\n\nfunction partsIndex(\n types: IndexedTypes,\n owner: Evaluated,\n parts: readonly IrType[],\n index: IrType,\n): Evaluation {\n if (isNeverIntersection(types, owner, parts)) {\n return { ...owner, type: NEVER };\n }\n const found = parts.map((type) => types.index({ ...owner, type }, index));\n if (found.some((part) => part.kind === \"opaque\")) {\n return OPAQUE;\n }\n const read = parts.map((type, at) => ({ type, found: found[at] as Evaluation }));\n const kept = declaredFirst(types, owner, indexKey(index), read).flatMap((part) =>\n part.kind === \"type\" ? [part.type] : [],\n );\n return kept.length === 0 ? MISSING : { ...owner, type: intersectionType(kept) };\n}\n\nfunction unionIndex(types: IndexedTypes, owner: Evaluated, index: IrType): Evaluation {\n const found = types\n .membersOf(owner)\n .map((member) => (member.kind === \"type\" ? types.index(member, index) : member));\n if (found.some((member) => member.kind === \"missing\")) {\n return MISSING;\n }\n if (found.some((member) => member.kind === \"opaque\")) {\n return OPAQUE;\n }\n return { ...owner, type: unionType((found as Evaluated[]).map((member) => member.type)) };\n}\n\n/**\n * A member read through `FlattenedDeepRequired`: a value that is only arrays (and `undefined` or\n * `null`) is replaced by its elements, anything else loses `undefined` and `null`.\n */\nfunction flattened(types: IndexedTypes, owner: Evaluated, type: IrType): Evaluation {\n const member: Evaluated = { ...owner, type };\n if (!owner.deep) {\n return types.expand(member);\n }\n const members = types.membersOf(member);\n if (members.some((candidate) => candidate.kind !== \"type\")) {\n return OPAQUE;\n }\n const present = (members as Evaluated[]).filter((candidate) => !isNullish(candidate.type));\n const elements = present.map((candidate) => arrayElement(candidate.type));\n if (present.length > 0 && elements.every((element) => element !== null)) {\n return types.expand({ ...owner, type: unionType(elements as IrType[]) });\n }\n return { ...owner, type: unionType(present.map((candidate) => candidate.type)) };\n}\n\n/** The element of an expanded member; expanding already dropped `readonly`. */\nfunction arrayElement(type: IrType): IrType | null {\n return type.kind === \"array\" ? type.element : null;\n}\n\nfunction indexKey(index: IrType): string | null {\n if (index.kind === \"stringLiteral\") {\n return index.value;\n }\n return index.kind === \"numberLiteral\" ? String(index.value) : null;\n}\n\nfunction isNumberIndex(index: IrType): boolean {\n const key = indexKey(index);\n return (index.kind === \"keyword\" && index.keyword === \"number\") || /^\\d+$/.test(key ?? \"\");\n}\n\nfunction isObjectBuiltIn(key: string): boolean {\n return key in {};\n}\n\n/** A key of a primitive or an array: a built-in member is opaque, any other key is missing. */\nfunction builtInIndex(index: IrType): Evaluation {\n const key = indexKey(index);\n const isBuiltIn = key === null || key in String.prototype || key in Array.prototype;\n return isBuiltIn || key in Number.prototype ? OPAQUE : MISSING;\n}\n"],"names":["propertyKey","OPAQUE","MISSING","isNeverIntersection","NEVER","declaredFirst","intersectionType","unionType","isNullish"],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { MISSING, OPAQUE, unionType, isNullish, NEVER, intersectionType, propertyKey } from './evaluation.mjs';
2
+ import { isNeverIntersection, declaredFirst } from './type-rules.mjs';
3
+
4
+ function indexType(types, value, index) {
5
+ const owner = types.expand(value);
6
+ if (owner.kind !== "type") {
7
+ return owner;
8
+ }
9
+ if (types.membersOf(owner).length > 1) {
10
+ return unionIndex(types, owner, index);
11
+ }
12
+ const { type } = owner;
13
+ switch (type.kind) {
14
+ case "object":
15
+ return memberType(types, owner, type.members, index);
16
+ case "intersection":
17
+ return partsIndex(types, owner, type.types, index);
18
+ case "union":
19
+ return unionIndex(types, owner, index);
20
+ case "array":
21
+ return isNumberIndex(index) ? flattened(types, owner, type.element) : builtInIndex(index);
22
+ case "keyword":
23
+ return type.keyword === "never" ? owner : builtInIndex(index);
24
+ default:
25
+ return builtInIndex(index);
26
+ }
27
+ }
28
+ function memberType(types, owner, members, index) {
29
+ const key = indexKey(index);
30
+ const property = members.find(
31
+ (member) => member.kind === "property" && key !== null && propertyKey(member.name) === key
32
+ );
33
+ if (property !== void 0) {
34
+ return flattened(types, owner, property.type);
35
+ }
36
+ const signature = members.find((member) => member.kind === "indexSignature");
37
+ if (signature !== void 0) {
38
+ return flattened(types, owner, signature.type);
39
+ }
40
+ return key === null || isObjectBuiltIn(key) ? OPAQUE : MISSING;
41
+ }
42
+ function partsIndex(types, owner, parts, index) {
43
+ if (isNeverIntersection(types, owner, parts)) {
44
+ return { ...owner, type: NEVER };
45
+ }
46
+ const found = parts.map((type) => types.index({ ...owner, type }, index));
47
+ if (found.some((part) => part.kind === "opaque")) {
48
+ return OPAQUE;
49
+ }
50
+ const read = parts.map((type, at) => ({ type, found: found[at] }));
51
+ const kept = declaredFirst(types, owner, indexKey(index), read).flatMap(
52
+ (part) => part.kind === "type" ? [part.type] : []
53
+ );
54
+ return kept.length === 0 ? MISSING : { ...owner, type: intersectionType(kept) };
55
+ }
56
+ function unionIndex(types, owner, index) {
57
+ const found = types.membersOf(owner).map((member) => member.kind === "type" ? types.index(member, index) : member);
58
+ if (found.some((member) => member.kind === "missing")) {
59
+ return MISSING;
60
+ }
61
+ if (found.some((member) => member.kind === "opaque")) {
62
+ return OPAQUE;
63
+ }
64
+ return { ...owner, type: unionType(found.map((member) => member.type)) };
65
+ }
66
+ function flattened(types, owner, type) {
67
+ const member = { ...owner, type };
68
+ if (!owner.deep) {
69
+ return types.expand(member);
70
+ }
71
+ const members = types.membersOf(member);
72
+ if (members.some((candidate) => candidate.kind !== "type")) {
73
+ return OPAQUE;
74
+ }
75
+ const present = members.filter((candidate) => !isNullish(candidate.type));
76
+ const elements = present.map((candidate) => arrayElement(candidate.type));
77
+ if (present.length > 0 && elements.every((element) => element !== null)) {
78
+ return types.expand({ ...owner, type: unionType(elements) });
79
+ }
80
+ return { ...owner, type: unionType(present.map((candidate) => candidate.type)) };
81
+ }
82
+ function arrayElement(type) {
83
+ return type.kind === "array" ? type.element : null;
84
+ }
85
+ function indexKey(index) {
86
+ if (index.kind === "stringLiteral") {
87
+ return index.value;
88
+ }
89
+ return index.kind === "numberLiteral" ? String(index.value) : null;
90
+ }
91
+ function isNumberIndex(index) {
92
+ const key = indexKey(index);
93
+ return index.kind === "keyword" && index.keyword === "number" || /^\d+$/.test(key ?? "");
94
+ }
95
+ function isObjectBuiltIn(key) {
96
+ return key in {};
97
+ }
98
+ function builtInIndex(index) {
99
+ const key = indexKey(index);
100
+ const isBuiltIn = key === null || key in String.prototype || key in Array.prototype;
101
+ return isBuiltIn || key in Number.prototype ? OPAQUE : MISSING;
102
+ }
103
+
104
+ export { indexType };
105
+ //# sourceMappingURL=type-indexing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-indexing.mjs","sources":["../../../../src/application/transform/footer/type-indexing.ts"],"sourcesContent":["import type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n type Evaluated,\n type Evaluation,\n intersectionType,\n isNullish,\n MISSING,\n NEVER,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\nimport { declaredFirst, isNeverIntersection, type TypeExpansion } from \"./type-rules.js\";\n\n/**\n * Indexed access (`T[\"key\"]`, `T[number]`) on the generated types, as TypeScript reads it, for\n * the evaluator of the `--enum-values` check (ADR-027).\n */\n\n/** The part of the evaluator that indexed access uses. */\nexport interface IndexedTypes extends TypeExpansion {\n expand(value: Evaluated): Evaluation;\n index(value: Evaluated, index: IrType): Evaluation;\n}\n\n/** `value[index]` for a string literal, `string` or `number` index. */\nexport function indexType(types: IndexedTypes, value: Evaluated, index: IrType): Evaluation {\n const owner = types.expand(value);\n if (owner.kind !== \"type\") {\n return owner;\n }\n if (types.membersOf(owner).length > 1) {\n return unionIndex(types, owner, index);\n }\n const { type } = owner;\n switch (type.kind) {\n case \"object\":\n return memberType(types, owner, type.members, index);\n case \"intersection\":\n return partsIndex(types, owner, type.types, index);\n case \"union\":\n return unionIndex(types, owner, index);\n case \"array\":\n return isNumberIndex(index) ? flattened(types, owner, type.element) : builtInIndex(index);\n case \"keyword\":\n return type.keyword === \"never\" ? owner : builtInIndex(index);\n default:\n return builtInIndex(index);\n }\n}\n\nfunction memberType(\n types: IndexedTypes,\n owner: Evaluated,\n members: readonly IrMember[],\n index: IrType,\n): Evaluation {\n const key = indexKey(index);\n const property = members.find(\n (member) => member.kind === \"property\" && key !== null && propertyKey(member.name) === key,\n );\n if (property !== undefined) {\n return flattened(types, owner, property.type);\n }\n const signature = members.find((member) => member.kind === \"indexSignature\");\n if (signature !== undefined) {\n return flattened(types, owner, signature.type);\n }\n return key === null || isObjectBuiltIn(key) ? OPAQUE : MISSING;\n}\n\nfunction partsIndex(\n types: IndexedTypes,\n owner: Evaluated,\n parts: readonly IrType[],\n index: IrType,\n): Evaluation {\n if (isNeverIntersection(types, owner, parts)) {\n return { ...owner, type: NEVER };\n }\n const found = parts.map((type) => types.index({ ...owner, type }, index));\n if (found.some((part) => part.kind === \"opaque\")) {\n return OPAQUE;\n }\n const read = parts.map((type, at) => ({ type, found: found[at] as Evaluation }));\n const kept = declaredFirst(types, owner, indexKey(index), read).flatMap((part) =>\n part.kind === \"type\" ? [part.type] : [],\n );\n return kept.length === 0 ? MISSING : { ...owner, type: intersectionType(kept) };\n}\n\nfunction unionIndex(types: IndexedTypes, owner: Evaluated, index: IrType): Evaluation {\n const found = types\n .membersOf(owner)\n .map((member) => (member.kind === \"type\" ? types.index(member, index) : member));\n if (found.some((member) => member.kind === \"missing\")) {\n return MISSING;\n }\n if (found.some((member) => member.kind === \"opaque\")) {\n return OPAQUE;\n }\n return { ...owner, type: unionType((found as Evaluated[]).map((member) => member.type)) };\n}\n\n/**\n * A member read through `FlattenedDeepRequired`: a value that is only arrays (and `undefined` or\n * `null`) is replaced by its elements, anything else loses `undefined` and `null`.\n */\nfunction flattened(types: IndexedTypes, owner: Evaluated, type: IrType): Evaluation {\n const member: Evaluated = { ...owner, type };\n if (!owner.deep) {\n return types.expand(member);\n }\n const members = types.membersOf(member);\n if (members.some((candidate) => candidate.kind !== \"type\")) {\n return OPAQUE;\n }\n const present = (members as Evaluated[]).filter((candidate) => !isNullish(candidate.type));\n const elements = present.map((candidate) => arrayElement(candidate.type));\n if (present.length > 0 && elements.every((element) => element !== null)) {\n return types.expand({ ...owner, type: unionType(elements as IrType[]) });\n }\n return { ...owner, type: unionType(present.map((candidate) => candidate.type)) };\n}\n\n/** The element of an expanded member; expanding already dropped `readonly`. */\nfunction arrayElement(type: IrType): IrType | null {\n return type.kind === \"array\" ? type.element : null;\n}\n\nfunction indexKey(index: IrType): string | null {\n if (index.kind === \"stringLiteral\") {\n return index.value;\n }\n return index.kind === \"numberLiteral\" ? String(index.value) : null;\n}\n\nfunction isNumberIndex(index: IrType): boolean {\n const key = indexKey(index);\n return (index.kind === \"keyword\" && index.keyword === \"number\") || /^\\d+$/.test(key ?? \"\");\n}\n\nfunction isObjectBuiltIn(key: string): boolean {\n return key in {};\n}\n\n/** A key of a primitive or an array: a built-in member is opaque, any other key is missing. */\nfunction builtInIndex(index: IrType): Evaluation {\n const key = indexKey(index);\n const isBuiltIn = key === null || key in String.prototype || key in Array.prototype;\n return isBuiltIn || key in Number.prototype ? OPAQUE : MISSING;\n}\n"],"names":[],"mappings":";;;AA0BO,SAAS,SAAA,CAAU,KAAA,EAAqB,KAAA,EAAkB,KAAA,EAA2B;AAC1F,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,IAAA,OAAO,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IACrD,KAAK,cAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACnD,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,IACvC,KAAK,OAAA;AACH,MAAA,OAAO,aAAA,CAAc,KAAK,CAAA,GAAI,SAAA,CAAU,KAAA,EAAO,OAAO,IAAA,CAAK,OAAO,CAAA,GAAI,YAAA,CAAa,KAAK,CAAA;AAAA,IAC1F,KAAK,SAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,KAAY,OAAA,GAAU,KAAA,GAAQ,aAAa,KAAK,CAAA;AAAA,IAC9D;AACE,MAAA,OAAO,aAAa,KAAK,CAAA;AAAA;AAE/B;AAEA,SAAS,UAAA,CACP,KAAA,EACA,KAAA,EACA,OAAA,EACA,KAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAAA,IACvB,CAAC,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,QAAQ,IAAA,IAAQ,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,KAAM;AAAA,GACzF;AACA,EAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,IAAA,OAAO,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,gBAAgB,CAAA;AAC3E,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,OAAO,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,SAAA,CAAU,IAAI,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,GAAA,KAAQ,IAAA,IAAQ,eAAA,CAAgB,GAAG,IAAI,MAAA,GAAS,OAAA;AACzD;AAEA,SAAS,UAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACA,KAAA,EACY;AACZ,EAAA,IAAI,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG;AAC5C,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EACjC;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,KAAA,CAAM,KAAA,CAAM,EAAE,GAAG,KAAA,EAAO,IAAA,EAAK,EAAG,KAAK,CAAC,CAAA;AACxE,EAAA,IAAI,MAAM,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,IAAA,KAAS,QAAQ,CAAA,EAAG;AAChD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,EAAA,MAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA,EAAgB,CAAE,CAAA;AAC/E,EAAA,MAAM,IAAA,GAAO,cAAc,KAAA,EAAO,KAAA,EAAO,SAAS,KAAK,CAAA,EAAG,IAAI,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,SACvE,IAAA,CAAK,IAAA,KAAS,SAAS,CAAC,IAAA,CAAK,IAAI,CAAA,GAAI;AAAC,GACxC;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,OAAA,GAAU,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,gBAAA,CAAiB,IAAI,CAAA,EAAE;AAChF;AAEA,SAAS,UAAA,CAAW,KAAA,EAAqB,KAAA,EAAkB,KAAA,EAA2B;AACpF,EAAA,MAAM,QAAQ,KAAA,CACX,SAAA,CAAU,KAAK,CAAA,CACf,IAAI,CAAC,MAAA,KAAY,MAAA,CAAO,IAAA,KAAS,SAAS,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAI,MAAO,CAAA;AACjF,EAAA,IAAI,MAAM,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,SAAS,CAAA,EAAG;AACrD,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,SAAA,CAAW,KAAA,CAAsB,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,IAAI,CAAC,CAAA,EAAE;AAC1F;AAMA,SAAS,SAAA,CAAU,KAAA,EAAqB,KAAA,EAAkB,IAAA,EAA0B;AAClF,EAAA,MAAM,MAAA,GAAoB,EAAE,GAAG,KAAA,EAAO,IAAA,EAAK;AAC3C,EAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,IAAA,OAAO,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA,EAC5B;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AACtC,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,cAAc,SAAA,CAAU,IAAA,KAAS,MAAM,CAAA,EAAG;AAC1D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAW,QAAwB,MAAA,CAAO,CAAC,cAAc,CAAC,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC,CAAA;AACzF,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,CAAC,cAAc,YAAA,CAAa,SAAA,CAAU,IAAI,CAAC,CAAA;AACxE,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,IAAK,QAAA,CAAS,MAAM,CAAC,OAAA,KAAY,OAAA,KAAY,IAAI,CAAA,EAAG;AACvE,IAAA,OAAO,KAAA,CAAM,OAAO,EAAE,GAAG,OAAO,IAAA,EAAM,SAAA,CAAU,QAAoB,CAAA,EAAG,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,SAAA,KAAc,SAAA,CAAU,IAAI,CAAC,CAAA,EAAE;AACjF;AAGA,SAAS,aAAa,IAAA,EAA6B;AACjD,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,IAAA;AAChD;AAEA,SAAS,SAAS,KAAA,EAA8B;AAC9C,EAAA,IAAI,KAAA,CAAM,SAAS,eAAA,EAAiB;AAClC,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAM,IAAA,KAAS,eAAA,GAAkB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,IAAA;AAChE;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,OAAQ,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,YAAY,QAAA,IAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA;AAC3F;AAEA,SAAS,gBAAgB,GAAA,EAAsB;AAC7C,EAAA,OAAO,OAAO,EAAC;AACjB;AAGA,SAAS,aAAa,KAAA,EAA2B;AAC/C,EAAA,MAAM,GAAA,GAAM,SAAS,KAAK,CAAA;AAC1B,EAAA,MAAM,YAAY,GAAA,KAAQ,IAAA,IAAQ,OAAO,MAAA,CAAO,SAAA,IAAa,OAAO,KAAA,CAAM,SAAA;AAC1E,EAAA,OAAO,SAAA,IAAa,GAAA,IAAO,MAAA,CAAO,SAAA,GAAY,MAAA,GAAS,OAAA;AACzD;;"}
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ const constructors = require('../../../domain/ir/constructors.cjs');
4
+ const propertyName = require('../../../domain/ir/property-name.cjs');
5
+ const evaluation = require('./evaluation.cjs');
6
+
7
+ function objectParts(types, value, parts) {
8
+ return parts.flatMap((part) => {
9
+ const members = types.membersOf({ ...value, type: part });
10
+ const [only] = members;
11
+ if (members.length !== 1 || only?.kind !== "type") {
12
+ return [null];
13
+ }
14
+ if (only.type.kind === "intersection") {
15
+ return objectParts(types, only, only.type.types);
16
+ }
17
+ return [only.type.kind === "object" ? only.type : null];
18
+ });
19
+ }
20
+ function unitOf(type) {
21
+ switch (type.kind) {
22
+ case "stringLiteral":
23
+ return `s:${type.value}`;
24
+ case "numberLiteral":
25
+ return `n:${type.value}`;
26
+ case "booleanLiteral":
27
+ return `b:${type.value}`;
28
+ case "keyword":
29
+ return type.keyword === "null" || type.keyword === "undefined" ? type.keyword : null;
30
+ default:
31
+ return null;
32
+ }
33
+ }
34
+ function unitsOf(types, value, type) {
35
+ const units = types.membersOf({ ...value, type }).map((member) => {
36
+ return member.kind === "type" ? unitOf(member.type) : null;
37
+ });
38
+ return units.includes(null) ? null : new Set(units);
39
+ }
40
+ function propertiesNamed(objects, key) {
41
+ return objects.flatMap((object) => {
42
+ const members = object.members;
43
+ return members.filter(
44
+ (member) => member.kind === "property" && evaluation.propertyKey(member.name) === key
45
+ );
46
+ });
47
+ }
48
+ function isNeverProperty(types, value, found) {
49
+ if (found.length < 2 || found.every((property) => property.isOptional)) {
50
+ return false;
51
+ }
52
+ const sets = found.map((property) => unitsOf(types, value, property.type));
53
+ if (sets.includes(null)) {
54
+ return false;
55
+ }
56
+ const [first, ...rest] = sets;
57
+ const shared = [...first].filter((unit) => rest.every((set) => set.has(unit)));
58
+ return shared.length === 0;
59
+ }
60
+ function isNullishObject(types, value, parts) {
61
+ const singles = parts.map((part) => {
62
+ const members = types.membersOf({ ...value, type: part });
63
+ const [only] = members;
64
+ return members.length === 1 && only?.kind === "type" ? only.type : null;
65
+ });
66
+ const isNullish = (type) => type?.kind === "keyword" && (type.keyword === "null" || type.keyword === "undefined");
67
+ return singles.some(isNullish) && singles.some((type) => type?.kind === "object");
68
+ }
69
+ function isNeverIntersection(types, value, parts) {
70
+ if (isNullishObject(types, value, parts)) {
71
+ return true;
72
+ }
73
+ const objects = objectParts(types, value, parts).filter((part) => part !== null);
74
+ if (objects.length < 2) {
75
+ return false;
76
+ }
77
+ const keys = new Set(
78
+ objects.flatMap(
79
+ (object) => object.members.flatMap(
80
+ (member) => member.kind === "property" ? [evaluation.propertyKey(member.name)] : []
81
+ )
82
+ )
83
+ );
84
+ const valueOfKeys = { ...value, deep: false };
85
+ return [...keys].some(
86
+ (key) => isNeverProperty(types, valueOfKeys, propertiesNamed(objects, key))
87
+ );
88
+ }
89
+ function isSignatureOnly(types, value, key) {
90
+ const members = types.membersOf(value);
91
+ const [only] = members;
92
+ if (key === null || members.length !== 1 || only?.kind !== "type" || only.type.kind !== "object") {
93
+ return false;
94
+ }
95
+ const { members: declared } = only.type;
96
+ const hasSignature = declared.some((member) => member.kind === "indexSignature");
97
+ return hasSignature && propertiesNamed([only.type], key).length === 0;
98
+ }
99
+ function declaredFirst(types, value, key, parts) {
100
+ const bySignature = parts.map(({ type }) => isSignatureOnly(types, { ...value, type }, key));
101
+ const isDeclared = parts.some(({ found }, at) => found.kind === "type" && !bySignature[at]);
102
+ return parts.filter((_, at) => !(isDeclared && bySignature[at])).map(({ found }) => found);
103
+ }
104
+ function hasKey(value, key) {
105
+ const { type } = value;
106
+ if (type.kind === "intersection") {
107
+ return type.types.some((part) => hasKey({ ...value, type: part }, key));
108
+ }
109
+ if (type.kind !== "object") {
110
+ return false;
111
+ }
112
+ return propertiesNamed([type], key).some((property) => value.deep || !property.isOptional);
113
+ }
114
+ function extracted(types, value, key) {
115
+ const members = types.membersOf(value);
116
+ if (members.some((member) => member.kind !== "type")) {
117
+ return evaluation.OPAQUE;
118
+ }
119
+ const kept = members.filter((member) => hasKey(member, key));
120
+ if (kept.length === 0) {
121
+ return evaluation.MISSING;
122
+ }
123
+ return { ...value, type: evaluation.unionType(kept.map((member) => member.type)) };
124
+ }
125
+ function omittedKeys(types, value, keys) {
126
+ const members = types.membersOf({ ...value, type: keys });
127
+ const names = members.map(
128
+ (member) => member.kind === "type" && member.type.kind === "stringLiteral" ? member.type.value : null
129
+ );
130
+ return names.includes(null) ? null : new Set(names);
131
+ }
132
+ function hasSharedProperty(members) {
133
+ const names = members.flatMap(
134
+ (member) => member.kind === "property" ? [evaluation.propertyKey(member.name)] : []
135
+ );
136
+ return new Set(names).size !== names.length;
137
+ }
138
+ function omitted(types, value, keys) {
139
+ const names = omittedKeys(types, value, keys);
140
+ const objects = objectParts(types, value, [value.type]);
141
+ if (names === null || objects.length === 0 || objects.includes(null)) {
142
+ return evaluation.OPAQUE;
143
+ }
144
+ const members = objects.flatMap((object) => object.members);
145
+ if (hasSharedProperty(members)) {
146
+ return evaluation.OPAQUE;
147
+ }
148
+ const signatures = members.filter((member) => member.kind === "indexSignature");
149
+ const kept = signatures.length > 0 ? signatures : members.filter(
150
+ (member) => member.kind !== "property" || !names.has(evaluation.propertyKey(member.name))
151
+ );
152
+ return { ...value, type: { kind: "object", members: kept } };
153
+ }
154
+ const READ_WRITE_MARKER_KEYS = /* @__PURE__ */ new Map([
155
+ ["$Read", "$read"],
156
+ ["$Write", "$write"]
157
+ ]);
158
+ function markerObject(name, argument) {
159
+ const key = READ_WRITE_MARKER_KEYS.get(name);
160
+ if (key === void 0) {
161
+ return null;
162
+ }
163
+ const member = constructors.irProperty(propertyName.toPropertyName(key), argument.type, { isReadonly: true });
164
+ return { ...argument, type: constructors.irObject([member]) };
165
+ }
166
+
167
+ exports.declaredFirst = declaredFirst;
168
+ exports.extracted = extracted;
169
+ exports.isNeverIntersection = isNeverIntersection;
170
+ exports.markerObject = markerObject;
171
+ exports.omitted = omitted;
172
+ //# sourceMappingURL=type-rules.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-rules.cjs","sources":["../../../../src/application/transform/footer/type-rules.ts"],"sourcesContent":["import { irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type {\n IrMember,\n IrObjectType,\n IrPropertySignature,\n IrType,\n} from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport {\n type Evaluated,\n type Evaluation,\n MISSING,\n OPAQUE,\n propertyKey,\n unionType,\n} from \"./evaluation.js\";\n\n/**\n * Rules of TypeScript about intersections, `Omit` and `Extract` that the `--enum-values` check\n * needs (ADR-027). They read the types as written, before `FlattenedDeepRequired`.\n */\n\n/** The part of the evaluator these rules use. */\nexport interface TypeExpansion {\n membersOf(value: Evaluated): readonly Evaluation[];\n}\n\n/** A unit value of a type: a literal, `null` or `undefined`. */\ntype Unit = string;\n\n/**\n * The parts an intersection is made of, nested intersections flattened: each object type, or\n * `null` for a part that is not one.\n */\nfunction objectParts(\n types: TypeExpansion,\n value: Evaluated,\n parts: readonly IrType[],\n): (IrObjectType | null)[] {\n return parts.flatMap((part) => {\n const members = types.membersOf({ ...value, type: part });\n const [only] = members;\n if (members.length !== 1 || only?.kind !== \"type\") {\n return [null];\n }\n if (only.type.kind === \"intersection\") {\n return objectParts(types, only, only.type.types);\n }\n return [only.type.kind === \"object\" ? only.type : null];\n });\n}\n\nfunction unitOf(type: IrType): Unit | null {\n switch (type.kind) {\n case \"stringLiteral\":\n return `s:${type.value}`;\n case \"numberLiteral\":\n return `n:${type.value}`;\n case \"booleanLiteral\":\n return `b:${type.value}`;\n case \"keyword\":\n return type.keyword === \"null\" || type.keyword === \"undefined\" ? type.keyword : null;\n default:\n return null;\n }\n}\n\n/** The unit values of a type made only of units, or `null` where it has other values. */\nfunction unitsOf(types: TypeExpansion, value: Evaluated, type: IrType): ReadonlySet<Unit> | null {\n const units = types.membersOf({ ...value, type }).map((member) => {\n return member.kind === \"type\" ? unitOf(member.type) : null;\n });\n return units.includes(null) ? null : new Set(units as Unit[]);\n}\n\nfunction propertiesNamed(objects: readonly IrObjectType[], key: string): IrPropertySignature[] {\n return objects.flatMap((object) => {\n const members: readonly IrMember[] = object.members;\n return members.filter(\n (member): member is IrPropertySignature =>\n member.kind === \"property\" && propertyKey(member.name) === key,\n );\n });\n}\n\n/** Whether properties of the same name share no unit value, one of them required. */\nfunction isNeverProperty(\n types: TypeExpansion,\n value: Evaluated,\n found: IrPropertySignature[],\n): boolean {\n if (found.length < 2 || found.every((property) => property.isOptional)) {\n return false;\n }\n const sets = found.map((property) => unitsOf(types, value, property.type));\n if (sets.includes(null)) {\n return false;\n }\n // At least two properties, so at least two sets.\n const [first, ...rest] = sets as [ReadonlySet<Unit>, ...ReadonlySet<Unit>[]];\n const shared = [...first].filter((unit) => rest.every((set) => set.has(unit)));\n return shared.length === 0;\n}\n\n/** Whether an intersection has `null` or `undefined` next to an object: `null & { a: 1 }`. */\nfunction isNullishObject(types: TypeExpansion, value: Evaluated, parts: readonly IrType[]) {\n const singles = parts.map((part) => {\n const members = types.membersOf({ ...value, type: part });\n const [only] = members;\n return members.length === 1 && only?.kind === \"type\" ? only.type : null;\n });\n const isNullish = (type: IrType | null) =>\n type?.kind === \"keyword\" && (type.keyword === \"null\" || type.keyword === \"undefined\");\n return singles.some(isNullish) && singles.some((type) => type?.kind === \"object\");\n}\n\n/**\n * Whether TypeScript reduces an intersection to `never`: `null` or `undefined` meets an object,\n * or objects share a property with literal types that have no value in common, one of them\n * requiring it (`{ a: \"x\" } & { a: \"y\" }`). Other properties are left alone, so the answer is\n * sure where it is yes.\n */\nexport function isNeverIntersection(\n types: TypeExpansion,\n value: Evaluated,\n parts: readonly IrType[],\n): boolean {\n if (isNullishObject(types, value, parts)) {\n return true;\n }\n const objects = objectParts(types, value, parts).filter((part) => part !== null);\n if (objects.length < 2) {\n return false;\n }\n const keys = new Set(\n objects.flatMap((object) =>\n object.members.flatMap((member) =>\n member.kind === \"property\" ? [propertyKey(member.name)] : [],\n ),\n ),\n );\n const valueOfKeys = { ...value, deep: false };\n return [...keys].some((key) =>\n isNeverProperty(types, valueOfKeys, propertiesNamed(objects, key)),\n );\n}\n\n/** Whether `key` reaches only an index signature of this object: it declares no such property. */\nfunction isSignatureOnly(types: TypeExpansion, value: Evaluated, key: string | null): boolean {\n const members = types.membersOf(value);\n const [only] = members;\n if (\n key === null ||\n members.length !== 1 ||\n only?.kind !== \"type\" ||\n only.type.kind !== \"object\"\n ) {\n return false;\n }\n const { members: declared } = only.type;\n const hasSignature = declared.some((member) => member.kind === \"indexSignature\");\n return hasSignature && propertiesNamed([only.type], key).length === 0;\n}\n\n/**\n * The parts of an intersection indexed by `index`, as TypeScript reads them: where one part\n * declares the property, the index signatures of the others do not take part\n * (`{ a: X } & { [key: string]: Y }` gives `X` for `a`).\n */\nexport function declaredFirst(\n types: TypeExpansion,\n value: Evaluated,\n key: string | null,\n parts: readonly { readonly type: IrType; readonly found: Evaluation }[],\n): Evaluation[] {\n const bySignature = parts.map(({ type }) => isSignatureOnly(types, { ...value, type }, key));\n const isDeclared = parts.some(({ found }, at) => found.kind === \"type\" && !bySignature[at]);\n return parts.filter((_, at) => !(isDeclared && bySignature[at])).map(({ found }) => found);\n}\n\n/**\n * Whether a member of `membersOf` has `key` as a property that `{ key: unknown }` accepts: written\n * and, outside `FlattenedDeepRequired`, required. An index signature does not count, as in\n * TypeScript. Such a member is expanded, parts included, so it is an object, an intersection of\n * members, or a primitive or array type, which has no such property; a type the evaluator cannot\n * read makes `membersOf` opaque instead.\n */\nfunction hasKey(value: Evaluated, key: string): boolean {\n const { type } = value;\n if (type.kind === \"intersection\") {\n return type.types.some((part) => hasKey({ ...value, type: part }, key));\n }\n if (type.kind !== \"object\") {\n return false;\n }\n return propertiesNamed([type], key).some((property) => value.deep || !property.isOptional);\n}\n\n/**\n * `Extract<T, { key: unknown }>`: the members of `T` that have `key`. When none has it the\n * result is `never`; it is `missing` here, as the location then types nothing.\n */\nexport function extracted(types: TypeExpansion, value: Evaluated, key: string): Evaluation {\n const members = types.membersOf(value);\n if (members.some((member) => member.kind !== \"type\")) {\n return OPAQUE;\n }\n const kept = (members as Evaluated[]).filter((member) => hasKey(member, key));\n if (kept.length === 0) {\n return MISSING;\n }\n return { ...value, type: unionType(kept.map((member) => member.type)) };\n}\n\nfunction omittedKeys(types: TypeExpansion, value: Evaluated, keys: IrType): Set<string> | null {\n const members = types.membersOf({ ...value, type: keys });\n const names = members.map((member) =>\n member.kind === \"type\" && member.type.kind === \"stringLiteral\" ? member.type.value : null,\n );\n return names.includes(null) ? null : new Set(names as string[]);\n}\n\n/** Whether two members name the same property: merging them would need their intersection. */\nfunction hasSharedProperty(members: readonly IrMember[]): boolean {\n const names = members.flatMap((member) =>\n member.kind === \"property\" ? [propertyKey(member.name)] : [],\n );\n return new Set(names).size !== names.length;\n}\n\n/**\n * `Omit<T, K>` for literal keys `K` over an object or an intersection of objects. A string index\n * signature makes `keyof T` all strings, so only the index signatures are left.\n */\nexport function omitted(types: TypeExpansion, value: Evaluated, keys: IrType): Evaluation {\n const names = omittedKeys(types, value, keys);\n const objects = objectParts(types, value, [value.type]);\n if (names === null || objects.length === 0 || objects.includes(null)) {\n return OPAQUE;\n }\n const members = (objects as IrObjectType[]).flatMap((object) => object.members);\n if (hasSharedProperty(members)) {\n return OPAQUE;\n }\n const signatures = members.filter((member) => member.kind === \"indexSignature\");\n const kept =\n signatures.length > 0\n ? signatures\n : members.filter(\n (member) => member.kind !== \"property\" || !names.has(propertyKey(member.name)),\n );\n return { ...value, type: { kind: \"object\", members: kept } };\n}\n\n/** The `--read-write-markers` types and their one member (`READ_WRITE_MARKER_TYPES`). */\nconst READ_WRITE_MARKER_KEYS: ReadonlyMap<string, string> = new Map([\n [\"$Read\", \"$read\"],\n [\"$Write\", \"$write\"],\n]);\n\n/** `$Read<T>` is `{ readonly $read: T }`: an object, which holds no enum value. */\nexport function markerObject(name: string, argument: Evaluated): Evaluated | null {\n const key = READ_WRITE_MARKER_KEYS.get(name);\n if (key === undefined) {\n return null;\n }\n const member = irProperty(toPropertyName(key), argument.type, { isReadonly: true });\n return { ...argument, type: irObject([member]) };\n}\n"],"names":["propertyKey","OPAQUE","MISSING","unionType","irProperty","toPropertyName","irObject"],"mappings":";;;;;;AAkCA,SAAS,WAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACyB;AACzB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACxD,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,OAAA;AACf,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,IAAA,EAAM,SAAS,MAAA,EAAQ;AACjD,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,cAAA,EAAgB;AACrC,MAAA,OAAO,WAAA,CAAY,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,CAAC,IAAA,CAAK,IAAA,CAAK,SAAS,QAAA,GAAW,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EACxD,CAAC,CAAA;AACH;AAEA,SAAS,OAAO,IAAA,EAA2B;AACzC,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AAAA,IACxB,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AAAA,IACxB,KAAK,gBAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,CAAA;AAAA,IACxB,KAAK,SAAA;AACH,MAAA,OAAO,KAAK,OAAA,KAAY,MAAA,IAAU,KAAK,OAAA,KAAY,WAAA,GAAc,KAAK,OAAA,GAAU,IAAA;AAAA,IAClF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAGA,SAAS,OAAA,CAAQ,KAAA,EAAsB,KAAA,EAAkB,IAAA,EAAwC;AAC/F,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,KAAW;AAChE,IAAA,OAAO,OAAO,IAAA,KAAS,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAAA,EACxD,CAAC,CAAA;AACD,EAAA,OAAO,MAAM,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,IAAI,IAAI,KAAe,CAAA;AAC9D;AAEA,SAAS,eAAA,CAAgB,SAAkC,GAAA,EAAoC;AAC7F,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACjC,IAAA,MAAM,UAA+B,MAAA,CAAO,OAAA;AAC5C,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACb,CAAC,WACC,MAAA,CAAO,IAAA,KAAS,cAAcA,sBAAA,CAAY,MAAA,CAAO,IAAI,CAAA,KAAM;AAAA,KAC/D;AAAA,EACF,CAAC,CAAA;AACH;AAGA,SAAS,eAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,QAAA,KAAa,QAAA,CAAS,UAAU,CAAA,EAAG;AACtE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAC,QAAA,KAAa,QAAQ,KAAA,EAAO,KAAA,EAAO,QAAA,CAAS,IAAI,CAAC,CAAA;AACzE,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,GAAG,IAAI,CAAA,GAAI,IAAA;AACzB,EAAA,MAAM,SAAS,CAAC,GAAG,KAAK,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,CAAC,GAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAC7E,EAAA,OAAO,OAAO,MAAA,KAAW,CAAA;AAC3B;AAGA,SAAS,eAAA,CAAgB,KAAA,EAAsB,KAAA,EAAkB,KAAA,EAA0B;AACzF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACxD,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,OAAA;AACf,IAAA,OAAO,QAAQ,MAAA,KAAW,CAAA,IAAK,MAAM,IAAA,KAAS,MAAA,GAAS,KAAK,IAAA,GAAO,IAAA;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,IAAA,EAAM,IAAA,KAAS,cAAc,IAAA,CAAK,OAAA,KAAY,MAAA,IAAU,IAAA,CAAK,OAAA,KAAY,WAAA,CAAA;AAC3E,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,OAAA,CAAQ,KAAK,CAAC,IAAA,KAAS,IAAA,EAAM,IAAA,KAAS,QAAQ,CAAA;AAClF;AAQO,SAAS,mBAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,EACS;AACT,EAAA,IAAI,eAAA,CAAgB,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,EAAG;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO,KAAK,EAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,IAAI,CAAA;AAC/E,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,IAAI,GAAA;AAAA,IACf,OAAA,CAAQ,OAAA;AAAA,MAAQ,CAAC,MAAA,KACf,MAAA,CAAO,OAAA,CAAQ,OAAA;AAAA,QAAQ,CAAC,MAAA,KACtB,MAAA,CAAO,IAAA,KAAS,UAAA,GAAa,CAACA,sBAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI;AAAC;AAC7D;AACF,GACF;AACA,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,KAAA,EAAO,MAAM,KAAA,EAAM;AAC5C,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,QACrB,eAAA,CAAgB,KAAA,EAAO,aAAa,eAAA,CAAgB,OAAA,EAAS,GAAG,CAAC;AAAA,GACnE;AACF;AAGA,SAAS,eAAA,CAAgB,KAAA,EAAsB,KAAA,EAAkB,GAAA,EAA6B;AAC5F,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACrC,EAAA,MAAM,CAAC,IAAI,CAAA,GAAI,OAAA;AACf,EAAA,IACE,GAAA,KAAQ,IAAA,IACR,OAAA,CAAQ,MAAA,KAAW,CAAA,IACnB,IAAA,EAAM,IAAA,KAAS,MAAA,IACf,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,QAAA,EACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,IAAA,CAAK,IAAA;AACnC,EAAA,MAAM,eAAe,QAAA,CAAS,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,gBAAgB,CAAA;AAC/E,EAAA,OAAO,YAAA,IAAgB,gBAAgB,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,GAAG,EAAE,MAAA,KAAW,CAAA;AACtE;AAOO,SAAS,aAAA,CACd,KAAA,EACA,KAAA,EACA,GAAA,EACA,KAAA,EACc;AACd,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,IAAA,EAAK,KAAM,eAAA,CAAgB,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAK,EAAG,GAAG,CAAC,CAAA;AAC3F,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,CAAC,EAAE,KAAA,EAAM,EAAG,EAAA,KAAO,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,CAAC,WAAA,CAAY,EAAE,CAAC,CAAA;AAC1F,EAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA,KAAO,EAAE,UAAA,IAAc,WAAA,CAAY,EAAE,CAAA,CAAE,EAAE,GAAA,CAAI,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAC3F;AASA,SAAS,MAAA,CAAO,OAAkB,GAAA,EAAsB;AACtD,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,IAAI,IAAA,CAAK,SAAS,cAAA,EAAgB;AAChC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,MAAA,CAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK,EAAG,GAAG,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,eAAA,CAAgB,CAAC,IAAI,CAAA,EAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,KAAa,KAAA,CAAM,IAAA,IAAQ,CAAC,SAAS,UAAU,CAAA;AAC3F;AAMO,SAAS,SAAA,CAAU,KAAA,EAAsB,KAAA,EAAkB,GAAA,EAAyB;AACzF,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACrC,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,MAAM,CAAA,EAAG;AACpD,IAAA,OAAOC,iBAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAQ,QAAwB,MAAA,CAAO,CAAC,WAAW,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC5E,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAOC,kBAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAMC,oBAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,IAAI,CAAC,CAAA,EAAE;AACxE;AAEA,SAAS,WAAA,CAAY,KAAA,EAAsB,KAAA,EAAkB,IAAA,EAAkC;AAC7F,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACxD,EAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,MAAA,KACzB,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,KAAA,GAAQ;AAAA,GACvF;AACA,EAAA,OAAO,MAAM,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,IAAI,IAAI,KAAiB,CAAA;AAChE;AAGA,SAAS,kBAAkB,OAAA,EAAuC;AAChE,EAAA,MAAM,QAAQ,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,MAAA,KAC7B,MAAA,CAAO,IAAA,KAAS,UAAA,GAAa,CAACH,sBAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,GAAI;AAAC,GAC7D;AACA,EAAA,OAAO,IAAI,GAAA,CAAI,KAAK,CAAA,CAAE,SAAS,KAAA,CAAM,MAAA;AACvC;AAMO,SAAS,OAAA,CAAQ,KAAA,EAAsB,KAAA,EAAkB,IAAA,EAA0B;AACxF,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO,IAAI,CAAA;AAC5C,EAAA,MAAM,UAAU,WAAA,CAAY,KAAA,EAAO,OAAO,CAAC,KAAA,CAAM,IAAI,CAAC,CAAA;AACtD,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAA,CAAQ,MAAA,KAAW,KAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACpE,IAAA,OAAOC,iBAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAW,OAAA,CAA2B,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA;AAC9E,EAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAC9B,IAAA,OAAOA,iBAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,gBAAgB,CAAA;AAC9E,EAAA,MAAM,IAAA,GACJ,UAAA,CAAW,MAAA,GAAS,CAAA,GAChB,aACA,OAAA,CAAQ,MAAA;AAAA,IACN,CAAC,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,UAAA,IAAc,CAAC,KAAA,CAAM,GAAA,CAAID,sBAAA,CAAY,MAAA,CAAO,IAAI,CAAC;AAAA,GAC/E;AACN,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK,EAAE;AAC7D;AAGA,MAAM,sBAAA,uBAA0D,GAAA,CAAI;AAAA,EAClE,CAAC,SAAS,OAAO,CAAA;AAAA,EACjB,CAAC,UAAU,QAAQ;AACrB,CAAC,CAAA;AAGM,SAAS,YAAA,CAAa,MAAc,QAAA,EAAuC;AAChF,EAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,GAAA,CAAI,IAAI,CAAA;AAC3C,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAASI,uBAAA,CAAWC,2BAAA,CAAe,GAAG,CAAA,EAAG,SAAS,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AAClF,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,IAAA,EAAMC,sBAAS,CAAC,MAAM,CAAC,CAAA,EAAE;AACjD;;;;;;"}
@@ -0,0 +1,166 @@
1
+ import { irProperty, irObject } from '../../../domain/ir/constructors.mjs';
2
+ import { toPropertyName } from '../../../domain/ir/property-name.mjs';
3
+ import { OPAQUE, propertyKey, MISSING, unionType } from './evaluation.mjs';
4
+
5
+ function objectParts(types, value, parts) {
6
+ return parts.flatMap((part) => {
7
+ const members = types.membersOf({ ...value, type: part });
8
+ const [only] = members;
9
+ if (members.length !== 1 || only?.kind !== "type") {
10
+ return [null];
11
+ }
12
+ if (only.type.kind === "intersection") {
13
+ return objectParts(types, only, only.type.types);
14
+ }
15
+ return [only.type.kind === "object" ? only.type : null];
16
+ });
17
+ }
18
+ function unitOf(type) {
19
+ switch (type.kind) {
20
+ case "stringLiteral":
21
+ return `s:${type.value}`;
22
+ case "numberLiteral":
23
+ return `n:${type.value}`;
24
+ case "booleanLiteral":
25
+ return `b:${type.value}`;
26
+ case "keyword":
27
+ return type.keyword === "null" || type.keyword === "undefined" ? type.keyword : null;
28
+ default:
29
+ return null;
30
+ }
31
+ }
32
+ function unitsOf(types, value, type) {
33
+ const units = types.membersOf({ ...value, type }).map((member) => {
34
+ return member.kind === "type" ? unitOf(member.type) : null;
35
+ });
36
+ return units.includes(null) ? null : new Set(units);
37
+ }
38
+ function propertiesNamed(objects, key) {
39
+ return objects.flatMap((object) => {
40
+ const members = object.members;
41
+ return members.filter(
42
+ (member) => member.kind === "property" && propertyKey(member.name) === key
43
+ );
44
+ });
45
+ }
46
+ function isNeverProperty(types, value, found) {
47
+ if (found.length < 2 || found.every((property) => property.isOptional)) {
48
+ return false;
49
+ }
50
+ const sets = found.map((property) => unitsOf(types, value, property.type));
51
+ if (sets.includes(null)) {
52
+ return false;
53
+ }
54
+ const [first, ...rest] = sets;
55
+ const shared = [...first].filter((unit) => rest.every((set) => set.has(unit)));
56
+ return shared.length === 0;
57
+ }
58
+ function isNullishObject(types, value, parts) {
59
+ const singles = parts.map((part) => {
60
+ const members = types.membersOf({ ...value, type: part });
61
+ const [only] = members;
62
+ return members.length === 1 && only?.kind === "type" ? only.type : null;
63
+ });
64
+ const isNullish = (type) => type?.kind === "keyword" && (type.keyword === "null" || type.keyword === "undefined");
65
+ return singles.some(isNullish) && singles.some((type) => type?.kind === "object");
66
+ }
67
+ function isNeverIntersection(types, value, parts) {
68
+ if (isNullishObject(types, value, parts)) {
69
+ return true;
70
+ }
71
+ const objects = objectParts(types, value, parts).filter((part) => part !== null);
72
+ if (objects.length < 2) {
73
+ return false;
74
+ }
75
+ const keys = new Set(
76
+ objects.flatMap(
77
+ (object) => object.members.flatMap(
78
+ (member) => member.kind === "property" ? [propertyKey(member.name)] : []
79
+ )
80
+ )
81
+ );
82
+ const valueOfKeys = { ...value, deep: false };
83
+ return [...keys].some(
84
+ (key) => isNeverProperty(types, valueOfKeys, propertiesNamed(objects, key))
85
+ );
86
+ }
87
+ function isSignatureOnly(types, value, key) {
88
+ const members = types.membersOf(value);
89
+ const [only] = members;
90
+ if (key === null || members.length !== 1 || only?.kind !== "type" || only.type.kind !== "object") {
91
+ return false;
92
+ }
93
+ const { members: declared } = only.type;
94
+ const hasSignature = declared.some((member) => member.kind === "indexSignature");
95
+ return hasSignature && propertiesNamed([only.type], key).length === 0;
96
+ }
97
+ function declaredFirst(types, value, key, parts) {
98
+ const bySignature = parts.map(({ type }) => isSignatureOnly(types, { ...value, type }, key));
99
+ const isDeclared = parts.some(({ found }, at) => found.kind === "type" && !bySignature[at]);
100
+ return parts.filter((_, at) => !(isDeclared && bySignature[at])).map(({ found }) => found);
101
+ }
102
+ function hasKey(value, key) {
103
+ const { type } = value;
104
+ if (type.kind === "intersection") {
105
+ return type.types.some((part) => hasKey({ ...value, type: part }, key));
106
+ }
107
+ if (type.kind !== "object") {
108
+ return false;
109
+ }
110
+ return propertiesNamed([type], key).some((property) => value.deep || !property.isOptional);
111
+ }
112
+ function extracted(types, value, key) {
113
+ const members = types.membersOf(value);
114
+ if (members.some((member) => member.kind !== "type")) {
115
+ return OPAQUE;
116
+ }
117
+ const kept = members.filter((member) => hasKey(member, key));
118
+ if (kept.length === 0) {
119
+ return MISSING;
120
+ }
121
+ return { ...value, type: unionType(kept.map((member) => member.type)) };
122
+ }
123
+ function omittedKeys(types, value, keys) {
124
+ const members = types.membersOf({ ...value, type: keys });
125
+ const names = members.map(
126
+ (member) => member.kind === "type" && member.type.kind === "stringLiteral" ? member.type.value : null
127
+ );
128
+ return names.includes(null) ? null : new Set(names);
129
+ }
130
+ function hasSharedProperty(members) {
131
+ const names = members.flatMap(
132
+ (member) => member.kind === "property" ? [propertyKey(member.name)] : []
133
+ );
134
+ return new Set(names).size !== names.length;
135
+ }
136
+ function omitted(types, value, keys) {
137
+ const names = omittedKeys(types, value, keys);
138
+ const objects = objectParts(types, value, [value.type]);
139
+ if (names === null || objects.length === 0 || objects.includes(null)) {
140
+ return OPAQUE;
141
+ }
142
+ const members = objects.flatMap((object) => object.members);
143
+ if (hasSharedProperty(members)) {
144
+ return OPAQUE;
145
+ }
146
+ const signatures = members.filter((member) => member.kind === "indexSignature");
147
+ const kept = signatures.length > 0 ? signatures : members.filter(
148
+ (member) => member.kind !== "property" || !names.has(propertyKey(member.name))
149
+ );
150
+ return { ...value, type: { kind: "object", members: kept } };
151
+ }
152
+ const READ_WRITE_MARKER_KEYS = /* @__PURE__ */ new Map([
153
+ ["$Read", "$read"],
154
+ ["$Write", "$write"]
155
+ ]);
156
+ function markerObject(name, argument) {
157
+ const key = READ_WRITE_MARKER_KEYS.get(name);
158
+ if (key === void 0) {
159
+ return null;
160
+ }
161
+ const member = irProperty(toPropertyName(key), argument.type, { isReadonly: true });
162
+ return { ...argument, type: irObject([member]) };
163
+ }
164
+
165
+ export { declaredFirst, extracted, isNeverIntersection, markerObject, omitted };
166
+ //# sourceMappingURL=type-rules.mjs.map