@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,99 +1,101 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __rest = (this && this.__rest) || function (s, e) {
12
- var t = {};
13
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
- t[p] = s[p];
15
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
- t[p[i]] = s[p[i]];
19
- }
20
- return t;
21
- };
22
2
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.resolvePreset = exports.resolveStyleguideConfig = exports.resolveApis = exports.resolvePlugins = exports.resolveConfig = exports.resolveConfigFileAndRefs = void 0;
3
+ exports.resolveConfigFileAndRefs = resolveConfigFileAndRefs;
4
+ exports.resolveConfig = resolveConfig;
5
+ exports.resolvePlugins = resolvePlugins;
6
+ exports.resolveApis = resolveApis;
7
+ exports.resolveStyleguideConfig = resolveStyleguideConfig;
8
+ exports.resolvePreset = resolvePreset;
24
9
  const path = require("path");
10
+ const fs_1 = require("fs");
25
11
  const ref_utils_1 = require("../ref-utils");
26
12
  const utils_1 = require("../utils");
27
13
  const resolve_1 = require("../resolve");
28
14
  const builtIn_1 = require("./builtIn");
29
15
  const utils_2 = require("./utils");
30
16
  const env_1 = require("../env");
31
- const utils_3 = require("../utils");
32
17
  const config_1 = require("./config");
33
18
  const logger_1 = require("../logger");
34
19
  const asserts_1 = require("../rules/common/assertions/asserts");
35
20
  const types_1 = require("../types");
36
21
  const redocly_yaml_1 = require("../types/redocly-yaml");
