openapi-typesafe 1.0.0-rc.4 → 1.0.0-rc.6

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 (366) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
  3. package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
  4. package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
  5. package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
  6. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
  7. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
  8. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
  9. package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
  10. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
  11. package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
  12. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
  13. package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
  14. package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
  15. package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
  16. package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
  17. package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
  18. package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
  19. package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
  20. package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
  21. package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
  22. package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
  23. package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
  24. package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
  25. package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
  26. package/dist/adapters/redocly-loader/query-named-components.cjs +129 -0
  27. package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
  28. package/dist/adapters/redocly-loader/query-named-components.mjs +126 -0
  29. package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
  30. package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
  31. package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
  32. package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
  33. package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
  34. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +39 -18
  35. package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
  36. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +40 -19
  37. package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
  38. package/dist/adapters/redocly-loader/ref-access.cjs +25 -4
  39. package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
  40. package/dist/adapters/redocly-loader/ref-access.mjs +26 -5
  41. package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
  42. package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
  43. package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
  44. package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
  45. package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
  46. package/dist/adapters/redocly-loader/remote-fetch.cjs +20 -3
  47. package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
  48. package/dist/adapters/redocly-loader/remote-fetch.mjs +20 -4
  49. package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
  50. package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
  51. package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
  52. package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
  53. package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
  54. package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
  55. package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
  56. package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
  57. package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
  58. package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
  59. package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
  60. package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
  61. package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
  62. package/dist/api/cwd-option.cjs +58 -0
  63. package/dist/api/cwd-option.cjs.map +1 -0
  64. package/dist/api/cwd-option.mjs +52 -0
  65. package/dist/api/cwd-option.mjs.map +1 -0
  66. package/dist/api/default-ports.cjs +15 -7
  67. package/dist/api/default-ports.cjs.map +1 -1
  68. package/dist/api/default-ports.mjs +14 -8
  69. package/dist/api/default-ports.mjs.map +1 -1
  70. package/dist/api/document-refs.cjs +16 -1
  71. package/dist/api/document-refs.cjs.map +1 -1
  72. package/dist/api/document-refs.mjs +16 -1
  73. package/dist/api/document-refs.mjs.map +1 -1
  74. package/dist/api/document-run.cjs +6 -26
  75. package/dist/api/document-run.cjs.map +1 -1
  76. package/dist/api/document-run.mjs +5 -21
  77. package/dist/api/document-run.mjs.map +1 -1
  78. package/dist/api/legacy-utils.cjs +1 -1
  79. package/dist/api/legacy-utils.cjs.map +1 -1
  80. package/dist/api/legacy-utils.mjs +1 -1
  81. package/dist/api/legacy-utils.mjs.map +1 -1
  82. package/dist/api/openapi-ts.cjs +1 -2
  83. package/dist/api/openapi-ts.cjs.map +1 -1
  84. package/dist/api/openapi-ts.mjs +2 -3
  85. package/dist/api/openapi-ts.mjs.map +1 -1
  86. package/dist/api/option-errors.cjs +24 -0
  87. package/dist/api/option-errors.cjs.map +1 -0
  88. package/dist/api/option-errors.mjs +21 -0
  89. package/dist/api/option-errors.mjs.map +1 -0
  90. package/dist/api/ref-limit-options.cjs +58 -0
  91. package/dist/api/ref-limit-options.cjs.map +1 -0
  92. package/dist/api/ref-limit-options.mjs +52 -0
  93. package/dist/api/ref-limit-options.mjs.map +1 -0
  94. package/dist/api/transform-schema.cjs +12 -5
  95. package/dist/api/transform-schema.cjs.map +1 -1
  96. package/dist/api/transform-schema.mjs +12 -5
  97. package/dist/api/transform-schema.mjs.map +1 -1
  98. package/dist/application/transform/declared-value-types.cjs +36 -0
  99. package/dist/application/transform/declared-value-types.cjs.map +1 -0
  100. package/dist/application/transform/declared-value-types.mjs +34 -0
  101. package/dist/application/transform/declared-value-types.mjs.map +1 -0
  102. package/dist/application/transform/document/document.cjs +3 -1
  103. package/dist/application/transform/document/document.cjs.map +1 -1
  104. package/dist/application/transform/document/document.mjs +3 -1
  105. package/dist/application/transform/document/document.mjs.map +1 -1
  106. package/dist/application/transform/document/exploded-query-values.cjs +63 -0
  107. package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
  108. package/dist/application/transform/document/exploded-query-values.mjs +59 -0
  109. package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
  110. package/dist/application/transform/document/header.cjs +11 -3
  111. package/dist/application/transform/document/header.cjs.map +1 -1
  112. package/dist/application/transform/document/header.mjs +10 -2
  113. package/dist/application/transform/document/header.mjs.map +1 -1
  114. package/dist/application/transform/document/parameter.cjs +1 -1
  115. package/dist/application/transform/document/parameter.cjs.map +1 -1
  116. package/dist/application/transform/document/parameter.mjs +1 -1
  117. package/dist/application/transform/document/parameter.mjs.map +1 -1
  118. package/dist/application/transform/document/parameters.cjs +23 -5
  119. package/dist/application/transform/document/parameters.cjs.map +1 -1
  120. package/dist/application/transform/document/parameters.mjs +23 -5
  121. package/dist/application/transform/document/parameters.mjs.map +1 -1
  122. package/dist/application/transform/document/path-item.cjs +4 -3
  123. package/dist/application/transform/document/path-item.cjs.map +1 -1
  124. package/dist/application/transform/document/path-item.mjs +4 -4
  125. package/dist/application/transform/document/path-item.mjs.map +1 -1
  126. package/dist/application/transform/document/path-template-key.cjs +84 -0
  127. package/dist/application/transform/document/path-template-key.cjs.map +1 -0
  128. package/dist/application/transform/document/path-template-key.mjs +79 -0
  129. package/dist/application/transform/document/path-template-key.mjs.map +1 -0
  130. package/dist/application/transform/document/path-template-refs.cjs +80 -0
  131. package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
  132. package/dist/application/transform/document/path-template-refs.mjs +77 -0
  133. package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
  134. package/dist/application/transform/document/paths-enum.cjs +7 -6
  135. package/dist/application/transform/document/paths-enum.cjs.map +1 -1
  136. package/dist/application/transform/document/paths-enum.mjs +7 -6
  137. package/dist/application/transform/document/paths-enum.mjs.map +1 -1
  138. package/dist/application/transform/document/paths.cjs +38 -66
  139. package/dist/application/transform/document/paths.cjs.map +1 -1
  140. package/dist/application/transform/document/paths.mjs +36 -66
  141. package/dist/application/transform/document/paths.mjs.map +1 -1
  142. package/dist/application/transform/document/webhooks.cjs +10 -3
  143. package/dist/application/transform/document/webhooks.cjs.map +1 -1
  144. package/dist/application/transform/document/webhooks.mjs +9 -2
  145. package/dist/application/transform/document/webhooks.mjs.map +1 -1
  146. package/dist/application/transform/footer/document-footer.cjs +6 -3
  147. package/dist/application/transform/footer/document-footer.cjs.map +1 -1
  148. package/dist/application/transform/footer/document-footer.mjs +6 -3
  149. package/dist/application/transform/footer/document-footer.mjs.map +1 -1
  150. package/dist/application/transform/helper-types.cjs +3 -3
  151. package/dist/application/transform/helper-types.cjs.map +1 -1
  152. package/dist/application/transform/helper-types.mjs +3 -3
  153. package/dist/application/transform/helper-types.mjs.map +1 -1
  154. package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
  155. package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
  156. package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
  157. package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
  158. package/dist/application/transform/ref-pointer/generated-shape.cjs +63 -64
  159. package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
  160. package/dist/application/transform/ref-pointer/generated-shape.mjs +57 -53
  161. package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
  162. package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
  163. package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
  164. package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
  165. package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
  166. package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
  167. package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
  168. package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
  169. package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
  170. package/dist/application/transform/ref-pointer/original-index.cjs +69 -14
  171. package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
  172. package/dist/application/transform/ref-pointer/original-index.mjs +71 -16
  173. package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
  174. package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
  175. package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
  176. package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
  177. package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
  178. package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
  179. package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
  180. package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
  181. package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
  182. package/dist/application/transform/ref-pointer/property-shape.cjs +57 -0
  183. package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
  184. package/dist/application/transform/ref-pointer/property-shape.mjs +49 -0
  185. package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
  186. package/dist/application/transform/ref-pointer/typed-walk.cjs +90 -22
  187. package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
  188. package/dist/application/transform/ref-pointer/typed-walk.mjs +87 -19
  189. package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
  190. package/dist/application/transform/schema/access-flags.cjs.map +1 -1
  191. package/dist/application/transform/schema/access-flags.mjs.map +1 -1
  192. package/dist/application/transform/schema/index-signature-type.cjs +21 -0
  193. package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
  194. package/dist/application/transform/schema/index-signature-type.mjs +19 -0
  195. package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
  196. package/dist/application/transform/schema/input-location.cjs +23 -0
  197. package/dist/application/transform/schema/input-location.cjs.map +1 -0
  198. package/dist/application/transform/schema/input-location.mjs +21 -0
  199. package/dist/application/transform/schema/input-location.mjs.map +1 -0
  200. package/dist/application/transform/schema/object-type.cjs +15 -5
  201. package/dist/application/transform/schema/object-type.cjs.map +1 -1
  202. package/dist/application/transform/schema/object-type.mjs +15 -5
  203. package/dist/application/transform/schema/object-type.mjs.map +1 -1
  204. package/dist/application/transform/schema/schema-transform.cjs +2 -1
  205. package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
  206. package/dist/application/transform/schema/schema-transform.mjs +2 -1
  207. package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
  208. package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
  209. package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
  210. package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
  211. package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
  212. package/dist/cli/api-logger.cjs +13 -0
  213. package/dist/cli/api-logger.cjs.map +1 -0
  214. package/dist/cli/api-logger.mjs +11 -0
  215. package/dist/cli/api-logger.mjs.map +1 -0
  216. package/dist/cli/api-settings.cjs +10 -17
  217. package/dist/cli/api-settings.cjs.map +1 -1
  218. package/dist/cli/api-settings.mjs +10 -17
  219. package/dist/cli/api-settings.mjs.map +1 -1
  220. package/dist/cli/api-writes.cjs +7 -1
  221. package/dist/cli/api-writes.cjs.map +1 -1
  222. package/dist/cli/api-writes.mjs +7 -1
  223. package/dist/cli/api-writes.mjs.map +1 -1
  224. package/dist/cli/cli-arguments.cjs +32 -74
  225. package/dist/cli/cli-arguments.cjs.map +1 -1
  226. package/dist/cli/cli-arguments.mjs +28 -70
  227. package/dist/cli/cli-arguments.mjs.map +1 -1
  228. package/dist/cli/cli-errors.cjs +18 -0
  229. package/dist/cli/cli-errors.cjs.map +1 -1
  230. package/dist/cli/cli-errors.mjs +18 -1
  231. package/dist/cli/cli-errors.mjs.map +1 -1
  232. package/dist/cli/cli-flag-names.cjs +77 -0
  233. package/dist/cli/cli-flag-names.cjs.map +1 -0
  234. package/dist/cli/cli-flag-names.mjs +64 -0
  235. package/dist/cli/cli-flag-names.mjs.map +1 -0
  236. package/dist/cli/cli-output.cjs +13 -6
  237. package/dist/cli/cli-output.cjs.map +1 -1
  238. package/dist/cli/cli-output.mjs +14 -7
  239. package/dist/cli/cli-output.mjs.map +1 -1
  240. package/dist/cli/main.cjs +11 -5
  241. package/dist/cli/main.cjs.map +1 -1
  242. package/dist/cli/main.mjs +11 -5
  243. package/dist/cli/main.mjs.map +1 -1
  244. package/dist/cli/redocly-apis.cjs +33 -12
  245. package/dist/cli/redocly-apis.cjs.map +1 -1
  246. package/dist/cli/redocly-apis.mjs +35 -14
  247. package/dist/cli/redocly-apis.mjs.map +1 -1
  248. package/dist/cli/ref-limits.cjs +15 -1
  249. package/dist/cli/ref-limits.cjs.map +1 -1
  250. package/dist/cli/ref-limits.mjs +15 -2
  251. package/dist/cli/ref-limits.mjs.map +1 -1
  252. package/dist/cli/run-cli.cjs +24 -7
  253. package/dist/cli/run-cli.cjs.map +1 -1
  254. package/dist/cli/run-cli.mjs +25 -8
  255. package/dist/cli/run-cli.mjs.map +1 -1
  256. package/dist/cli/written-flags.cjs +83 -0
  257. package/dist/cli/written-flags.cjs.map +1 -0
  258. package/dist/cli/written-flags.mjs +77 -0
  259. package/dist/cli/written-flags.mjs.map +1 -0
  260. package/dist/domain/cause-secrets.cjs +31 -16
  261. package/dist/domain/cause-secrets.cjs.map +1 -1
  262. package/dist/domain/cause-secrets.mjs +31 -16
  263. package/dist/domain/cause-secrets.mjs.map +1 -1
  264. package/dist/domain/errors.cjs +3 -0
  265. package/dist/domain/errors.cjs.map +1 -1
  266. package/dist/domain/errors.mjs +3 -0
  267. package/dist/domain/errors.mjs.map +1 -1
  268. package/dist/domain/location-text.cjs +15 -0
  269. package/dist/domain/location-text.cjs.map +1 -0
  270. package/dist/domain/location-text.mjs +13 -0
  271. package/dist/domain/location-text.mjs.map +1 -0
  272. package/dist/domain/openapi/document-places.cjs +55 -0
  273. package/dist/domain/openapi/document-places.cjs.map +1 -0
  274. package/dist/domain/openapi/document-places.mjs +53 -0
  275. package/dist/domain/openapi/document-places.mjs.map +1 -0
  276. package/dist/domain/output-fixes.cjs +8 -2
  277. package/dist/domain/output-fixes.cjs.map +1 -1
  278. package/dist/domain/output-fixes.mjs +8 -2
  279. package/dist/domain/output-fixes.mjs.map +1 -1
  280. package/dist/domain/terminal-text.cjs +31 -0
  281. package/dist/domain/terminal-text.cjs.map +1 -0
  282. package/dist/domain/terminal-text.mjs +29 -0
  283. package/dist/domain/terminal-text.mjs.map +1 -0
  284. package/dist/domain/warnings.cjs +1 -0
  285. package/dist/domain/warnings.cjs.map +1 -1
  286. package/dist/domain/warnings.mjs +1 -0
  287. package/dist/domain/warnings.mjs.map +1 -1
  288. package/dist/index.d.cts +29 -18
  289. package/dist/index.d.mts +29 -18
  290. package/dist/index.d.ts +29 -18
  291. package/package.json +1 -1
  292. package/src/adapters/node-file-system/node-file-system.ts +14 -1
  293. package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
  294. package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
  295. package/src/adapters/redocly-loader/component-schemas.ts +19 -0
  296. package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
  297. package/src/adapters/redocly-loader/query-document-names.ts +79 -0
  298. package/src/adapters/redocly-loader/query-named-components.ts +200 -0
  299. package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
  300. package/src/adapters/redocly-loader/redocly-schema-loader.ts +63 -17
  301. package/src/adapters/redocly-loader/ref-access.ts +32 -5
  302. package/src/adapters/redocly-loader/ref-holders.ts +75 -14
  303. package/src/adapters/redocly-loader/remote-fetch.ts +37 -2
  304. package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
  305. package/src/adapters/redocly-loader/schema-source.ts +15 -3
  306. package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
  307. package/src/api/cwd-option.ts +76 -0
  308. package/src/api/default-ports.ts +33 -10
  309. package/src/api/document-refs.ts +29 -1
  310. package/src/api/document-run.ts +7 -32
  311. package/src/api/legacy-utils.ts +1 -1
  312. package/src/api/openapi-ts.ts +20 -4
  313. package/src/api/option-errors.ts +22 -0
  314. package/src/api/ref-limit-options.ts +69 -0
  315. package/src/api/transform-schema.ts +20 -5
  316. package/src/application/ports/file-system.ts +8 -0
  317. package/src/application/ports/redocly-config-source.ts +5 -0
  318. package/src/application/transform/declared-value-types.ts +42 -0
  319. package/src/application/transform/document/document.ts +4 -2
  320. package/src/application/transform/document/exploded-query-values.ts +88 -0
  321. package/src/application/transform/document/header.ts +25 -5
  322. package/src/application/transform/document/parameter.ts +4 -4
  323. package/src/application/transform/document/parameters.ts +45 -10
  324. package/src/application/transform/document/path-item.ts +3 -3
  325. package/src/application/transform/document/path-template-key.ts +152 -0
  326. package/src/application/transform/document/path-template-refs.ts +127 -0
  327. package/src/application/transform/document/paths-enum.ts +23 -9
  328. package/src/application/transform/document/paths.ts +53 -123
  329. package/src/application/transform/document/webhooks.ts +18 -5
  330. package/src/application/transform/footer/document-footer.ts +18 -8
  331. package/src/application/transform/helper-types.ts +4 -4
  332. package/src/application/transform/ref-pointer/generated-location.ts +1 -1
  333. package/src/application/transform/ref-pointer/generated-shape.ts +115 -83
  334. package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
  335. package/src/application/transform/ref-pointer/located-node.ts +38 -0
  336. package/src/application/transform/ref-pointer/original-index.ts +106 -20
  337. package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
  338. package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
  339. package/src/application/transform/ref-pointer/property-shape.ts +106 -0
  340. package/src/application/transform/ref-pointer/typed-walk.ts +143 -29
  341. package/src/application/transform/schema/access-flags.ts +5 -2
  342. package/src/application/transform/schema/index-signature-type.ts +31 -0
  343. package/src/application/transform/schema/input-location.ts +35 -0
  344. package/src/application/transform/schema/object-type.ts +18 -8
  345. package/src/application/transform/schema/schema-transform.ts +2 -1
  346. package/src/application/transform/schema/unevaluated-properties.ts +4 -44
  347. package/src/cli/api-logger.ts +17 -0
  348. package/src/cli/api-settings.ts +12 -20
  349. package/src/cli/api-writes.ts +11 -3
  350. package/src/cli/cli-arguments.ts +57 -92
  351. package/src/cli/cli-dependencies.ts +7 -2
  352. package/src/cli/cli-errors.ts +23 -0
  353. package/src/cli/cli-flag-names.ts +99 -0
  354. package/src/cli/cli-output.ts +31 -16
  355. package/src/cli/main.ts +12 -5
  356. package/src/cli/redocly-apis.ts +56 -20
  357. package/src/cli/ref-limits.ts +21 -2
  358. package/src/cli/run-cli.ts +39 -7
  359. package/src/cli/written-flags.ts +131 -0
  360. package/src/domain/cause-secrets.ts +59 -25
  361. package/src/domain/errors.ts +3 -0
  362. package/src/domain/location-text.ts +27 -0
  363. package/src/domain/openapi/document-places.ts +78 -0
  364. package/src/domain/output-fixes.ts +9 -2
  365. package/src/domain/terminal-text.ts +44 -0
  366. package/src/domain/warnings.ts +1 -0
