@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,18 +1,20 @@
1
1
  import * as path from 'path';
2
+ import { existsSync } from 'fs';
2
3
  import { isAbsoluteUrl } from '../ref-utils';
3
- import { pickDefined } from '../utils';
4
+ import { pickDefined, isNotString, isString, isDefined, keysOf } from '../utils';
4
5
  import { resolveDocument, BaseResolver } from '../resolve';
5
6
  import { defaultPlugin } from './builtIn';
6
7
  import {
7
8
  getResolveConfig,
8
9
  getUniquePlugins,
10
+ isCommonJsPlugin,
11
+ isDeprecatedPluginFormat,
9
12
  mergeExtends,
10
13
  parsePresetName,
11
14
  prefixRules,
12
15
  transformConfig,
13
16
  } from './utils';
14
17
  import { isBrowser } from '../env';
15
- import { isNotString, isString, isDefined, keysOf } from '../utils';
16
18
  import { Config } from './config';
17
19
  import { colorize, logger } from '../logger';
18
20
  import { asserts, buildAssertCustomFunction } from '../rules/common/assertions/asserts';
@@ -28,12 +30,18 @@ import type {
28
30
  ResolvedStyleguideConfig,
29
31
  RuleConfig,
30
32
  DeprecatedInRawConfig,
33
+ ImportedPlugin,
31
34
  } from './types';
32
35
  import type { Assertion, AssertionDefinition, RawAssertion } from '../rules/common/assertions';
33
36
  import type { Asserts, AssertionFn } from '../rules/common/assertions/asserts';
34
37
  import type { BundleOptions } from '../bundle';
35
38
  import type { Document, ResolvedRefMap } from '../resolve';
36
39
 