37
- function resolveConfigFileAndRefs({ configPath, externalRefResolver = new resolve_1.BaseResolver(), base = null, }) {
38
- return __awaiter(this, void 0, void 0, function* () {
39
- if (!configPath) {
40
- throw new Error('Reference to a config is required.\n');
41
- }
42
- const document = yield externalRefResolver.resolveDocument(base, configPath, true);
43
- if (document instanceof Error) {
44
- throw document;
45
- }
46
- const types = (0, types_1.normalizeTypes)(redocly_yaml_1.ConfigTypes);
47
- const resolvedRefMap = yield (0, resolve_1.resolveDocument)({
48
- rootDocument: document,
49
- rootType: types.ConfigRoot,
50
- externalRefResolver,
51
- });
52
- return { document, resolvedRefMap };
22
+ const DEFAULT_PROJECT_PLUGIN_PATHS = ['@theme/plugin.js', '@theme/plugin.cjs', '@theme/plugin.mjs'];
23
+ // Workaround for dynamic imports being transpiled to require by Typescript: https://github.com/microsoft/TypeScript/issues/43329#issuecomment-811606238
24
+ const _importDynamic = new Function('modulePath', 'return import(modulePath)');
25
+ async function resolveConfigFileAndRefs({ configPath, externalRefResolver = new resolve_1.BaseResolver(), base = null, }) {
26
+ if (!configPath) {
27
+ throw new Error('Reference to a config is required.\n');
28
+ }
29
+ const document = await externalRefResolver.resolveDocument(base, configPath, true);
30
+ if (document instanceof Error) {
31
+ throw document;
32
+ }
33
+ const types = (0, types_1.normalizeTypes)(redocly_yaml_1.ConfigTypes);
34
+ const resolvedRefMap = await (0, resolve_1.resolveDocument)({
35
+ rootDocument: document,
36
+ rootType: types.ConfigRoot,
37
+ externalRefResolver,
53
38
  });
39
+ return { document, resolvedRefMap };
54
40
  }
55
- exports.resolveConfigFileAndRefs = resolveConfigFileAndRefs;
56
- function resolveConfig({ rawConfig, configPath, externalRefResolver, }) {
57
- var _a, _b;
58
- return __awaiter(this, void 0, void 0, function* () {
59
- if ((_b = (_a = rawConfig.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
60
- throw new Error(`Error configuration format not detected in extends value must contain strings`);
61
- }
62
- const resolver = externalRefResolver !== null && externalRefResolver !== void 0 ? externalRefResolver : new resolve_1.BaseResolver((0, utils_2.getResolveConfig)(rawConfig.resolve));
63
- const apis = yield resolveApis({
64
- rawConfig,
65
- configPath,
66
- resolver,
67
- });
68
- const styleguide = yield resolveStyleguideConfig({
69
- styleguideConfig: rawConfig.styleguide,
70
- configPath,
71
- resolver,
72
- });
73
- return new config_1.Config(Object.assign(Object.assign({}, rawConfig), { apis,
74
- styleguide }), configPath);
41
+ async function resolveConfig({ rawConfig, configPath, externalRefResolver, }) {
42
+ if (rawConfig.styleguide?.extends?.some(utils_1.isNotString)) {
43
+ throw new Error(`Error configuration format not detected in extends value must contain strings`);
44
+ }
45
+ const resolver = externalRefResolver ?? new resolve_1.BaseResolver((0, utils_2.getResolveConfig)(rawConfig.resolve));
46
+ const apis = await resolveApis({
47
+ rawConfig,
48
+ configPath,
49
+ resolver,
50
+ });
51
+ const styleguide = await resolveStyleguideConfig({
52
+ styleguideConfig: rawConfig.styleguide,
53
+ configPath,
54
+ resolver,
75
55
  });
56
+ return new config_1.Config({
57
+ ...rawConfig,
58
+ apis,
59
+ styleguide,
60
+ }, configPath);
76
61
  }
77
- exports.resolveConfig = resolveConfig;
78
- function resolvePlugins(plugins, configPath = '') {
62
+ function getDefaultPluginPath(configPath) {
63
+ for (const pluginPath of DEFAULT_PROJECT_PLUGIN_PATHS) {
64
+ const absolutePluginPath = path.resolve(path.dirname(configPath), pluginPath);
65
+ if ((0, fs_1.existsSync)(absolutePluginPath)) {
66
+ return pluginPath;
67
+ }
68
+ }
69
+ return undefined;
70
+ }
71
+ async function resolvePlugins(plugins, configPath = '') {
79
72
  if (!plugins)
80
73
  return [];
81
74
  // TODO: implement or reuse Resolver approach so it will work in node and browser envs
82
- const requireFunc = (plugin) => {
83
- if (env_1.isBrowser && (0, utils_3.isString)(plugin)) {
75
+ const requireFunc = async (plugin) => {
76
+ if (env_1.isBrowser && (0, utils_1.isString)(plugin)) {
84
77
  logger_1.logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
85
78
  return undefined;
86
79
  }
87
- if ((0, utils_3.isString)(plugin)) {
80
+ if ((0, utils_1.isString)(plugin)) {
88
81
  try {
89
- const absoltePluginPath = path.resolve(path.dirname(configPath), plugin);
82
+ const maybeAbsolutePluginPath = path.resolve(path.dirname(configPath), plugin);
83
+ const absolutePluginPath = (0, fs_1.existsSync)(maybeAbsolutePluginPath)
84
+ ? maybeAbsolutePluginPath
85
+ : // For plugins imported from packages specifically
86
+ require.resolve(plugin);
90
87
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
91
88
  // @ts-ignore
92
- return typeof __webpack_require__ === 'function'
93
- ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
94
- // @ts-ignore
95
- __non_webpack_require__(absoltePluginPath)
96
- : require(absoltePluginPath);
89
+ if (typeof __webpack_require__ === 'function') {
90
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
91
+ // @ts-ignore
92
+ return __non_webpack_require__(absolutePluginPath);
93
+ }
94
+ else {
95
+ // you can import both cjs and mjs
96
+ const mod = await _importDynamic(absolutePluginPath);
97
+ return mod.default || mod;
98
+ }
97
99
  }
98
100
  catch (e) {
99
101
  if (e instanceof SyntaxError) {
@@ -105,16 +107,37 @@ function resolvePlugins(plugins, configPath = '') {
105
107
  return plugin;
106
108
  };
107
109
  const seenPluginIds = new Map();
108
- return plugins
109
- .map((p) => {
110
- if ((0, utils_3.isString)(p) && (0, ref_utils_1.isAbsoluteUrl)(p)) {
111
- throw new Error(logger_1.colorize.red(`We don't support remote plugins yet.`));
110
+ /**
111
+ * Include the default plugin automatically if it's not in configuration
112
+ */
113
+ const defaultPluginPath = getDefaultPluginPath(configPath);
114
+ if (defaultPluginPath) {
115
+ plugins.push(defaultPluginPath);
116
+ }
117
+ const resolvedPlugins = new Set();
118
+ const instances = await Promise.all(plugins.map(async (p) => {
119
+ if ((0, utils_1.isString)(p)) {
120
+ if ((0, ref_utils_1.isAbsoluteUrl)(p)) {
121
+ throw new Error(logger_1.colorize.red(`We don't support remote plugins yet.`));
122
+ }
123
+ if (resolvedPlugins.has(p)) {
124
+ return;
125
+ }
126
+ resolvedPlugins.add(p);
112
127
  }
113
- // TODO: resolve npm packages similar to eslint
114
- const pluginModule = requireFunc(p);
128
+ const requiredPlugin = await requireFunc(p);
129
+ const pluginCreatorOptions = { contentDir: path.dirname(configPath) };
130
+ const pluginModule = (0, utils_2.isDeprecatedPluginFormat)(requiredPlugin)
131
+ ? requiredPlugin
132
+ : (0, utils_2.isCommonJsPlugin)(requiredPlugin)
133
+ ? await requiredPlugin(pluginCreatorOptions)
134
+ : await requiredPlugin?.default?.(pluginCreatorOptions);
115
135
  if (!pluginModule) {
116
136
  return;
117
137
  }
138
+ if ((0, utils_1.isString)(p) && pluginModule.id && (0, utils_2.isDeprecatedPluginFormat)(requiredPlugin)) {
139
+ logger_1.logger.info(`Deprecated plugin format detected: ${pluginModule.id}\n`);
140
+ }
118
141
  const id = pluginModule.id;
119
142
  if (typeof id !== 'string') {
120
143
  throw new Error(logger_1.colorize.red(`Plugin must define \`id\` property in ${logger_1.colorize.blue(p.toString())}.`));
@@ -124,10 +147,14 @@ function resolvePlugins(plugins, configPath = '') {
124
147
  throw new Error(logger_1.colorize.red(`Plugin "id" must be unique. Plugin ${logger_1.colorize.blue(p.toString())} uses id "${logger_1.colorize.blue(id)}" already seen in ${logger_1.colorize.blue(pluginPath)}`));
125
148
  }
126
149
  seenPluginIds.set(id, p.toString());
127
- const plugin = Object.assign(Object.assign({ id }, (pluginModule.configs ? { configs: pluginModule.configs } : {})), (pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}));
150
+ const plugin = {
151
+ id,
152
+ ...(pluginModule.configs ? { configs: pluginModule.configs } : {}),
153
+ ...(pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}),
154
+ };
128
155
  if (pluginModule.rules) {
129
156
  if (!pluginModule.rules.oas3 && !pluginModule.rules.oas2 && !pluginModule.rules.async2) {
130
- throw new Error(`Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, or \`arazzo\` rules "${p}.`);
157
+ throw new Error(`Plugin rules must have \`oas3\`, \`oas2\`, \`async2\`, \`async3\` or \`arazzo\` rules "${p}.`);
131
158
  }
132
159
  plugin.rules = {};
133
160
  if (pluginModule.rules.oas3) {
@@ -139,6 +166,9 @@ function resolvePlugins(plugins, configPath = '') {
139
166
  if (pluginModule.rules.async2) {
140
167
  plugin.rules.async2 = (0, utils_2.prefixRules)(pluginModule.rules.async2, id);
141
168
  }
169
+ if (pluginModule.rules.async3) {
170
+ plugin.rules.async3 = (0, utils_2.prefixRules)(pluginModule.rules.async3, id);
171
+ }
142
172
  if (pluginModule.rules.arazzo) {
143
173
  plugin.rules.arazzo = (0, utils_2.prefixRules)(pluginModule.rules.arazzo, id);
144
174
  }
@@ -147,6 +177,7 @@ function resolvePlugins(plugins, configPath = '') {
147
177
  if (!pluginModule.preprocessors.oas3 &&
148
178
  !pluginModule.preprocessors.oas2 &&
149
179
  !pluginModule.preprocessors.async2 &&
180
+ !pluginModule.preprocessors.async3 &&
150
181
  !pluginModule.preprocessors.arazzo) {
151
182
  throw new Error(`Plugin \`preprocessors\` must have \`oas3\`, \`oas2\` or \`async2\` preprocessors "${p}.`);
152
183
  }
@@ -160,6 +191,9 @@ function resolvePlugins(plugins, configPath = '') {
160
191
  if (pluginModule.preprocessors.async2) {
161
192
  plugin.preprocessors.async2 = (0, utils_2.prefixRules)(pluginModule.preprocessors.async2, id);
162
193
  }
194
+ if (pluginModule.preprocessors.async3) {
195
+ plugin.preprocessors.async3 = (0, utils_2.prefixRules)(pluginModule.preprocessors.async3, id);
196
+ }
163
197
  if (pluginModule.preprocessors.arazzo) {
164
198
  plugin.preprocessors.arazzo = (0, utils_2.prefixRules)(pluginModule.preprocessors.arazzo, id);
165
199
  }
@@ -168,8 +202,9 @@ function resolvePlugins(plugins, configPath = '') {
168
202
  if (!pluginModule.decorators.oas3 &&
169
203
  !pluginModule.decorators.oas2 &&
170
204
  !pluginModule.decorators.async2 &&
205
+ !pluginModule.decorators.async3 &&
171
206
  !pluginModule.decorators.arazzo) {
172
- throw new Error(`Plugin \`decorators\` must have \`oas3\`, \`oas2\` or \`async2\` decorators "${p}.`);
207
+ throw new Error(`Plugin \`decorators\` must have \`oas3\`, \`oas2\`, \`async2\` or \`async3\` decorators "${p}.`);
173
208
  }
174
209
  plugin.decorators = {};
175
210
  if (pluginModule.decorators.oas3) {
@@ -181,6 +216,9 @@ function resolvePlugins(plugins, configPath = '') {
181
216
  if (pluginModule.decorators.async2) {
182
217
  plugin.decorators.async2 = (0, utils_2.prefixRules)(pluginModule.decorators.async2, id);
183
218
  }
219
+ if (pluginModule.decorators.async3) {
220
+ plugin.decorators.async3 = (0, utils_2.prefixRules)(pluginModule.decorators.async3, id);
221
+ }
184
222
  if (pluginModule.decorators.arazzo) {
185
223
  plugin.decorators.arazzo = (0, utils_2.prefixRules)(pluginModule.decorators.arazzo, id);
186
224
  }
@@ -189,80 +227,85 @@ function resolvePlugins(plugins, configPath = '') {
189
227
  plugin.assertions = pluginModule.assertions;
190
228
  }
191
229
  return plugin;
192
- })
193
- .filter(utils_3.isDefined);
230
+ }));
231
+ return instances.filter(utils_1.isDefined);
194
232
  }
195
- exports.resolvePlugins = resolvePlugins;
196
- function resolveApis({ rawConfig, configPath = '', resolver, }) {
197
- var _a, _b;
198
- return __awaiter(this, void 0, void 0, function* () {
199
- const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
200
- const resolvedApis = {};
201
- for (const [apiName, apiContent] of Object.entries(apis || {})) {
202
- if ((_b = (_a = apiContent.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
203
- throw new Error(`Error configuration format not detected in extends value must contain strings`);
204
- }
205
- const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
206
- const resolvedApiConfig = yield resolveStyleguideConfig({
207
- styleguideConfig: rawStyleguideConfig,
208
- configPath,
209
- resolver,
210
- });
211
- resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), { styleguide: resolvedApiConfig });
233
+ async function resolveApis({ rawConfig, configPath = '', resolver, }) {
234
+ const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
235
+ const resolvedApis = {};
236
+ for (const [apiName, apiContent] of Object.entries(apis || {})) {
237
+ if (apiContent.styleguide?.extends?.some(utils_1.isNotString)) {
238
+ throw new Error(`Error configuration format not detected in extends value must contain strings`);
212
239
  }
213
- return resolvedApis;
214
- });
240
+ const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
241
+ const resolvedApiConfig = await resolveStyleguideConfig({
242
+ styleguideConfig: rawStyleguideConfig,
243
+ configPath,
244
+ resolver,
245
+ });
246
+ resolvedApis[apiName] = { ...apiContent, styleguide: resolvedApiConfig };
247
+ }
248
+ return resolvedApis;
215
249
  }
216
- exports.resolveApis = resolveApis;
217
- function resolveAndMergeNestedStyleguideConfig({ styleguideConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
218
- var _a, _b, _c;
219
- return __awaiter(this, void 0, void 0, function* () {
220
- if (parentConfigPaths.includes(configPath)) {
221
- throw new Error(`Circular dependency in config file: "${configPath}"`);
250
+ async function resolveAndMergeNestedStyleguideConfig({ styleguideConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
251
+ if (parentConfigPaths.includes(configPath)) {
252
+ throw new Error(`Circular dependency in config file: "${configPath}"`);
253
+ }
254
+ const plugins = (0, utils_2.getUniquePlugins)(await resolvePlugins([...(styleguideConfig?.plugins || []), builtIn_1.defaultPlugin], configPath));
255
+ const pluginPaths = styleguideConfig?.plugins
256
+ ?.filter(utils_1.isString)
257
+ .map((p) => path.resolve(path.dirname(configPath), p));
258
+ const resolvedConfigPath = (0, ref_utils_1.isAbsoluteUrl)(configPath)
259
+ ? configPath
260
+ : configPath && path.resolve(configPath);
261
+ const extendConfigs = await Promise.all(styleguideConfig?.extends?.map(async (presetItem) => {
262
+ if (!(0, ref_utils_1.isAbsoluteUrl)(presetItem) && !path.extname(presetItem)) {
263
+ return resolvePreset(presetItem, plugins);
222
264
  }
223
- const plugins = (0, utils_2.getUniquePlugins)(resolvePlugins([...((styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) || []), builtIn_1.defaultPlugin], configPath));
224
- const pluginPaths = (_a = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) === null || _a === void 0 ? void 0 : _a.filter(utils_3.isString).map((p) => path.resolve(path.dirname(configPath), p));
225
- const resolvedConfigPath = (0, ref_utils_1.isAbsoluteUrl)(configPath)
226
- ? configPath
227
- : configPath && path.resolve(configPath);
228
- const extendConfigs = yield Promise.all(((_b = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.extends) === null || _b === void 0 ? void 0 : _b.map((presetItem) => __awaiter(this, void 0, void 0, function* () {
229
- if (!(0, ref_utils_1.isAbsoluteUrl)(presetItem) && !path.extname(presetItem)) {
230
- return resolvePreset(presetItem, plugins);
231
- }
232
- const pathItem = (0, ref_utils_1.isAbsoluteUrl)(presetItem)
233
- ? presetItem
234
- : (0, ref_utils_1.isAbsoluteUrl)(configPath)
235
- ? new URL(presetItem, configPath).href
236
- : path.resolve(path.dirname(configPath), presetItem);
237
- const extendedStyleguideConfig = yield loadExtendStyleguideConfig(pathItem, resolver);
238
- return yield resolveAndMergeNestedStyleguideConfig({
239
- styleguideConfig: extendedStyleguideConfig,
240
- configPath: pathItem,
241
- resolver: resolver,
242
- }, [...parentConfigPaths, resolvedConfigPath], extendPaths);
243
- }))) || []);
244
- const _d = (0, utils_2.mergeExtends)([
245
- ...extendConfigs,
246
- Object.assign(Object.assign({}, styleguideConfig), { plugins, extends: undefined, extendPaths: [...parentConfigPaths, resolvedConfigPath], pluginPaths }),
247
- ]), { plugins: mergedPlugins = [] } = _d, styleguide = __rest(_d, ["plugins"]);
248
- return Object.assign(Object.assign({}, styleguide), { extendPaths: (_c = styleguide.extendPaths) === null || _c === void 0 ? void 0 : _c.filter((path) => path && !(0, ref_utils_1.isAbsoluteUrl)(path)), plugins: (0, utils_2.getUniquePlugins)(mergedPlugins), recommendedFallback: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.recommendedFallback, doNotResolveExamples: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.doNotResolveExamples });
249
- });
265
+ const pathItem = (0, ref_utils_1.isAbsoluteUrl)(presetItem)
266
+ ? presetItem
267
+ : (0, ref_utils_1.isAbsoluteUrl)(configPath)
268
+ ? new URL(presetItem, configPath).href
269
+ : path.resolve(path.dirname(configPath), presetItem);
270
+ const extendedStyleguideConfig = await loadExtendStyleguideConfig(pathItem, resolver);
271
+ return await resolveAndMergeNestedStyleguideConfig({
272
+ styleguideConfig: extendedStyleguideConfig,
273
+ configPath: pathItem,
274
+ resolver: resolver,
275
+ }, [...parentConfigPaths, resolvedConfigPath], extendPaths);
276
+ }) || []);
277
+ const { plugins: mergedPlugins = [], ...styleguide } = (0, utils_2.mergeExtends)([
278
+ ...extendConfigs,
279
+ {
280
+ ...styleguideConfig,
281
+ plugins,
282
+ extends: undefined,
283
+ extendPaths: [...parentConfigPaths, resolvedConfigPath],
284
+ pluginPaths,
285
+ },
286
+ ]);
287
+ return {
288
+ ...styleguide,
289
+ extendPaths: styleguide.extendPaths?.filter((path) => path && !(0, ref_utils_1.isAbsoluteUrl)(path)),
290
+ plugins: (0, utils_2.getUniquePlugins)(mergedPlugins),
291
+ recommendedFallback: styleguideConfig?.recommendedFallback,
292
+ doNotResolveExamples: styleguideConfig?.doNotResolveExamples,
293
+ };
250
294
  }
251
- function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
252
- return __awaiter(this, void 0, void 0, function* () {
253
- const resolvedStyleguideConfig = yield resolveAndMergeNestedStyleguideConfig(opts, parentConfigPaths, extendPaths);
254
- return Object.assign(Object.assign({}, resolvedStyleguideConfig), { rules: resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig) });
255
- });
295
+ async function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
296
+ const resolvedStyleguideConfig = await resolveAndMergeNestedStyleguideConfig(opts, parentConfigPaths, extendPaths);
297
+ return {
298
+ ...resolvedStyleguideConfig,
299
+ rules: resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig),
300
+ };
256
301
  }
257
- exports.resolveStyleguideConfig = resolveStyleguideConfig;
258
302
  function resolvePreset(presetName, plugins) {
259
- var _a;
260
303
  const { pluginId, configName } = (0, utils_2.parsePresetName)(presetName);
261
304
  const plugin = plugins.find((p) => p.id === pluginId);
262
305
  if (!plugin) {
263
306
  throw new Error(`Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} is not included.`);
264
307
  }
265
- const preset = (_a = plugin.configs) === null || _a === void 0 ? void 0 : _a[configName];
308
+ const preset = plugin.configs?.[configName];
266
309
  if (!preset) {
267
310
  throw new Error(pluginId
268
311
  ? `Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} doesn't export config with name ${configName}.`
@@ -270,26 +313,63 @@ function resolvePreset(presetName, plugins) {
270
313
  }
271
314
  return preset;
272
315
  }
273
- exports.resolvePreset = resolvePreset;
274
- function loadExtendStyleguideConfig(filePath, resolver) {
275
- return __awaiter(this, void 0, void 0, function* () {
276
- try {
277
- const { parsed } = (yield resolver.resolveDocument(null, filePath));
278
- const rawConfig = (0, utils_2.transformConfig)(parsed);
279
- if (!rawConfig.styleguide) {
280
- throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
281
- }
282
- return rawConfig.styleguide;
283
- }
284
- catch (error) {
285
- throw new Error(`Failed to load "${filePath}": ${error.message}`);
316
+ async function loadExtendStyleguideConfig(filePath, resolver) {
317
+ try {
318
+ const { parsed } = (await resolver.resolveDocument(null, filePath));
319
+ const rawConfig = (0, utils_2.transformConfig)(parsed);
320
+ if (!rawConfig.styleguide) {
321
+ throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
286
322
  }
287
- });
323
+ return rawConfig.styleguide;
324
+ }
325
+ catch (error) {
326
+ throw new Error(`Failed to load "${filePath}": ${error.message}`);
327
+ }
288
328
  }
289
329
  function getMergedRawStyleguideConfig(rootStyleguideConfig, apiStyleguideConfig) {
290
- const resultLint = Object.assign(Object.assign(Object.assign({}, rootStyleguideConfig), (0, utils_1.pickDefined)(apiStyleguideConfig)), { rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.rules), oas2Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Rules), oas3_0Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Rules), oas3_1Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Rules), arazzoRules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.arazzoRules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.arazzoRules), preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.preprocessors), oas2Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Preprocessors), oas3_0Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Preprocessors), oas3_1Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Preprocessors), decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.decorators), oas2Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Decorators), oas3_0Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Decorators), oas3_1Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Decorators), recommendedFallback: (apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.extends)
330
+ const resultLint = {
331
+ ...rootStyleguideConfig,
332
+ ...(0, utils_1.pickDefined)(apiStyleguideConfig),
333
+ rules: { ...rootStyleguideConfig?.rules, ...apiStyleguideConfig?.rules },
334
+ oas2Rules: { ...rootStyleguideConfig?.oas2Rules, ...apiStyleguideConfig?.oas2Rules },
335
+ oas3_0Rules: { ...rootStyleguideConfig?.oas3_0Rules, ...apiStyleguideConfig?.oas3_0Rules },
336
+ oas3_1Rules: { ...rootStyleguideConfig?.oas3_1Rules, ...apiStyleguideConfig?.oas3_1Rules },
337
+ async2Rules: { ...rootStyleguideConfig?.async2Rules, ...apiStyleguideConfig?.async2Rules },
338
+ async3Rules: { ...rootStyleguideConfig?.async3Rules, ...apiStyleguideConfig?.async3Rules },
339
+ arazzoRules: { ...rootStyleguideConfig?.arazzoRules, ...apiStyleguideConfig?.arazzoRules },
340
+ preprocessors: {
341
+ ...rootStyleguideConfig?.preprocessors,
342
+ ...apiStyleguideConfig?.preprocessors,
343
+ },
344
+ oas2Preprocessors: {
345
+ ...rootStyleguideConfig?.oas2Preprocessors,
346
+ ...apiStyleguideConfig?.oas2Preprocessors,
347
+ },
348
+ oas3_0Preprocessors: {
349
+ ...rootStyleguideConfig?.oas3_0Preprocessors,
350
+ ...apiStyleguideConfig?.oas3_0Preprocessors,
351
+ },
352
+ oas3_1Preprocessors: {
353
+ ...rootStyleguideConfig?.oas3_1Preprocessors,
354
+ ...apiStyleguideConfig?.oas3_1Preprocessors,
355
+ },
356
+ decorators: { ...rootStyleguideConfig?.decorators, ...apiStyleguideConfig?.decorators },
357
+ oas2Decorators: {
358
+ ...rootStyleguideConfig?.oas2Decorators,
359
+ ...apiStyleguideConfig?.oas2Decorators,
360
+ },
361
+ oas3_0Decorators: {
362
+ ...rootStyleguideConfig?.oas3_0Decorators,
363
+ ...apiStyleguideConfig?.oas3_0Decorators,
364
+ },
365
+ oas3_1Decorators: {
366
+ ...rootStyleguideConfig?.oas3_1Decorators,
367
+ ...apiStyleguideConfig?.oas3_1Decorators,
368
+ },
369
+ recommendedFallback: apiStyleguideConfig?.extends
291
370
  ? false
292
- : rootStyleguideConfig.recommendedFallback });
371
+ : rootStyleguideConfig.recommendedFallback,
372
+ };
293
373
  return resultLint;
294
374
  }
295
375
  function groupStyleguideAssertionRules({ rules, plugins, }) {
@@ -313,7 +393,10 @@ function groupStyleguideAssertionRules({ rules, plugins, }) {
313
393
  registerCustomAssertions(plugins, context);
314
394
  }
315
395
  }
316
- assertions.push(Object.assign(Object.assign({}, assertion), { assertionId: ruleKey }));
396
+ assertions.push({
397
+ ...assertion,
398
+ assertionId: ruleKey,
399
+ });
317
400
  }
318
401
  else {
319
402
  // If it's not an assertion, keep it as is
@@ -326,7 +409,7 @@ function groupStyleguideAssertionRules({ rules, plugins, }) {
326
409
  return transformedRules;
327
410
  }
328
411
  function registerCustomAssertions(plugins, assertion) {
329
- for (const field of (0, utils_3.keysOf)(assertion.assertions)) {
412
+ for (const field of (0, utils_1.keysOf)(assertion.assertions)) {
330
413
  const [pluginId, fn] = field.split('/');
331
414
  if (!pluginId || !fn)
332
415
  continue;
@@ -1,5 +1,6 @@
1
- import { NormalizedProblem } from '../walk';
2
- import { SpecVersion, SpecMajorVersion, Oas2RuleSet, Oas3RuleSet, Async2RuleSet, ArazzoRuleSet } from '../oas-types';
1
+ import { SpecVersion, SpecMajorVersion } from '../oas-types';
2
+ import type { NormalizedProblem } from '../walk';
3
+ import type { Oas2RuleSet, Oas3RuleSet, Async3RuleSet, ArazzoRuleSet } from '../oas-types';
3
4
  import type { NodeType } from '../types';
4
5
  import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig, ResolvedStyleguideConfig, RuleConfig, RuleSettings, Telemetry, ThemeRawConfig } from './types';
5
6
  export declare const IGNORE_FILE = ".redocly.lint-ignore.yaml";
@@ -31,7 +32,7 @@ export declare class StyleguideConfig {
31
32
  preprocessors: string[];
32
33
  decorators: string[];
33
34
  };
34
- getRulesForOasVersion(version: SpecMajorVersion): Oas3RuleSet[] | Oas2RuleSet[] | Async2RuleSet[] | ArazzoRuleSet[];
35
+ getRulesForOasVersion(version: SpecMajorVersion): Oas3RuleSet[] | Oas2RuleSet[] | Async3RuleSet[] | ArazzoRuleSet[];
35
36
  skipRules(rules?: string[]): void;
36
37
  skipPreprocessors(preprocessors?: string[]): void;
37
38
  skipDecorators(decorators?: string[]): void;