@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
package/lib/resolve.js CHANGED
@@ -1,15 +1,9 @@
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.resolveDocument = exports.BaseResolver = exports.makeDocumentFromString = exports.makeRefId = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
3
+ exports.BaseResolver = exports.YamlParseError = exports.ResolveError = exports.Source = void 0;
4
+ exports.makeRefId = makeRefId;
5
+ exports.makeDocumentFromString = makeDocumentFromString;
6
+ exports.resolveDocument = resolveDocument;
13
7
  const fs = require("fs");
14
8
  const path = require("path");
15
9
  const ref_utils_1 = require("./ref-utils");
@@ -23,9 +17,8 @@ class Source {
23
17
  }
24
18
  // pass safeLoad as argument to separate it from browser bundle
25
19
  getAst(safeLoad) {
26
- var _a;
27
20
  if (this._ast === undefined) {
28
- this._ast = (_a = safeLoad(this.body, { filename: this.absoluteRef })) !== null && _a !== void 0 ? _a : undefined;
21
+ this._ast = safeLoad(this.body, { filename: this.absoluteRef }) ?? undefined;
29
22
  // fix ast representation of file with newlines only
30
23
  if (this._ast &&
31
24
  this._ast.kind === 0 && // KIND.scalar = 0
@@ -71,7 +64,6 @@ exports.YamlParseError = YamlParseError;
71
64
  function makeRefId(absoluteRef, pointer) {
72
65
  return absoluteRef + '::' + pointer;
73
66
  }
74
- exports.makeRefId = makeRefId;
75
67
  function makeDocumentFromString(sourceString, absoluteRef) {
76
68
  const source = new Source(absoluteRef, sourceString);
77
69
  try {
@@ -84,7 +76,6 @@ function makeDocumentFromString(sourceString, absoluteRef) {
84
76
  throw new YamlParseError(e, source);
85
77
  }
86
78
  }
87
- exports.makeDocumentFromString = makeDocumentFromString;
88
79
  class BaseResolver {
89
80
  constructor(config = { http: { headers: [] } }) {
90
81
  this.config = config;
@@ -102,33 +93,30 @@ class BaseResolver {
102
93
  }
103
94
  return path.resolve(base ? path.dirname(base) : process.cwd(), ref);
104
95
  }
105
- loadExternalRef(absoluteRef) {
106
- return __awaiter(this, void 0, void 0, function* () {
107
- try {
108
- if ((0, ref_utils_1.isAbsoluteUrl)(absoluteRef)) {
109
- const { body, mimeType } = yield (0, utils_1.readFileFromUrl)(absoluteRef, this.config.http);
110
- return new Source(absoluteRef, body, mimeType);
111
- }
112
- else {
113
- if (fs.lstatSync(absoluteRef).isDirectory()) {
114
- throw new Error(`Expected a file but received a folder at ${absoluteRef}`);
115
- }
116
- const content = yield fs.promises.readFile(absoluteRef, 'utf-8');
117
- // In some cases file have \r\n line delimeters like on windows, we should skip it.
118
- return new Source(absoluteRef, content.replace(/\r\n/g, '\n'));
119
- }
96
+ async loadExternalRef(absoluteRef) {
97
+ try {
98
+ if ((0, ref_utils_1.isAbsoluteUrl)(absoluteRef)) {
99
+ const { body, mimeType } = await (0, utils_1.readFileFromUrl)(absoluteRef, this.config.http);
100
+ return new Source(absoluteRef, body, mimeType);
120
101
  }
121
- catch (error) {
122
- error.message = error.message.replace(', lstat', '');
123
- throw new ResolveError(error);
102
+ else {
103
+ if (fs.lstatSync(absoluteRef).isDirectory()) {
104
+ throw new Error(`Expected a file but received a folder at ${absoluteRef}`);
105
+ }
106
+ const content = await fs.promises.readFile(absoluteRef, 'utf-8');
107
+ // In some cases file have \r\n line delimeters like on windows, we should skip it.
108
+ return new Source(absoluteRef, content.replace(/\r\n/g, '\n'));
124
109
  }
125
- });
110
+ }
111
+ catch (error) {
112
+ error.message = error.message.replace(', lstat', '');
113
+ throw new ResolveError(error);
114
+ }
126
115
  }
127
116
  parseDocument(source, isRoot = false) {
128
- var _a;
129
117
  const ext = source.absoluteRef.substr(source.absoluteRef.lastIndexOf('.'));
130
118
  if (!['.json', '.json', '.yml', '.yaml'].includes(ext) &&
131
- !((_a = source.mimeType) === null || _a === void 0 ? void 0 : _a.match(/(json|yaml|openapi)/)) &&
119
+ !source.mimeType?.match(/(json|yaml|openapi)/) &&
132
120
  !isRoot // always parse root
133
121
  ) {
134
122
  return { source, parsed: source.body };
@@ -143,19 +131,17 @@ class BaseResolver {
143
131
  throw new YamlParseError(e, source);
144
132
  }
145
133
  }
146
- resolveDocument(base, ref, isRoot = false) {
147
- return __awaiter(this, void 0, void 0, function* () {
148
- const absoluteRef = this.resolveExternalRef(base, ref);
149
- const cachedDocument = this.cache.get(absoluteRef);
150
- if (cachedDocument) {
151
- return cachedDocument;
152
- }
153
- const doc = this.loadExternalRef(absoluteRef).then((source) => {
154
- return this.parseDocument(source, isRoot);
155
- });
156
- this.cache.set(absoluteRef, doc);
157
- return doc;
134
+ async resolveDocument(base, ref, isRoot = false) {
135
+ const absoluteRef = this.resolveExternalRef(base, ref);
136
+ const cachedDocument = this.cache.get(absoluteRef);
137
+ if (cachedDocument) {
138
+ return cachedDocument;
139
+ }
140
+ const doc = this.loadExternalRef(absoluteRef).then((source) => {
141
+ return this.parseDocument(source, isRoot);
158
142
  });
143
+ this.cache.set(absoluteRef, doc);
144
+ return doc;
159
145
  }
160
146
  }
161
147
  exports.BaseResolver = BaseResolver;
@@ -176,174 +162,169 @@ function hasRef(head, node) {
176
162
  }
177
163
  const unknownType = { name: 'unknown', properties: {} };
178
164
  const resolvableScalarType = { name: 'scalar', properties: {} };
179
- function resolveDocument(opts) {
180
- return __awaiter(this, void 0, void 0, function* () {
181
- const { rootDocument, externalRefResolver, rootType } = opts;
182
- const resolvedRefMap = new Map();
183
- const seedNodes = new Set(); // format "${type}::${absoluteRef}${pointer}"
184
- const resolvePromises = [];
185
- resolveRefsInParallel(rootDocument.parsed, rootDocument, '#/', rootType);
186
- let resolved;
187
- do {
188
- resolved = yield Promise.all(resolvePromises);
189
- } while (resolvePromises.length !== resolved.length);
190
- return resolvedRefMap;
191
- function resolveRefsInParallel(rootNode, rootNodeDocument, rootNodePointer, type) {
192
- const rootNodeDocAbsoluteRef = rootNodeDocument.source.absoluteRef;
193
- const anchorRefsMap = new Map();
194
- walk(rootNode, type, rootNodeDocAbsoluteRef + rootNodePointer);
195
- function walk(node, type, nodeAbsoluteRef) {
196
- if (typeof node !== 'object' || node === null) {
197
- return;
198
- }
199
- const nodeId = `${type.name}::${nodeAbsoluteRef}`;
200
- if (seedNodes.has(nodeId)) {
165
+ async function resolveDocument(opts) {
166
+ const { rootDocument, externalRefResolver, rootType } = opts;
167
+ const resolvedRefMap = new Map();
168
+ const seedNodes = new Set(); // format "${type}::${absoluteRef}${pointer}"
169
+ const resolvePromises = [];
170
+ resolveRefsInParallel(rootDocument.parsed, rootDocument, '#/', rootType);
171
+ let resolved;
172
+ do {
173
+ resolved = await Promise.all(resolvePromises);
174
+ } while (resolvePromises.length !== resolved.length);
175
+ return resolvedRefMap;
176
+ function resolveRefsInParallel(rootNode, rootNodeDocument, rootNodePointer, type) {
177
+ const rootNodeDocAbsoluteRef = rootNodeDocument.source.absoluteRef;
178
+ const anchorRefsMap = new Map();
179
+ walk(rootNode, type, rootNodeDocAbsoluteRef + rootNodePointer);
180
+ function walk(node, type, nodeAbsoluteRef) {
181
+ if (typeof node !== 'object' || node === null) {
182
+ return;
183
+ }
184
+ const nodeId = `${type.name}::${nodeAbsoluteRef}`;
185
+ if (seedNodes.has(nodeId)) {
186
+ return;
187
+ }
188
+ seedNodes.add(nodeId);
189
+ const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
190
+ if (anchor) {
191
+ anchorRefsMap.set(`#${anchor}`, node);
192
+ }
193
+ if (Array.isArray(node)) {
194
+ const itemsType = type.items;
195
+ // we continue resolving unknown types, but stop early on known scalars
196
+ if (itemsType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
201
197
  return;
202
198
  }
203
- seedNodes.add(nodeId);
204
- const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
205
- if (anchor) {
206
- anchorRefsMap.set(`#${anchor}`, node);
207
- }
208
- if (Array.isArray(node)) {
209
- const itemsType = type.items;
199
+ const isTypeAFunction = typeof itemsType === 'function';
200
+ for (let i = 0; i < node.length; i++) {
201
+ const itemType = isTypeAFunction
202
+ ? itemsType(node[i], (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, i))
203
+ : itemsType;
210
204
  // we continue resolving unknown types, but stop early on known scalars
211
- if (itemsType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
212
- return;
213
- }
214
- const isTypeAFunction = typeof itemsType === 'function';
215
- for (let i = 0; i < node.length; i++) {
216
- const itemType = isTypeAFunction
217
- ? itemsType(node[i], (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, i))
218
- : itemsType;
219
- // we continue resolving unknown types, but stop early on known scalars
220
- if (itemType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
221
- continue;
222
- }
223
- walk(node[i], (0, types_1.isNamedType)(itemType) ? itemType : unknownType, (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, i));
224
- }
225
- return;
226
- }
227
- for (const propName of Object.keys(node)) {
228
- let propValue = node[propName];
229
- let propType = type.properties[propName];
230
- if (propType === undefined)
231
- propType = type.additionalProperties;
232
- if (typeof propType === 'function')
233
- propType = propType(propValue, propName);
234
- if (propType === undefined)
235
- propType = unknownType;
236
- if (type.extensionsPrefix &&
237
- propName.startsWith(type.extensionsPrefix) &&
238
- propType === unknownType) {
239
- propType = types_1.SpecExtension;
240
- }
241
- if (!(0, types_1.isNamedType)(propType) && (propType === null || propType === void 0 ? void 0 : propType.directResolveAs)) {
242
- propType = propType.directResolveAs;
243
- propValue = { $ref: propValue };
244
- }
245
- if (propType && propType.name === undefined && propType.resolvable !== false) {
246
- propType = resolvableScalarType;
247
- }
248
- if (!(0, types_1.isNamedType)(propType) || typeof propValue !== 'object') {
205
+ if (itemType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
249
206
  continue;
250
207
  }
251
- walk(propValue, propType, (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, (0, ref_utils_1.escapePointer)(propName)));
208
+ walk(node[i], (0, types_1.isNamedType)(itemType) ? itemType : unknownType, (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, i));
209
+ }
210
+ return;
211
+ }
212
+ for (const propName of Object.keys(node)) {
213
+ let propValue = node[propName];
214
+ let propType = type.properties[propName];
215
+ if (propType === undefined)
216
+ propType = type.additionalProperties;
217
+ if (typeof propType === 'function')
218
+ propType = propType(propValue, propName);
219
+ if (propType === undefined)
220
+ propType = unknownType;
221
+ if (type.extensionsPrefix &&
222
+ propName.startsWith(type.extensionsPrefix) &&
223
+ propType === unknownType) {
224
+ propType = types_1.SpecExtension;
252
225
  }
253
- if ((0, ref_utils_1.isRef)(node)) {
254
- const promise = followRef(rootNodeDocument, node, {
255
- prev: null,
256
- node,
257
- }).then((resolvedRef) => {
258
- if (resolvedRef.resolved) {
259
- resolveRefsInParallel(resolvedRef.node, resolvedRef.document, resolvedRef.nodePointer, type);
260
- }
261
- });
262
- resolvePromises.push(promise);
226
+ if (!(0, types_1.isNamedType)(propType) && propType?.directResolveAs) {
227
+ propType = propType.directResolveAs;
228
+ propValue = { $ref: propValue };
263
229
  }
230
+ if (propType && propType.name === undefined && propType.resolvable !== false) {
231
+ propType = resolvableScalarType;
232
+ }
233
+ if (!(0, types_1.isNamedType)(propType) || typeof propValue !== 'object') {
234
+ continue;
235
+ }
236
+ walk(propValue, propType, (0, ref_utils_1.joinPointer)(nodeAbsoluteRef, (0, ref_utils_1.escapePointer)(propName)));
264
237
  }
265
- function followRef(document, ref, refStack) {
266
- return __awaiter(this, void 0, void 0, function* () {
267
- if (hasRef(refStack.prev, ref)) {
268
- throw new Error('Self-referencing circular pointer');
269
- }
270
- if ((0, ref_utils_1.isAnchor)(ref.$ref)) {
271
- // Wait for all anchors in the document to be collected firstly.
272
- yield (0, utils_1.nextTick)();
273
- const resolvedRef = {
274
- resolved: true,
275
- isRemote: false,
276
- node: anchorRefsMap.get(ref.$ref),
277
- document,
278
- nodePointer: ref.$ref,
279
- };
280
- const refId = makeRefId(document.source.absoluteRef, ref.$ref);
281
- resolvedRefMap.set(refId, resolvedRef);
282
- return resolvedRef;
283
- }
284
- const { uri, pointer } = (0, ref_utils_1.parseRef)(ref.$ref);
285
- const isRemote = uri !== null;
286
- let targetDoc;
287
- try {
288
- targetDoc = isRemote
289
- ? (yield externalRefResolver.resolveDocument(document.source.absoluteRef, uri))
290
- : document;
238
+ if ((0, ref_utils_1.isRef)(node)) {
239
+ const promise = followRef(rootNodeDocument, node, {
240
+ prev: null,
241
+ node,
242
+ }).then((resolvedRef) => {
243
+ if (resolvedRef.resolved) {
244
+ resolveRefsInParallel(resolvedRef.node, resolvedRef.document, resolvedRef.nodePointer, type);
291
245
  }
292
- catch (error) {
293
- const resolvedRef = {
294
- resolved: false,
295
- isRemote,
296
- document: undefined,
297
- error: error,
298
- };
299
- const refId = makeRefId(document.source.absoluteRef, ref.$ref);
300
- resolvedRefMap.set(refId, resolvedRef);
301
- return resolvedRef;
302
- }
303
- let resolvedRef = {
304
- resolved: true,
305
- document: targetDoc,
306
- isRemote,
307
- node: document.parsed,
308
- nodePointer: '#/',
309
- };
310
- let target = targetDoc.parsed;
311
- const segments = pointer;
312
- for (const segment of segments) {
313
- if (typeof target !== 'object') {
314
- target = undefined;
315
- break;
316
- }
317
- else if (target[segment] !== undefined) {
318
- target = target[segment];
319
- resolvedRef.nodePointer = (0, ref_utils_1.joinPointer)(resolvedRef.nodePointer, (0, ref_utils_1.escapePointer)(segment));
320
- }
321
- else if ((0, ref_utils_1.isRef)(target)) {
322
- resolvedRef = yield followRef(targetDoc, target, pushRef(refStack, target));
323
- targetDoc = resolvedRef.document || targetDoc;
324
- if (typeof resolvedRef.node !== 'object') {
325
- target = undefined;
326
- break;
327
- }
328
- target = resolvedRef.node[segment];
329
- resolvedRef.nodePointer = (0, ref_utils_1.joinPointer)(resolvedRef.nodePointer, (0, ref_utils_1.escapePointer)(segment));
330
- }
331
- else {
332
- target = undefined;
333
- break;
334
- }
335
- }
336
- resolvedRef.node = target;
337
- resolvedRef.document = targetDoc;
338
- const refId = makeRefId(document.source.absoluteRef, ref.$ref);
339
- if (resolvedRef.document && (0, ref_utils_1.isRef)(target)) {
340
- resolvedRef = yield followRef(resolvedRef.document, target, pushRef(refStack, target));
341
- }
342
- resolvedRefMap.set(refId, resolvedRef);
343
- return Object.assign({}, resolvedRef);
344
246
  });
247
+ resolvePromises.push(promise);
345
248
  }
346
249
  }
347
- });
250
+ async function followRef(document, ref, refStack) {
251
+ if (hasRef(refStack.prev, ref)) {
252
+ throw new Error('Self-referencing circular pointer');
253
+ }
254
+ if ((0, ref_utils_1.isAnchor)(ref.$ref)) {
255
+ // Wait for all anchors in the document to be collected firstly.
256
+ await (0, utils_1.nextTick)();
257
+ const resolvedRef = {
258
+ resolved: true,
259
+ isRemote: false,
260
+ node: anchorRefsMap.get(ref.$ref),
261
+ document,
262
+ nodePointer: ref.$ref,
263
+ };
264
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
265
+ resolvedRefMap.set(refId, resolvedRef);
266
+ return resolvedRef;
267
+ }
268
+ const { uri, pointer } = (0, ref_utils_1.parseRef)(ref.$ref);
269
+ const isRemote = uri !== null;
270
+ let targetDoc;
271
+ try {
272
+ targetDoc = isRemote
273
+ ? (await externalRefResolver.resolveDocument(document.source.absoluteRef, uri))
274
+ : document;
275
+ }
276
+ catch (error) {
277
+ const resolvedRef = {
278
+ resolved: false,
279
+ isRemote,
280
+ document: undefined,
281
+ error: error,
282
+ };
283
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
284
+ resolvedRefMap.set(refId, resolvedRef);
285
+ return resolvedRef;
286
+ }
287
+ let resolvedRef = {
288
+ resolved: true,
289
+ document: targetDoc,
290
+ isRemote,
291
+ node: document.parsed,
292
+ nodePointer: '#/',
293
+ };
294
+ let target = targetDoc.parsed;
295
+ const segments = pointer;
296
+ for (const segment of segments) {
297
+ if (typeof target !== 'object') {
298
+ target = undefined;
299
+ break;
300
+ }
301
+ else if (target[segment] !== undefined) {
302
+ target = target[segment];
303
+ resolvedRef.nodePointer = (0, ref_utils_1.joinPointer)(resolvedRef.nodePointer, (0, ref_utils_1.escapePointer)(segment));
304
+ }
305
+ else if ((0, ref_utils_1.isRef)(target)) {
306
+ resolvedRef = await followRef(targetDoc, target, pushRef(refStack, target));
307
+ targetDoc = resolvedRef.document || targetDoc;
308
+ if (typeof resolvedRef.node !== 'object') {
309
+ target = undefined;
310
+ break;
311
+ }
312
+ target = resolvedRef.node[segment];
313
+ resolvedRef.nodePointer = (0, ref_utils_1.joinPointer)(resolvedRef.nodePointer, (0, ref_utils_1.escapePointer)(segment));
314
+ }
315
+ else {
316
+ target = undefined;
317
+ break;
318
+ }
319
+ }
320
+ resolvedRef.node = target;
321
+ resolvedRef.document = targetDoc;
322
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
323
+ if (resolvedRef.document && (0, ref_utils_1.isRef)(target)) {
324
+ resolvedRef = await followRef(resolvedRef.document, target, pushRef(refStack, target));
325
+ }
326
+ resolvedRefMap.set(refId, resolvedRef);
327
+ return { ...resolvedRef };
328
+ }
329
+ }
348
330
  }
349
- exports.resolveDocument = resolveDocument;
@@ -1,4 +1,4 @@
1
- import { Location } from '../ref-utils';
1
+ import type { Location } from '../ref-utils';
2
2
  import type { ErrorObject } from '@redocly/ajv/dist/2020';
3
3
  import type { ResolveFn } from '../walk';
4
4
  export declare function releaseAjvInstance(): void;
package/lib/rules/ajv.js CHANGED
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateJsonSchema = exports.releaseAjvInstance = void 0;
3
+ exports.releaseAjvInstance = releaseAjvInstance;
4
+ exports.validateJsonSchema = validateJsonSchema;
4
5
  const _2020_1 = require("@redocly/ajv/dist/2020");
5
6
  const ref_utils_1 = require("../ref-utils");
6
7
  let ajvInstance = null;
7
8
  function releaseAjvInstance() {
8
9
  ajvInstance = null;
9
10
  }
10
- exports.releaseAjvInstance = releaseAjvInstance;
11
11
  function getAjv(resolve, allowAdditionalProperties) {
12
12
  if (!ajvInstance) {
13
13
  ajvInstance = new _2020_1.default({
@@ -19,13 +19,13 @@ function getAjv(resolve, allowAdditionalProperties) {
19
19
  validateSchema: false,
20
20
  discriminator: true,
21
21
  allowUnionTypes: true,
22
- validateFormats: false,
22
+ validateFormats: false, // TODO: fix it
23
23
  defaultUnevaluatedProperties: allowAdditionalProperties,
24
24
  loadSchemaSync(base, $ref, $id) {
25
25
  const resolvedRef = resolve({ $ref }, base.split('#')[0]);
26
26
  if (!resolvedRef || !resolvedRef.location)
27
27
  return false;
28
- return Object.assign({ $id: resolvedRef.location.source.absoluteRef + '#' + $id }, resolvedRef.node);
28
+ return { $id: resolvedRef.location.source.absoluteRef + '#' + $id, ...resolvedRef.node };
29
29
  },
30
30
  logger: false,
31
31
  });
@@ -35,7 +35,7 @@ function getAjv(resolve, allowAdditionalProperties) {
35
35
  function getAjvValidator(schema, loc, resolve, allowAdditionalProperties) {
36
36
  const ajv = getAjv(resolve, allowAdditionalProperties);
37
37
  if (!ajv.getSchema(loc.absolutePointer)) {
38
- ajv.addSchema(Object.assign({ $id: loc.absolutePointer }, schema), loc.absolutePointer);
38
+ ajv.addSchema({ $id: loc.absolutePointer, ...schema }, loc.absolutePointer);
39
39
  }
40
40
  return ajv.getSchema(loc.absolutePointer);
41
41
  }
@@ -73,8 +73,10 @@ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, allo
73
73
  message = `${message} \`${property}\``;
74
74
  error.instancePath += '/' + (0, ref_utils_1.escapePointer)(property);
75
75
  }
76
- return Object.assign(Object.assign({}, error), { message,
77
- suggest });
76
+ return {
77
+ ...error,
78
+ message,
79
+ suggest,
80
+ };
78
81
  }
79
82
  }
80
- exports.validateJsonSchema = validateJsonSchema;
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.preprocessors = exports.rules = void 0;
4
4
  const spec_1 = require("../common/spec");
5
5
  const assertions_1 = require("../common/assertions");
6
+ const parameters_no_body_inside_in_1 = require("../spot/parameters-no-body-inside-in");
6
7
  exports.rules = {
7
8
  spec: spec_1.Spec,
8
9
  assertions: assertions_1.Assertions,
10
+ 'parameters-no-body-inside-in': parameters_no_body_inside_in_1.ParametersNoBodyInsideIn,
9
11
  };
10
12
  exports.preprocessors = {};
@@ -1,2 +1,2 @@
1
- import { Async2Rule } from '../../visitors';
1
+ import type { Async2Rule } from '../../visitors';
2
2
  export declare const ChannelsKebabCase: Async2Rule;
@@ -4,6 +4,7 @@ exports.preprocessors = exports.rules = void 0;
4
4
  const assertions_1 = require("../common/assertions");
5
5
  const spec_1 = require("../common/spec");
6
6
  const info_contact_1 = require("../common/info-contact");
7
+ const info_license_strict_1 = require("../common/info-license-strict");
7
8
  const operation_operationId_1 = require("../common/operation-operationId");
8
9
  const tag_description_1 = require("../common/tag-description");
9
10
  const tags_alphabetical_1 = require("../common/tags-alphabetical");
@@ -13,6 +14,7 @@ exports.rules = {
13
14
  spec: spec_1.Spec,
14
15
  assertions: assertions_1.Assertions,
15
16
  'info-contact': info_contact_1.InfoContact,
17
+ 'info-license-strict': info_license_strict_1.InfoLicenseStrict,
16
18
  'operation-operationId': operation_operationId_1.OperationOperationId,
17
19
  'channels-kebab-case': channels_kebab_case_1.ChannelsKebabCase,
18
20
  'no-channel-trailing-slash': no_channel_trailing_slash_1.NoChannelTrailingSlash,
@@ -1,2 +1,2 @@
1
- import { Async2Rule } from '../../visitors';
1
+ import type { Async2Rule } from '../../visitors';
2
2
  export declare const NoChannelTrailingSlash: Async2Rule;
@@ -0,0 +1,2 @@
1
+ import type { Async3Rule } from '../../visitors';
2
+ export declare const ChannelsKebabCase: Async3Rule;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChannelsKebabCase = void 0;
4
+ const ChannelsKebabCase = () => {
5
+ return {
6
+ Channel(channel, { report }) {
7
+ const segments = (channel.address || '')
8
+ .split(/[/.:]/) // split on / or : as likely channel namespacers
9
+ .filter((s) => s !== ''); // filter out empty segments
10
+ if (!segments.every((segment) => /^{.+}$/.test(segment) || /^[a-z0-9-.]+$/.test(segment))) {
11
+ report({
12
+ message: `\`${channel.address}\` does not use kebab-case.`,
13
+ location: { reportOnKey: true },
14
+ });
15
+ }
16
+ },
17
+ };
18
+ };
19
+ exports.ChannelsKebabCase = ChannelsKebabCase;
@@ -0,0 +1,3 @@
1
+ import type { Async3RuleSet } from '../../oas-types';
2
+ export declare const rules: Async3RuleSet<'built-in'>;
3
+ export declare const preprocessors: {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.preprocessors = exports.rules = void 0;
4
+ const assertions_1 = require("../common/assertions");
5
+ const spec_1 = require("../common/spec");
6
+ const info_contact_1 = require("../common/info-contact");
7
+ const info_license_strict_1 = require("../common/info-license-strict");
8
+ const operation_operationId_1 = require("../common/operation-operationId");
9
+ const tag_description_1 = require("../common/tag-description");
10
+ const tags_alphabetical_1 = require("../common/tags-alphabetical");
11
+ const channels_kebab_case_1 = require("./channels-kebab-case");
12
+ const no_channel_trailing_slash_1 = require("./no-channel-trailing-slash");
13
+ exports.rules = {
14
+ spec: spec_1.Spec,
15
+ assertions: assertions_1.Assertions,
16
+ 'info-contact': info_contact_1.InfoContact,
17
+ 'info-license-strict': info_license_strict_1.InfoLicenseStrict,
18
+ 'operation-operationId': operation_operationId_1.OperationOperationId,
19
+ 'channels-kebab-case': channels_kebab_case_1.ChannelsKebabCase,
20
+ 'no-channel-trailing-slash': no_channel_trailing_slash_1.NoChannelTrailingSlash,
21
+ 'tag-description': tag_description_1.TagDescription,
22
+ 'tags-alphabetical': tags_alphabetical_1.TagsAlphabetical,
23
+ };
24
+ exports.preprocessors = {};
@@ -0,0 +1,2 @@
1
+ import type { Async3Rule } from '../../visitors';
2
+ export declare const NoChannelTrailingSlash: Async3Rule;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoChannelTrailingSlash = void 0;
4
+ const NoChannelTrailingSlash = () => {
5
+ return {
6
+ Channel(channel, { report, location }) {
7
+ if (channel.address.endsWith('/') && channel.address !== '/') {
8
+ report({
9
+ message: `\`${channel.address}\` should not have a trailing slash.`,
10
+ location: location.key(),
11
+ });
12
+ }
13
+ },
14
+ };
15
+ };
16
+ exports.NoChannelTrailingSlash = NoChannelTrailingSlash;
@@ -1,5 +1,5 @@
1
- import { AssertionContext, AssertResult, CustomFunction } from 'core/src/config/types';
2
- import { Location } from '../../../ref-utils';
1
+ import type { AssertionContext, AssertResult, CustomFunction } from '../../../config/types';
2
+ import type { Location } from '../../../ref-utils';
3
3
  export type AssertionFnContext = AssertionContext & {
4
4
  baseLocation: Location;
5
5
  rawValue?: any;