40
+ const DEFAULT_PROJECT_PLUGIN_PATHS = ['@theme/plugin.js', '@theme/plugin.cjs', '@theme/plugin.mjs'];
41
+
42
+ // Workaround for dynamic imports being transpiled to require by Typescript: https://github.com/microsoft/TypeScript/issues/43329#issuecomment-811606238
43
+ const _importDynamic = new Function('modulePath', 'return import(modulePath)');
44
+
37
45
  export async function resolveConfigFileAndRefs({
38
46
  configPath,
39
47
  externalRefResolver = new BaseResolver(),
@@ -102,14 +110,24 @@ export async function resolveConfig({
102
110
  );
103
111
  }
104
112
 
105
- export function resolvePlugins(
113
+ function getDefaultPluginPath(configPath: string): string | undefined {
114
+ for (const pluginPath of DEFAULT_PROJECT_PLUGIN_PATHS) {
115
+ const absolutePluginPath = path.resolve(path.dirname(configPath), pluginPath);
116
+ if (existsSync(absolutePluginPath)) {
117
+ return pluginPath;
118
+ }
119
+ }
120
+ return undefined;
121
+ }
122
+
123
+ export async function resolvePlugins(
106
124
  plugins: (string | Plugin)[] | null,
107
125
  configPath: string = ''
108
- ): Plugin[] {
126
+ ): Promise<Plugin[]> {
109
127
  if (!plugins) return [];
110
128
 
111
129
  // TODO: implement or reuse Resolver approach so it will work in node and browser envs
112
- const requireFunc = (plugin: string | Plugin): Plugin | undefined => {
130
+ const requireFunc = async (plugin: string | Plugin): Promise<ImportedPlugin | undefined> => {
113
131
  if (isBrowser && isString(plugin)) {
114
132
  logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
115
133
 
@@ -118,14 +136,24 @@ export function resolvePlugins(
118
136
 
119
137
  if (isString(plugin)) {
120
138
  try {
121
- const absoltePluginPath = path.resolve(path.dirname(configPath), plugin);
139
+ const maybeAbsolutePluginPath = path.resolve(path.dirname(configPath), plugin);
140
+
141
+ const absolutePluginPath = existsSync(maybeAbsolutePluginPath)
142
+ ? maybeAbsolutePluginPath
143
+ : // For plugins imported from packages specifically
144
+ require.resolve(plugin);
145
+
122
146
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
123
147
  // @ts-ignore
124
- return typeof __webpack_require__ === 'function'
125
- ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
126
- // @ts-ignore
127
- __non_webpack_require__(absoltePluginPath)
128
- : require(absoltePluginPath);
148
+ if (typeof __webpack_require__ === 'function') {
149
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
150
+ // @ts-ignore
151
+ return __non_webpack_require__(absolutePluginPath);
152
+ } else {
153
+ // you can import both cjs and mjs
154
+ const mod = await _importDynamic(absolutePluginPath);
155
+ return mod.default || mod;
156
+ }
129
157
  } catch (e) {
130
158
  if (e instanceof SyntaxError) {
131
159
  throw e;
@@ -139,19 +167,47 @@ export function resolvePlugins(
139
167
 
140
168
  const seenPluginIds = new Map<string, string>();
141
169
 
142
- return plugins
143
- .map((p) => {
144
- if (isString(p) && isAbsoluteUrl(p)) {
145
- throw new Error(colorize.red(`We don't support remote plugins yet.`));
170
+ /**
171
+ * Include the default plugin automatically if it's not in configuration
172
+ */
173
+ const defaultPluginPath = getDefaultPluginPath(configPath);
174
+ if (defaultPluginPath) {
175
+ plugins.push(defaultPluginPath);
176
+ }
177
+
178
+ const resolvedPlugins: Set<string> = new Set();
179
+
180
+ const instances = await Promise.all(
181
+ plugins.map(async (p) => {
182
+ if (isString(p)) {
183
+ if (isAbsoluteUrl(p)) {
184
+ throw new Error(colorize.red(`We don't support remote plugins yet.`));
185
+ }
186
+ if (resolvedPlugins.has(p)) {
187
+ return;
188
+ }
189
+
190
+ resolvedPlugins.add(p);
146
191
  }
147
192
 
148
- // TODO: resolve npm packages similar to eslint
149
- const pluginModule = requireFunc(p);
193
+ const requiredPlugin: ImportedPlugin | undefined = await requireFunc(p);
194
+
195
+ const pluginCreatorOptions = { contentDir: path.dirname(configPath) };
196
+
197
+ const pluginModule = isDeprecatedPluginFormat(requiredPlugin)
198
+ ? requiredPlugin
199
+ : isCommonJsPlugin(requiredPlugin)
200
+ ? await requiredPlugin(pluginCreatorOptions)
201
+ : await requiredPlugin?.default?.(pluginCreatorOptions);
150
202
 
151
203
  if (!pluginModule) {
152
204
  return;
153
205
  }
154
206
 
207
+ if (isString(p) && pluginModule.id && isDeprecatedPluginFormat(requiredPlugin)) {
208
+ logger.info(`Deprecated plugin format detected: ${pluginModule.id}\n`);
209
+ }
210
+
155
211
  const id = pluginModule.id;
156
212
  if (typeof id !== 'string') {
157
213
  throw new Error(
@@ -181,7 +237,7 @@ export function resolvePlugins(
181
237
  if (pluginModule.rules) {
182
238
  if (!pluginModule.rules.oas3 && !pluginModule.rules.oas2 && !pluginModule.rules.async2) {
183
239
  throw new Error(
184
- `Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, or \`arazzo\` rules "${p}.`
240
+ `Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, \`async3\` or \`arazzo\` rules "${p}.`
185
241
  );
186
242
  }
187
243
  plugin.rules = {};
@@ -194,6 +250,9 @@ export function resolvePlugins(
194
250
  if (pluginModule.rules.async2) {
195
251
  plugin.rules.async2 = prefixRules(pluginModule.rules.async2, id);
196
252
  }
253
+ if (pluginModule.rules.async3) {
254
+ plugin.rules.async3 = prefixRules(pluginModule.rules.async3, id);
255
+ }
197
256
  if (pluginModule.rules.arazzo) {
198
257
  plugin.rules.arazzo = prefixRules(pluginModule.rules.arazzo, id);
199
258
  }
@@ -203,6 +262,7 @@ export function resolvePlugins(
203
262
  !pluginModule.preprocessors.oas3 &&
204
263
  !pluginModule.preprocessors.oas2 &&
205
264
  !pluginModule.preprocessors.async2 &&
265
+ !pluginModule.preprocessors.async3 &&
206
266
  !pluginModule.preprocessors.arazzo
207
267
  ) {
208
268
  throw new Error(
@@ -219,6 +279,9 @@ export function resolvePlugins(
219
279
  if (pluginModule.preprocessors.async2) {
220
280
  plugin.preprocessors.async2 = prefixRules(pluginModule.preprocessors.async2, id);
221
281
  }
282
+ if (pluginModule.preprocessors.async3) {
283
+ plugin.preprocessors.async3 = prefixRules(pluginModule.preprocessors.async3, id);
284
+ }
222
285
  if (pluginModule.preprocessors.arazzo) {
223
286
  plugin.preprocessors.arazzo = prefixRules(pluginModule.preprocessors.arazzo, id);
224
287
  }
@@ -229,10 +292,11 @@ export function resolvePlugins(
229
292
  !pluginModule.decorators.oas3 &&
230
293
  !pluginModule.decorators.oas2 &&
231
294
  !pluginModule.decorators.async2 &&
295
+ !pluginModule.decorators.async3 &&
232
296
  !pluginModule.decorators.arazzo
233
297
  ) {
234
298
  throw new Error(
235
- `Plugin \`decorators\` must have \`oas3\`, \`oas2\` or \`async2\` decorators "${p}.`
299
+ `Plugin \`decorators\` must have \`oas3\`, \`oas2\`, \`async2\` or \`async3\` decorators "${p}.`
236
300
  );
237
301
  }
238
302
  plugin.decorators = {};
@@ -245,6 +309,9 @@ export function resolvePlugins(
245
309
  if (pluginModule.decorators.async2) {
246
310
  plugin.decorators.async2 = prefixRules(pluginModule.decorators.async2, id);
247
311
  }
312
+ if (pluginModule.decorators.async3) {
313
+ plugin.decorators.async3 = prefixRules(pluginModule.decorators.async3, id);
314
+ }
248
315
  if (pluginModule.decorators.arazzo) {
249
316
  plugin.decorators.arazzo = prefixRules(pluginModule.decorators.arazzo, id);
250
317
  }
@@ -256,7 +323,9 @@ export function resolvePlugins(
256
323
 
257
324
  return plugin;
258
325
  })
259
- .filter(isDefined);
326
+ );
327
+
328
+ return instances.filter(isDefined);
260
329
  }
261
330
 
262
331
  export async function resolveApis({
@@ -307,7 +376,7 @@ async function resolveAndMergeNestedStyleguideConfig(
307
376
  throw new Error(`Circular dependency in config file: "${configPath}"`);
308
377
  }
309
378
  const plugins = getUniquePlugins(
310
- resolvePlugins([...(styleguideConfig?.plugins || []), defaultPlugin], configPath)
379
+ await resolvePlugins([...(styleguideConfig?.plugins || []), defaultPlugin], configPath)
311
380
  );
312
381
  const pluginPaths = styleguideConfig?.plugins
313
382
  ?.filter(isString)
@@ -432,6 +501,8 @@ function getMergedRawStyleguideConfig(
432
501
  oas2Rules: { ...rootStyleguideConfig?.oas2Rules, ...apiStyleguideConfig?.oas2Rules },
433
502
  oas3_0Rules: { ...rootStyleguideConfig?.oas3_0Rules, ...apiStyleguideConfig?.oas3_0Rules },
434
503
  oas3_1Rules: { ...rootStyleguideConfig?.oas3_1Rules, ...apiStyleguideConfig?.oas3_1Rules },
504
+ async2Rules: { ...rootStyleguideConfig?.async2Rules, ...apiStyleguideConfig?.async2Rules },
505
+ async3Rules: { ...rootStyleguideConfig?.async3Rules, ...apiStyleguideConfig?.async3Rules },
435
506
  arazzoRules: { ...rootStyleguideConfig?.arazzoRules, ...apiStyleguideConfig?.arazzoRules },
436
507
  preprocessors: {
437
508
  ...rootStyleguideConfig?.preprocessors,
@@ -2,17 +2,19 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { parseYaml, stringifyYaml } from '../js-yaml';
4
4
  import { slash, doesYamlFileExist } from '../utils';
5
- import { NormalizedProblem } from '../walk';
6
- import {
7
- SpecVersion,
8
- SpecMajorVersion,
5
+ import { SpecVersion, SpecMajorVersion } from '../oas-types';
6
+ import { isBrowser } from '../env';
7
+ import { getResolveConfig } from './utils';
8
+ import { isAbsoluteUrl } from '../ref-utils';
9
+
10
+ import type { NormalizedProblem } from '../walk';
11
+ import type {
9
12
  Oas2RuleSet,
10
13
  Oas3RuleSet,
11
14
  Async2RuleSet,
15
+ Async3RuleSet,
12
16
  ArazzoRuleSet,
13
17
  } from '../oas-types';
14
- import { isBrowser } from '../env';
15
-
16
18
  import type { NodeType } from '../types';
17
19
  import type {
18
20
  DecoratorConfig,
@@ -28,8 +30,6 @@ import type {
28
30
  Telemetry,
29
31
  ThemeRawConfig,
30
32
  } from './types';
31
- import { getResolveConfig } from './utils';
32
- import { isAbsoluteUrl } from '../ref-utils';
33
33
 
34
34
  export const IGNORE_FILE = '.redocly.lint-ignore.yaml';
35
35
  const IGNORE_BANNER =
@@ -72,6 +72,7 @@ export class StyleguideConfig {
72
72
  [SpecVersion.OAS3_0]: { ...rawConfig.rules, ...rawConfig.oas3_0Rules },
73
73
  [SpecVersion.OAS3_1]: { ...rawConfig.rules, ...rawConfig.oas3_1Rules },
74
74
  [SpecVersion.Async2]: { ...rawConfig.rules, ...rawConfig.async2Rules },
75
+ [SpecVersion.Async3]: { ...rawConfig.rules, ...rawConfig.async3Rules },
75
76
  [SpecVersion.Arazzo]: { ...rawConfig.arazzoRules },
76
77
  };
77
78
 
@@ -80,6 +81,7 @@ export class StyleguideConfig {
80
81
  [SpecVersion.OAS3_0]: { ...rawConfig.preprocessors, ...rawConfig.oas3_0Preprocessors },
81
82
  [SpecVersion.OAS3_1]: { ...rawConfig.preprocessors, ...rawConfig.oas3_1Preprocessors },
82
83
  [SpecVersion.Async2]: { ...rawConfig.preprocessors, ...rawConfig.async2Preprocessors },
84
+ [SpecVersion.Async3]: { ...rawConfig.preprocessors, ...rawConfig.async3Preprocessors },
83
85
  [SpecVersion.Arazzo]: { ...rawConfig.arazzoPreprocessors },
84
86
  };
85
87
 
@@ -88,6 +90,7 @@ export class StyleguideConfig {
88
90
  [SpecVersion.OAS3_0]: { ...rawConfig.decorators, ...rawConfig.oas3_0Decorators },
89
91
  [SpecVersion.OAS3_1]: { ...rawConfig.decorators, ...rawConfig.oas3_1Decorators },
90
92
  [SpecVersion.Async2]: { ...rawConfig.decorators, ...rawConfig.async2Decorators },
93
+ [SpecVersion.Async3]: { ...rawConfig.decorators, ...rawConfig.async3Decorators },
91
94
  [SpecVersion.Arazzo]: { ...rawConfig.arazzoDecorators },
92
95
  };
93
96
 
@@ -182,6 +185,10 @@ export class StyleguideConfig {
182
185
  if (!plugin.typeExtension.async2) continue;
183
186
  extendedTypes = plugin.typeExtension.async2(extendedTypes, version);
184
187
  break;
188
+ case SpecVersion.Async3:
189
+ if (!plugin.typeExtension.async3) continue;
190
+ extendedTypes = plugin.typeExtension.async3(extendedTypes, version);
191
+ break;
185
192
  case SpecVersion.Arazzo:
186
193
  if (!plugin.typeExtension.arazzo) continue;
187
194
  extendedTypes = plugin.typeExtension.arazzo(extendedTypes, version);
@@ -276,15 +283,26 @@ export class StyleguideConfig {
276
283
  return oas2Rules;
277
284
  case SpecMajorVersion.Async2:
278
285
  // eslint-disable-next-line no-case-declarations
279
- const asyncApiRules: Async2RuleSet[] = []; // default ruleset
286
+ const asyncApi2Rules: Async2RuleSet[] = []; // default ruleset
287
+ this.plugins.forEach(
288
+ (p) => p.preprocessors?.async2 && asyncApi2Rules.push(p.preprocessors.async2)
289
+ );
290
+ this.plugins.forEach((p) => p.rules?.async2 && asyncApi2Rules.push(p.rules.async2));
291
+ this.plugins.forEach(
292
+ (p) => p.decorators?.async2 && asyncApi2Rules.push(p.decorators.async2)
293
+ );
294
+ return asyncApi2Rules;
295
+ case SpecMajorVersion.Async3:
296
+ // eslint-disable-next-line no-case-declarations
297
+ const asyncApi3Rules: Async3RuleSet[] = []; // default ruleset
280
298
  this.plugins.forEach(
281
- (p) => p.preprocessors?.async2 && asyncApiRules.push(p.preprocessors.async2)
299
+ (p) => p.preprocessors?.async3 && asyncApi3Rules.push(p.preprocessors.async3)
282
300
  );
283
- this.plugins.forEach((p) => p.rules?.async2 && asyncApiRules.push(p.rules.async2));
301
+ this.plugins.forEach((p) => p.rules?.async3 && asyncApi3Rules.push(p.rules.async3));
284
302
  this.plugins.forEach(
285
- (p) => p.decorators?.async2 && asyncApiRules.push(p.decorators.async2)
303
+ (p) => p.decorators?.async3 && asyncApi3Rules.push(p.decorators.async3)
286
304
  );
287
- return asyncApiRules;
305
+ return asyncApi3Rules;
288
306
  case SpecMajorVersion.Arazzo:
289
307
  // eslint-disable-next-line no-case-declarations
290
308
  const arazzoRules: ArazzoRuleSet[] = []; // default ruleset
@@ -3,17 +3,17 @@ import * as path from 'path';
3
3
  import { RedoclyClient } from '../redocly';
4
4
  import { isEmptyObject } from '../utils';
5
5
  import { parseYaml } from '../js-yaml';
6
- import { Config } from './config';
7
6
  import { ConfigValidationError, transformConfig, deepCloneMapWithJSON } from './utils';
8
7
  import { resolveConfig, resolveConfigFileAndRefs } from './config-resolvers';
9
8
  import { bundleConfig } from '../bundle';
10
9
  import { BaseResolver } from '../resolve';
11
10
  import { isBrowser } from '../env';
11
+ import { DOMAINS } from '../redocly/domains';
12
12
 
13
+ import type { Config } from './config';
13
14
  import type { Document, ResolvedRefMap } from '../resolve';
14
15
  import type { RegionalToken, RegionalTokenWithValidity } from '../redocly/redocly-client-types';
15
16
  import type { RawConfig, RawUniversalConfig, Region } from './types';
16
- import { DOMAINS } from '../redocly/domains';
17
17
 
18
18
  async function addConfigMetadata({
19
19
  rawConfig,
@@ -5,6 +5,7 @@ const minimal: PluginStyleguideConfig<'built-in'> = {
5
5
  'info-contact': 'off',
6
6
  'info-license': 'off',
7
7
  'info-license-url': 'off',
8
+ 'info-license-strict': 'off',
8
9
  'tag-description': 'warn',
9
10
  'tags-alphabetical': 'off',
10
11
  'parameter-description': 'off',
@@ -90,6 +91,17 @@ const minimal: PluginStyleguideConfig<'built-in'> = {
90
91
  async2Rules: {
91
92
  spec: 'error',
92
93
  'info-contact': 'off',
94
+ 'info-license-strict': 'off',
95
+ 'operation-operationId': 'warn',
96
+ 'tag-description': 'warn',
97
+ 'tags-alphabetical': 'off',
98
+ 'channels-kebab-case': 'off',
99
+ 'no-channel-trailing-slash': 'off',
100
+ },
101
+ async3Rules: {
102
+ spec: 'error',
103
+ 'info-contact': 'off',
104
+ 'info-license-strict': 'off',
93
105
  'operation-operationId': 'warn',
94
106
  'tag-description': 'warn',
95
107
  'tags-alphabetical': 'off',
@@ -98,6 +110,7 @@ const minimal: PluginStyleguideConfig<'built-in'> = {
98
110
  },
99
111
  arazzoRules: {
100
112
  spec: 'error',
113
+ 'parameters-no-body-inside-in': 'off',
101
114
  },
102
115
  };
103
116
 
@@ -4,7 +4,8 @@ const recommendedStrict: PluginStyleguideConfig<'built-in'> = {
4
4
  rules: {
5
5
  'info-contact': 'off',
6
6
  'info-license': 'error',
7
- 'info-license-url': 'error',
7
+ 'info-license-url': 'off',
8
+ 'info-license-strict': 'error',
8
9
  'tag-description': 'error',
9
10
  'tags-alphabetical': 'off',
10
11
  'parameter-description': 'off',
@@ -90,6 +91,17 @@ const recommendedStrict: PluginStyleguideConfig<'built-in'> = {
90
91
  async2Rules: {
91
92
  spec: 'error',
92
93
  'info-contact': 'off',
94
+ 'info-license-strict': 'error',
95
+ 'operation-operationId': 'error',
96
+ 'tag-description': 'error',
97
+ 'tags-alphabetical': 'off',
98
+ 'channels-kebab-case': 'off',
99
+ 'no-channel-trailing-slash': 'off',
100
+ },
101
+ async3Rules: {
102
+ spec: 'error',
103
+ 'info-contact': 'off',
104
+ 'info-license-strict': 'error',
93
105
  'operation-operationId': 'error',
94
106
  'tag-description': 'error',
95
107
  'tags-alphabetical': 'off',
@@ -98,6 +110,7 @@ const recommendedStrict: PluginStyleguideConfig<'built-in'> = {
98
110
  },
99
111
  arazzoRules: {
100
112
  spec: 'error',
113
+ 'parameters-no-body-inside-in': 'off',
101
114
  },
102
115
  };
103
116
 
@@ -4,7 +4,8 @@ const recommended: PluginStyleguideConfig<'built-in'> = {
4
4
  rules: {
5
5
  'info-contact': 'off',
6
6
  'info-license': 'warn',
7
- 'info-license-url': 'warn',
7
+ 'info-license-url': 'off',
8
+ 'info-license-strict': 'warn',
8
9
  'tag-description': 'warn',
9
10
  'tags-alphabetical': 'off',
10
11
  'parameter-description': 'off',
@@ -90,6 +91,17 @@ const recommended: PluginStyleguideConfig<'built-in'> = {
90
91
  async2Rules: {
91
92
  spec: 'error',
92
93
  'info-contact': 'off',
94
+ 'info-license-strict': 'warn',
95
+ 'operation-operationId': 'warn',
96
+ 'tag-description': 'warn',
97
+ 'tags-alphabetical': 'off',
98
+ 'channels-kebab-case': 'off',
99
+ 'no-channel-trailing-slash': 'off',
100
+ },
101
+ async3Rules: {
102
+ spec: 'error',
103
+ 'info-contact': 'off',
104
+ 'info-license-strict': 'warn',
93
105
  'operation-operationId': 'warn',
94
106
  'tag-description': 'warn',
95
107
  'tags-alphabetical': 'off',
@@ -98,6 +110,7 @@ const recommended: PluginStyleguideConfig<'built-in'> = {
98
110
  },
99
111
  arazzoRules: {
100
112
  spec: 'error',
113
+ 'parameters-no-body-inside-in': 'off',
101
114
  },
102
115
  };
103
116
 
@@ -1,6 +1,14 @@
1
- import { RuleSet, SpecVersion } from '../oas-types';
2
- import { StyleguideConfig } from './config';
3
1
  import { isDefined } from '../utils';
2
+
3
+ import type {
4
+ ArazzoRuleSet,
5
+ Async2RuleSet,
6
+ Async3RuleSet,
7
+ Oas2RuleSet,
8
+ Oas3RuleSet,
9
+ SpecVersion,
10
+ } from '../oas-types';
11
+ import type { StyleguideConfig } from './config';
4
12
  import type { ProblemSeverity } from '../walk';
5
13
 
6
14
  type InitializedRule = {
@@ -9,8 +17,8 @@ type InitializedRule = {
9
17
  visitor: any;
10
18
  };
11
19
 
12
- export function initRules<T extends Function, P extends RuleSet<T>>(
13
- rules: P[],
20
+ export function initRules(
21
+ rules: (Oas3RuleSet | Oas2RuleSet | Async2RuleSet | Async3RuleSet | ArazzoRuleSet)[],
14
22
  config: StyleguideConfig,
15
23
  type: 'rules' | 'preprocessors' | 'decorators',
16
24
  oasVersion: SpecVersion
@@ -1,3 +1,4 @@
1
+ import type { Location } from '../ref-utils';
1
2
  import type { ProblemSeverity, UserContext } from '../walk';
2
3
  import type {
3
4
  Oas3PreprocessorsSet,
@@ -11,17 +12,19 @@ import type {
11
12
  Async2PreprocessorsSet,
12
13
  Async2DecoratorsSet,
13
14
  Async2RuleSet,
15
+ Async3PreprocessorsSet,
16
+ Async3DecoratorsSet,
17
+ Async3RuleSet,
14
18
  ArazzoRuleSet,
15
19
  ArazzoPreprocessorsSet,
16
20
  ArazzoDecoratorsSet,
17
21
  RuleMap,
18
22
  } from '../oas-types';
19
-
20
23
  import type { NodeType } from '../types';
21
- import { Location } from '../ref-utils';
22
24
  import type { SkipFunctionContext } from '../visitors';
23
- import {
25
+ import type {
24
26
  BuiltInAsync2RuleId,
27
+ BuiltInAsync3RuleId,
25
28
  BuiltInCommonOASRuleId,
26
29
  BuiltInOAS2RuleId,
27
30
  BuiltInOAS3RuleId,
@@ -59,6 +62,7 @@ export type StyleguideRawConfig<T = undefined> = {
59
62
  oas3_0Rules?: RuleMap<BuiltInOAS3RuleId, RuleConfig, T>;
60
63
  oas3_1Rules?: RuleMap<BuiltInOAS3RuleId, RuleConfig, T>;
61
64
  async2Rules?: RuleMap<BuiltInAsync2RuleId, RuleConfig, T>;
65
+ async3Rules?: RuleMap<BuiltInAsync3RuleId, RuleConfig, T>;
62
66
  arazzoRules?: RuleMap<BuiltInArazzoRuleId, RuleConfig, T>;
63
67
 
64
68
  preprocessors?: Record<string, PreprocessorConfig>;
@@ -66,6 +70,7 @@ export type StyleguideRawConfig<T = undefined> = {
66
70
  oas3_0Preprocessors?: Record<string, PreprocessorConfig>;
67
71
  oas3_1Preprocessors?: Record<string, PreprocessorConfig>;
68
72
  async2Preprocessors?: Record<string, PreprocessorConfig>;
73
+ async3Preprocessors?: Record<string, PreprocessorConfig>;
69
74
  arazzoPreprocessors?: Record<string, PreprocessorConfig>;
70
75
 
71
76
  decorators?: Record<string, DecoratorConfig>;
@@ -73,6 +78,7 @@ export type StyleguideRawConfig<T = undefined> = {
73
78
  oas3_0Decorators?: Record<string, DecoratorConfig>;
74
79
  oas3_1Decorators?: Record<string, DecoratorConfig>;
75
80
  async2Decorators?: Record<string, DecoratorConfig>;
81
+ async3Decorators?: Record<string, DecoratorConfig>;
76
82
  arazzoDecorators?: Record<string, DecoratorConfig>;
77
83
  };
78
84
 
@@ -90,6 +96,7 @@ export type PreprocessorsConfig = {
90
96
  oas3?: Oas3PreprocessorsSet;
91
97
  oas2?: Oas2PreprocessorsSet;
92
98
  async2?: Async2PreprocessorsSet;
99
+ async3?: Async3PreprocessorsSet;
93
100
  arazzo?: ArazzoPreprocessorsSet;
94
101
  };
95
102
 
@@ -97,6 +104,7 @@ export type DecoratorsConfig = {
97
104
  oas3?: Oas3DecoratorsSet;
98
105
  oas2?: Oas2DecoratorsSet;
99
106
  async2?: Async2DecoratorsSet;
107
+ async3?: Async3DecoratorsSet;
100
108
  arazzo?: ArazzoDecoratorsSet;
101
109
  };
102
110
 
@@ -111,6 +119,7 @@ export type CustomRulesConfig = {
111
119
  oas3?: Oas3RuleSet;
112
120
  oas2?: Oas2RuleSet;
113
121
  async2?: Async2RuleSet;
122
+ async3?: Async3RuleSet;
114
123
  arazzo?: ArazzoRuleSet;
115
124
  };
116
125
 
@@ -135,6 +144,22 @@ export type Plugin = {
135
144
  assertions?: AssertionsConfig;
136
145
  };
137
146
 
147
+ type PluginCreatorOptions = {
148
+ contentDir: string;
149
+ };
150
+
151
+ export type PluginCreator = (options: PluginCreatorOptions) => Plugin | Promise<Plugin>;
152
+
153
+ export type ImportedPlugin =
154
+ // ES Modules
155
+ | {
156
+ default?: PluginCreator;
157
+ }
158
+ // CommonJS
159
+ | PluginCreator
160
+ // Deprecated format
161
+ | Plugin;
162
+
138
163
  export type PluginStyleguideConfig<T = undefined> = Omit<
139
164
  StyleguideRawConfig<T>,
140
165
  'plugins' | 'extends'
@@ -161,6 +186,7 @@ export type RawResolveConfig = {
161
186
 
162
187
  export type HttpResolveConfig = {
163
188
  headers: ResolveHeader[];
189
+ // eslint-disable-next-line @typescript-eslint/ban-types
164
190
  customFetch?: Function;
165
191
  };
166
192
 
@@ -243,16 +269,19 @@ export type RulesFields =
243
269
  | 'oas3_0Rules'
244
270
  | 'oas3_1Rules'
245
271
  | 'async2Rules'
272
+ | 'async3Rules'
246
273
  | 'arazzoRules'
247
274
  | 'preprocessors'
248
275
  | 'oas2Preprocessors'
249
276
  | 'oas3_0Preprocessors'
250
277
  | 'oas3_1Preprocessors'
251
278
  | 'async2Preprocessors'
279
+ | 'async3Preprocessors'
252
280
  | 'arazzoPreprocessors'
253
281
  | 'decorators'
254
282
  | 'oas2Decorators'
255
283
  | 'oas3_0Decorators'
256
284
  | 'oas3_1Decorators'
257
- | 'arazzoDecorators'
258
- | 'async2Decorators';
285
+ | 'async2Decorators'
286
+ | 'async3Decorators'
287
+ | 'arazzoDecorators';