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

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 (596) hide show
  1. package/CHANGELOG.md +1972 -0
  2. package/dist/adapters/node-file-system/file-claims.cjs +105 -0
  3. package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
  4. package/dist/adapters/node-file-system/file-claims.mjs +95 -0
  5. package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
  6. package/dist/adapters/node-file-system/file-identity.cjs +82 -0
  7. package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
  8. package/dist/adapters/node-file-system/file-identity.mjs +74 -0
  9. package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
  10. package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
  11. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  12. package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
  13. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  14. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  15. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  16. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  17. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +48 -0
  19. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
  21. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
  23. package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
  24. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
  25. package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
  26. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  27. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  29. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
  31. package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
  32. package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
  33. package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
  34. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  35. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  36. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  37. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  38. package/dist/adapters/redocly-loader/query-named-components.cjs +137 -0
  39. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  40. package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
  41. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  42. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
  43. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
  45. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
  47. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
  49. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  51. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/ref-holders.mjs +53 -12
  53. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
  55. package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
  56. package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
  57. package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
  58. package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
  59. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  60. package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
  61. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  62. package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
  63. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
  64. package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
  65. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
  66. package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
  67. package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
  68. package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
  69. package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
  70. package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
  71. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  72. package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
  73. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  74. package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
  75. package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
  76. package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
  77. package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
  78. package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
  79. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  80. package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
  81. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  82. package/dist/api/default-ports.cjs +14 -2
  83. package/dist/api/default-ports.cjs.map +1 -1
  84. package/dist/api/default-ports.mjs +14 -2
  85. package/dist/api/default-ports.mjs.map +1 -1
  86. package/dist/api/discriminator-enum-parent.cjs +2 -2
  87. package/dist/api/discriminator-enum-parent.cjs.map +1 -1
  88. package/dist/api/discriminator-enum-parent.mjs +3 -3
  89. package/dist/api/discriminator-enum-parent.mjs.map +1 -1
  90. package/dist/api/discriminator-other-owners.cjs +5 -3
  91. package/dist/api/discriminator-other-owners.cjs.map +1 -1
  92. package/dist/api/discriminator-other-owners.mjs +5 -3
  93. package/dist/api/discriminator-other-owners.mjs.map +1 -1
  94. package/dist/api/discriminator-patch.cjs +5 -1
  95. package/dist/api/discriminator-patch.cjs.map +1 -1
  96. package/dist/api/discriminator-patch.mjs +5 -1
  97. package/dist/api/discriminator-patch.mjs.map +1 -1
  98. package/dist/api/discriminator-scan.cjs +15 -8
  99. package/dist/api/discriminator-scan.cjs.map +1 -1
  100. package/dist/api/discriminator-scan.mjs +15 -8
  101. package/dist/api/discriminator-scan.mjs.map +1 -1
  102. package/dist/api/document-refs.cjs +16 -1
  103. package/dist/api/document-refs.cjs.map +1 -1
  104. package/dist/api/document-refs.mjs +16 -1
  105. package/dist/api/document-refs.mjs.map +1 -1
  106. package/dist/api/document-run.cjs +6 -12
  107. package/dist/api/document-run.cjs.map +1 -1
  108. package/dist/api/document-run.mjs +6 -12
  109. package/dist/api/document-run.mjs.map +1 -1
  110. package/dist/api/legacy-utils.cjs.map +1 -1
  111. package/dist/api/legacy-utils.mjs.map +1 -1
  112. package/dist/api/openapi-ts.cjs +9 -6
  113. package/dist/api/openapi-ts.cjs.map +1 -1
  114. package/dist/api/openapi-ts.mjs +10 -8
  115. package/dist/api/openapi-ts.mjs.map +1 -1
  116. package/dist/api/ref-limit-options.cjs +63 -0
  117. package/dist/api/ref-limit-options.cjs.map +1 -0
  118. package/dist/api/ref-limit-options.mjs +57 -0
  119. package/dist/api/ref-limit-options.mjs.map +1 -0
  120. package/dist/api/schema-callbacks.cjs +36 -12
  121. package/dist/api/schema-callbacks.cjs.map +1 -1
  122. package/dist/api/schema-callbacks.mjs +36 -12
  123. package/dist/api/schema-callbacks.mjs.map +1 -1
  124. package/dist/api/transform-context.cjs +7 -3
  125. package/dist/api/transform-context.cjs.map +1 -1
  126. package/dist/api/transform-context.mjs +7 -3
  127. package/dist/api/transform-context.mjs.map +1 -1
  128. package/dist/api/transform-schema.cjs +47 -10
  129. package/dist/api/transform-schema.cjs.map +1 -1
  130. package/dist/api/transform-schema.mjs +48 -11
  131. package/dist/api/transform-schema.mjs.map +1 -1
  132. package/dist/application/print/text-writer.cjs +10 -3
  133. package/dist/application/print/text-writer.cjs.map +1 -1
  134. package/dist/application/print/text-writer.mjs +10 -3
  135. package/dist/application/print/text-writer.mjs.map +1 -1
  136. package/dist/application/stack-overflow.cjs +2 -1
  137. package/dist/application/stack-overflow.cjs.map +1 -1
  138. package/dist/application/stack-overflow.mjs +2 -1
  139. package/dist/application/stack-overflow.mjs.map +1 -1
  140. package/dist/application/transform/declared-value-types.cjs +36 -0
  141. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  142. package/dist/application/transform/declared-value-types.mjs +34 -0
  143. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  144. package/dist/application/transform/document/components.cjs +1 -1
  145. package/dist/application/transform/document/components.cjs.map +1 -1
  146. package/dist/application/transform/document/components.mjs +2 -2
  147. package/dist/application/transform/document/components.mjs.map +1 -1
  148. package/dist/application/transform/document/declared-type-names.cjs +23 -0
  149. package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
  150. package/dist/application/transform/document/declared-type-names.mjs +20 -0
  151. package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
  152. package/dist/application/transform/document/defs-root.cjs +1 -1
  153. package/dist/application/transform/document/defs-root.cjs.map +1 -1
  154. package/dist/application/transform/document/defs-root.mjs +2 -2
  155. package/dist/application/transform/document/defs-root.mjs.map +1 -1
  156. package/dist/application/transform/document/document.cjs +7 -2
  157. package/dist/application/transform/document/document.cjs.map +1 -1
  158. package/dist/application/transform/document/document.mjs +6 -3
  159. package/dist/application/transform/document/document.mjs.map +1 -1
  160. package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
  161. package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
  162. package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
  163. package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
  164. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  165. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  166. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  167. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  168. package/dist/application/transform/document/global-type-references.cjs +1 -0
  169. package/dist/application/transform/document/global-type-references.cjs.map +1 -1
  170. package/dist/application/transform/document/global-type-references.mjs +1 -1
  171. package/dist/application/transform/document/global-type-references.mjs.map +1 -1
  172. package/dist/application/transform/document/header.cjs +11 -3
  173. package/dist/application/transform/document/header.cjs.map +1 -1
  174. package/dist/application/transform/document/header.mjs +10 -2
  175. package/dist/application/transform/document/header.mjs.map +1 -1
  176. package/dist/application/transform/document/media-type.cjs +2 -2
  177. package/dist/application/transform/document/media-type.cjs.map +1 -1
  178. package/dist/application/transform/document/media-type.mjs +3 -3
  179. package/dist/application/transform/document/media-type.mjs.map +1 -1
  180. package/dist/application/transform/document/operation-keys-written.cjs +26 -0
  181. package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
  182. package/dist/application/transform/document/operation-keys-written.mjs +24 -0
  183. package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
  184. package/dist/application/transform/document/operation.cjs +1 -1
  185. package/dist/application/transform/document/operation.cjs.map +1 -1
  186. package/dist/application/transform/document/operation.mjs +2 -2
  187. package/dist/application/transform/document/operation.mjs.map +1 -1
  188. package/dist/application/transform/document/parameter-entries.cjs +34 -0
  189. package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
  190. package/dist/application/transform/document/parameter-entries.mjs +30 -0
  191. package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
  192. package/dist/application/transform/document/parameter.cjs +12 -4
  193. package/dist/application/transform/document/parameter.cjs.map +1 -1
  194. package/dist/application/transform/document/parameter.mjs +13 -5
  195. package/dist/application/transform/document/parameter.mjs.map +1 -1
  196. package/dist/application/transform/document/parameters.cjs +29 -34
  197. package/dist/application/transform/document/parameters.cjs.map +1 -1
  198. package/dist/application/transform/document/parameters.mjs +29 -34
  199. package/dist/application/transform/document/parameters.mjs.map +1 -1
  200. package/dist/application/transform/document/path-item.cjs +15 -17
  201. package/dist/application/transform/document/path-item.cjs.map +1 -1
  202. package/dist/application/transform/document/path-item.mjs +15 -19
  203. package/dist/application/transform/document/path-item.mjs.map +1 -1
  204. package/dist/application/transform/document/path-template-key.cjs +84 -0
  205. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  206. package/dist/application/transform/document/path-template-key.mjs +79 -0
  207. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  208. package/dist/application/transform/document/path-template-refs.cjs +70 -0
  209. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  210. package/dist/application/transform/document/path-template-refs.mjs +67 -0
  211. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  212. package/dist/application/transform/document/paths-enum.cjs +8 -6
  213. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  214. package/dist/application/transform/document/paths-enum.mjs +8 -7
  215. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  216. package/dist/application/transform/document/paths.cjs +43 -67
  217. package/dist/application/transform/document/paths.cjs.map +1 -1
  218. package/dist/application/transform/document/paths.mjs +42 -68
  219. package/dist/application/transform/document/paths.mjs.map +1 -1
  220. package/dist/application/transform/document/referenced-parameter.cjs +80 -0
  221. package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
  222. package/dist/application/transform/document/referenced-parameter.mjs +78 -0
  223. package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
  224. package/dist/application/transform/document/request-body.cjs +1 -1
  225. package/dist/application/transform/document/request-body.cjs.map +1 -1
  226. package/dist/application/transform/document/request-body.mjs +2 -2
  227. package/dist/application/transform/document/request-body.mjs.map +1 -1
  228. package/dist/application/transform/document/response.cjs +2 -2
  229. package/dist/application/transform/document/response.cjs.map +1 -1
  230. package/dist/application/transform/document/response.mjs +3 -3
  231. package/dist/application/transform/document/response.mjs.map +1 -1
  232. package/dist/application/transform/document/responses.cjs +1 -1
  233. package/dist/application/transform/document/responses.cjs.map +1 -1
  234. package/dist/application/transform/document/responses.mjs +2 -2
  235. package/dist/application/transform/document/responses.mjs.map +1 -1
  236. package/dist/application/transform/document/root-type-aliases.cjs +8 -23
  237. package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
  238. package/dist/application/transform/document/root-type-aliases.mjs +8 -24
  239. package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
  240. package/dist/application/transform/document/type-resolution.cjs +3 -1
  241. package/dist/application/transform/document/type-resolution.cjs.map +1 -1
  242. package/dist/application/transform/document/type-resolution.mjs +3 -1
  243. package/dist/application/transform/document/type-resolution.mjs.map +1 -1
  244. package/dist/application/transform/document/webhooks.cjs +10 -3
  245. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  246. package/dist/application/transform/document/webhooks.mjs +10 -3
  247. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  248. package/dist/application/transform/footer/document-footer.cjs +16 -5
  249. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  250. package/dist/application/transform/footer/document-footer.mjs +16 -5
  251. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  252. package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
  253. package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
  254. package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
  255. package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
  256. package/dist/application/transform/footer/operation-keys.cjs +23 -0
  257. package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
  258. package/dist/application/transform/footer/operation-keys.mjs +21 -0
  259. package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
  260. package/dist/application/transform/footer/type-evaluation.cjs +4 -4
  261. package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
  262. package/dist/application/transform/footer/type-evaluation.mjs +4 -4
  263. package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
  264. package/dist/application/transform/helper-types.cjs +3 -3
  265. package/dist/application/transform/helper-types.cjs.map +1 -1
  266. package/dist/application/transform/helper-types.mjs +3 -3
  267. package/dist/application/transform/helper-types.mjs.map +1 -1
  268. package/dist/application/transform/numbered-names.cjs +9 -0
  269. package/dist/application/transform/numbered-names.cjs.map +1 -1
  270. package/dist/application/transform/numbered-names.mjs +9 -1
  271. package/dist/application/transform/numbered-names.mjs.map +1 -1
  272. package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
  273. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  274. package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
  275. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  276. package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
  277. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  278. package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
  279. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  280. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  281. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  282. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  283. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  284. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  285. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  286. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  287. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  288. package/dist/application/transform/ref-pointer/original-index.cjs +68 -13
  289. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  290. package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
  291. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  292. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  293. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  294. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  295. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  296. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  297. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  298. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  299. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  300. package/dist/application/transform/ref-pointer/property-shape.cjs +52 -0
  301. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  302. package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
  303. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  304. package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
  305. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  306. package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
  307. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  308. package/dist/application/transform/ref-type.cjs +2 -1
  309. package/dist/application/transform/ref-type.cjs.map +1 -1
  310. package/dist/application/transform/ref-type.mjs +2 -1
  311. package/dist/application/transform/ref-type.mjs.map +1 -1
  312. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  313. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  314. package/dist/application/transform/schema/composition-type.cjs +1 -1
  315. package/dist/application/transform/schema/composition-type.cjs.map +1 -1
  316. package/dist/application/transform/schema/composition-type.mjs +2 -2
  317. package/dist/application/transform/schema/composition-type.mjs.map +1 -1
  318. package/dist/application/transform/schema/enum-rule.cjs +1 -1
  319. package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
  320. package/dist/application/transform/schema/enum-rule.mjs +2 -2
  321. package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
  322. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  323. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  324. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  325. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  326. package/dist/application/transform/schema/input-location.cjs +23 -0
  327. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  328. package/dist/application/transform/schema/input-location.mjs +21 -0
  329. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  330. package/dist/application/transform/schema/object-type.cjs +18 -8
  331. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  332. package/dist/application/transform/schema/object-type.mjs +19 -9
  333. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  334. package/dist/application/transform/schema/ref-siblings.cjs +47 -0
  335. package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
  336. package/dist/application/transform/schema/ref-siblings.mjs +45 -0
  337. package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
  338. package/dist/application/transform/schema/schema-transform.cjs +6 -3
  339. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  340. package/dist/application/transform/schema/schema-transform.mjs +6 -3
  341. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  342. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  343. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  344. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  345. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  346. package/dist/application/transform/schema-comment.cjs +5 -1
  347. package/dist/application/transform/schema-comment.cjs.map +1 -1
  348. package/dist/application/transform/schema-comment.mjs +5 -1
  349. package/dist/application/transform/schema-comment.mjs.map +1 -1
  350. package/dist/cli/api-logger.cjs +13 -0
  351. package/dist/cli/api-logger.cjs.map +1 -0
  352. package/dist/cli/api-logger.mjs +11 -0
  353. package/dist/cli/api-logger.mjs.map +1 -0
  354. package/dist/cli/api-settings.cjs +57 -9
  355. package/dist/cli/api-settings.cjs.map +1 -1
  356. package/dist/cli/api-settings.mjs +56 -11
  357. package/dist/cli/api-settings.mjs.map +1 -1
  358. package/dist/cli/api-writes.cjs +72 -0
  359. package/dist/cli/api-writes.cjs.map +1 -0
  360. package/dist/cli/api-writes.mjs +69 -0
  361. package/dist/cli/api-writes.mjs.map +1 -0
  362. package/dist/cli/cli-arguments.cjs +51 -11
  363. package/dist/cli/cli-arguments.cjs.map +1 -1
  364. package/dist/cli/cli-arguments.mjs +51 -11
  365. package/dist/cli/cli-arguments.mjs.map +1 -1
  366. package/dist/cli/cli-errors.cjs +29 -1
  367. package/dist/cli/cli-errors.cjs.map +1 -1
  368. package/dist/cli/cli-errors.mjs +29 -2
  369. package/dist/cli/cli-errors.mjs.map +1 -1
  370. package/dist/cli/cli-output.cjs +111 -4
  371. package/dist/cli/cli-output.cjs.map +1 -1
  372. package/dist/cli/cli-output.mjs +104 -5
  373. package/dist/cli/cli-output.mjs.map +1 -1
  374. package/dist/cli/main.cjs +13 -3
  375. package/dist/cli/main.cjs.map +1 -1
  376. package/dist/cli/main.mjs +14 -4
  377. package/dist/cli/main.mjs.map +1 -1
  378. package/dist/cli/redocly-apis.cjs +94 -37
  379. package/dist/cli/redocly-apis.cjs.map +1 -1
  380. package/dist/cli/redocly-apis.mjs +99 -42
  381. package/dist/cli/redocly-apis.mjs.map +1 -1
  382. package/dist/cli/ref-limits.cjs +15 -1
  383. package/dist/cli/ref-limits.cjs.map +1 -1
  384. package/dist/cli/ref-limits.mjs +15 -2
  385. package/dist/cli/ref-limits.mjs.map +1 -1
  386. package/dist/cli/run-cli.cjs +37 -14
  387. package/dist/cli/run-cli.cjs.map +1 -1
  388. package/dist/cli/run-cli.mjs +39 -16
  389. package/dist/cli/run-cli.mjs.map +1 -1
  390. package/dist/domain/append-all.cjs +10 -0
  391. package/dist/domain/append-all.cjs.map +1 -0
  392. package/dist/domain/append-all.mjs +8 -0
  393. package/dist/domain/append-all.mjs.map +1 -0
  394. package/dist/domain/cause-secrets.cjs +52 -0
  395. package/dist/domain/cause-secrets.cjs.map +1 -0
  396. package/dist/domain/cause-secrets.mjs +50 -0
  397. package/dist/domain/cause-secrets.mjs.map +1 -0
  398. package/dist/domain/errors.cjs +11 -3
  399. package/dist/domain/errors.cjs.map +1 -1
  400. package/dist/domain/errors.mjs +11 -3
  401. package/dist/domain/errors.mjs.map +1 -1
  402. package/dist/domain/ir/identifier-text.cjs.map +1 -1
  403. package/dist/domain/ir/identifier-text.mjs +1 -1
  404. package/dist/domain/ir/identifier-text.mjs.map +1 -1
  405. package/dist/domain/ir/ir-shape.cjs +187 -0
  406. package/dist/domain/ir/ir-shape.cjs.map +1 -0
  407. package/dist/domain/ir/ir-shape.mjs +184 -0
  408. package/dist/domain/ir/ir-shape.mjs.map +1 -0
  409. package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
  410. package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
  411. package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
  412. package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
  413. package/dist/domain/location-text.cjs +9 -0
  414. package/dist/domain/location-text.cjs.map +1 -0
  415. package/dist/domain/location-text.mjs +7 -0
  416. package/dist/domain/location-text.mjs.map +1 -0
  417. package/dist/domain/openapi/alias-expansion.cjs +3 -1
  418. package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
  419. package/dist/domain/openapi/alias-expansion.mjs +3 -1
  420. package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
  421. package/dist/domain/openapi/discriminated-union.cjs +3 -3
  422. package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
  423. package/dist/domain/openapi/discriminated-union.mjs +4 -4
  424. package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
  425. package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
  426. package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
  427. package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
  428. package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
  429. package/dist/domain/openapi/document-places.cjs +55 -0
  430. package/dist/domain/openapi/document-places.cjs.map +1 -0
  431. package/dist/domain/openapi/document-places.mjs +53 -0
  432. package/dist/domain/openapi/document-places.mjs.map +1 -0
  433. package/dist/domain/openapi/json-pointer.cjs +43 -1
  434. package/dist/domain/openapi/json-pointer.cjs.map +1 -1
  435. package/dist/domain/openapi/json-pointer.mjs +40 -2
  436. package/dist/domain/openapi/json-pointer.mjs.map +1 -1
  437. package/dist/domain/openapi/schema-dialect.cjs +15 -0
  438. package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
  439. package/dist/domain/openapi/schema-dialect.mjs +12 -0
  440. package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
  441. package/dist/domain/openapi/unsupported-features.cjs +1 -1
  442. package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
  443. package/dist/domain/openapi/unsupported-features.mjs +2 -2
  444. package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
  445. package/dist/domain/output-fixes.cjs +20 -0
  446. package/dist/domain/output-fixes.cjs.map +1 -1
  447. package/dist/domain/output-fixes.mjs +20 -0
  448. package/dist/domain/output-fixes.mjs.map +1 -1
  449. package/dist/domain/terminal-text.cjs +31 -0
  450. package/dist/domain/terminal-text.cjs.map +1 -0
  451. package/dist/domain/terminal-text.mjs +29 -0
  452. package/dist/domain/terminal-text.mjs.map +1 -0
  453. package/dist/domain/url-secrets.cjs +48 -0
  454. package/dist/domain/url-secrets.cjs.map +1 -0
  455. package/dist/domain/url-secrets.mjs +45 -0
  456. package/dist/domain/url-secrets.mjs.map +1 -0
  457. package/dist/domain/warnings.cjs +1 -0
  458. package/dist/domain/warnings.cjs.map +1 -1
  459. package/dist/domain/warnings.mjs +1 -0
  460. package/dist/domain/warnings.mjs.map +1 -1
  461. package/dist/index.d.cts +46 -20
  462. package/dist/index.d.mts +46 -20
  463. package/dist/index.d.ts +46 -20
  464. package/package.json +4 -5
  465. package/src/adapters/node-file-system/file-claims.ts +138 -0
  466. package/src/adapters/node-file-system/file-identity.ts +137 -0
  467. package/src/adapters/node-file-system/node-file-system.ts +158 -18
  468. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  469. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
  470. package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
  471. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  472. package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
  473. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  474. package/src/adapters/redocly-loader/query-named-components.ts +201 -0
  475. package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
  476. package/src/adapters/redocly-loader/ref-access.ts +51 -4
  477. package/src/adapters/redocly-loader/ref-holders.ts +76 -15
  478. package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
  479. package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
  480. package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
  481. package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
  482. package/src/adapters/redocly-loader/schema-source.ts +35 -11
  483. package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
  484. package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
  485. package/src/api/default-ports.ts +33 -4
  486. package/src/api/discriminator-enum-parent.ts +3 -3
  487. package/src/api/discriminator-other-owners.ts +5 -3
  488. package/src/api/discriminator-patch.ts +5 -1
  489. package/src/api/discriminator-scan.ts +16 -8
  490. package/src/api/document-refs.ts +29 -1
  491. package/src/api/document-run.ts +10 -19
  492. package/src/api/legacy-utils.ts +5 -1
  493. package/src/api/openapi-ts.ts +26 -8
  494. package/src/api/ref-limit-options.ts +76 -0
  495. package/src/api/run-context.ts +3 -0
  496. package/src/api/schema-callbacks.ts +60 -17
  497. package/src/api/transform-context.ts +7 -3
  498. package/src/api/transform-schema.ts +79 -12
  499. package/src/application/ports/file-system.ts +47 -0
  500. package/src/application/ports/schema-loader.ts +11 -1
  501. package/src/application/print/text-writer.ts +10 -3
  502. package/src/application/stack-overflow.ts +9 -5
  503. package/src/application/transform/declared-value-types.ts +42 -0
  504. package/src/application/transform/document/components.ts +2 -2
  505. package/src/application/transform/document/declared-type-names.ts +36 -0
  506. package/src/application/transform/document/defs-root.ts +2 -2
  507. package/src/application/transform/document/document.ts +8 -5
  508. package/src/application/transform/document/enum-names-given-back.ts +91 -0
  509. package/src/application/transform/document/exploded-query-values.ts +88 -0
  510. package/src/application/transform/document/global-type-references.ts +1 -1
  511. package/src/application/transform/document/header.ts +25 -5
  512. package/src/application/transform/document/media-type.ts +4 -3
  513. package/src/application/transform/document/operation-keys-written.ts +27 -0
  514. package/src/application/transform/document/operation.ts +2 -2
  515. package/src/application/transform/document/parameter-entries.ts +70 -0
  516. package/src/application/transform/document/parameter.ts +21 -9
  517. package/src/application/transform/document/parameters.ts +56 -66
  518. package/src/application/transform/document/path-item.ts +16 -34
  519. package/src/application/transform/document/path-template-key.ts +152 -0
  520. package/src/application/transform/document/path-template-refs.ts +106 -0
  521. package/src/application/transform/document/paths-enum.ts +24 -10
  522. package/src/application/transform/document/paths.ts +59 -125
  523. package/src/application/transform/document/referenced-parameter.ts +146 -0
  524. package/src/application/transform/document/request-body.ts +2 -2
  525. package/src/application/transform/document/response.ts +3 -3
  526. package/src/application/transform/document/responses.ts +2 -2
  527. package/src/application/transform/document/root-type-aliases.ts +17 -38
  528. package/src/application/transform/document/type-resolution.ts +2 -1
  529. package/src/application/transform/document/webhooks.ts +19 -6
  530. package/src/application/transform/footer/document-footer.ts +36 -9
  531. package/src/application/transform/footer/enum-name-claims.ts +62 -0
  532. package/src/application/transform/footer/operation-keys.ts +28 -0
  533. package/src/application/transform/footer/type-evaluation.ts +4 -4
  534. package/src/application/transform/helper-types.ts +8 -7
  535. package/src/application/transform/numbered-names.ts +15 -0
  536. package/src/application/transform/ref-pointer/generated-location.ts +3 -3
  537. package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
  538. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  539. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  540. package/src/application/transform/ref-pointer/original-index.ts +100 -17
  541. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  542. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  543. package/src/application/transform/ref-pointer/property-shape.ts +97 -0
  544. package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
  545. package/src/application/transform/ref-type.ts +2 -1
  546. package/src/application/transform/schema/access-flags.ts +5 -2
  547. package/src/application/transform/schema/composition-type.ts +2 -2
  548. package/src/application/transform/schema/enum-rule.ts +6 -2
  549. package/src/application/transform/schema/index-signature-type.ts +31 -0
  550. package/src/application/transform/schema/input-location.ts +35 -0
  551. package/src/application/transform/schema/object-type.ts +22 -12
  552. package/src/application/transform/schema/ref-siblings.ts +76 -0
  553. package/src/application/transform/schema/schema-context.ts +3 -0
  554. package/src/application/transform/schema/schema-transform.ts +6 -3
  555. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  556. package/src/application/transform/schema-comment.ts +5 -1
  557. package/src/application/transform/transform-context.ts +5 -0
  558. package/src/cli/api-logger.ts +17 -0
  559. package/src/cli/api-settings.ts +80 -13
  560. package/src/cli/api-writes.ts +117 -0
  561. package/src/cli/cli-arguments.ts +90 -14
  562. package/src/cli/cli-dependencies.ts +26 -4
  563. package/src/cli/cli-errors.ts +42 -1
  564. package/src/cli/cli-output.ts +195 -15
  565. package/src/cli/main.ts +14 -5
  566. package/src/cli/redocly-apis.ts +177 -52
  567. package/src/cli/ref-limits.ts +21 -2
  568. package/src/cli/run-cli.ts +76 -15
  569. package/src/domain/append-all.ts +10 -0
  570. package/src/domain/cause-secrets.ts +86 -0
  571. package/src/domain/errors.ts +16 -5
  572. package/src/domain/ir/identifier-text.ts +6 -5
  573. package/src/domain/ir/ir-shape.ts +299 -0
  574. package/src/domain/ir/newer-identifier-ranges.ts +183 -30
  575. package/src/domain/location-text.ts +12 -0
  576. package/src/domain/openapi/alias-expansion.ts +4 -1
  577. package/src/domain/openapi/discriminated-union.ts +6 -4
  578. package/src/domain/openapi/discriminator-conflicts.ts +21 -7
  579. package/src/domain/openapi/document-object.ts +2 -0
  580. package/src/domain/openapi/document-places.ts +78 -0
  581. package/src/domain/openapi/json-pointer.ts +96 -7
  582. package/src/domain/openapi/schema-dialect.ts +22 -0
  583. package/src/domain/openapi/unsupported-features.ts +2 -2
  584. package/src/domain/output-fixes.ts +28 -2
  585. package/src/domain/terminal-text.ts +44 -0
  586. package/src/domain/url-secrets.ts +72 -0
  587. package/src/domain/warnings.ts +1 -0
  588. package/src/types/generator-options.ts +1 -1
  589. package/dist/cli/main.d.cts +0 -2
  590. package/dist/cli/main.d.mts +0 -2
  591. package/dist/cli/main.d.ts +0 -2
  592. package/dist/domain/url-credentials.cjs +0 -10
  593. package/dist/domain/url-credentials.cjs.map +0 -1
  594. package/dist/domain/url-credentials.mjs +0 -8
  595. package/dist/domain/url-credentials.mjs.map +0 -1
  596. package/src/domain/url-credentials.ts +0 -18
