@redocly/openapi-core 1.18.1 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/__tests__/utils.ts +14 -7
  3. package/lib/benchmark/benches/lint-with-many-rules.bench.d.ts +1 -0
  4. package/lib/benchmark/benches/lint-with-many-rules.bench.js +7 -3
  5. package/lib/benchmark/benches/lint-with-nested-rule.bench.d.ts +1 -0
  6. package/lib/benchmark/benches/lint-with-nested-rule.bench.js +7 -3
  7. package/lib/benchmark/benches/lint-with-no-rules.bench.d.ts +1 -0
  8. package/lib/benchmark/benches/lint-with-no-rules.bench.js +7 -3
  9. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.d.ts +1 -0
  10. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +19 -15
  11. package/lib/benchmark/benches/lint-with-top-level-rule.bench.d.ts +1 -0
  12. package/lib/benchmark/benches/lint-with-top-level-rule.bench.js +18 -14
  13. package/lib/benchmark/benches/recommended-oas3.bench.js +2 -2
  14. package/lib/benchmark/benches/resolve-with-no-external.bench.js +2 -2
  15. package/lib/benchmark/utils.d.ts +3 -3
  16. package/lib/benchmark/utils.js +10 -7
  17. package/lib/bundle.d.ts +2 -2
  18. package/lib/bundle.js +127 -120
  19. package/lib/config/all.js +13 -1
  20. package/lib/config/builtIn.js +18 -17
  21. package/lib/config/config-resolvers.d.ts +1 -1
  22. package/lib/config/config-resolvers.js +241 -158
  23. package/lib/config/config.d.ts +4 -3
  24. package/lib/config/config.js +53 -34
  25. package/lib/config/load.d.ts +1 -1
  26. package/lib/config/load.js +105 -117
  27. package/lib/config/minimal.js +13 -0
  28. package/lib/config/recommended-strict.js +14 -1
  29. package/lib/config/recommended.js +14 -1
  30. package/lib/config/rules.d.ts +3 -3
  31. package/lib/config/rules.js +1 -2
  32. package/lib/config/types.d.ts +17 -4
  33. package/lib/config/utils.d.ts +3 -1
  34. package/lib/config/utils.js +78 -49
  35. package/lib/decorators/async3/index.d.ts +1 -0
  36. package/lib/decorators/async3/index.js +4 -0
  37. package/lib/decorators/common/filters/filter-helper.d.ts +1 -1
  38. package/lib/decorators/common/filters/filter-helper.js +2 -3
  39. package/lib/decorators/common/filters/filter-in.d.ts +1 -1
  40. package/lib/decorators/common/filters/filter-in.js +1 -1
  41. package/lib/decorators/common/filters/filter-out.d.ts +1 -1
  42. package/lib/decorators/common/filters/filter-out.js +1 -1
  43. package/lib/decorators/common/info-description-override.d.ts +1 -1
  44. package/lib/decorators/common/info-override.d.ts +1 -1
  45. package/lib/decorators/common/info-override.js +1 -12
  46. package/lib/decorators/common/media-type-examples-override.d.ts +1 -1
  47. package/lib/decorators/common/media-type-examples-override.js +8 -2
  48. package/lib/decorators/common/operation-description-override.d.ts +1 -1
  49. package/lib/decorators/common/registry-dependencies.d.ts +1 -1
  50. package/lib/decorators/common/remove-x-internal.d.ts +1 -1
  51. package/lib/decorators/common/remove-x-internal.js +4 -5
  52. package/lib/decorators/common/tag-description-override.d.ts +1 -1
  53. package/lib/decorators/oas2/index.d.ts +1 -1
  54. package/lib/decorators/oas2/remove-unused-components.js +1 -2
  55. package/lib/decorators/oas3/index.d.ts +1 -1
  56. package/lib/decorators/oas3/remove-unused-components.js +1 -2
  57. package/lib/env.d.ts +0 -1
  58. package/lib/env.js +1 -1
  59. package/lib/format/codeframes.d.ts +1 -1
  60. package/lib/format/codeframes.js +10 -8
  61. package/lib/format/format.d.ts +1 -1
  62. package/lib/format/format.js +24 -16
  63. package/lib/index.d.ts +2 -1
  64. package/lib/index.js +6 -4
  65. package/lib/js-yaml/index.d.ts +1 -1
  66. package/lib/js-yaml/index.js +1 -1
  67. package/lib/lint.d.ts +3 -1
  68. package/lib/lint.js +92 -99
  69. package/lib/logger.js +2 -2
  70. package/lib/oas-types.d.ts +9 -5
  71. package/lib/oas-types.js +22 -12
  72. package/lib/redocly/domains.d.ts +1 -1
  73. package/lib/redocly/domains.js +6 -6
  74. package/lib/redocly/index.d.ts +1 -1
  75. package/lib/redocly/index.js +60 -73
  76. package/lib/redocly/registry-api.js +64 -82
  77. package/lib/ref-utils.d.ts +2 -2
  78. package/lib/ref-utils.js +14 -13
  79. package/lib/resolve.d.ts +2 -2
  80. package/lib/resolve.js +186 -205
  81. package/lib/rules/ajv.d.ts +1 -1
  82. package/lib/rules/ajv.js +10 -8
  83. package/lib/rules/arazzo/index.js +2 -0
  84. package/lib/rules/async2/channels-kebab-case.d.ts +1 -1
  85. package/lib/rules/async2/index.js +2 -0
  86. package/lib/rules/async2/no-channel-trailing-slash.d.ts +1 -1
  87. package/lib/rules/async3/channels-kebab-case.d.ts +2 -0
  88. package/lib/rules/async3/channels-kebab-case.js +19 -0
  89. package/lib/rules/async3/index.d.ts +3 -0
  90. package/lib/rules/async3/index.js +24 -0
  91. package/lib/rules/async3/no-channel-trailing-slash.d.ts +2 -0
  92. package/lib/rules/async3/no-channel-trailing-slash.js +16 -0
  93. package/lib/rules/common/assertions/asserts.d.ts +2 -2
  94. package/lib/rules/common/assertions/asserts.js +5 -5
  95. package/lib/rules/common/assertions/index.d.ts +4 -4
  96. package/lib/rules/common/assertions/utils.d.ts +1 -1
  97. package/lib/rules/common/assertions/utils.js +43 -28
  98. package/lib/rules/common/info-contact.d.ts +1 -1
  99. package/lib/rules/common/info-license-strict.d.ts +2 -0
  100. package/lib/rules/common/info-license-strict.js +26 -0
  101. package/lib/rules/common/info-license-url.d.ts +1 -1
  102. package/lib/rules/common/info-license.d.ts +1 -1
  103. package/lib/rules/common/no-ambiguous-paths.d.ts +1 -1
  104. package/lib/rules/common/no-enum-type-mismatch.d.ts +1 -1
  105. package/lib/rules/common/no-http-verbs-in-paths.d.ts +1 -1
  106. package/lib/rules/common/no-identical-paths.d.ts +1 -1
  107. package/lib/rules/common/no-invalid-parameter-examples.js +1 -2
  108. package/lib/rules/common/no-invalid-schema-examples.js +1 -2
  109. package/lib/rules/common/no-path-trailing-slash.d.ts +1 -1
  110. package/lib/rules/common/no-required-schema-properties-undefined.d.ts +1 -1
  111. package/lib/rules/common/no-required-schema-properties-undefined.js +1 -2
  112. package/lib/rules/common/operation-2xx-response.d.ts +1 -1
  113. package/lib/rules/common/operation-4xx-response.d.ts +1 -1
  114. package/lib/rules/common/operation-description.d.ts +1 -1
  115. package/lib/rules/common/operation-operationId-unique.d.ts +1 -1
  116. package/lib/rules/common/operation-operationId-url-safe.d.ts +1 -1
  117. package/lib/rules/common/operation-operationId-url-safe.js +1 -0
  118. package/lib/rules/common/operation-operationId.d.ts +1 -1
  119. package/lib/rules/common/operation-parameters-unique.d.ts +1 -1
  120. package/lib/rules/common/operation-singular-tag.d.ts +1 -1
  121. package/lib/rules/common/operation-summary.d.ts +1 -1
  122. package/lib/rules/common/operation-tag-defined.d.ts +1 -1
  123. package/lib/rules/common/operation-tag-defined.js +1 -2
  124. package/lib/rules/common/parameter-description.d.ts +1 -1
  125. package/lib/rules/common/path-declaration-must-exist.d.ts +1 -1
  126. package/lib/rules/common/path-excludes-patterns.d.ts +1 -1
  127. package/lib/rules/common/path-http-verbs-order.d.ts +1 -1
  128. package/lib/rules/common/path-http-verbs-order.js +1 -1
  129. package/lib/rules/common/path-not-include-query.d.ts +1 -1
  130. package/lib/rules/common/path-params-defined.d.ts +1 -1
  131. package/lib/rules/common/path-segment-plural.d.ts +1 -1
  132. package/lib/rules/common/paths-kebab-case.d.ts +1 -1
  133. package/lib/rules/common/required-string-property-missing-min-length.d.ts +1 -1
  134. package/lib/rules/common/required-string-property-missing-min-length.js +2 -2
  135. package/lib/rules/common/response-contains-header.d.ts +1 -1
  136. package/lib/rules/common/response-contains-header.js +2 -2
  137. package/lib/rules/common/security-defined.d.ts +1 -1
  138. package/lib/rules/common/security-defined.js +3 -7
  139. package/lib/rules/common/spec-strict-refs.d.ts +1 -1
  140. package/lib/rules/common/spec.d.ts +2 -2
  141. package/lib/rules/common/spec.js +6 -7
  142. package/lib/rules/common/tag-description.d.ts +1 -1
  143. package/lib/rules/common/tags-alphabetical.d.ts +1 -1
  144. package/lib/rules/no-unresolved-refs.d.ts +3 -3
  145. package/lib/rules/no-unresolved-refs.js +3 -4
  146. package/lib/rules/oas2/boolean-parameter-prefixes.d.ts +1 -1
  147. package/lib/rules/oas2/index.d.ts +1 -1
  148. package/lib/rules/oas2/index.js +2 -0
  149. package/lib/rules/oas2/response-contains-property.d.ts +1 -1
  150. package/lib/rules/oas2/response-contains-property.js +1 -2
  151. package/lib/rules/oas3/array-parameter-serialization.d.ts +1 -1
  152. package/lib/rules/oas3/array-parameter-serialization.js +1 -2
  153. package/lib/rules/oas3/boolean-parameter-prefixes.d.ts +1 -1
  154. package/lib/rules/oas3/component-name-unique.d.ts +1 -1
  155. package/lib/rules/oas3/component-name-unique.js +2 -4
  156. package/lib/rules/oas3/index.d.ts +1 -1
  157. package/lib/rules/oas3/index.js +2 -0
  158. package/lib/rules/oas3/no-empty-servers.d.ts +1 -1
  159. package/lib/rules/oas3/no-example-value-and-externalValue.d.ts +1 -1
  160. package/lib/rules/oas3/no-invalid-media-type-examples.d.ts +1 -1
  161. package/lib/rules/oas3/no-invalid-media-type-examples.js +1 -2
  162. package/lib/rules/oas3/no-server-example.com.d.ts +1 -1
  163. package/lib/rules/oas3/no-server-example.com.js +1 -0
  164. package/lib/rules/oas3/no-server-trailing-slash.d.ts +1 -1
  165. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +1 -1
  166. package/lib/rules/oas3/no-server-variables-empty-enum.js +1 -2
  167. package/lib/rules/oas3/no-undefined-server-variable.d.ts +1 -1
  168. package/lib/rules/oas3/no-undefined-server-variable.js +2 -3
  169. package/lib/rules/oas3/no-unused-components.d.ts +1 -1
  170. package/lib/rules/oas3/no-unused-components.js +1 -2
  171. package/lib/rules/oas3/response-contains-property.d.ts +1 -1
  172. package/lib/rules/oas3/response-contains-property.js +1 -2
  173. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +1 -1
  174. package/lib/rules/other/stats.d.ts +3 -3
  175. package/lib/rules/other/stats.js +5 -3
  176. package/lib/rules/spot/parameters-no-body-inside-in.d.ts +2 -0
  177. package/lib/rules/spot/parameters-no-body-inside-in.js +18 -0
  178. package/lib/rules/utils.d.ts +4 -2
  179. package/lib/rules/utils.js +41 -13
  180. package/lib/types/arazzo.d.ts +1 -2275
  181. package/lib/types/arazzo.js +246 -309
  182. package/lib/types/asyncapi2.d.ts +17 -0
  183. package/lib/types/{asyncapi.js → asyncapi2.js} +59 -53
  184. package/lib/types/asyncapi3.d.ts +2 -0
  185. package/lib/types/asyncapi3.js +347 -0
  186. package/lib/types/index.js +19 -10
  187. package/lib/types/json-schema-adapter.d.ts +1 -1
  188. package/lib/types/json-schema-adapter.js +4 -18
  189. package/lib/types/oas2.js +6 -6
  190. package/lib/types/oas3.d.ts +4 -0
  191. package/lib/types/oas3.js +19 -19
  192. package/lib/types/oas3_1.d.ts +3 -0
  193. package/lib/types/oas3_1.js +20 -14
  194. package/lib/types/redocly-yaml.d.ts +8 -6
  195. package/lib/types/redocly-yaml.js +135 -36
  196. package/lib/typings/arazzo.d.ts +145 -27
  197. package/lib/typings/asyncapi3.d.ts +53 -0
  198. package/lib/typings/asyncapi3.js +2 -0
  199. package/lib/typings/common.d.ts +1 -1
  200. package/lib/typings/swagger.d.ts +2 -2
  201. package/lib/utils.d.ts +4 -3
  202. package/lib/utils.js +55 -72
  203. package/lib/visitors.d.ts +29 -1
  204. package/lib/visitors.js +21 -8
  205. package/lib/walk.d.ts +3 -3
  206. package/lib/walk.js +30 -23
  207. package/package.json +3 -3
  208. package/src/__tests__/bundle.test.ts +144 -2
  209. package/src/__tests__/lint.test.ts +29 -21
  210. package/src/__tests__/walk.test.ts +25 -25
  211. package/src/benchmark/benches/lint-with-many-rules.bench.ts +7 -1
  212. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +7 -1
  213. package/src/benchmark/benches/lint-with-no-rules.bench.ts +8 -1
  214. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +18 -13
  215. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +17 -11
  216. package/src/benchmark/fork.js +4 -0
  217. package/src/benchmark/utils.ts +6 -5
  218. package/src/bundle.ts +19 -4
  219. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +32 -2
  220. package/src/config/__tests__/__snapshots__/config.test.ts.snap +24 -0
  221. package/src/config/__tests__/config-resolvers.test.ts +82 -0
  222. package/src/config/__tests__/config.test.ts +11 -0
  223. package/src/config/__tests__/fixtures/resolve-config/local-config-with-commonjs-export-function.yaml +2 -0
  224. package/src/config/__tests__/fixtures/resolve-config/local-config-with-esm.yaml +2 -0
  225. package/src/config/__tests__/fixtures/resolve-config/plugin-esm.mjs +10 -0
  226. package/src/config/__tests__/fixtures/resolve-config/plugin-with-export-function.cjs +10 -0
  227. package/src/config/__tests__/resolve-plugins.test.ts +4 -1
  228. package/src/config/all.ts +13 -1
  229. package/src/config/builtIn.ts +9 -8
  230. package/src/config/config-resolvers.ts +92 -21
  231. package/src/config/config.ts +31 -13
  232. package/src/config/load.ts +2 -2
  233. package/src/config/minimal.ts +13 -0
  234. package/src/config/recommended-strict.ts +14 -1
  235. package/src/config/recommended.ts +14 -1
  236. package/src/config/rules.ts +12 -4
  237. package/src/config/types.ts +34 -5
  238. package/src/config/utils.ts +28 -2
  239. package/src/decorators/__tests__/filter-in.test.ts +29 -26
  240. package/src/decorators/__tests__/filter-out.test.ts +32 -23
  241. package/src/decorators/__tests__/media-type-examples-override.test.ts +45 -45
  242. package/src/decorators/__tests__/remove-x-internal.test.ts +8 -5
  243. package/src/decorators/async3/index.ts +1 -0
  244. package/src/decorators/common/filters/filter-helper.ts +2 -1
  245. package/src/decorators/common/filters/filter-in.ts +2 -1
  246. package/src/decorators/common/filters/filter-out.ts +2 -1
  247. package/src/decorators/common/info-description-override.ts +3 -2
  248. package/src/decorators/common/info-override.ts +1 -1
  249. package/src/decorators/common/media-type-examples-override.ts +4 -3
  250. package/src/decorators/common/operation-description-override.ts +5 -4
  251. package/src/decorators/common/registry-dependencies.ts +2 -2
  252. package/src/decorators/common/remove-x-internal.ts +5 -4
  253. package/src/decorators/common/tag-description-override.ts +3 -2
  254. package/src/decorators/oas2/__tests__/remove-unused-components.test.ts +3 -3
  255. package/src/decorators/oas2/index.ts +2 -1
  256. package/src/decorators/oas2/remove-unused-components.ts +1 -1
  257. package/src/decorators/oas3/__tests__/remove-unused-components.test.ts +4 -4
  258. package/src/decorators/oas3/index.ts +2 -1
  259. package/src/decorators/oas3/remove-unused-components.ts +1 -1
  260. package/src/format/codeframes.ts +2 -1
  261. package/src/format/format.ts +9 -4
  262. package/src/index.ts +2 -1
  263. package/src/js-yaml/index.ts +3 -1
  264. package/src/lint.ts +28 -4
  265. package/src/logger.ts +2 -2
  266. package/src/oas-types.ts +41 -22
  267. package/src/redocly/domains.ts +1 -1
  268. package/src/redocly/index.ts +3 -3
  269. package/src/redocly/registry-api.ts +5 -3
  270. package/src/ref-utils.ts +4 -2
  271. package/src/resolve.ts +6 -4
  272. package/src/rules/__tests__/no-unresolved-refs.test.ts +21 -7
  273. package/src/rules/ajv.ts +2 -1
  274. package/src/rules/arazzo/__tests__/parameters-no-body-inside-in.test.ts +76 -0
  275. package/src/rules/arazzo/index.ts +6 -3
  276. package/src/rules/async2/__tests__/channels-kebab-case.test.ts +9 -5
  277. package/src/rules/async2/__tests__/no-channel-trailing-slash.test.ts +3 -3
  278. package/src/rules/async2/channels-kebab-case.ts +2 -2
  279. package/src/rules/async2/index.ts +9 -6
  280. package/src/rules/async2/no-channel-trailing-slash.ts +2 -2
  281. package/src/rules/async3/__tests__/channels-kebab-case.test.ts +145 -0
  282. package/src/rules/async3/__tests__/no-channel-trailing-slash.test.ts +96 -0
  283. package/src/rules/async3/channels-kebab-case.ts +19 -0
  284. package/src/rules/async3/index.ts +26 -0
  285. package/src/rules/async3/no-channel-trailing-slash.ts +16 -0
  286. package/src/rules/common/__tests__/info-license-strict.test.ts +141 -0
  287. package/src/rules/common/__tests__/info-license.test.ts +2 -2
  288. package/src/rules/common/__tests__/license-url.test.ts +2 -2
  289. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +1 -1
  290. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +5 -5
  291. package/src/rules/common/__tests__/no-identical-paths.test.ts +1 -1
  292. package/src/rules/common/__tests__/no-invalid-parameter-examples.test.ts +1 -1
  293. package/src/rules/common/__tests__/no-invalid-schema-examples.test.ts +1 -1
  294. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +4 -4
  295. package/src/rules/common/__tests__/no-required-schema-properties-undefined.test.ts +11 -11
  296. package/src/rules/common/__tests__/operation-2xx-response.test.ts +8 -6
  297. package/src/rules/common/__tests__/operation-4xx-response.test.ts +9 -7
  298. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +2 -2
  299. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +1 -1
  300. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +4 -4
  301. package/src/rules/common/__tests__/operation-singular-tag.test.ts +2 -2
  302. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +2 -2
  303. package/src/rules/common/__tests__/path-not-include-query.test.ts +2 -2
  304. package/src/rules/common/__tests__/path-params-defined.test.ts +5 -5
  305. package/src/rules/common/__tests__/paths-kebab-case.test.ts +6 -4
  306. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +8 -8
  307. package/src/rules/common/__tests__/security-defined.test.ts +14 -8
  308. package/src/rules/common/__tests__/spec-strict-refs.test.ts +1 -1
  309. package/src/rules/common/__tests__/spec.test.ts +10 -10
  310. package/src/rules/common/__tests__/tag-description.test.ts +2 -2
  311. package/src/rules/common/__tests__/tags-alphabetical.test.ts +6 -4
  312. package/src/rules/common/assertions/asserts.ts +5 -9
  313. package/src/rules/common/assertions/index.ts +12 -4
  314. package/src/rules/common/assertions/utils.ts +4 -2
  315. package/src/rules/common/info-contact.ts +2 -1
  316. package/src/rules/common/info-license-strict.ts +24 -0
  317. package/src/rules/common/info-license-url.ts +2 -1
  318. package/src/rules/common/info-license.ts +2 -1
  319. package/src/rules/common/no-ambiguous-paths.ts +4 -4
  320. package/src/rules/common/no-enum-type-mismatch.ts +5 -4
  321. package/src/rules/common/no-http-verbs-in-paths.ts +5 -4
  322. package/src/rules/common/no-identical-paths.ts +4 -4
  323. package/src/rules/common/no-invalid-parameter-examples.ts +3 -2
  324. package/src/rules/common/no-path-trailing-slash.ts +2 -2
  325. package/src/rules/common/no-required-schema-properties-undefined.ts +5 -4
  326. package/src/rules/common/operation-2xx-response.ts +3 -2
  327. package/src/rules/common/operation-4xx-response.ts +3 -2
  328. package/src/rules/common/operation-description.ts +5 -4
  329. package/src/rules/common/operation-operationId-unique.ts +4 -4
  330. package/src/rules/common/operation-operationId-url-safe.ts +5 -4
  331. package/src/rules/common/operation-operationId.ts +5 -4
  332. package/src/rules/common/operation-parameters-unique.ts +4 -4
  333. package/src/rules/common/operation-singular-tag.ts +4 -4
  334. package/src/rules/common/operation-summary.ts +5 -4
  335. package/src/rules/common/operation-tag-defined.ts +4 -4
  336. package/src/rules/common/parameter-description.ts +4 -4
  337. package/src/rules/common/path-declaration-must-exist.ts +2 -2
  338. package/src/rules/common/path-excludes-patterns.ts +4 -4
  339. package/src/rules/common/path-http-verbs-order.ts +4 -4
  340. package/src/rules/common/path-not-include-query.ts +2 -2
  341. package/src/rules/common/path-params-defined.ts +4 -4
  342. package/src/rules/common/path-segment-plural.ts +3 -2
  343. package/src/rules/common/paths-kebab-case.ts +2 -2
  344. package/src/rules/common/required-string-property-missing-min-length.ts +4 -4
  345. package/src/rules/common/response-contains-header.ts +5 -4
  346. package/src/rules/common/scalar-property-missing-example.ts +2 -1
  347. package/src/rules/common/security-defined.ts +5 -5
  348. package/src/rules/common/spec-strict-refs.ts +2 -1
  349. package/src/rules/common/spec.ts +4 -3
  350. package/src/rules/common/tag-description.ts +2 -1
  351. package/src/rules/common/tags-alphabetical.ts +4 -4
  352. package/src/rules/no-unresolved-refs.ts +4 -3
  353. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +7 -5
  354. package/src/rules/oas2/__tests__/response-contains-header.test.ts +14 -8
  355. package/src/rules/oas2/__tests__/response-contains-property.test.ts +14 -8
  356. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +3 -1
  357. package/src/rules/oas2/boolean-parameter-prefixes.ts +1 -1
  358. package/src/rules/oas2/index.ts +8 -6
  359. package/src/rules/oas2/request-mime-type.ts +2 -1
  360. package/src/rules/oas2/response-contains-property.ts +3 -2
  361. package/src/rules/oas2/response-mime-type.ts +2 -1
  362. package/src/rules/oas3/__tests__/array-parameter-serialization.test.ts +18 -6
  363. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +7 -5
  364. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +6 -6
  365. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +2 -2
  366. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +34 -24
  367. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +3 -3
  368. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +3 -3
  369. package/src/rules/oas3/__tests__/no-unused-components.test.ts +1 -1
  370. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +3 -3
  371. package/src/rules/oas3/__tests__/response-contains-header.test.ts +34 -22
  372. package/src/rules/oas3/__tests__/response-contains-property.test.ts +34 -20
  373. package/src/rules/oas3/__tests__/spec/spec.test.ts +12 -3
  374. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +9 -3
  375. package/src/rules/oas3/__tests__/utils/lint-document-for-test.ts +1 -1
  376. package/src/rules/oas3/array-parameter-serialization.ts +3 -2
  377. package/src/rules/oas3/boolean-parameter-prefixes.ts +1 -1
  378. package/src/rules/oas3/component-name-unique.ts +3 -3
  379. package/src/rules/oas3/index.ts +42 -38
  380. package/src/rules/oas3/no-empty-servers.ts +1 -1
  381. package/src/rules/oas3/no-example-value-and-externalValue.ts +1 -1
  382. package/src/rules/oas3/no-invalid-media-type-examples.ts +6 -4
  383. package/src/rules/oas3/no-server-example.com.ts +2 -1
  384. package/src/rules/oas3/no-server-trailing-slash.ts +1 -1
  385. package/src/rules/oas3/no-server-variables-empty-enum.ts +2 -2
  386. package/src/rules/oas3/no-undefined-server-variable.ts +1 -1
  387. package/src/rules/oas3/no-unused-components.ts +2 -2
  388. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +2 -1
  389. package/src/rules/oas3/request-mime-type.ts +2 -1
  390. package/src/rules/oas3/response-contains-property.ts +3 -2
  391. package/src/rules/oas3/response-mime-type.ts +2 -1
  392. package/src/rules/oas3/spec-components-invalid-map-name.ts +3 -3
  393. package/src/rules/other/stats.ts +8 -6
  394. package/src/rules/spot/parameters-no-body-inside-in.ts +17 -0
  395. package/src/rules/utils.ts +41 -4
  396. package/src/types/arazzo.ts +257 -334
  397. package/src/types/{asyncapi.ts → asyncapi2.ts} +41 -35
  398. package/src/types/asyncapi3.ts +383 -0
  399. package/src/types/json-schema-adapter.ts +2 -2
  400. package/src/types/oas3.ts +4 -4
  401. package/src/types/oas3_1.ts +5 -4
  402. package/src/types/redocly-yaml.ts +21 -4
  403. package/src/typings/arazzo.ts +169 -41
  404. package/src/typings/asyncapi3.ts +61 -0
  405. package/src/typings/common.ts +1 -0
  406. package/src/typings/swagger.ts +2 -2
  407. package/src/utils.ts +5 -3
  408. package/src/visitors.ts +58 -1
  409. package/src/walk.ts +3 -3
  410. package/tsconfig.tsbuildinfo +1 -1
  411. package/lib/types/asyncapi.d.ts +0 -2