@@ -1,22 +1,12 @@
1
1
  import { isRawBinarySchema } from '../../../domain/openapi/binary-content.mjs';
2
+ import { followLocated, isJsonObject, childLocation } from './located-node.mjs';
3
+ import { isNullableSchema, isExcludedProperty, isOptionalProperty, isMarkedProperty, hasKeptProperties } from './property-shape.mjs';
2
4
 
3
5
  const OPAQUE_KEYS = ["not", "enum", "const", "$ref"];
4
6
  const MAX_DEPTH = 8;
5
7
  const INDEX_RE = /^\d+$/;
6
8
  const MISSING = { kind: "missing" };
7
9
  const OPAQUE = { kind: "opaque" };
8
- function isJsonObject(value) {
9
- return typeof value === "object" && value !== null && !Array.isArray(value);
10
- }
11
- function followRefs(node, refs) {
12
- return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
13
- }
14
- function isNullableSchema(node) {
15
- if (!isJsonObject(node)) {
16
- return false;
17
- }
18
- return node.nullable === true || Array.isArray(node.type) && node.type.includes("null");
19
- }
20
10
  function typeNames(node) {
21
11
  return Array.isArray(node.type) ? node.type : [node.type];
22
12
  }
@@ -42,52 +32,65 @@ function emptyObjectMember(node, options) {
42
32
  function isBuiltInMember(key, prototype) {
43
33
  return key in prototype;
44
34
  }
45
- function indexMember(node, options) {
46
- const { additionalProperties: values, patternProperties: patterns } = node;
47
- if (isJsonObject(patterns) && Object.keys(patterns).length > 0) {
48
- return OPAQUE;
35
+ function isUnknownValue(value) {
36
+ return value === true || isJsonObject(value) && Object.keys(value).length === 0;
37
+ }
38
+ function typedIndexValues(owner) {
39
+ const { additionalProperties: values, patternProperties: patterns } = owner.node;
40
+ const located = [];
41
+ if (isJsonObject(values)) {
42
+ located.push({ node: values, location: childLocation(owner.location, "additionalProperties") });
49
43
  }
50
- if (isJsonObject(values) && Object.keys(values).length > 0) {
51
- return { kind: "index", node: values };
44
+ for (const [pattern, node] of isJsonObject(patterns) ? Object.entries(patterns) : []) {
45
+ located.push({ node, location: childLocation(owner.location, "patternProperties", pattern) });
52
46
  }
53
- const isImplicit = values === true || isJsonObject(values) && Object.keys(values).length === 0;
54
- return isImplicit || !values && options.additionalProperties ? { kind: "index", node: void 0 } : null;
47
+ return located;
55
48
  }
56
- function isOptionalProperty(node, key, options) {
57
- const required = Array.isArray(node.required) ? node.required : void 0;
58
- const property = node.properties[key];
59
- const hasDefault = isJsonObject(property) && property.default !== void 0;
60
- const isRequired = required?.includes(key) === true || required === void 0 && options.propertiesRequiredByDefault || hasDefault && options.defaultNonNullable;
61
- return !isRequired;
49
+ function indexMember(owner, isExcludedKey, input) {
50
+ const { additionalProperties: values, patternProperties: patterns } = owner.node;
51
+ const patternValues = isJsonObject(patterns) ? Object.values(patterns) : [];
52
+ const isUnknown = isUnknownValue(values) || patternValues.some(isUnknownValue) || !values && input.options.additionalProperties;
53
+ if (isUnknown) {
54
+ return { kind: "index", node: void 0, location: void 0, isOtherType: isExcludedKey };
55
+ }
56
+ const typed = typedIndexValues(owner);
57
+ const [only] = typed;
58
+ if (only === void 0 || typed.length > 1) {
59
+ return only === void 0 ? null : OPAQUE;
60
+ }
61
+ const isOtherType = isExcludedKey || hasKeptProperties(owner.node, input.options, input.refs);
62
+ return { kind: "index", ...only, isOtherType };
62
63
  }
63
- function objectMember(node, key, options) {
64
+ function objectMember(owner, key, input) {
65
+ const { options } = input;
66
+ const { node } = owner;
64
67
  const properties = isJsonObject(node.properties) ? node.properties : {};
65
- if (Object.hasOwn(properties, key)) {
66
- const property = properties[key];
67
- const isExcluded = options.excludeDeprecated && isJsonObject(property) && property.deprecated;
68
- return isExcluded || isJsonObject(node.discriminator) ? OPAQUE : { kind: "property", node: property, isOptional: isOptionalProperty(node, key, options) };
68
+ const isExcludedKey = Object.hasOwn(properties, key) && isExcludedProperty(properties[key], options, input.refs);
69
+ if (Object.hasOwn(properties, key) && !isExcludedKey) {
70
+ if (isJsonObject(node.discriminator)) {
71
+ return OPAQUE;
72
+ }
73
+ const location = childLocation(owner.location, "properties", key);
74
+ const isOptional = isOptionalProperty(owner, key, options);
75
+ const isMarked = isMarkedProperty(properties[key], options, input.refs);
76
+ return { kind: "property", node: properties[key], location, isOptional, isMarked };
69
77
  }
70
78
  const isUnknownShape = isJsonObject(node.discriminator) || node.unevaluatedProperties !== void 0;
71
79
  if (isBuiltInMember(key, {}) || key === "$defs" || isUnknownShape) {
72
80
  return OPAQUE;
73
81
  }
74
- return hasObjectKeywords(node) ? indexMember(node, options) ?? MISSING : emptyObjectMember(node, options);
75
- }
76
- function schemaPresence(schema, refs) {
77
- return isNullableSchema(followRefs(schema, refs)) ? "absent" : "present";
78
- }
79
- function propertyPresence(schema, key, options, refs) {
80
- const node = followRefs(schema, refs);
81
- const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};
82
- if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {
83
- return "unknown";
84
- }
85
- return isOptionalProperty(node, key, options) ? "absent" : schemaPresence(properties[key], refs);
82
+ return hasObjectKeywords(node) ? indexMember(owner, isExcludedKey, input) ?? MISSING : emptyObjectMember(node, options);
86
83
  }
87
84
  function membersOf(node, keyword) {
88
85
  const members = node[keyword];
89
86
  return Array.isArray(members) ? members : [];
90
87
  }
88
+ function locatedMembers(owner, keyword) {
89
+ return membersOf(owner.node, keyword).map((node, index) => ({
90
+ node,
91
+ location: childLocation(owner.location, keyword, String(index))
92
+ }));
93
+ }
91
94
  function withoutComposition(node) {
92
95
  const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;
93
96
  return own;
@@ -95,8 +98,9 @@ function withoutComposition(node) {
95
98
  function hasOwnObjectType(own) {
96
99
  return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));
97
100
  }
98
- function composedMember(node, key, input) {
99
- const variants = [...membersOf(node, "anyOf"), ...membersOf(node, "oneOf")];
101
+ function composedMember(owner, key, input) {
102
+ const { node } = owner;
103
+ const variants = [...locatedMembers(owner, "anyOf"), ...locatedMembers(owner, "oneOf")];
100
104
  const own = withoutComposition(node);
101
105
  const hasOwn = hasOwnObjectType(own);
102
106
  if (variants.length > 0) {
@@ -104,7 +108,8 @@ function composedMember(node, key, input) {
104
108
  const members = variants.map((variant) => memberAt(variant, key, input));
105
109
  return isAlone && members.some((member) => member.kind === "missing") ? MISSING : OPAQUE;
106
110
  }
107
- const parts = [...membersOf(node, "allOf"), ...hasOwn ? [own] : []];
111
+ const ownPart = { node: own, location: owner.location };
112
+ const parts = [...locatedMembers(owner, "allOf"), ...hasOwn ? [ownPart] : []];
108
113
  return intersectionMember(parts.map((part) => memberAt(part, key, input)));
109
114
  }
110
115
  function isUnknownIndex(member) {
@@ -120,21 +125,20 @@ function intersectionMember(members) {
120
125
  return typed.length === 1 && only.kind !== "opaque" ? only : OPAQUE;
121
126
  }
122
127
  function memberAt(schema, key, input) {
123
- const node = followRefs(schema, input.refs);
128
+ const followed = followLocated(schema, input.refs);
129
+ const { node } = followed;
124
130
  if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {
125
131
  return OPAQUE;
126
132
  }
133
+ const owner = { ...followed, node };
127
134
  if (isNullableSchema(node)) {
128
135
  return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;
129
136
  }
130
- if (input.options.readWriteMarkers) {
131
- return OPAQUE;
132
- }
133
137
  if ("allOf" in node || "anyOf" in node || "oneOf" in node) {
134
- return composedMember(node, key, { ...input, depth: input.depth + 1 });
138
+ return composedMember(owner, key, { ...input, depth: input.depth + 1 });
135
139
  }
136
140
  if (isObjectShape(node)) {
137
- return objectMember(node, key, input.options);
141
+ return objectMember(owner, key, input);
138
142
  }
139
143
  if (isArrayShape(node)) {
140
144
  return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;
@@ -158,5 +162,5 @@ function generatedMember(schema, key, options, refs) {
158
162
  return memberAt(schema, key, { options, refs, depth: 0 });
159
163
  }
160
164
 
161
- export { followRefs, generatedMember, isArrayShape, isJsonObject, isNullableSchema, isObjectShape, propertyPresence, schemaPresence };
165
+ export { generatedMember, isArrayShape, isObjectShape };
162
166
  //# sourceMappingURL=generated-shape.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"generated-shape.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-shape.ts"],"sourcesContent":["import { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\n\n/**\n * What the generated type of a schema has under a key, read from the schema itself. It answers the\n * question TypeScript answers when it checks `T[\"key\"]`, for the schema shapes where the answer is\n * sure; for every other shape it says `opaque`, so a caller never assumes an error that is not.\n */\n\nexport type GeneratedMember =\n | { readonly kind: \"property\"; readonly node: unknown; readonly isOptional: boolean }\n /** An index signature; `node` is undefined when its value type is `unknown`. */\n | { readonly kind: \"index\"; readonly node: unknown }\n | { readonly kind: \"missing\" }\n | { readonly kind: \"opaque\" };\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst OPAQUE_KEYS = [\"not\", \"enum\", \"const\", \"$ref\"] as const;\n/** How deep `allOf`/`anyOf`/`oneOf` members are read; deeper shapes count as opaque. */\nconst MAX_DEPTH = 8;\nconst INDEX_RE = /^\\d+$/;\nconst MISSING: GeneratedMember = { kind: \"missing\" };\nconst OPAQUE: GeneratedMember = { kind: \"opaque\" };\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `nullable: true` or a `type` list with `null`: the generated type includes `null`. */\nexport function isNullableSchema(node: unknown): boolean {\n if (!isJsonObject(node)) {\n return false;\n }\n return node.nullable === true || (Array.isArray(node.type) && node.type.includes(\"null\"));\n}\n\nfunction typeNames(node: JsonObject): readonly unknown[] {\n return Array.isArray(node.type) ? node.type : [node.type];\n}\n\n/**\n * Whether the generated type is an object. One `type` name decides alone: `type: string` with\n * `properties` or `items` is `string`, as `coreType` matches the `type` before the keywords.\n */\nexport function isObjectShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"object\";\n }\n return (\n typeNames(node).includes(\"object\") ||\n \"properties\" in node ||\n \"additionalProperties\" in node ||\n \"patternProperties\" in node\n );\n}\n\n/** Whether the generated type is an array; one `type` name decides alone (`isObjectShape`). */\nexport function isArrayShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"array\";\n }\n return typeNames(node).includes(\"array\") || \"items\" in node;\n}\n\n/** Whether `objectType` writes a type for the schema; the same test as there. */\nfunction hasObjectKeywords(node: JsonObject): boolean {\n const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;\n return (\n hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs)\n );\n}\n\n/**\n * A key of an object schema without object keywords. With a `type` it is `Record<string, never>`:\n * every key is `never`, and so is every key after it (or `unknown` with `--empty-objects-unknown`,\n * which has no key). Without a `type` it is `unknown`.\n */\nfunction emptyObjectMember(node: JsonObject, options: SchemaOptions): GeneratedMember {\n return node.type !== undefined && !options.emptyObjectsUnknown ? OPAQUE : MISSING;\n}\n\n/** Whether a key the object has no property for is still a member: `toString`, `length`, `0`. */\nfunction isBuiltInMember(key: string, prototype: object): boolean {\n return key in prototype;\n}\n\nfunction indexMember(node: JsonObject, options: SchemaOptions): GeneratedMember | null {\n const { additionalProperties: values, patternProperties: patterns } = node;\n if (isJsonObject(patterns) && Object.keys(patterns).length > 0) {\n return OPAQUE;\n }\n if (isJsonObject(values) && Object.keys(values).length > 0) {\n return { kind: \"index\", node: values };\n }\n const isImplicit = values === true || (isJsonObject(values) && Object.keys(values).length === 0);\n return isImplicit || (!values && options.additionalProperties)\n ? { kind: \"index\", node: undefined }\n : null;\n}\n\nfunction isOptionalProperty(node: JsonObject, key: string, options: SchemaOptions): boolean {\n const required = Array.isArray(node.required) ? node.required : undefined;\n const property = (node.properties as JsonObject)[key];\n const hasDefault = isJsonObject(property) && property.default !== undefined;\n const isRequired =\n required?.includes(key) === true ||\n (required === undefined && options.propertiesRequiredByDefault) ||\n (hasDefault && options.defaultNonNullable);\n return !isRequired;\n}\n\nfunction objectMember(node: JsonObject, key: string, options: SchemaOptions): GeneratedMember {\n const properties = isJsonObject(node.properties) ? node.properties : {};\n if (Object.hasOwn(properties, key)) {\n const property = properties[key];\n const isExcluded = options.excludeDeprecated && isJsonObject(property) && property.deprecated;\n return isExcluded || isJsonObject(node.discriminator)\n ? OPAQUE\n : { kind: \"property\", node: property, isOptional: isOptionalProperty(node, key, options) };\n }\n // `unevaluatedProperties` adds an index signature with its fix, so it counts as opaque too.\n const isUnknownShape =\n isJsonObject(node.discriminator) || node.unevaluatedProperties !== undefined;\n if (isBuiltInMember(key, {}) || key === \"$defs\" || isUnknownShape) {\n return OPAQUE;\n }\n return hasObjectKeywords(node)\n ? (indexMember(node, options) ?? MISSING)\n : emptyObjectMember(node, options);\n}\n\n/** Whether a value is there: `present`, `absent` (may be `undefined` or `null`) or `unknown`. */\nexport type Presence = \"present\" | \"absent\" | \"unknown\";\n\n/** The presence of a value of `schema` itself: `absent` when its type includes `null`. */\nexport function schemaPresence(schema: unknown, refs: RefResolver): Presence {\n return isNullableSchema(followRefs(schema, refs)) ? \"absent\" : \"present\";\n}\n\n/** The presence of property `key` of `schema`: optional or nullable is `absent`. */\nexport function propertyPresence(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): Presence {\n const node = followRefs(schema, refs);\n const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};\n if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {\n return \"unknown\";\n }\n return isOptionalProperty(node, key, options) ? \"absent\" : schemaPresence(properties[key], refs);\n}\n\nfunction membersOf(node: JsonObject, keyword: string): readonly unknown[] {\n const members = node[keyword];\n return Array.isArray(members) ? members : [];\n}\n\nfunction withoutComposition(node: JsonObject): JsonObject {\n const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;\n return own;\n}\n\n/** Own keywords without an object type of their own (`properties: {}`) add no part. */\nfunction hasOwnObjectType(own: JsonObject): boolean {\n return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));\n}\n\n/**\n * `allOf` with own keywords is an intersection (`intersectionMember`).\n * `anyOf` or `oneOf` alone is a union: a key is missing if one member misses it. A mix of both\n * is written in more than one way (`anyof-properties`), so it counts as opaque.\n */\nfunction composedMember(node: JsonObject, key: string, input: MemberInput): GeneratedMember {\n const variants = [...membersOf(node, \"anyOf\"), ...membersOf(node, \"oneOf\")];\n const own = withoutComposition(node);\n const hasOwn = hasOwnObjectType(own);\n if (variants.length > 0) {\n const isAlone = membersOf(node, \"allOf\").length === 0 && !hasOwn;\n const members = variants.map((variant) => memberAt(variant, key, input));\n return isAlone && members.some((member) => member.kind === \"missing\") ? MISSING : OPAQUE;\n }\n const parts = [...membersOf(node, \"allOf\"), ...(hasOwn ? [own] : [])];\n return intersectionMember(parts.map((part) => memberAt(part, key, input)));\n}\n\nfunction isUnknownIndex(member: GeneratedMember): boolean {\n return member.kind === \"index\" && member.node === undefined;\n}\n\n/**\n * A key of an intersection: missing if every part misses it; the part's member if only one part\n * has it (`A & B` where `B` has no such key and no index signature); else opaque. A part's\n * `[key: string]: unknown` adds nothing (`unknown & T` is `T`), and only such parts give `unknown`.\n */\nfunction intersectionMember(members: readonly GeneratedMember[]): GeneratedMember {\n const found = members.filter((member) => member.kind !== \"missing\");\n const typed = found.filter((member) => !isUnknownIndex(member));\n const [only] = typed;\n if (only === undefined) {\n return found[0] ?? MISSING;\n }\n return typed.length === 1 && only.kind !== \"opaque\" ? only : OPAQUE;\n}\n\ninterface MemberInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n readonly depth: number;\n}\n\nfunction memberAt(schema: unknown, key: string, input: MemberInput): GeneratedMember {\n const node = followRefs(schema, input.refs);\n if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {\n return OPAQUE;\n }\n if (isNullableSchema(node)) {\n // Every key of `T | null` is an error, unless `T` is unknown (then the type is `unknown`).\n return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;\n }\n if (input.options.readWriteMarkers) {\n return OPAQUE;\n }\n if (\"allOf\" in node || \"anyOf\" in node || \"oneOf\" in node) {\n return composedMember(node, key, { ...input, depth: input.depth + 1 });\n }\n if (isObjectShape(node)) {\n return objectMember(node, key, input.options);\n }\n if (isArrayShape(node)) {\n return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;\n }\n // `--binary-as-blob` types raw binary strings as `Blob`, which has members of its own.\n return input.options.binaryAsBlob && isRawBinarySchema(node as never)\n ? OPAQUE\n : primitiveMember(node, key);\n}\n\n/** The JavaScript value whose members a primitive `type` has: `\"\".length`, `(0).toFixed`. */\nconst PRIMITIVE_PROTOTYPES: Readonly<Record<string, object>> = {\n string: String.prototype,\n number: Number.prototype,\n integer: Number.prototype,\n boolean: Boolean.prototype,\n};\n\n/**\n * A key of a schema with one primitive `type`: missing unless the primitive has it. Object and\n * array keywords next to that `type` do not change the type (`isObjectShape`). Without a `type`\n * and object keywords the schema is `unknown` (`objectType` writes nothing), which has no keys.\n */\nfunction primitiveMember(node: JsonObject, key: string): GeneratedMember {\n if (node.type === undefined) {\n return hasObjectKeywords(node) ? OPAQUE : MISSING;\n }\n const prototype = typeof node.type === \"string\" ? PRIMITIVE_PROTOTYPES[node.type] : undefined;\n return prototype !== undefined && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;\n}\n\n/** The member `key` of the type generated for `schema` (a `$ref` is followed first). */\nexport function generatedMember(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): GeneratedMember {\n return memberAt(schema, key, { options, refs, depth: 0 });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generated-shape.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-shape.ts"],"sourcesContent":["import { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n childLocation,\n followLocated,\n isJsonObject,\n type JsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\nimport {\n hasKeptProperties,\n isExcludedProperty,\n isMarkedProperty,\n isNullableSchema,\n isOptionalProperty,\n} from \"./property-shape.js\";\n\n/**\n * What the generated type of a schema has under a key, read from the schema itself. It answers the\n * question TypeScript answers when it checks `T[\"key\"]`, for the schema shapes where the answer is\n * sure; for every other shape it says `opaque`, so a caller never assumes an error that is not.\n */\n\nexport type GeneratedMember =\n | {\n readonly kind: \"property\";\n readonly node: unknown;\n readonly location: string | undefined;\n readonly isOptional: boolean;\n /** `$Read<T>` or `$Write<T>` (`isMarkedProperty`): no member but the marker's own. */\n readonly isMarked: boolean;\n }\n /**\n * An index signature; `node` is undefined when its value type is `unknown`. `isOtherType`: the\n * type read is not the type of the node the key names (`indexMember`).\n */\n | {\n readonly kind: \"index\";\n readonly node: unknown;\n readonly location: string | undefined;\n readonly isOtherType: boolean;\n }\n | { readonly kind: \"missing\" }\n | { readonly kind: \"opaque\" };\n\nconst OPAQUE_KEYS = [\"not\", \"enum\", \"const\", \"$ref\"] as const;\n/** How deep `allOf`/`anyOf`/`oneOf` members are read; deeper shapes count as opaque. */\nconst MAX_DEPTH = 8;\nconst INDEX_RE = /^\\d+$/;\nconst MISSING: GeneratedMember = { kind: \"missing\" };\nconst OPAQUE: GeneratedMember = { kind: \"opaque\" };\n\nfunction typeNames(node: JsonObject): readonly unknown[] {\n return Array.isArray(node.type) ? node.type : [node.type];\n}\n\n/**\n * Whether the generated type is an object. One `type` name decides alone: `type: string` with\n * `properties` or `items` is `string`, as `coreType` matches the `type` before the keywords.\n */\nexport function isObjectShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"object\";\n }\n return (\n typeNames(node).includes(\"object\") ||\n \"properties\" in node ||\n \"additionalProperties\" in node ||\n \"patternProperties\" in node\n );\n}\n\n/** Whether the generated type is an array; one `type` name decides alone (`isObjectShape`). */\nexport function isArrayShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"array\";\n }\n return typeNames(node).includes(\"array\") || \"items\" in node;\n}\n\n/** Whether `objectType` writes a type for the schema; the same test as there. */\nfunction hasObjectKeywords(node: JsonObject): boolean {\n const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;\n return (\n hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs)\n );\n}\n\n/**\n * A key of an object schema without object keywords. With a `type` it is `Record<string, never>`:\n * every key is `never`, and so is every key after it (or `unknown` with `--empty-objects-unknown`,\n * which has no key). Without a `type` it is `unknown`.\n */\nfunction emptyObjectMember(node: JsonObject, options: SchemaOptions): GeneratedMember {\n return node.type !== undefined && !options.emptyObjectsUnknown ? OPAQUE : MISSING;\n}\n\n/** Whether a key the object has no property for is still a member: `toString`, `length`, `0`. */\nfunction isBuiltInMember(key: string, prototype: object): boolean {\n return key in prototype;\n}\n\n/** `additionalProperties: true` or `{}` (also as a pattern's schema): a value of `unknown`. */\nfunction isUnknownValue(value: unknown): boolean {\n return value === true || (isJsonObject(value) && Object.keys(value).length === 0);\n}\n\n/** The value schemas of an index signature none of whose values is `unknown`, located. */\nfunction typedIndexValues(owner: LocatedNode & { node: JsonObject }): LocatedNode[] {\n const { additionalProperties: values, patternProperties: patterns } = owner.node;\n const located: LocatedNode[] = [];\n if (isJsonObject(values)) {\n located.push({ node: values, location: childLocation(owner.location, \"additionalProperties\") });\n }\n for (const [pattern, node] of isJsonObject(patterns) ? Object.entries(patterns) : []) {\n located.push({ node, location: childLocation(owner.location, \"patternProperties\", pattern) });\n }\n return located;\n}\n\n/**\n * The index signature of an object schema, or null without one. Its type is the union of its\n * value schemas' types (`unknown` if one is `unknown`); a union of several counts as opaque. It\n * also holds the kept property types (`withPropertyTypes`), and a key that names a property\n * `--exclude-deprecated` left out reads it instead of that property: both are `isOtherType`.\n */\nfunction indexMember(\n owner: LocatedNode & { node: JsonObject },\n isExcludedKey: boolean,\n input: MemberInput,\n): GeneratedMember | null {\n const { additionalProperties: values, patternProperties: patterns } = owner.node;\n const patternValues = isJsonObject(patterns) ? Object.values(patterns) : [];\n const isUnknown =\n isUnknownValue(values) ||\n patternValues.some(isUnknownValue) ||\n (!values && input.options.additionalProperties);\n if (isUnknown) {\n return { kind: \"index\", node: undefined, location: undefined, isOtherType: isExcludedKey };\n }\n const typed = typedIndexValues(owner);\n const [only] = typed;\n if (only === undefined || typed.length > 1) {\n return only === undefined ? null : OPAQUE;\n }\n const isOtherType = isExcludedKey || hasKeptProperties(owner.node, input.options, input.refs);\n return { kind: \"index\", ...only, isOtherType };\n}\n\nfunction objectMember(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n input: MemberInput,\n): GeneratedMember {\n const { options } = input;\n const { node } = owner;\n const properties = isJsonObject(node.properties) ? node.properties : {};\n const isExcludedKey =\n Object.hasOwn(properties, key) && isExcludedProperty(properties[key], options, input.refs);\n if (Object.hasOwn(properties, key) && !isExcludedKey) {\n if (isJsonObject(node.discriminator)) {\n return OPAQUE;\n }\n const location = childLocation(owner.location, \"properties\", key);\n const isOptional = isOptionalProperty(owner, key, options);\n const isMarked = isMarkedProperty(properties[key], options, input.refs);\n return { kind: \"property\", node: properties[key], location, isOptional, isMarked };\n }\n // `unevaluatedProperties` adds an index signature with its fix, so it counts as opaque too.\n const isUnknownShape =\n isJsonObject(node.discriminator) || node.unevaluatedProperties !== undefined;\n if (isBuiltInMember(key, {}) || key === \"$defs\" || isUnknownShape) {\n return OPAQUE;\n }\n return hasObjectKeywords(node)\n ? (indexMember(owner, isExcludedKey, input) ?? MISSING)\n : emptyObjectMember(node, options);\n}\n\nfunction membersOf(node: JsonObject, keyword: string): readonly unknown[] {\n const members = node[keyword];\n return Array.isArray(members) ? members : [];\n}\n\n/** The members of a composition keyword with their locations. */\nfunction locatedMembers(owner: LocatedNode & { node: JsonObject }, keyword: string): LocatedNode[] {\n return membersOf(owner.node, keyword).map((node, index) => ({\n node,\n location: childLocation(owner.location, keyword, String(index)),\n }));\n}\n\nfunction withoutComposition(node: JsonObject): JsonObject {\n const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;\n return own;\n}\n\n/** Own keywords without an object type of their own (`properties: {}`) add no part. */\nfunction hasOwnObjectType(own: JsonObject): boolean {\n return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));\n}\n\n/**\n * `allOf` with own keywords is an intersection (`intersectionMember`).\n * `anyOf` or `oneOf` alone is a union: a key is missing if one member misses it. A mix of both\n * is written in more than one way (`anyof-properties`), so it counts as opaque.\n */\nfunction composedMember(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n input: MemberInput,\n): GeneratedMember {\n const { node } = owner;\n const variants = [...locatedMembers(owner, \"anyOf\"), ...locatedMembers(owner, \"oneOf\")];\n const own = withoutComposition(node);\n const hasOwn = hasOwnObjectType(own);\n if (variants.length > 0) {\n const isAlone = membersOf(node, \"allOf\").length === 0 && !hasOwn;\n const members = variants.map((variant) => memberAt(variant, key, input));\n return isAlone && members.some((member) => member.kind === \"missing\") ? MISSING : OPAQUE;\n }\n const ownPart = { node: own, location: owner.location };\n const parts = [...locatedMembers(owner, \"allOf\"), ...(hasOwn ? [ownPart] : [])];\n return intersectionMember(parts.map((part) => memberAt(part, key, input)));\n}\n\nfunction isUnknownIndex(member: GeneratedMember): boolean {\n return member.kind === \"index\" && member.node === undefined;\n}\n\n/**\n * A key of an intersection: missing if every part misses it; the part's member if only one part\n * has it (`A & B` where `B` has no such key and no index signature); else opaque. A part's\n * `[key: string]: unknown` adds nothing (`unknown & T` is `T`), and only such parts give `unknown`.\n */\nfunction intersectionMember(members: readonly GeneratedMember[]): GeneratedMember {\n const found = members.filter((member) => member.kind !== \"missing\");\n const typed = found.filter((member) => !isUnknownIndex(member));\n const [only] = typed;\n if (only === undefined) {\n return found[0] ?? MISSING;\n }\n return typed.length === 1 && only.kind !== \"opaque\" ? only : OPAQUE;\n}\n\ninterface MemberInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n readonly depth: number;\n}\n\nfunction memberAt(schema: LocatedNode, key: string, input: MemberInput): GeneratedMember {\n const followed = followLocated(schema, input.refs);\n const { node } = followed;\n if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {\n return OPAQUE;\n }\n const owner = { ...followed, node };\n if (isNullableSchema(node)) {\n // Every key of `T | null` is an error, unless `T` is unknown (then the type is `unknown`).\n return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;\n }\n if (\"allOf\" in node || \"anyOf\" in node || \"oneOf\" in node) {\n return composedMember(owner, key, { ...input, depth: input.depth + 1 });\n }\n if (isObjectShape(node)) {\n return objectMember(owner, key, input);\n }\n if (isArrayShape(node)) {\n return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;\n }\n // `--binary-as-blob` types raw binary strings as `Blob`, which has members of its own.\n return input.options.binaryAsBlob && isRawBinarySchema(node as never)\n ? OPAQUE\n : primitiveMember(node, key);\n}\n\n/** The JavaScript value whose members a primitive `type` has: `\"\".length`, `(0).toFixed`. */\nconst PRIMITIVE_PROTOTYPES: Readonly<Record<string, object>> = {\n string: String.prototype,\n number: Number.prototype,\n integer: Number.prototype,\n boolean: Boolean.prototype,\n};\n\n/**\n * A key of a schema with one primitive `type`: missing unless the primitive has it. Object and\n * array keywords next to that `type` do not change the type (`isObjectShape`). Without a `type`\n * and object keywords the schema is `unknown` (`objectType` writes nothing), which has no keys.\n */\nfunction primitiveMember(node: JsonObject, key: string): GeneratedMember {\n if (node.type === undefined) {\n return hasObjectKeywords(node) ? OPAQUE : MISSING;\n }\n const prototype = typeof node.type === \"string\" ? PRIMITIVE_PROTOTYPES[node.type] : undefined;\n return prototype !== undefined && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;\n}\n\n/** The member `key` of the type generated for `schema` (a `$ref` is followed first). */\nexport function generatedMember(\n schema: LocatedNode,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): GeneratedMember {\n return memberAt(schema, key, { options, refs, depth: 0 });\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const generatedShape = require('./generated-shape.cjs');
3
+ const locatedNode = require('./located-node.cjs');
4
4
  const pointerWalk = require('./pointer-walk.cjs');
5
5
  const typedWalk = require('./typed-walk.cjs');
6
6
 
@@ -9,7 +9,7 @@ function refsIn(node, found = []) {
9
9
  for (const item of node) {
10
10
  refsIn(item, found);
11
11
  }
12
- } else if (generatedShape.isJsonObject(node)) {
12
+ } else if (locatedNode.isJsonObject(node)) {
13
13
  if (typeof node.$ref === "string") {
14
14
  found.push(node.$ref);
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inline-cycles.cjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":["isJsonObject","refPointerOf","typedWalk","pointerNode"],"mappings":";;;;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAWA,2BAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAUC,yBAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQC,mBAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAUD,yBAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAYE,uBAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
1
+ {"version":3,"file":"inline-cycles.cjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":["isJsonObject","refPointerOf","typedWalk","pointerNode"],"mappings":";;;;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAWA,wBAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAUC,yBAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQC,mBAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAUD,yBAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAYE,uBAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
@@ -1,4 +1,4 @@
1
- import { isJsonObject } from './generated-shape.mjs';
1
+ import { isJsonObject } from './located-node.mjs';
2
2
  import { refPointerOf, pointerNode } from './pointer-walk.mjs';
3
3
  import { typedWalk } from './typed-walk.mjs';
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"inline-cycles.mjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":[],"mappings":";;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAW,YAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQ,SAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAY,WAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
1
+ {"version":3,"file":"inline-cycles.mjs","sources":["../../../../src/application/transform/ref-pointer/inline-cycles.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./located-node.js\";\nimport { pointerNode, refPointerOf } from \"./pointer-walk.js\";\nimport { typedWalk } from \"./typed-walk.js\";\n\n/**\n * A `$ref` whose pointer crosses a segment with no type (`definitions/A`) is typed by writing its\n * target inline. If the target, directly or through other such `$ref`s, points back at itself,\n * writing it inline never ends; such a `$ref` keeps the original type.\n */\n\ninterface CycleInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction refsIn(node: unknown, found: string[] = []): string[] {\n if (Array.isArray(node)) {\n for (const item of node) {\n refsIn(item, found);\n }\n } else if (isJsonObject(node)) {\n if (typeof node.$ref === \"string\") {\n found.push(node.$ref);\n }\n for (const value of Object.values(node)) {\n refsIn(value, found);\n }\n }\n return found;\n}\n\nfunction isWrittenInline(ref: string, input: CycleInput): boolean {\n const pointer = refPointerOf(ref);\n return pointer !== null && typedWalk({ pointer, ...input }).kind === \"untyped\";\n}\n\n/** Depth-first search with the usual colors: a `$ref` met again while it is open is a cycle. */\nfunction reachesOpenRef(ref: string, open: Map<string, boolean>, input: CycleInput): boolean {\n if (open.has(ref)) {\n return open.get(ref) === true;\n }\n open.set(ref, true);\n const pointer = refPointerOf(ref);\n const target = pointer === null ? undefined : pointerNode(pointer, input.refs);\n const isCycle = refsIn(target).some(\n (inner) => isWrittenInline(inner, input) && reachesOpenRef(inner, open, input),\n );\n open.set(ref, false);\n return isCycle;\n}\n\n/** Whether writing the target of `ref` inline would write it again inside itself. */\nexport function hasInlineCycle(ref: string, options: SchemaOptions, refs: RefResolver): boolean {\n return reachesOpenRef(ref, new Map(), { options, refs });\n}\n"],"names":[],"mappings":";;;;AAgBA,SAAS,MAAA,CAAO,IAAA,EAAe,KAAA,GAAkB,EAAC,EAAa;AAC7D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,MAAA,IAAW,YAAA,CAAa,IAAI,CAAA,EAAG;AAC7B,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,KAAa,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,OAAO,OAAA,KAAY,QAAQ,SAAA,CAAU,EAAE,SAAS,GAAG,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,SAAA;AACvE;AAGA,SAAS,cAAA,CAAe,GAAA,EAAa,IAAA,EAA4B,KAAA,EAA4B;AAC3F,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA;AAAA,EAC3B;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,MAAM,SAAS,OAAA,KAAY,IAAA,GAAO,SAAY,WAAA,CAAY,OAAA,EAAS,MAAM,IAAI,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA;AAAA,IAC7B,CAAC,UAAU,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA,IAAK,cAAA,CAAe,KAAA,EAAO,IAAA,EAAM,KAAK;AAAA,GAC/E;AACA,EAAA,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAA;AACnB,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,GAAA,EAAa,OAAA,EAAwB,IAAA,EAA4B;AAC9F,EAAA,OAAO,cAAA,CAAe,qBAAK,IAAI,GAAA,IAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AACzD;;"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
4
+
5
+ function isJsonObject(value) {
6
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7
+ }
8
+ function followRefs(node, refs) {
9
+ return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
10
+ }
11
+ function followLocated(located, refs) {
12
+ const { node } = located;
13
+ return isJsonObject(node) && typeof node.$ref === "string" ? { node: refs.resolve(node.$ref), location: node.$ref } : located;
14
+ }
15
+ function childLocation(location, ...segments) {
16
+ return location === void 0 ? void 0 : jsonPointer.appendPointer(location, segments);
17
+ }
18
+
19
+ exports.childLocation = childLocation;
20
+ exports.followLocated = followLocated;
21
+ exports.followRefs = followRefs;
22
+ exports.isJsonObject = isJsonObject;
23
+ //# sourceMappingURL=located-node.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"located-node.cjs","sources":["../../../../src/application/transform/ref-pointer/located-node.ts"],"sourcesContent":["import { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\n\n/** Document nodes as the `$ref` pointer walks read them: with their place in the document. */\n\nexport type JsonObject = Readonly<Record<string, unknown>>;\n\n/**\n * A schema node and its JSON Pointer in the document. The generator writes the type of a schema\n * reached by a `$ref` at the target, and the location decides whether a property with a `default`\n * is required (`isInputLocation`). Undefined for a node that is not in the document.\n */\nexport interface LocatedNode {\n readonly node: unknown;\n readonly location: string | undefined;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `followRefs` with the location: a `$ref` is followed to its target and the target's pointer. */\nexport function followLocated(located: LocatedNode, refs: RefResolver): LocatedNode {\n const { node } = located;\n return isJsonObject(node) && typeof node.$ref === \"string\"\n ? { node: refs.resolve(node.$ref), location: node.$ref }\n : located;\n}\n\n/** The location of a child of a node at `location`, or undefined outside the document. */\nexport function childLocation(location: string | undefined, ...segments: string[]) {\n return location === undefined ? undefined : appendPointer(location, segments);\n}\n"],"names":["appendPointer"],"mappings":";;;;AAiBO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAA,CAAW,MAAe,IAAA,EAA4B;AACpE,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzF;AAGO,SAAS,aAAA,CAAc,SAAsB,IAAA,EAAgC;AAClF,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,OAAO,aAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAS,QAAA,GAC9C,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,GAAG,QAAA,EAAU,IAAA,CAAK,MAAK,GACrD,OAAA;AACN;AAGO,SAAS,aAAA,CAAc,aAAiC,QAAA,EAAoB;AACjF,EAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAYA,yBAAA,CAAc,UAAU,QAAQ,CAAA;AAC9E;;;;;"}
@@ -0,0 +1,18 @@
1
+ import { appendPointer } from '../../../domain/openapi/json-pointer.mjs';
2
+
3
+ function isJsonObject(value) {
4
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
+ }
6
+ function followRefs(node, refs) {
7
+ return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
8
+ }
9
+ function followLocated(located, refs) {
10
+ const { node } = located;
11
+ return isJsonObject(node) && typeof node.$ref === "string" ? { node: refs.resolve(node.$ref), location: node.$ref } : located;
12
+ }
13
+ function childLocation(location, ...segments) {
14
+ return location === void 0 ? void 0 : appendPointer(location, segments);
15
+ }
16
+
17
+ export { childLocation, followLocated, followRefs, isJsonObject };
18
+ //# sourceMappingURL=located-node.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"located-node.mjs","sources":["../../../../src/application/transform/ref-pointer/located-node.ts"],"sourcesContent":["import { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\n\n/** Document nodes as the `$ref` pointer walks read them: with their place in the document. */\n\nexport type JsonObject = Readonly<Record<string, unknown>>;\n\n/**\n * A schema node and its JSON Pointer in the document. The generator writes the type of a schema\n * reached by a `$ref` at the target, and the location decides whether a property with a `default`\n * is required (`isInputLocation`). Undefined for a node that is not in the document.\n */\nexport interface LocatedNode {\n readonly node: unknown;\n readonly location: string | undefined;\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `followRefs` with the location: a `$ref` is followed to its target and the target's pointer. */\nexport function followLocated(located: LocatedNode, refs: RefResolver): LocatedNode {\n const { node } = located;\n return isJsonObject(node) && typeof node.$ref === \"string\"\n ? { node: refs.resolve(node.$ref), location: node.$ref }\n : located;\n}\n\n/** The location of a child of a node at `location`, or undefined outside the document. */\nexport function childLocation(location: string | undefined, ...segments: string[]) {\n return location === undefined ? undefined : appendPointer(location, segments);\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAA,CAAW,MAAe,IAAA,EAA4B;AACpE,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzF;AAGO,SAAS,aAAA,CAAc,SAAsB,IAAA,EAAgC;AAClF,EAAA,MAAM,EAAE,MAAK,GAAI,OAAA;AACjB,EAAA,OAAO,aAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAS,QAAA,GAC9C,EAAE,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,GAAG,QAAA,EAAU,IAAA,CAAK,MAAK,GACrD,OAAA;AACN;AAGO,SAAS,aAAA,CAAc,aAAiC,QAAA,EAAoB;AACjF,EAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,aAAA,CAAc,UAAU,QAAQ,CAAA;AAC9E;;"}
@@ -1,55 +1,110 @@
1
1
  'use strict';
2
2
 
3
3
  const generatedShape = require('./generated-shape.cjs');
4
+ const locatedNode = require('./located-node.cjs');
4
5
  const pointerWalk = require('./pointer-walk.cjs');
5
6
 
6
7
  function schemaStep(walk, segment, isLast, input) {
7
8
  if (segment === "properties") {
8
9
  return { step: "continue", walk };
9
10
  }
10
- const member = generatedShape.generatedMember(walk.node, segment, input.options, input.refs);
11
- if (member.kind === "missing") {
11
+ const member = generatedShape.generatedMember(walk, segment, input.options, input.refs);
12
+ if (member.kind === "missing" || member.kind === "index" && member.isOtherType) {
12
13
  return { step: "fails", walk };
13
14
  }
14
15
  if (member.kind === "opaque") {
15
16
  return { step: "compiles", walk };
16
17
  }
17
18
  const isAbsentValue = member.kind === "index" && member.node === void 0;
18
- const isUnsafe = member.kind === "property" ? member.isOptional : isAbsentValue;
19
+ const isUnsafe = member.kind === "property" ? member.isOptional || member.isMarked : isAbsentValue;
19
20
  return {
20
21
  step: isUnsafe && !isLast ? "fails" : "continue",
21
- walk: { ...walk, node: member.node }
22
+ walk: { ...walk, node: member.node, location: member.location }
22
23
  };
23
24
  }
24
25
  function containerStep(walk, index, input) {
25
26
  const segment = input.pointer.segments[index];
26
27
  const isLast = index === input.pointer.segments.length - 1;
28
+ if (pointerWalk.isExcludedOperation(input.pointer, index, walk.node, input)) {
29
+ return { step: "fails", walk };
30
+ }
27
31
  const isOptional = segment === "requestBody" && pointerWalk.isOptionalRequestBody(walk.node, input.refs) || pointerWalk.isOptionalHeader(input.pointer, index, walk.node);
28
32
  if (isOptional && !isLast) {
29
33
  return { step: "fails", walk };
30
34
  }
31
- const child = generatedShape.isJsonObject(walk.node) ? generatedShape.followRefs(walk.node[segment], input.refs) : void 0;
35
+ const child = locatedNode.followLocated(
36
+ {
37
+ node: locatedNode.isJsonObject(walk.node) ? walk.node[segment] : void 0,
38
+ location: locatedNode.childLocation(walk.location, segment)
39
+ },
40
+ input.refs
41
+ );
32
42
  return {
33
- step: child === void 0 ? "compiles" : "continue",
34
- walk: { ...walk, node: child }
43
+ step: child.node === void 0 ? "compiles" : "continue",
44
+ walk: { ...walk, ...child }
35
45
  };
36
46
  }
47
+ function firstMediaTypeSchema(walk, refs) {
48
+ const content = locatedNode.isJsonObject(walk.node) ? walk.node.content : void 0;
49
+ if (!locatedNode.isJsonObject(content)) {
50
+ return null;
51
+ }
52
+ const [mediaType] = Object.keys(content);
53
+ if (mediaType === void 0) {
54
+ return null;
55
+ }
56
+ const location = locatedNode.childLocation(locatedNode.childLocation(walk.location, "content"), mediaType);
57
+ const entry = locatedNode.followLocated({ node: content[mediaType], location }, refs);
58
+ return ownSchema({ ...entry}, refs);
59
+ }
60
+ function ownSchema(walk, refs) {
61
+ const schema = locatedNode.isJsonObject(walk.node) ? walk.node.schema : void 0;
62
+ const location = locatedNode.childLocation(walk.location, "schema");
63
+ return { ...locatedNode.followLocated({ node: schema, location }, refs), isSchema: true };
64
+ }
65
+ function contentSchema(walk, form, refs) {
66
+ switch (form) {
67
+ case "first-media-type":
68
+ return firstMediaTypeSchema(walk, refs);
69
+ case "schema":
70
+ return ownSchema(walk, refs);
71
+ case "string":
72
+ return null;
73
+ }
74
+ }
75
+ function contentStep(walk, form, isLast, input) {
76
+ const content = locatedNode.isJsonObject(walk.node) ? walk.node.content : void 0;
77
+ if (form === "media-type-members") {
78
+ const hasMember = locatedNode.isJsonObject(content) && Object.hasOwn(content, "content");
79
+ return { step: hasMember ? "compiles" : "fails", walk };
80
+ }
81
+ const schema = contentSchema(walk, form, input.refs);
82
+ return schema === null ? { step: "fails", walk } : schemaStep(schema, "content", isLast, input);
83
+ }
84
+ function documentStep(walk, index, input) {
85
+ const segment = input.pointer.segments[index];
86
+ const isLast = index === input.pointer.segments.length - 1;
87
+ const form = pointerWalk.headerParameterContentForm(input.pointer, index, walk.node, input.options);
88
+ if (form !== null) {
89
+ return contentStep(walk, form, isLast, input);
90
+ }
91
+ if (pointerWalk.isTypedAsSchema(input.pointer, index) && locatedNode.isJsonObject(walk.node)) {
92
+ return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);
93
+ }
94
+ return containerStep(walk, index, input);
95
+ }
37
96
  function originalIndexFails(input) {
38
97
  const { segments } = input.pointer;
39
98
  let walk = {
40
- node: pointerWalk.leadingNode(input.pointer, input.refs),
99
+ ...pointerWalk.leadingLocated(input.pointer, input.refs),
41
100
  isSchema: pointerWalk.startsInSchema(input.pointer)
42
101
  };
43
102
  for (let index = pointerWalk.leadingSegmentsOf(input.pointer); index < segments.length; index++) {
44
- const segment = segments[index];
45
- const isLast = index === segments.length - 1;
46
103
  if (!walk.isSchema && pointerWalk.isParameterList(input.pointer, index)) {
47
104
  return true;
48
105
  }
49
- if (!walk.isSchema && pointerWalk.isTypedAsSchema(input.pointer, index) && generatedShape.isJsonObject(walk.node)) {
50
- walk = { node: generatedShape.followRefs(walk.node.schema, input.refs), isSchema: true };
51
- }
52
- const result = walk.isSchema ? schemaStep(walk, segment, isLast, input) : containerStep(walk, index, input);
106
+ const isLast = index === segments.length - 1;
107
+ const result = walk.isSchema ? schemaStep(walk, segments[index], isLast, input) : documentStep(walk, index, input);
53
108
  if (result.step !== "continue") {
54
109
  return result.step === "fails";
55
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"original-index.cjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { followRefs, generatedMember, isJsonObject } from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure; where the\n * answer depends on a shape it does not model, it answers false, so that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk.node, segment, input.options, input.refs);\n if (member.kind === \"missing\") {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe = member.kind === \"property\" ? member.isOptional : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = isJsonObject(walk.node) ? followRefs(walk.node[segment], input.refs) : undefined;\n return {\n step: (child === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, node: child },\n };\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n node: leadingNode(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n if (!walk.isSchema && isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n walk = { node: followRefs(walk.node.schema, input.refs), isSchema: true };\n }\n const result = walk.isSchema\n ? schemaStep(walk, segment, isLast, input)\n : containerStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":["generatedMember","isOptionalRequestBody","isOptionalHeader","isJsonObject","followRefs","leadingNode","startsInSchema","leadingSegmentsOf","isParameterList","isTypedAsSchema"],"mappings":"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"}
1
+ {"version":3,"file":"original-index.cjs","sources":["../../../../src/application/transform/ref-pointer/original-index.ts"],"sourcesContent":["import type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { generatedMember } from \"./generated-shape.js\";\nimport { childLocation, followLocated, isJsonObject } from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Whether the type the original wrote for a `$ref` (`refType`: every segment indexed by name,\n * `properties` skipped) surely fails to compile. It walks the document as TypeScript walks the\n * generated types and answers true only where TypeScript reports an error for sure, or where the\n * type compiles but is read through an index signature that is not the target's type alone\n * (`isOtherType`); where the answer depends on a shape it does not model, it answers false, so\n * that output stays as it was.\n */\n\ntype Step = \"fails\" | \"compiles\" | \"continue\";\n\ninterface OriginalWalk {\n readonly node: unknown;\n /** The node's JSON Pointer (`LocatedNode`). */\n readonly location: string | undefined;\n readonly isSchema: boolean;\n}\n\ninterface WalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\nfunction schemaStep(walk: OriginalWalk, segment: string, isLast: boolean, input: WalkInput) {\n if (segment === \"properties\") {\n return { step: \"continue\" as Step, walk };\n }\n const member = generatedMember(walk, segment, input.options, input.refs);\n // Such an index signature compiles, but its type is not the target's alone.\n if (member.kind === \"missing\" || (member.kind === \"index\" && member.isOtherType)) {\n return { step: \"fails\" as Step, walk };\n }\n if (member.kind === \"opaque\") {\n return { step: \"compiles\" as Step, walk };\n }\n const isAbsentValue = member.kind === \"index\" && member.node === undefined;\n const isUnsafe =\n member.kind === \"property\" ? member.isOptional || member.isMarked : isAbsentValue;\n return {\n step: (isUnsafe && !isLast ? \"fails\" : \"continue\") as Step,\n walk: { ...walk, node: member.node, location: member.location },\n };\n}\n\nfunction containerStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n if (isExcludedOperation(input.pointer, index, walk.node, input)) {\n return { step: \"fails\" as Step, walk };\n }\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(walk.node, input.refs)) ||\n isOptionalHeader(input.pointer, index, walk.node);\n if (isOptional && !isLast) {\n return { step: \"fails\" as Step, walk };\n }\n const child = followLocated(\n {\n node: isJsonObject(walk.node) ? walk.node[segment] : undefined,\n location: childLocation(walk.location, segment),\n },\n input.refs,\n );\n return {\n step: (child.node === undefined ? \"compiles\" : \"continue\") as Step,\n walk: { ...walk, ...child },\n };\n}\n\n/** The schema of the first media type of a `content` map, `$ref`s followed. */\nfunction firstMediaTypeSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk | null {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (!isJsonObject(content)) {\n return null;\n }\n const [mediaType] = Object.keys(content);\n if (mediaType === undefined) {\n return null;\n }\n const location = childLocation(childLocation(walk.location, \"content\"), mediaType);\n const entry = followLocated({ node: content[mediaType], location }, refs);\n return ownSchema({ ...entry, isSchema: false }, refs);\n}\n\n/** The schema a header or parameter is typed by, `$ref`s followed. */\nfunction ownSchema(walk: OriginalWalk, refs: RefResolver): OriginalWalk {\n const schema = isJsonObject(walk.node) ? walk.node.schema : undefined;\n const location = childLocation(walk.location, \"schema\");\n return { ...followLocated({ node: schema, location }, refs), isSchema: true };\n}\n\n/** The schema whose type a header or parameter is, when not its media type members. */\nfunction contentSchema(\n walk: OriginalWalk,\n form: Exclude<ContentForm, \"media-type-members\">,\n refs: RefResolver,\n): OriginalWalk | null {\n switch (form) {\n case \"first-media-type\":\n return firstMediaTypeSchema(walk, refs);\n case \"schema\":\n return ownSchema(walk, refs);\n case \"string\":\n return null;\n }\n}\n\n/**\n * The original indexes the `content` of a header or parameter by name. The media type members\n * have no `content` unless a media type is named so, and `string` and `unknown` (no media type)\n * have none; the schema of the first media type, or the `schema` next to `content`, is walked on.\n */\nfunction contentStep(walk: OriginalWalk, form: ContentForm, isLast: boolean, input: WalkInput) {\n const content = isJsonObject(walk.node) ? walk.node.content : undefined;\n if (form === \"media-type-members\") {\n const hasMember = isJsonObject(content) && Object.hasOwn(content, \"content\");\n return { step: (hasMember ? \"compiles\" : \"fails\") as Step, walk };\n }\n const schema = contentSchema(walk, form, input.refs);\n return schema === null\n ? { step: \"fails\" as Step, walk }\n : schemaStep(schema, \"content\", isLast, input);\n}\n\n/**\n * A step outside a schema: a header's or parameter's `content`, a schema's container, or another.\n */\nfunction documentStep(walk: OriginalWalk, index: number, input: WalkInput) {\n const segment = input.pointer.segments[index] as string;\n const isLast = index === input.pointer.segments.length - 1;\n const form = headerParameterContentForm(input.pointer, index, walk.node, input.options);\n if (form !== null) {\n return contentStep(walk, form, isLast, input);\n }\n if (isTypedAsSchema(input.pointer, index) && isJsonObject(walk.node)) {\n // The container's type is its schema's type: the segment indexes that type.\n return schemaStep(ownSchema(walk, input.refs), segment, isLast, input);\n }\n return containerStep(walk, index, input);\n}\n\n/** True when the original type of the `$ref` does not compile for sure. */\nexport function originalIndexFails(input: WalkInput): boolean {\n const { segments } = input.pointer;\n let walk: OriginalWalk = {\n ...leadingLocated(input.pointer, input.refs),\n isSchema: startsInSchema(input.pointer),\n };\n for (let index = leadingSegmentsOf(input.pointer); index < segments.length; index++) {\n if (!walk.isSchema && isParameterList(input.pointer, index)) {\n return true;\n }\n const isLast = index === segments.length - 1;\n const result = walk.isSchema\n ? schemaStep(walk, segments[index] as string, isLast, input)\n : documentStep(walk, index, input);\n if (result.step !== \"continue\") {\n return result.step === \"fails\";\n }\n walk = result.walk;\n }\n return false;\n}\n"],"names":["generatedMember","isExcludedOperation","isOptionalRequestBody","isOptionalHeader","followLocated","isJsonObject","childLocation","headerParameterContentForm","isTypedAsSchema","leadingLocated","startsInSchema","leadingSegmentsOf","isParameterList"],"mappings":"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"}