@@ -2,11 +2,12 @@ import { NEWER_IDENTIFIER_PART, NEWER_IDENTIFIER_START } from "./newer-identifie
2
2
 
3
3
  /**
4
4
  * Identifier rules of ECMAScript (Unicode `ID_Start` / `ID_Continue`, plus `$`, `_`, ZWNJ and
5
- * ZWJ), for names built from document text, without the characters that TypeScript's scanner
6
- * does not know yet. Node.js follows a newer Unicode version than TypeScript's identifier tables,
7
- * so a name such as `꟒Name` (Unicode 17) passed here and failed to parse with "Invalid
8
- * character" (ADR-019). Removing the newer characters also gives the same names on every
9
- * supported Node.js version.
5
+ * ZWJ), for names built from document text, without the characters that the scanner of the lowest
6
+ * supported TypeScript (5.4) does not know. Node.js follows a newer Unicode version than
7
+ * TypeScript's identifier tables, so a name such as `꟒Name` (Unicode 17) passed here and failed to
8
+ * parse with "Invalid character" (ADR-019); TypeScript 5.4 also rejects ZWJ and characters that
9
+ * TypeScript 6 accepts. Removing these also gives the same names on every supported Node.js
10
+ * version.
10
11
  */
11
12
 
12
13
  const IDENTIFIER_START_RE = new RegExp(
@@ -0,0 +1,299 @@
1
+ import { hasIdentifierStart, withIdentifierParts } from "./identifier-text.js";
2
+ import type { IrKeyword, IrPropertySignature, IrType } from "./nodes.js";
3
+
4
+ /**
5
+ * Whether a value from outside the package (an IR callback's result) is IR the printer writes as
6
+ * valid TypeScript. JavaScript callers can return any value, and the type checker of a
7
+ * TypeScript caller does not stop `{ kind: "union", types: [] }` or an empty type text either:
8
+ * without this check such a result crashed the printer with an untyped error, or printed text
9
+ * such as `a?: ;`. Raw type text is printed as written, so only blank text is rejected; the text
10
+ * itself is the caller's TypeScript, which the caller's compiler checks.
11
+ */
12
+
13
+ type Fields = Readonly<Record<string, unknown>>;
14
+
15
+ const KEYWORDS: ReadonlySet<string> = new Set<IrKeyword>([
16
+ "string",
17
+ "number",
18
+ "boolean",
19
+ "null",
20
+ "undefined",
21
+ "unknown",
22
+ "never",
23
+ ]);
24
+
25
+ const STRING_ENCODINGS: ReadonlySet<unknown> = new Set([undefined, "json", "escaped"]);
26
+
27
+ function isFields(value: unknown): value is Fields {
28
+ return typeof value === "object" && value !== null;
29
+ }
30
+
31
+ function isText(value: unknown): value is string {
32
+ return typeof value === "string" && value.trim() !== "";
33
+ }
34
+
35
+ function isIdentifier(text: unknown): boolean {
36
+ return typeof text === "string" && hasIdentifierStart(text) && withIdentifierParts(text) === text;
37
+ }
38
+
39
+ /** The prefix of a type query: the generator writes `typeof Status` as a reference name. */
40
+ const TYPE_QUERY_PREFIX = "typeof ";
41
+
42
+ /**
43
+ * Words that cannot start the name of a type query (`typeof <name>`): `import` starts an import
44
+ * type, and strict mode reserves the others. Found with the TypeScript 5.4 and 6.0 compilers
45
+ * (syntax and grammar errors) on `type A = { a?: typeof <name> }`, over every reserved word and
46
+ * contextual keyword. A name after a `.` may be any identifier, reserved words included.
47
+ */
48
+ const NOT_TYPE_QUERY_START: ReadonlySet<string> = new Set(
49
+ "import implements interface let package private protected public static yield".split(" "),
50
+ );
51
+ /** Words that cannot start a type reference either: they are operators of a type there. */
52
+ const NOT_TYPE_REFERENCE_START: ReadonlySet<string> = new Set([
53
+ ...NOT_TYPE_QUERY_START,
54
+ ..."new typeof infer keyof readonly unique".split(" "),
55
+ ]);
56
+
57
+ /**
58
+ * A name TypeScript reads as the name of a type: identifiers joined by `.` (`Status`,
59
+ * `Status.active`), optionally as a type query (`typeof Status`). Text such as `a b` or `A<B>`
60
+ * would print as other or invalid TypeScript, and so would `keyof` or `let` as the first name;
61
+ * type arguments go in `typeArguments`.
62
+ */
63
+ function isTypeName(text: unknown): boolean {
64
+ if (typeof text !== "string") {
65
+ return false;
66
+ }
67
+ const isQuery = text.startsWith(TYPE_QUERY_PREFIX);
68
+ const names = (isQuery ? text.slice(TYPE_QUERY_PREFIX.length) : text).split(".");
69
+ const reserved = isQuery ? NOT_TYPE_QUERY_START : NOT_TYPE_REFERENCE_START;
70
+ return names.every(isIdentifier) && !reserved.has(names[0] as string);
71
+ }
72
+
73
+ /** A non-negative number written as JavaScript writes it, as `toPropertyName` makes them. */
74
+ function isNumberName(text: unknown): boolean {
75
+ return typeof text === "string" && String(Number(text)) === text && !text.startsWith("-");
76
+ }
77
+
78
+ /** Walks one value; `ancestors` makes a cycle invalid instead of an endless recursion. */
79
+ class IrShapeCheck {
80
+ readonly #ancestors = new Set<object>();
81
+
82
+ isType(value: unknown): boolean {
83
+ return this.#within(value, (node) => {
84
+ const check = TYPE_CHECKS[node.kind as IrType["kind"]];
85
+ return Object.hasOwn(TYPE_CHECKS, String(node.kind)) && check(node, this);
86
+ });
87
+ }
88
+
89
+ isTypeList(value: unknown, isEmptyAllowed: boolean): boolean {
90
+ return (
91
+ Array.isArray(value) &&
92
+ (isEmptyAllowed || value.length > 0) &&
93
+ value.every((entry) => this.isType(entry))
94
+ );
95
+ }
96
+
97
+ isMember(value: unknown): boolean {
98
+ return isFields(value) && value.kind === "indexSignature"
99
+ ? this.#within(value, (node) => this.#isIndexSignature(node))
100
+ : this.isProperty(value);
101
+ }
102
+
103
+ isProperty(value: unknown): boolean {
104
+ return this.#within(
105
+ value,
106
+ (node) =>
107
+ node.kind === "property" &&
108
+ isPropertyName(node.name) &&
109
+ this.isType(node.type) &&
110
+ typeof node.isOptional === "boolean" &&
111
+ typeof node.isReadonly === "boolean" &&
112
+ areComments(node.comments),
113
+ );
114
+ }
115
+
116
+ #isIndexSignature(node: Fields): boolean {
117
+ return (
118
+ isIdentifier(node.parameterName) &&
119
+ this.isType(node.parameterType) &&
120
+ isIndexParameterType(node.parameterType as IrType) &&
121
+ this.isType(node.type) &&
122
+ typeof node.isReadonly === "boolean" &&
123
+ areComments(node.comments)
124
+ );
125
+ }
126
+
127
+ #within(value: unknown, check: (node: Fields) => boolean): boolean {
128
+ if (!isFields(value) || this.#ancestors.has(value)) {
129
+ return false;
130
+ }
131
+ this.#ancestors.add(value);
132
+ try {
133
+ return check(value);
134
+ } finally {
135
+ this.#ancestors.delete(value);
136
+ }
137
+ }
138
+ }
139
+
140
+ /**
141
+ * What an index signature parameter type reduces to: `string`, `number`, or an object type that
142
+ * tags one of them (`string & {}`), each as an atom; `unresolved` for a name, an indexed access
143
+ * (`K["a"]`) or type text, which only TypeScript can resolve; undefined for a type that can never
144
+ * be one (a literal, an array, a tuple, `readonly`, another keyword).
145
+ */
146
+ type IndexAtom = "string" | "number" | "tag";
147
+ type IndexKeys = ReadonlySet<IndexAtom> | "unresolved";
148
+
149
+ /** The keywords an index signature takes as its parameter type, as atoms. */
150
+ const INDEX_KEYWORD_ATOMS: ReadonlyMap<string, IndexAtom> = new Map([
151
+ ["string", "string"],
152
+ ["number", "number"],
153
+ ]);
154
+
155
+ const TAG: IndexAtom = "tag";
156
+ const UNRESOLVED = "unresolved";
157
+
158
+ /** One atom of each side together: a tag keeps the other side, two keys must be the same. */
159
+ function intersectAtoms(left: IndexAtom, right: IndexAtom): IndexAtom | undefined {
160
+ if (left === right || right === TAG) {
161
+ return left;
162
+ }
163
+ return left === TAG ? right : undefined;
164
+ }
165
+
166
+ /** `A & B` over atoms, as TypeScript spreads an intersection over the members of a union. */
167
+ function intersectKeys(left: IndexKeys, right: IndexKeys): IndexKeys {
168
+ if (left === UNRESOLVED || right === UNRESOLVED) {
169
+ return UNRESOLVED;
170
+ }
171
+ const atoms = [...left].flatMap((atom) => [...right].map((other) => intersectAtoms(atom, other)));
172
+ return new Set(atoms.filter((atom) => atom !== undefined));
173
+ }
174
+
175
+ /** `A | B` over atoms. */
176
+ function unionKeys(left: IndexKeys, right: IndexKeys): IndexKeys {
177
+ return left === UNRESOLVED || right === UNRESOLVED ? UNRESOLVED : new Set([...left, ...right]);
178
+ }
179
+
180
+ /** The keys of each member combined, or undefined when one member can never be a key. */
181
+ function combineKeys(
182
+ types: readonly IrType[],
183
+ combine: (left: IndexKeys, right: IndexKeys) => IndexKeys,
184
+ ): IndexKeys | undefined {
185
+ let combined: IndexKeys | undefined;
186
+ for (const member of types) {
187
+ const keys = indexKeys(member);
188
+ if (keys === undefined) {
189
+ return undefined;
190
+ }
191
+ combined = combined === undefined ? keys : combine(combined, keys);
192
+ }
193
+ return combined;
194
+ }
195
+
196
+ function indexKeys(type: IrType): IndexKeys | undefined {
197
+ switch (type.kind) {
198
+ case "keyword": {
199
+ const atom = INDEX_KEYWORD_ATOMS.get(type.keyword);
200
+ return atom === undefined ? undefined : new Set([atom]);
201
+ }
202
+ case "object":
203
+ return new Set([TAG]);
204
+ case "reference":
205
+ case "indexedAccess":
206
+ case "raw":
207
+ return UNRESOLVED;
208
+ case "union":
209
+ return combineKeys(type.types, unionKeys);
210
+ case "intersection":
211
+ return combineKeys(type.types, intersectKeys);
212
+ default:
213
+ return undefined;
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Whether a type can be the parameter type of an index signature. TypeScript takes `string`,
219
+ * `number`, `symbol`, a template literal type, a union of these, or one of them tagged by an
220
+ * intersection (`string & {}`); anything else fails with TS1268 or TS1337. It decides by the
221
+ * resolved type, so `string & "a"` (the literal `"a"`), `string & number` (`never`) and an
222
+ * object type alone are refused, and a name, an indexed access and type text pass for TypeScript
223
+ * to check.
224
+ */
225
+ function isIndexParameterType(type: IrType): boolean {
226
+ const keys = indexKeys(type);
227
+ return keys === UNRESOLVED || (keys !== undefined && keys.size > 0 && !keys.has(TAG));
228
+ }
229
+
230
+ function isPropertyName(value: unknown): boolean {
231
+ if (!isFields(value)) {
232
+ return false;
233
+ }
234
+ switch (value.kind) {
235
+ case "identifier":
236
+ return isIdentifier(value.text);
237
+ case "number":
238
+ return isNumberName(value.text);
239
+ case "string":
240
+ return typeof value.value === "string";
241
+ default:
242
+ return false;
243
+ }
244
+ }
245
+
246
+ /** A block comment must not end itself early (`*\/`); a line comment must stay on its line. */
247
+ function isComment(value: unknown): boolean {
248
+ if (!isFields(value) || typeof value.text !== "string") {
249
+ return false;
250
+ }
251
+ return value.kind === "block"
252
+ ? !value.text.includes("*/")
253
+ : value.kind === "line" && !/[\n\r\u2028\u2029]/.test(value.text);
254
+ }
255
+
256
+ function areComments(value: unknown): boolean {
257
+ return Array.isArray(value) && value.every(isComment);
258
+ }
259
+
260
+ function isTupleElement(value: unknown, check: IrShapeCheck): boolean {
261
+ return (
262
+ isFields(value) &&
263
+ check.isType(value.type) &&
264
+ typeof value.isRest === "boolean" &&
265
+ typeof value.isOptional === "boolean" &&
266
+ !(value.isRest && value.isOptional)
267
+ );
268
+ }
269
+
270
+ /** One check per kind; the `Record` makes a new kind fail to compile until it is checked. */
271
+ const TYPE_CHECKS: Readonly<
272
+ Record<IrType["kind"], (node: Fields, check: IrShapeCheck) => boolean>
273
+ > = {
274
+ keyword: (node) => KEYWORDS.has(node.keyword as string),
275
+ stringLiteral: (node) => typeof node.value === "string" && STRING_ENCODINGS.has(node.encoding),
276
+ numberLiteral: (node) => Number.isFinite(node.value),
277
+ booleanLiteral: (node) => typeof node.value === "boolean",
278
+ reference: (node, check) => isTypeName(node.name) && check.isTypeList(node.typeArguments, true),
279
+ array: (node, check) => check.isType(node.element),
280
+ tuple: (node, check) =>
281
+ Array.isArray(node.elements) && node.elements.every((entry) => isTupleElement(entry, check)),
282
+ union: (node, check) => check.isTypeList(node.types, false),
283
+ intersection: (node, check) => check.isTypeList(node.types, false),
284
+ object: (node, check) =>
285
+ Array.isArray(node.members) && node.members.every((member) => check.isMember(member)),
286
+ indexedAccess: (node, check) => check.isType(node.object) && check.isType(node.index),
287
+ readonly: (node, check) => check.isType(node.type),
288
+ raw: (node) => isText(node.text),
289
+ };
290
+
291
+ /** Whether `value` is an IR type the printer writes as valid TypeScript. */
292
+ export function isPrintableIrType(value: unknown): value is IrType {
293
+ return new IrShapeCheck().isType(value);
294
+ }
295
+
296
+ /** Whether `value` is an IR property signature the printer writes as valid TypeScript. */
297
+ export function isPrintableIrProperty(value: unknown): value is IrPropertySignature {
298
+ return new IrShapeCheck().isProperty(value);
299
+ }
@@ -1,22 +1,52 @@
1
1
  // Generated by scripts/identifier-ranges.ts (Node.js 26.0.0, Unicode
2
- // 17.0, TypeScript 5.9.3). Do not edit.
2
+ // 17.0, TypeScript 5.4.5). Do not edit.
3
3
 
4
4
  /** `ID_Start` code points that TypeScript's scanner does not accept, as regex class items. */
5
5
  export const NEWER_IDENTIFIER_START: readonly string[] = [
6
- "\\u{88F}",
7
- "\\u{C5C}",
8
- "\\u{CDC}",
6
+ "\\u{870}-\\u{887}",
7
+ "\\u{889}-\\u{88F}",
8
+ "\\u{8B5}",
9
+ "\\u{8BE}-\\u{8C9}",
10
+ "\\u{C5C}-\\u{C5D}",
11
+ "\\u{CDC}-\\u{CDD}",
12
+ "\\u{D04}",
13
+ "\\u{170D}",
14
+ "\\u{171F}",
15
+ "\\u{1B4C}",
9
16
  "\\u{1C89}-\\u{1C8A}",
10
- "\\u{A7CB}-\\u{A7CF}",
11
- "\\u{A7D2}",
12
- "\\u{A7D4}",
13
- "\\u{A7DA}-\\u{A7DC}",
14
- "\\u{A7F1}",
17
+ "\\u{2C2F}",
18
+ "\\u{2C5F}",
19
+ "\\u{31BB}-\\u{31BF}",
20
+ "\\u{4DB6}-\\u{4DBF}",
21
+ "\\u{9FF0}-\\u{9FFF}",
22
+ "\\u{A7C0}-\\u{A7C1}",
23
+ "\\u{A7C7}-\\u{A7DC}",
24
+ "\\u{A7F1}-\\u{A7F6}",
25
+ "\\u{AB68}-\\u{AB69}",
26
+ "\\u{10570}-\\u{1057A}",
27
+ "\\u{1057C}-\\u{1058A}",
28
+ "\\u{1058C}-\\u{10592}",
29
+ "\\u{10594}-\\u{10595}",
30
+ "\\u{10597}-\\u{105A1}",
31
+ "\\u{105A3}-\\u{105B1}",
32
+ "\\u{105B3}-\\u{105B9}",
33
+ "\\u{105BB}-\\u{105BC}",
15
34
  "\\u{105C0}-\\u{105F3}",
35
+ "\\u{10780}-\\u{10785}",
36
+ "\\u{10787}-\\u{107B0}",
37
+ "\\u{107B2}-\\u{107BA}",
16
38
  "\\u{10940}-\\u{10959}",
17
39
  "\\u{10D4A}-\\u{10D65}",
18
40
  "\\u{10D6F}-\\u{10D85}",
41
+ "\\u{10E80}-\\u{10EA9}",
42
+ "\\u{10EB0}-\\u{10EB1}",
19
43
  "\\u{10EC2}-\\u{10EC7}",
44
+ "\\u{10F70}-\\u{10F81}",
45
+ "\\u{10FB0}-\\u{10FC4}",
46
+ "\\u{11071}-\\u{11072}",
47
+ "\\u{11075}",
48
+ "\\u{11147}",
49
+ "\\u{1123F}-\\u{11240}",
20
50
  "\\u{11380}-\\u{11389}",
21
51
  "\\u{1138B}",
22
52
  "\\u{1138E}",
@@ -24,18 +54,47 @@ export const NEWER_IDENTIFIER_START: readonly string[] = [
24
54
  "\\u{113B7}",
25
55
  "\\u{113D1}",
26
56
  "\\u{113D3}",
57
+ "\\u{11460}-\\u{11461}",
58
+ "\\u{11740}-\\u{11746}",
59
+ "\\u{11900}-\\u{11906}",
60
+ "\\u{11909}",
61
+ "\\u{1190C}-\\u{11913}",
62
+ "\\u{11915}-\\u{11916}",
63
+ "\\u{11918}-\\u{1192F}",
64
+ "\\u{1193F}",
65
+ "\\u{11941}",
66
+ "\\u{11AB0}-\\u{11ABF}",
27
67
  "\\u{11BC0}-\\u{11BE0}",
28
68
  "\\u{11DB0}-\\u{11DDB}",
69
+ "\\u{11F02}",
70
+ "\\u{11F04}-\\u{11F10}",
71
+ "\\u{11F12}-\\u{11F33}",
72
+ "\\u{11FB0}",
73
+ "\\u{12F90}-\\u{12FF0}",
74
+ "\\u{1342F}",
75
+ "\\u{13441}-\\u{13446}",
29
76
  "\\u{13460}-\\u{143FA}",
30
77
  "\\u{16100}-\\u{1611D}",
78
+ "\\u{16A70}-\\u{16ABE}",
31
79
  "\\u{16D40}-\\u{16D6C}",
32
80
  "\\u{16EA0}-\\u{16EB8}",
33
81
  "\\u{16EBB}-\\u{16ED3}",
34
82
  "\\u{16FF2}-\\u{16FF6}",
35
83
  "\\u{187F8}-\\u{187FF}",
36
- "\\u{18CFF}",
37
- "\\u{18D09}-\\u{18D1E}",
84
+ "\\u{18AF3}-\\u{18CD5}",
85
+ "\\u{18CFF}-\\u{18D1E}",
38
86
  "\\u{18D80}-\\u{18DF2}",
87
+ "\\u{1AFF0}-\\u{1AFF3}",
88
+ "\\u{1AFF5}-\\u{1AFFB}",
89
+ "\\u{1AFFD}-\\u{1AFFE}",
90
+ "\\u{1B11F}-\\u{1B122}",
91
+ "\\u{1B132}",
92
+ "\\u{1B155}",
93
+ "\\u{1DF00}-\\u{1DF1E}",
94
+ "\\u{1DF25}-\\u{1DF2A}",
95
+ "\\u{1E030}-\\u{1E06D}",
96
+ "\\u{1E290}-\\u{1E2AD}",
97
+ "\\u{1E4D0}-\\u{1E4EB}",
39
98
  "\\u{1E5D0}-\\u{1E5ED}",
40
99
  "\\u{1E5F0}",
41
100
  "\\u{1E6C0}-\\u{1E6DE}",
@@ -44,32 +103,83 @@ export const NEWER_IDENTIFIER_START: readonly string[] = [
44
103
  "\\u{1E6E7}-\\u{1E6ED}",
45
104
  "\\u{1E6F0}-\\u{1E6F4}",
46
105
  "\\u{1E6FE}-\\u{1E6FF}",
47
- "\\u{2B73A}-\\u{2B73F}",
106
+ "\\u{1E7E0}-\\u{1E7E6}",
107
+ "\\u{1E7E8}-\\u{1E7EB}",
108
+ "\\u{1E7ED}-\\u{1E7EE}",
109
+ "\\u{1E7F0}-\\u{1E7FE}",
110
+ "\\u{2A6D7}-\\u{2A6DF}",
111
+ "\\u{2B735}-\\u{2B73F}",
48
112
  "\\u{2CEA2}-\\u{2CEAD}",
49
- "\\u{323B0}-\\u{33479}",
113
+ "\\u{2EBF0}-\\u{2EE5D}",
114
+ "\\u{30000}-\\u{3134A}",
115
+ "\\u{31350}-\\u{33479}",
50
116
  ];
51
117
 
52
118
  /** `ID_Continue` code points that TypeScript's scanner does not accept, as regex class items. */
53
119
  export const NEWER_IDENTIFIER_PART: readonly string[] = [
54
- "\\u{88F}",
55
- "\\u{897}",
56
- "\\u{C5C}",
57
- "\\u{CDC}",
58
- "\\u{1ACF}-\\u{1ADD}",
120
+ "\\u{870}-\\u{887}",
121
+ "\\u{889}-\\u{88F}",
122
+ "\\u{897}-\\u{89F}",
123
+ "\\u{8B5}",
124
+ "\\u{8BE}-\\u{8D2}",
125
+ "\\u{B55}",
126
+ "\\u{C3C}",
127
+ "\\u{C5C}-\\u{C5D}",
128
+ "\\u{CDC}-\\u{CDD}",
129
+ "\\u{CF3}",
130
+ "\\u{D04}",
131
+ "\\u{D81}",
132
+ "\\u{ECE}",
133
+ "\\u{170D}",
134
+ "\\u{1715}",
135
+ "\\u{171F}",
136
+ "\\u{180F}",
137
+ "\\u{1ABF}-\\u{1ADD}",
59
138
  "\\u{1AE0}-\\u{1AEB}",
139
+ "\\u{1B4C}",
60
140
  "\\u{1C89}-\\u{1C8A}",
61
- "\\u{A7CB}-\\u{A7CF}",
62
- "\\u{A7D2}",
63
- "\\u{A7D4}",
64
- "\\u{A7DA}-\\u{A7DC}",
65
- "\\u{A7F1}",
141
+ "\\u{1DFA}",
142
+ "\\u{200C}-\\u{200D}",
143
+ "\\u{2C2F}",
144
+ "\\u{2C5F}",
145
+ "\\u{30FB}",
146
+ "\\u{31BB}-\\u{31BF}",
147
+ "\\u{4DB6}-\\u{4DBF}",
148
+ "\\u{9FF0}-\\u{9FFF}",
149
+ "\\u{A7C0}-\\u{A7C1}",
150
+ "\\u{A7C7}-\\u{A7DC}",
151
+ "\\u{A7F1}-\\u{A7F6}",
152
+ "\\u{A82C}",
153
+ "\\u{AB68}-\\u{AB69}",
154
+ "\\u{FF65}",
155
+ "\\u{10570}-\\u{1057A}",
156
+ "\\u{1057C}-\\u{1058A}",
157
+ "\\u{1058C}-\\u{10592}",
158
+ "\\u{10594}-\\u{10595}",
159
+ "\\u{10597}-\\u{105A1}",
160
+ "\\u{105A3}-\\u{105B1}",
161
+ "\\u{105B3}-\\u{105B9}",
162
+ "\\u{105BB}-\\u{105BC}",
66
163
  "\\u{105C0}-\\u{105F3}",
164
+ "\\u{10780}-\\u{10785}",
165
+ "\\u{10787}-\\u{107B0}",
166
+ "\\u{107B2}-\\u{107BA}",
67
167
  "\\u{10940}-\\u{10959}",
68
168
  "\\u{10D40}-\\u{10D65}",
69
169
  "\\u{10D69}-\\u{10D6D}",
70
170
  "\\u{10D6F}-\\u{10D85}",
171
+ "\\u{10E80}-\\u{10EA9}",
172
+ "\\u{10EAB}-\\u{10EAC}",
173
+ "\\u{10EB0}-\\u{10EB1}",
71
174
  "\\u{10EC2}-\\u{10EC7}",
72
- "\\u{10EFA}-\\u{10EFC}",
175
+ "\\u{10EFA}-\\u{10EFF}",
176
+ "\\u{10F70}-\\u{10F85}",
177
+ "\\u{10FB0}-\\u{10FC4}",
178
+ "\\u{11070}-\\u{11075}",
179
+ "\\u{110C2}",
180
+ "\\u{11147}",
181
+ "\\u{111CE}-\\u{111CF}",
182
+ "\\u{1123F}-\\u{11241}",
73
183
  "\\u{11380}-\\u{11389}",
74
184
  "\\u{1138B}",
75
185
  "\\u{1138E}",
@@ -80,30 +190,73 @@ export const NEWER_IDENTIFIER_PART: readonly string[] = [
80
190
  "\\u{113C7}-\\u{113CA}",
81
191
  "\\u{113CC}-\\u{113D3}",
82
192
  "\\u{113E1}-\\u{113E2}",
193
+ "\\u{11460}-\\u{11461}",
83
194
  "\\u{116D0}-\\u{116E3}",
195
+ "\\u{11740}-\\u{11746}",
196
+ "\\u{11900}-\\u{11906}",
197
+ "\\u{11909}",
198
+ "\\u{1190C}-\\u{11913}",
199
+ "\\u{11915}-\\u{11916}",
200
+ "\\u{11918}-\\u{11935}",
201
+ "\\u{11937}-\\u{11938}",
202
+ "\\u{1193B}-\\u{11943}",
203
+ "\\u{11950}-\\u{11959}",
204
+ "\\u{11AB0}-\\u{11ABF}",
84
205
  "\\u{11B60}-\\u{11B67}",
85
206
  "\\u{11BC0}-\\u{11BE0}",
86
207
  "\\u{11BF0}-\\u{11BF9}",
87
208
  "\\u{11DB0}-\\u{11DDB}",
88
209
  "\\u{11DE0}-\\u{11DE9}",
89
- "\\u{11F5A}",
210
+ "\\u{11F00}-\\u{11F10}",
211
+ "\\u{11F12}-\\u{11F3A}",
212
+ "\\u{11F3E}-\\u{11F42}",
213
+ "\\u{11F50}-\\u{11F5A}",
214
+ "\\u{11FB0}",
215
+ "\\u{12F90}-\\u{12FF0}",
216
+ "\\u{1342F}",
217
+ "\\u{13440}-\\u{13455}",
90
218
  "\\u{13460}-\\u{143FA}",
91
219
  "\\u{16100}-\\u{16139}",
220
+ "\\u{16A70}-\\u{16ABE}",
221
+ "\\u{16AC0}-\\u{16AC9}",
92
222
  "\\u{16D40}-\\u{16D6C}",
93
223
  "\\u{16D70}-\\u{16D79}",
94
224
  "\\u{16EA0}-\\u{16EB8}",
95
225
  "\\u{16EBB}-\\u{16ED3}",
96
- "\\u{16FF2}-\\u{16FF6}",
226
+ "\\u{16FE4}",
227
+ "\\u{16FF0}-\\u{16FF6}",
97
228
  "\\u{187F8}-\\u{187FF}",
98
- "\\u{18CFF}",
99
- "\\u{18D09}-\\u{18D1E}",
229
+ "\\u{18AF3}-\\u{18CD5}",
230
+ "\\u{18CFF}-\\u{18D1E}",
100
231
  "\\u{18D80}-\\u{18DF2}",
232
+ "\\u{1AFF0}-\\u{1AFF3}",
233
+ "\\u{1AFF5}-\\u{1AFFB}",
234
+ "\\u{1AFFD}-\\u{1AFFE}",
235
+ "\\u{1B11F}-\\u{1B122}",
236
+ "\\u{1B132}",
237
+ "\\u{1B155}",
101
238
  "\\u{1CCF0}-\\u{1CCF9}",
239
+ "\\u{1CF00}-\\u{1CF2D}",
240
+ "\\u{1CF30}-\\u{1CF46}",
241
+ "\\u{1DF00}-\\u{1DF1E}",
242
+ "\\u{1DF25}-\\u{1DF2A}",
243
+ "\\u{1E030}-\\u{1E06D}",
244
+ "\\u{1E08F}",
245
+ "\\u{1E290}-\\u{1E2AE}",
246
+ "\\u{1E4D0}-\\u{1E4F9}",
102
247
  "\\u{1E5D0}-\\u{1E5FA}",
103
248
  "\\u{1E6C0}-\\u{1E6DE}",
104
249
  "\\u{1E6E0}-\\u{1E6F5}",
105
250
  "\\u{1E6FE}-\\u{1E6FF}",
106
- "\\u{2B73A}-\\u{2B73F}",
251
+ "\\u{1E7E0}-\\u{1E7E6}",
252
+ "\\u{1E7E8}-\\u{1E7EB}",
253
+ "\\u{1E7ED}-\\u{1E7EE}",
254
+ "\\u{1E7F0}-\\u{1E7FE}",
255
+ "\\u{1FBF0}-\\u{1FBF9}",
256
+ "\\u{2A6D7}-\\u{2A6DF}",
257
+ "\\u{2B735}-\\u{2B73F}",
107
258
  "\\u{2CEA2}-\\u{2CEAD}",
108
- "\\u{323B0}-\\u{33479}",
259
+ "\\u{2EBF0}-\\u{2EE5D}",
260
+ "\\u{30000}-\\u{3134A}",
261
+ "\\u{31350}-\\u{33479}",
109
262
  ];
@@ -0,0 +1,12 @@
1
+ /** How a location the user writes, as a CLI argument or an option string, is read. */
2
+
3
+ /**
4
+ * A scheme of two or more characters (`https:`, `file:`). One letter is a Windows drive (`C:`), so
5
+ * `C:\\specs\\api.yaml` stays a path.
6
+ */
7
+ const URL_SCHEME = /^[a-z][a-z\d+.-]+:/i;
8
+
9
+ /** Whether the location is written as a URL, not as a file path. */
10
+ export function hasUrlScheme(location: string): boolean {
11
+ return URL_SCHEME.test(location);
12
+ }
@@ -53,7 +53,10 @@ export function countNodes(root: unknown): NodeCounts {
53
53
  ? childrenOf(node).filter((child) => isContainer(child) && !entered.has(child))
54
54
  : [];
55
55
  if (pending.length > 0) {
56
- stack.push(...(pending as object[]));
56
+ // One push per child: spreading an array of millions of children overflows the stack.
57
+ for (const child of pending as object[]) {
58
+ stack.push(child);
59
+ }
57
60
  continue;
58
61
  }
59
62
  stack.pop();
@@ -1,4 +1,4 @@
1
- import { escapePointerSegment } from "./json-pointer.js";
1
+ import { canonicalRef, escapePointerSegment } from "./json-pointer.js";
2
2
  import type { Schema, SchemaObject } from "./schema-object.js";
3
3
 
4
4
  /**
@@ -51,7 +51,7 @@ function reaches(schema: Schema, search: Search): boolean {
51
51
  }
52
52
  const ref = (schema as { readonly $ref?: unknown }).$ref;
53
53
  if (typeof ref === "string") {
54
- if (ref === search.target) {
54
+ if (canonicalRef(ref) === canonicalRef(search.target)) {
55
55
  return true;
56
56
  }
57
57
  if (search.visited.has(ref)) {
@@ -84,7 +84,9 @@ function mappingRef(target: unknown): string | undefined {
84
84
  if (typeof target !== "string") {
85
85
  return undefined;
86
86
  }
87
- return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
87
+ return target.startsWith("#")
88
+ ? canonicalRef(target)
89
+ : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
88
90
  }
89
91
 
90
92
  /** Whether the discriminator `mapping` of `union` names the schema at `target`. */
@@ -93,7 +95,7 @@ export function unionMaps(union: SchemaObject, target: string): boolean {
93
95
  if (!isSchemaObject(mapping)) {
94
96
  return false;
95
97
  }
96
- return Object.values(mapping).some((value) => mappingRef(value) === target);
98
+ return Object.values(mapping).some((value) => mappingRef(value) === canonicalRef(target));
97
99
  }
98
100
 
99
101
  /**