@@ -1,8 +1,9 @@
1
- import { Oas3Decorator } from '../../visitors';
2
- import { Oas3Operation, Oas3RequestBody, Oas3Response } from '../../typings/openapi';
3
1
  import { yamlAndJsonSyncReader } from '../../utils';
4
2
  import { isRef } from '../../ref-utils';
5
- import { NonUndefined, ResolveFn, UserContext } from '../../walk';
3
+
4
+ import type { Oas3Decorator } from '../../visitors';
5
+ import type { Oas3Operation, Oas3RequestBody, Oas3Response } from '../../typings/openapi';
6
+ import type { NonUndefined, ResolveFn, UserContext } from '../../walk';
6
7
 
7
8
  export const MediaTypeExamplesOverride: Oas3Decorator = ({ operationIds }) => {
8
9
  return {
@@ -1,8 +1,9 @@
1
- import { Oas3Decorator, Oas2Decorator } from '../../visitors';
2
- import { Oas2Operation } from '../../typings/swagger';
3
- import { Oas3Operation } from '../../typings/openapi';
4
1
  import { readFileAsStringSync } from '../../utils';
5
- import { UserContext } from '../../walk';
2
+
3
+ import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
4
+ import type { Oas2Operation } from '../../typings/swagger';
5
+ import type { Oas3Operation } from '../../typings/openapi';
6
+ import type { UserContext } from '../../walk';
6
7
 
7
8
  export const OperationDescriptionOverride: Oas3Decorator | Oas2Decorator = ({ operationIds }) => {
8
9
  return {
@@ -1,7 +1,7 @@
1
- import { UserContext } from '../../walk';
2
1
  import { isRedoclyRegistryURL } from '../../redocly/domains';
3
2
 
4
- import { Oas3Decorator, Oas2Decorator } from '../../visitors';
3
+ import type { UserContext } from '../../walk';
4
+ import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
5
5
 
6
6
  export const RegistryDependencies: Oas3Decorator | Oas2Decorator = () => {
7
7
  const registryDependencies = new Set<string>();
@@ -1,12 +1,13 @@
1
- import { Oas3Decorator, Oas2Decorator } from '../../visitors';
2
1
  import { isEmptyArray, isEmptyObject, isPlainObject } from '../../utils';
3
- import { UserContext } from '../../walk';
4
2
  import { isRef } from '../../ref-utils';
5
3
 
4
+ import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
5
+ import type { UserContext } from '../../walk';
6
+
6
7
  const DEFAULT_INTERNAL_PROPERTY_NAME = 'x-internal';
7
8
 
8
9
  export const RemoveXInternal: Oas3Decorator | Oas2Decorator = ({ internalFlagProperty }) => {
9
- const hiddenTag = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
10
+ const hiddenTag: string = internalFlagProperty || DEFAULT_INTERNAL_PROPERTY_NAME;
10
11
 
11
12
  function removeInternal(node: any, ctx: UserContext) {
12
13
  const { parent, key } = ctx;
@@ -31,7 +32,7 @@ export const RemoveXInternal: Oas3Decorator | Oas2Decorator = ({ internalFlagPro
31
32
  for (const key of Object.keys(node)) {
32
33
  node = node as any;
33
34
  if (isRef(node[key])) {
34
- const resolved = ctx.resolve(node[key]);
35
+ const resolved = ctx.resolve<any>(node[key]);
35
36
  if (resolved.node?.[hiddenTag]) {
36
37
  delete node[key];
37
38
  didDelete = true;
@@ -1,6 +1,7 @@
1
- import { Oas3Decorator, Oas2Decorator } from '../../visitors';
2
1
  import { readFileAsStringSync } from '../../utils';
3
- import { UserContext } from '../../walk';
2
+
3
+ import type { Oas3Decorator, Oas2Decorator } from '../../visitors';
4
+ import type { UserContext } from '../../walk';
4
5
 
5
6
  export const TagDescriptionOverride: Oas3Decorator | Oas2Decorator = ({ tagNames }) => {
6
7
  return {
@@ -38,7 +38,7 @@ describe('oas2 remove-unused-components', () => {
38
38
  const results = await bundleDocument({
39
39
  externalRefResolver: new BaseResolver(),
40
40
  document,
41
- config: await makeConfig({}),
41
+ config: await makeConfig({ rules: {} }),
42
42
  removeUnusedComponents: true,
43
43
  });
44
44
 
@@ -111,7 +111,7 @@ describe('oas2 remove-unused-components', () => {
111
111
  const results = await bundleDocument({
112
112
  externalRefResolver: new BaseResolver(),
113
113
  document,
114
- config: await makeConfig({}),
114
+ config: await makeConfig({ rules: {} }),
115
115
  removeUnusedComponents: true,
116
116
  });
117
117
 
@@ -192,7 +192,7 @@ describe('oas2 remove-unused-components', () => {
192
192
  const results = await bundleDocument({
193
193
  externalRefResolver: new BaseResolver(),
194
194
  document,
195
- config: await makeConfig({}),
195
+ config: await makeConfig({ rules: {} }),
196
196
  removeUnusedComponents: true,
197
197
  });
198
198
 
@@ -1,4 +1,3 @@
1
- import { Oas2Decorator } from '../../visitors';
2
1
  import { RegistryDependencies } from '../common/registry-dependencies';
3
2
  import { OperationDescriptionOverride } from '../common/operation-description-override';
4
3
  import { TagDescriptionOverride } from '../common/tag-description-override';
@@ -8,6 +7,8 @@ import { RemoveXInternal } from '../common/remove-x-internal';
8
7
  import { FilterIn } from '../common/filters/filter-in';
9
8
  import { FilterOut } from '../common/filters/filter-out';
10
9
 
10
+ import type { Oas2Decorator } from '../../visitors';
11
+
11
12
  export const decorators = {
12
13
  'registry-dependencies': RegistryDependencies as Oas2Decorator,
13
14
  'operation-description-override': OperationDescriptionOverride as Oas2Decorator,
@@ -1,6 +1,6 @@
1
- import { Location } from '../../ref-utils';
2
1
  import { isEmptyObject } from '../../utils';
3
2
 
3
+ import type { Location } from '../../ref-utils';
4
4
  import type { Oas2Decorator } from '../../visitors';
5
5
  import type { Oas2Components, Oas2Definition } from '../../typings/swagger';
6
6
 
@@ -42,7 +42,7 @@ describe('oas3 remove-unused-components', () => {
42
42
  const results = await bundleDocument({
43
43
  externalRefResolver: new BaseResolver(),
44
44
  document,
45
- config: await makeConfig({}),
45
+ config: await makeConfig({ rules: {} }),
46
46
  removeUnusedComponents: true,
47
47
  });
48
48
 
@@ -121,7 +121,7 @@ describe('oas3 remove-unused-components', () => {
121
121
  const results = await bundleDocument({
122
122
  externalRefResolver: new BaseResolver(),
123
123
  document,
124
- config: await makeConfig({}),
124
+ config: await makeConfig({ rules: {} }),
125
125
  removeUnusedComponents: true,
126
126
  });
127
127
 
@@ -204,7 +204,7 @@ describe('oas3 remove-unused-components', () => {
204
204
  const results = await bundleDocument({
205
205
  externalRefResolver: new BaseResolver(),
206
206
  document,
207
- config: await makeConfig({}),
207
+ config: await makeConfig({ rules: {} }),
208
208
  removeUnusedComponents: true,
209
209
  });
210
210
 
@@ -270,7 +270,7 @@ describe('oas3 remove-unused-components', () => {
270
270
  const results = await bundleDocument({
271
271
  externalRefResolver: new BaseResolver(),
272
272
  document,
273
- config: await makeConfig({}),
273
+ config: await makeConfig({ rules: {} }),
274
274
  removeUnusedComponents: true,
275
275
  });
276
276
 
@@ -1,4 +1,3 @@
1
- import { Oas3Decorator } from '../../visitors';
2
1
  import { RegistryDependencies } from '../common/registry-dependencies';
3
2
  import { OperationDescriptionOverride } from '../common/operation-description-override';
4
3
  import { TagDescriptionOverride } from '../common/tag-description-override';
@@ -9,6 +8,8 @@ import { FilterIn } from '../common/filters/filter-in';
9
8
  import { FilterOut } from '../common/filters/filter-out';
10
9
  import { MediaTypeExamplesOverride } from '../common/media-type-examples-override';
11
10
 
11
+ import type { Oas3Decorator } from '../../visitors';
12
+
12
13
  export const decorators = {
13
14
  'registry-dependencies': RegistryDependencies as Oas3Decorator,
14
15
  'operation-description-override': OperationDescriptionOverride as Oas3Decorator,
@@ -1,6 +1,6 @@
1
- import { Location } from '../../ref-utils';
2
1
  import { isEmptyObject } from '../../utils';
3
2
 
3
+ import type { Location } from '../../ref-utils';
4
4
  import type { Oas3Decorator } from '../../visitors';
5
5
  import type { Oas3Components, Oas3Definition } from '../../typings/openapi';
6
6
 
@@ -1,8 +1,9 @@
1
1
  import * as yamlAst from 'yaml-ast-parser';
2
2
  import { unescapePointer } from '../ref-utils';
3
- import { LineColLocationObject, Loc, LocationObject } from '../walk';
4
3
  import { colorize, colorOptions } from '../logger';
5
4
 
5
+ import type { LineColLocationObject, Loc, LocationObject } from '../walk';
6
+
6
7
  type YAMLMapping = yamlAst.YAMLMapping & { kind: yamlAst.Kind.MAPPING };
7
8
  type YAMLMap = yamlAst.YamlMap & { kind: yamlAst.Kind.MAP };
8
9
  type YAMLAnchorReference = yamlAst.YAMLAnchorReference & { kind: yamlAst.Kind.ANCHOR_REF };
@@ -1,14 +1,19 @@
1
1
  import * as path from 'path';
2
2
  import { colorOptions, colorize, logger } from '../logger';
3
3
  import { output } from '../output';
4
-
5
- const coreVersion = require('../../package.json').version;
6
-
7
- import { NormalizedProblem, ProblemSeverity, LineColLocationObject, LocationObject } from '../walk';
8
4
  import { getCodeframe, getLineColLocation } from './codeframes';
9
5
  import { env, isBrowser } from '../env';
10
6
  import { isAbsoluteUrl } from '../ref-utils';
11
7
 
8
+ import type {
9
+ NormalizedProblem,
10
+ ProblemSeverity,
11
+ LineColLocationObject,
12
+ LocationObject,
13
+ } from '../walk';
14
+
15
+ const coreVersion = require('../../package.json').version;
16
+
12
17
  export type Totals = {
13
18
  errors: number;
14
19
  warnings: number;
package/src/index.ts CHANGED
@@ -11,7 +11,8 @@ export { Oas3_1Types } from './types/oas3_1';
11
11
  export { ArazzoTypes } from './types/arazzo';
12
12
  export { Oas3Types } from './types/oas3';
13
13
  export { Oas2Types } from './types/oas2';
14
- export { AsyncApi2Types } from './types/asyncapi';
14
+ export { AsyncApi2Types } from './types/asyncapi2';
15
+ export { AsyncApi3Types } from './types/asyncapi3';
15
16
  export { ConfigTypes } from './types/redocly-yaml';
16
17
  export type {
17
18
  Oas3Definition,
@@ -1,7 +1,9 @@
1
1
  // TODO: add a type for "types" https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/js-yaml/index.d.ts
2
2
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
3
  // @ts-ignore
4
- import { JSON_SCHEMA, types, LoadOptions, DumpOptions, load, dump } from 'js-yaml';
4
+ import { JSON_SCHEMA, types, load, dump } from 'js-yaml';
5
+
6
+ import type { LoadOptions, DumpOptions } from 'js-yaml';
5
7
 
6
8
  const DEFAULT_SCHEMA_WITHOUT_TIMESTAMP = JSON_SCHEMA.extend({
7
9
  implicit: [types.merge],
package/src/lint.ts CHANGED
@@ -1,7 +1,8 @@
1
+ import { rootRedoclyConfigSchema } from '@redocly/config';
1
2
  import { BaseResolver, resolveDocument, makeDocumentFromString } from './resolve';
2
3
  import { normalizeVisitors } from './visitors';
3
4
  import { walkDocument } from './walk';
4
- import { StyleguideConfig, Config, initRules } from './config';
5
+ import { initRules } from './config';
5
6
  import { normalizeTypes } from './types';
6
7
  import { releaseAjvInstance } from './rules/ajv';
7
8
  import { SpecVersion, getMajorSpecVersion, detectSpec, getTypes } from './oas-types';
@@ -9,19 +10,30 @@ import { createConfigTypes } from './types/redocly-yaml';
9
10
  import { Spec } from './rules/common/spec';
10
11
  import { NoUnresolvedRefs } from './rules/no-unresolved-refs';
11
12
 
13
+ import type { StyleguideConfig, Config } from './config';
12
14
  import type { Document, ResolvedRefMap } from './resolve';
13
15
  import type { ProblemSeverity, WalkContext } from './walk';
14
16
  import type { NodeType } from './types';
15
- import type { NestedVisitObject, Oas3Visitor, RuleInstanceConfig } from './visitors';
16
- import { rootRedoclyConfigSchema } from '@redocly/config';
17
+ import type {
18
+ ArazzoVisitor,
19
+ Async2Visitor,
20
+ Async3Visitor,
21
+ NestedVisitObject,
22
+ Oas2Visitor,
23
+ Oas3Visitor,
24
+ RuleInstanceConfig,
25
+ } from './visitors';
26
+ import type { CollectFn } from './utils';
17
27
 
18
28
  export async function lint(opts: {
19
29
  ref: string;
20
30
  config: Config;
21
31
  externalRefResolver?: BaseResolver;
32
+ collectSpecData?: CollectFn;
22
33
  }) {
23
34
  const { ref, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
24
35
  const document = (await externalRefResolver.resolveDocument(null, ref, true)) as Document;
36
+ opts.collectSpecData?.(document.parsed);
25
37
 
26
38
  return lintDocument({
27
39
  document,
@@ -130,7 +142,19 @@ export async function lintConfig(opts: {
130
142
  );
131
143
 
132
144
  const rules: (RuleInstanceConfig & {
133
- visitor: NestedVisitObject<unknown, Oas3Visitor | Oas3Visitor[]>;
145
+ visitor: NestedVisitObject<
146
+ unknown,
147
+ | Oas3Visitor
148
+ | Oas3Visitor[]
149
+ | Oas2Visitor
150
+ | Oas2Visitor[]
151
+ | Async2Visitor
152
+ | Async2Visitor[]
153
+ | Async3Visitor
154
+ | Async3Visitor[]
155
+ | ArazzoVisitor
156
+ | ArazzoVisitor[]
157
+ >;
134
158
  })[] = [
135
159
  {
136
160
  severity: severity || 'error',
package/src/logger.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as colorette from 'colorette';
2
- export { options as colorOptions } from 'colorette';
3
-
4
2
  import { isBrowser } from './env';
5
3
  import { identity } from './utils';
6
4
 
5
+ export { options as colorOptions } from 'colorette';
6
+
7
7
  export const colorize = new Proxy(colorette, {
8
8
  get(target: typeof colorette, prop: string): typeof identity {
9
9
  if (isBrowser) {
package/src/oas-types.ts CHANGED
@@ -1,33 +1,38 @@
1
- import {
2
- Oas3Rule,
3
- Oas3Preprocessor,
4
- Oas2Rule,
5
- Oas2Preprocessor,
6
- Async2Preprocessor,
7
- Async2Rule,
8
- ArazzoPreprocessor,
9
- ArazzoRule,
10
- } from './visitors';
11
1
  import { Oas2Types } from './types/oas2';
12
2
  import { Oas3Types } from './types/oas3';
13
3
  import { Oas3_1Types } from './types/oas3_1';
14
- import { AsyncApi2Types } from './types/asyncapi';
4
+ import { AsyncApi2Types } from './types/asyncapi2';
5
+ import { AsyncApi3Types } from './types/asyncapi3';
15
6
  import { ArazzoTypes } from './types/arazzo';
16
- import {
7
+ import { isPlainObject } from './utils';
8
+
9
+ import type {
17
10
  BuiltInAsync2RuleId,
11
+ BuiltInAsync3RuleId,
18
12
  BuiltInCommonOASRuleId,
19
13
  BuiltInArazzoRuleId,
20
14
  BuiltInOAS2RuleId,
21
15
  BuiltInOAS3RuleId,
22
16
  } from './types/redocly-yaml';
23
-
24
- export type RuleSet<T> = Record<string, T>;
17
+ import type {
18
+ Oas3Rule,
19
+ Oas3Preprocessor,
20
+ Oas2Rule,
21
+ Oas2Preprocessor,
22
+ Async2Preprocessor,
23
+ Async2Rule,
24
+ Async3Preprocessor,
25
+ Async3Rule,
26
+ ArazzoPreprocessor,
27
+ ArazzoRule,
28
+ } from './visitors';
25
29
 
26
30
  export enum SpecVersion {
27
31
  OAS2 = 'oas2',
28
32
  OAS3_0 = 'oas3_0',
29
33
  OAS3_1 = 'oas3_1',
30
- Async2 = 'async2', // todo split into 2.x maybe?
34
+ Async2 = 'async2',
35
+ Async3 = 'async3',
31
36
  Arazzo = 'arazzo',
32
37
  }
33
38
 
@@ -35,6 +40,7 @@ export enum SpecMajorVersion {
35
40
  OAS2 = 'oas2',
36
41
  OAS3 = 'oas3',
37
42
  Async2 = 'async2',
43
+ Async3 = 'async3',
38
44
  Arazzo = 'arazzo',
39
45
  }
40
46
 
@@ -43,6 +49,7 @@ const typesMap = {
43
49
  [SpecVersion.OAS3_0]: Oas3Types,
44
50
  [SpecVersion.OAS3_1]: Oas3_1Types,
45
51
  [SpecVersion.Async2]: AsyncApi2Types,
52
+ [SpecVersion.Async3]: AsyncApi3Types,
46
53
  [SpecVersion.Arazzo]: ArazzoTypes,
47
54
  };
48
55
 
@@ -65,6 +72,11 @@ export type Async2RuleSet<T = undefined> = RuleMap<
65
72
  Async2Rule,
66
73
  T
67
74
  >;
75
+ export type Async3RuleSet<T = undefined> = RuleMap<
76
+ BuiltInAsync3RuleId | 'assertions',
77
+ Async3Rule,
78
+ T
79
+ >;
68
80
  export type ArazzoRuleSet<T = undefined> = RuleMap<
69
81
  BuiltInArazzoRuleId | 'assertions',
70
82
  ArazzoRule,
@@ -74,15 +86,17 @@ export type ArazzoRuleSet<T = undefined> = RuleMap<
74
86
  export type Oas3PreprocessorsSet = Record<string, Oas3Preprocessor>;
75
87
  export type Oas2PreprocessorsSet = Record<string, Oas2Preprocessor>;
76
88
  export type Async2PreprocessorsSet = Record<string, Async2Preprocessor>;
89
+ export type Async3PreprocessorsSet = Record<string, Async3Preprocessor>;
77
90
  export type ArazzoPreprocessorsSet = Record<string, ArazzoPreprocessor>;
78
91
 
79
92
  export type Oas3DecoratorsSet = Record<string, Oas3Preprocessor>;
80
93
  export type Oas2DecoratorsSet = Record<string, Oas2Preprocessor>;
81
94
  export type Async2DecoratorsSet = Record<string, Async2Preprocessor>;
95
+ export type Async3DecoratorsSet = Record<string, Async3Preprocessor>;
82
96
  export type ArazzoDecoratorsSet = Record<string, ArazzoPreprocessor>;
83
97
 
84
- export function detectSpec(root: any): SpecVersion {
85
- if (typeof root !== 'object') {
98
+ export function detectSpec(root: unknown): SpecVersion {
99
+ if (!isPlainObject(root)) {
86
100
  throw new Error(`Document must be JSON object, got ${typeof root}`);
87
101
  }
88
102
 
@@ -90,11 +104,11 @@ export function detectSpec(root: any): SpecVersion {
90
104
  throw new Error(`Invalid OpenAPI version: should be a string but got "${typeof root.openapi}"`);
91
105
  }
92
106
 
93
- if (root.openapi && root.openapi.startsWith('3.0')) {
107
+ if (typeof root.openapi === 'string' && root.openapi.startsWith('3.0')) {
94
108
  return SpecVersion.OAS3_0;
95
109
  }
96
110
 
97
- if (root.openapi && root.openapi.startsWith('3.1')) {
111
+ if (typeof root.openapi === 'string' && root.openapi.startsWith('3.1')) {
98
112
  return SpecVersion.OAS3_1;
99
113
  }
100
114
 
@@ -102,20 +116,23 @@ export function detectSpec(root: any): SpecVersion {
102
116
  return SpecVersion.OAS2;
103
117
  }
104
118
 
105
- // if not detected yet
106
119
  if (root.openapi || root.swagger) {
107
120
  throw new Error(`Unsupported OpenAPI version: ${root.openapi || root.swagger}`);
108
121
  }
109
122
 
110
- if (root.asyncapi && root.asyncapi.startsWith('2.')) {
123
+ if (typeof root.asyncapi === 'string' && root.asyncapi.startsWith('2.')) {
111
124
  return SpecVersion.Async2;
112
125
  }
113
126
 
127
+ if (typeof root.asyncapi === 'string' && root.asyncapi.startsWith('3.')) {
128
+ return SpecVersion.Async3;
129
+ }
130
+
114
131
  if (root.asyncapi) {
115
132
  throw new Error(`Unsupported AsyncAPI version: ${root.asyncapi}`);
116
133
  }
117
134
 
118
- if (root.arazzo && root.arazzo.startsWith('1.')) {
135
+ if (typeof root.arazzo === 'string' && root.arazzo.startsWith('1.')) {
119
136
  return SpecVersion.Arazzo;
120
137
  }
121
138
 
@@ -127,6 +144,8 @@ export function getMajorSpecVersion(version: SpecVersion): SpecMajorVersion {
127
144
  return SpecMajorVersion.OAS2;
128
145
  } else if (version === SpecVersion.Async2) {
129
146
  return SpecMajorVersion.Async2;
147
+ } else if (version === SpecVersion.Async3) {
148
+ return SpecMajorVersion.Async3;
130
149
  } else if (version === SpecVersion.Arazzo) {
131
150
  return SpecMajorVersion.Arazzo;
132
151
  } else {
@@ -1,4 +1,4 @@
1
- import { Region } from '../config/types';
1
+ import type { Region } from '../config/types';
2
2
 
3
3
  let redoclyDomain = 'redocly.com';
4
4
 
@@ -3,11 +3,8 @@ import { resolve } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { RegistryApi } from './registry-api';
5
5
  import { env } from '../env';
6
- import { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
7
6
  import { isNotEmptyObject } from '../utils';
8
7
  import { colorize } from '../logger';
9
-
10
- import type { AccessTokens, Region } from '../config/types';
11
8
  import {
12
9
  AVAILABLE_REGIONS,
13
10
  DEFAULT_REGION,
@@ -16,6 +13,9 @@ import {
16
13
  setRedoclyDomain,
17
14
  } from './domains';
18
15
 
16
+ import type { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
17
+ import type { AccessTokens, Region } from '../config/types';
18
+
19
19
  export const TOKEN_FILENAME = '.redocly-config.json';
20
20
 
21
21
  export class RedoclyClient {
@@ -1,4 +1,8 @@
1
- import fetch, { RequestInit, HeadersInit } from 'node-fetch';
1
+ import fetch from 'node-fetch';
2
+ import { getProxyAgent, isNotEmptyObject } from '../utils';
3
+ import { getRedoclyDomain } from './domains';
4
+
5
+ import type { RequestInit, HeadersInit } from 'node-fetch';
2
6
  import type {
3
7
  NotFoundProblemResponse,
4
8
  PrepareFileuploadOKResponse,
@@ -6,8 +10,6 @@ import type {
6
10
  PushApiParams,
7
11
  } from './registry-api-types';
8
12
  import type { AccessTokens, Region } from '../config/types';
9
- import { getProxyAgent, isNotEmptyObject } from '../utils';
10
- import { getRedoclyDomain } from './domains';
11
13
 
12
14
  const version = require('../../package.json').version;
13
15
 
package/src/ref-utils.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { Source } from './resolve';
2
- import { OasRef } from './typings/openapi';
3
1
  import { isTruthy } from './utils';
4
2
 
3
+ import type { Source } from './resolve';
4
+ import type { OasRef } from './typings/openapi';
5
+
5
6
  export function joinPointer(base: string, key: string | number) {
6
7
  if (base === '') base = '#/';
7
8
  return base[base.length - 1] === '/' ? base + key : base + '/' + key;
@@ -60,6 +61,7 @@ export function pointerBaseName(pointer: string) {
60
61
  }
61
62
 
62
63
  export function refBaseName(ref: string) {
64
+ // eslint-disable-next-line no-useless-escape
63
65
  const parts = ref.split(/[\/\\]/); // split by '\' and '/'
64
66
  return parts[parts.length - 1].replace(/\.[^.]+$/, ''); // replace extension with empty string
65
67
  }
package/src/resolve.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { OasRef } from './typings/openapi';
4
3
  import { isRef, joinPointer, escapePointer, parseRef, isAbsoluteUrl, isAnchor } from './ref-utils';
5
- import type { YAMLNode, LoadOptions } from 'yaml-ast-parser';
6
- import { NormalizedNodeType, isNamedType, SpecExtension } from './types';
4
+ import { isNamedType, SpecExtension } from './types';
7
5
  import { readFileFromUrl, parseYaml, nextTick } from './utils';
8
- import { ResolveConfig } from './config/types';
6
+
7
+ import type { YAMLNode, LoadOptions } from 'yaml-ast-parser';
8
+ import type { NormalizedNodeType } from './types';
9
+ import type { ResolveConfig } from './config/types';
10
+ import type { OasRef } from './typings/openapi';
9
11
 
10
12
  export type CollectedRefs = Map<string /* absoluteFilePath */, Document>;
11
13
 
@@ -22,7 +22,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
22
22
  externalRefResolver: new BaseResolver(),
23
23
  document,
24
24
  config: await makeConfig({
25
- 'no-unresolved-refs': 'error',
25
+ rules: {
26
+ 'no-unresolved-refs': 'error',
27
+ },
26
28
  }),
27
29
  });
28
30
 
@@ -62,7 +64,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
62
64
  externalRefResolver: new BaseResolver(),
63
65
  document,
64
66
  config: await makeConfig({
65
- 'no-unresolved-refs': 'error',
67
+ rules: {
68
+ 'no-unresolved-refs': 'error',
69
+ },
66
70
  }),
67
71
  });
68
72
 
@@ -119,7 +123,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
119
123
  externalRefResolver: new BaseResolver(),
120
124
  document,
121
125
  config: await makeConfig({
122
- 'no-unresolved-refs': 'error',
126
+ rules: {
127
+ 'no-unresolved-refs': 'error',
128
+ },
123
129
  }),
124
130
  });
125
131
 
@@ -143,7 +149,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
143
149
  externalRefResolver: new BaseResolver(),
144
150
  document,
145
151
  config: await makeConfig({
146
- 'no-unresolved-refs': 'error',
152
+ rules: {
153
+ 'no-unresolved-refs': 'error',
154
+ },
147
155
  }),
148
156
  });
149
157
 
@@ -190,7 +198,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
190
198
  externalRefResolver: new BaseResolver(),
191
199
  document,
192
200
  config: await makeConfig({
193
- 'no-unresolved-refs': 'error',
201
+ rules: {
202
+ 'no-unresolved-refs': 'error',
203
+ },
194
204
  }),
195
205
  });
196
206
 
@@ -219,7 +229,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
219
229
  externalRefResolver: new BaseResolver(),
220
230
  document,
221
231
  config: await makeConfig({
222
- 'no-unresolved-refs': 'error',
232
+ rules: {
233
+ 'no-unresolved-refs': 'error',
234
+ },
223
235
  }),
224
236
  });
225
237
 
@@ -248,7 +260,9 @@ describe('oas3 boolean-parameter-prefixes', () => {
248
260
  externalRefResolver: new BaseResolver(),
249
261
  document,
250
262
  config: await makeConfig({
251
- 'no-unresolved-refs': 'error',
263
+ rules: {
264
+ 'no-unresolved-refs': 'error',
265
+ },
252
266
  }),
253
267
  });
254
268
 
package/src/rules/ajv.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import Ajv from '@redocly/ajv/dist/2020';
2
- import { Location, escapePointer } from '../ref-utils';
2
+ import { escapePointer } from '../ref-utils';
3
3
 
4
+ import type { Location } from '../ref-utils';
4
5
  import type { ValidateFunction, ErrorObject } from '@redocly/ajv/dist/2020';
5
6
  import type { ResolveFn } from '../walk';
6
7