@redocly/openapi-core 1.0.0-beta.98 → 1.0.0-rc.1

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 (380) hide show
  1. package/README.md +6 -6
  2. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +0 -1
  3. package/lib/benchmark/benches/recommended-oas3.bench.js +1 -1
  4. package/lib/benchmark/benches/resolve-with-no-external.bench.js +1 -1
  5. package/lib/benchmark/utils.d.ts +2 -2
  6. package/lib/benchmark/utils.js +2 -2
  7. package/lib/bundle.d.ts +12 -15
  8. package/lib/bundle.js +38 -15
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +17 -6
  11. package/lib/config/builtIn.d.ts +2 -2
  12. package/lib/config/builtIn.js +2 -2
  13. package/lib/config/config-resolvers.d.ts +5 -5
  14. package/lib/config/config-resolvers.js +121 -66
  15. package/lib/config/config.d.ts +12 -18
  16. package/lib/config/config.js +42 -26
  17. package/lib/config/load.d.ts +16 -3
  18. package/lib/config/load.js +36 -14
  19. package/lib/config/minimal.d.ts +2 -2
  20. package/lib/config/minimal.js +10 -6
  21. package/lib/config/recommended.d.ts +2 -2
  22. package/lib/config/recommended.js +10 -6
  23. package/lib/config/rules.d.ts +7 -4
  24. package/lib/config/rules.js +5 -4
  25. package/lib/config/types.d.ts +72 -23
  26. package/lib/config/types.js +13 -0
  27. package/lib/config/utils.d.ts +6 -5
  28. package/lib/config/utils.js +110 -32
  29. package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
  30. package/lib/decorators/common/filters/filter-helper.js +67 -0
  31. package/lib/decorators/common/filters/filter-in.d.ts +2 -0
  32. package/lib/decorators/common/filters/filter-in.js +17 -0
  33. package/lib/decorators/common/filters/filter-out.d.ts +2 -0
  34. package/lib/decorators/common/filters/filter-out.js +17 -0
  35. package/lib/decorators/common/info-override.d.ts +2 -0
  36. package/lib/decorators/common/info-override.js +28 -0
  37. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  38. package/lib/decorators/common/media-type-examples-override.js +53 -0
  39. package/lib/decorators/common/registry-dependencies.js +2 -2
  40. package/lib/decorators/common/remove-x-internal.js +2 -2
  41. package/lib/decorators/oas2/index.d.ts +3 -0
  42. package/lib/decorators/oas2/index.js +7 -1
  43. package/lib/decorators/oas3/index.d.ts +4 -0
  44. package/lib/decorators/oas3/index.js +9 -1
  45. package/lib/env.d.ts +3 -0
  46. package/lib/env.js +8 -0
  47. package/lib/format/codeframes.js +16 -10
  48. package/lib/format/format.d.ts +1 -1
  49. package/lib/format/format.js +64 -32
  50. package/lib/index.d.ts +6 -6
  51. package/lib/index.js +7 -2
  52. package/lib/js-yaml/index.js +2 -6
  53. package/lib/lint.d.ts +4 -2
  54. package/lib/lint.js +36 -11
  55. package/lib/logger.d.ts +10 -0
  56. package/lib/logger.js +31 -0
  57. package/lib/output.d.ts +3 -0
  58. package/lib/output.js +9 -0
  59. package/lib/redocly/index.js +10 -9
  60. package/lib/redocly/registry-api-types.d.ts +28 -28
  61. package/lib/redocly/registry-api.d.ts +3 -3
  62. package/lib/redocly/registry-api.js +10 -2
  63. package/lib/ref-utils.d.ts +1 -0
  64. package/lib/ref-utils.js +8 -2
  65. package/lib/resolve.d.ts +1 -1
  66. package/lib/resolve.js +33 -3
  67. package/lib/rules/ajv.d.ts +2 -2
  68. package/lib/rules/ajv.js +12 -12
  69. package/lib/rules/common/assertions/asserts.d.ts +29 -4
  70. package/lib/rules/common/assertions/asserts.js +227 -97
  71. package/lib/rules/common/assertions/index.d.ts +27 -2
  72. package/lib/rules/common/assertions/index.js +9 -37
  73. package/lib/rules/common/assertions/utils.d.ts +16 -8
  74. package/lib/rules/common/assertions/utils.js +160 -76
  75. package/lib/rules/common/info-license-url.d.ts +1 -1
  76. package/lib/rules/common/info-license-url.js +5 -10
  77. package/lib/rules/common/info-license.d.ts +2 -0
  78. package/lib/rules/common/info-license.js +17 -0
  79. package/lib/rules/common/no-ambiguous-paths.js +1 -1
  80. package/lib/rules/common/no-enum-type-mismatch.js +1 -3
  81. package/lib/rules/common/no-identical-paths.js +4 -4
  82. package/lib/rules/common/no-invalid-parameter-examples.js +3 -3
  83. package/lib/rules/common/no-invalid-schema-examples.js +3 -3
  84. package/lib/rules/common/operation-2xx-response.js +15 -9
  85. package/lib/rules/common/operation-4xx-response.js +15 -9
  86. package/lib/rules/common/operation-operationId.js +2 -2
  87. package/lib/rules/common/operation-tag-defined.js +1 -1
  88. package/lib/rules/common/path-not-include-query.js +2 -2
  89. package/lib/rules/common/path-params-defined.js +7 -2
  90. package/lib/rules/common/paths-kebab-case.js +4 -1
  91. package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
  92. package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
  93. package/lib/rules/common/response-contains-header.d.ts +2 -0
  94. package/lib/rules/common/response-contains-header.js +29 -0
  95. package/lib/rules/common/scalar-property-missing-example.d.ts +2 -0
  96. package/lib/rules/common/scalar-property-missing-example.js +42 -0
  97. package/lib/rules/common/security-defined.d.ts +2 -0
  98. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  99. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  100. package/lib/rules/common/spec-strict-refs.js +30 -0
  101. package/lib/rules/common/spec.js +41 -18
  102. package/lib/rules/common/tags-alphabetical.js +1 -1
  103. package/lib/rules/oas2/index.d.ts +6 -2
  104. package/lib/rules/oas2/index.js +16 -8
  105. package/lib/rules/oas2/remove-unused-components.js +6 -6
  106. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/request-mime-type.js +1 -1
  108. package/lib/rules/oas2/response-contains-property.d.ts +2 -0
  109. package/lib/rules/oas2/response-contains-property.js +38 -0
  110. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  111. package/lib/rules/oas2/response-mime-type.js +1 -1
  112. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  113. package/lib/rules/oas3/component-name-unique.js +124 -0
  114. package/lib/rules/oas3/index.js +24 -10
  115. package/lib/rules/oas3/no-empty-servers.js +2 -2
  116. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  117. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  118. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  119. package/lib/rules/oas3/no-unused-components.js +2 -2
  120. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  121. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  122. package/lib/rules/oas3/remove-unused-components.js +6 -6
  123. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  124. package/lib/rules/oas3/request-mime-type.js +1 -1
  125. package/lib/rules/oas3/response-contains-property.d.ts +2 -0
  126. package/lib/rules/oas3/response-contains-property.js +40 -0
  127. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  128. package/lib/rules/oas3/response-mime-type.js +1 -1
  129. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  130. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  131. package/lib/rules/other/stats.d.ts +2 -2
  132. package/lib/rules/other/stats.js +45 -16
  133. package/lib/rules/utils.d.ts +5 -2
  134. package/lib/rules/utils.js +54 -6
  135. package/lib/types/config-external-schemas.d.ts +2193 -0
  136. package/lib/types/config-external-schemas.js +805 -0
  137. package/lib/types/index.d.ts +3 -2
  138. package/lib/types/index.js +9 -1
  139. package/lib/types/oas2.js +91 -15
  140. package/lib/types/oas3.js +139 -49
  141. package/lib/types/oas3_1.js +32 -26
  142. package/lib/types/redocly-yaml.js +414 -58
  143. package/lib/typings/openapi.d.ts +3 -2
  144. package/lib/utils.d.ts +15 -3
  145. package/lib/utils.js +73 -7
  146. package/lib/visitors.d.ts +20 -16
  147. package/lib/visitors.js +28 -3
  148. package/lib/walk.d.ts +11 -19
  149. package/lib/walk.js +74 -53
  150. package/package.json +5 -6
  151. package/__tests__/__snapshots__/bundle.test.ts.snap +0 -229
  152. package/__tests__/bundle.test.ts +0 -132
  153. package/__tests__/codeframes.test.ts +0 -531
  154. package/__tests__/fixtures/extension.js +0 -24
  155. package/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/__tests__/fixtures/refs/param-b.yaml +0 -1
  163. package/__tests__/fixtures/refs/param-c.yaml +0 -1
  164. package/__tests__/fixtures/refs/rename.yaml +0 -1
  165. package/__tests__/fixtures/refs/requestBody.yaml +0 -9
  166. package/__tests__/fixtures/refs/schema-a.yaml +0 -1
  167. package/__tests__/fixtures/refs/simple.yaml +0 -1
  168. package/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  169. package/__tests__/fixtures/resolve/External.yaml +0 -10
  170. package/__tests__/fixtures/resolve/External2.yaml +0 -4
  171. package/__tests__/fixtures/resolve/description.md +0 -3
  172. package/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  173. package/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  174. package/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  175. package/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  176. package/__tests__/fixtures/resolve/openapi.yaml +0 -28
  177. package/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  178. package/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  179. package/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  180. package/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  181. package/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  182. package/__tests__/lint.test.ts +0 -17
  183. package/__tests__/login.test.ts +0 -17
  184. package/__tests__/normalizeVisitors.test.ts +0 -151
  185. package/__tests__/ref-utils.test.ts +0 -120
  186. package/__tests__/resolve-http.test.ts +0 -77
  187. package/__tests__/resolve.test.ts +0 -405
  188. package/__tests__/utils.ts +0 -86
  189. package/__tests__/walk.test.ts +0 -1485
  190. package/lib/rules/common/info-description.d.ts +0 -2
  191. package/lib/rules/common/info-description.js +0 -12
  192. package/lib/rules/common/license-url.d.ts +0 -2
  193. package/lib/rules/common/license-url.js +0 -12
  194. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  195. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  196. package/src/__tests__/js-yaml.test.ts +0 -71
  197. package/src/__tests__/lint.test.ts +0 -182
  198. package/src/__tests__/utils.test.ts +0 -74
  199. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  200. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  201. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  202. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  203. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  204. package/src/benchmark/benches/rebilly.yaml +0 -32267
  205. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  206. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  207. package/src/benchmark/benchmark.js +0 -307
  208. package/src/benchmark/colors.js +0 -29
  209. package/src/benchmark/fork.js +0 -83
  210. package/src/benchmark/utils.ts +0 -36
  211. package/src/bundle.ts +0 -371
  212. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  213. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  214. package/src/config/__tests__/config.test.ts +0 -244
  215. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  216. package/src/config/__tests__/fixtures/plugin.js +0 -56
  217. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  218. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  219. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  220. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  221. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  222. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  223. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  224. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  225. package/src/config/__tests__/load.test.ts +0 -83
  226. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  227. package/src/config/all.ts +0 -65
  228. package/src/config/builtIn.ts +0 -37
  229. package/src/config/config-resolvers.ts +0 -359
  230. package/src/config/config.ts +0 -312
  231. package/src/config/index.ts +0 -7
  232. package/src/config/load.ts +0 -84
  233. package/src/config/minimal.ts +0 -58
  234. package/src/config/recommended.ts +0 -58
  235. package/src/config/rules.ts +0 -46
  236. package/src/config/types.ts +0 -168
  237. package/src/config/utils.ts +0 -208
  238. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  239. package/src/decorators/common/info-description-override.ts +0 -24
  240. package/src/decorators/common/operation-description-override.ts +0 -30
  241. package/src/decorators/common/registry-dependencies.ts +0 -25
  242. package/src/decorators/common/remove-x-internal.ts +0 -59
  243. package/src/decorators/common/tag-description-override.ts +0 -25
  244. package/src/decorators/oas2/index.ts +0 -14
  245. package/src/decorators/oas3/index.ts +0 -14
  246. package/src/format/codeframes.ts +0 -210
  247. package/src/format/format.ts +0 -339
  248. package/src/index.ts +0 -68
  249. package/src/js-yaml/index.ts +0 -18
  250. package/src/lint.ts +0 -125
  251. package/src/oas-types.ts +0 -62
  252. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  253. package/src/redocly/index.ts +0 -182
  254. package/src/redocly/redocly-client-types.ts +0 -10
  255. package/src/redocly/registry-api-types.ts +0 -32
  256. package/src/redocly/registry-api.ts +0 -134
  257. package/src/ref-utils.ts +0 -79
  258. package/src/resolve.ts +0 -378
  259. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  260. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  261. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  262. package/src/rules/ajv.ts +0 -103
  263. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  264. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  265. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  266. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  267. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  268. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  269. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  270. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  271. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  272. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  273. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  274. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  275. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  276. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  277. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  278. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  279. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  280. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  281. package/src/rules/common/__tests__/spec.test.ts +0 -62
  282. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  283. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  284. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  285. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  286. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  287. package/src/rules/common/assertions/asserts.ts +0 -137
  288. package/src/rules/common/assertions/index.ts +0 -75
  289. package/src/rules/common/assertions/utils.ts +0 -167
  290. package/src/rules/common/info-contact.ts +0 -15
  291. package/src/rules/common/info-description.ts +0 -10
  292. package/src/rules/common/info-license-url.ts +0 -15
  293. package/src/rules/common/license-url.ts +0 -10
  294. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  295. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  296. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  297. package/src/rules/common/no-identical-paths.ts +0 -24
  298. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  299. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  300. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  301. package/src/rules/common/operation-2xx-response.ts +0 -16
  302. package/src/rules/common/operation-4xx-response.ts +0 -17
  303. package/src/rules/common/operation-description.ts +0 -13
  304. package/src/rules/common/operation-operationId-unique.ts +0 -21
  305. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  306. package/src/rules/common/operation-operationId.ts +0 -17
  307. package/src/rules/common/operation-parameters-unique.ts +0 -48
  308. package/src/rules/common/operation-security-defined.ts +0 -45
  309. package/src/rules/common/operation-singular-tag.ts +0 -17
  310. package/src/rules/common/operation-summary.ts +0 -13
  311. package/src/rules/common/operation-tag-defined.ts +0 -26
  312. package/src/rules/common/parameter-description.ts +0 -22
  313. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  314. package/src/rules/common/path-excludes-patterns.ts +0 -23
  315. package/src/rules/common/path-http-verbs-order.ts +0 -30
  316. package/src/rules/common/path-not-include-query.ts +0 -17
  317. package/src/rules/common/path-params-defined.ts +0 -58
  318. package/src/rules/common/path-segment-plural.ts +0 -31
  319. package/src/rules/common/paths-kebab-case.ts +0 -16
  320. package/src/rules/common/spec.ts +0 -143
  321. package/src/rules/common/tag-description.ts +0 -10
  322. package/src/rules/common/tags-alphabetical.ts +0 -20
  323. package/src/rules/no-unresolved-refs.ts +0 -51
  324. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  325. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  326. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  327. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  328. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  329. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  330. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  331. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  332. package/src/rules/oas2/index.ts +0 -83
  333. package/src/rules/oas2/remove-unused-components.ts +0 -76
  334. package/src/rules/oas2/request-mime-type.ts +0 -17
  335. package/src/rules/oas2/response-mime-type.ts +0 -17
  336. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  337. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  338. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  339. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  340. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  341. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  342. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  343. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  344. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  345. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  346. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  347. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  348. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  349. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  350. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  351. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  352. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  353. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  354. package/src/rules/oas3/index.ts +0 -99
  355. package/src/rules/oas3/no-empty-servers.ts +0 -22
  356. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  357. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  358. package/src/rules/oas3/no-server-example.com.ts +0 -14
  359. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  360. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  361. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  362. package/src/rules/oas3/no-unused-components.ts +0 -75
  363. package/src/rules/oas3/remove-unused-components.ts +0 -84
  364. package/src/rules/oas3/request-mime-type.ts +0 -31
  365. package/src/rules/oas3/response-mime-type.ts +0 -31
  366. package/src/rules/other/stats.ts +0 -44
  367. package/src/rules/utils.ts +0 -123
  368. package/src/types/index.ts +0 -138
  369. package/src/types/oas2.ts +0 -397
  370. package/src/types/oas3.ts +0 -506
  371. package/src/types/oas3_1.ts +0 -251
  372. package/src/types/redocly-yaml.ts +0 -637
  373. package/src/typings/common.ts +0 -9
  374. package/src/typings/openapi.ts +0 -297
  375. package/src/typings/swagger.ts +0 -236
  376. package/src/utils.ts +0 -190
  377. package/src/visitors.ts +0 -448
  378. package/src/walk.ts +0 -416
  379. package/tsconfig.json +0 -8
  380. package/tsconfig.tsbuildinfo +0 -1
@@ -1,2 +1,27 @@
1
- import { Oas2Rule, Oas3Rule } from '../../../visitors';
2
- export declare const Assertions: Oas3Rule | Oas2Rule;
1
+ import { asserts, AssertionFn } from './asserts';
2
+ import { Oas2Visitor, Oas3Visitor } from '../../../visitors';
3
+ import { RuleSeverity } from '../../../config';
4
+ export declare type AssertionLocators = {
5
+ filterInParentKeys?: (string | number)[];
6
+ filterOutParentKeys?: (string | number)[];
7
+ matchParentKeys?: string;
8
+ };
9
+ export declare type AssertionDefinition = {
10
+ subject: {
11
+ type: string;
12
+ property?: string | string[];
13
+ } & AssertionLocators;
14
+ assertions: {
15
+ [name in keyof typeof asserts]?: AssertionFn;
16
+ };
17
+ };
18
+ export declare type RawAssertion = AssertionDefinition & {
19
+ where?: AssertionDefinition[];
20
+ message?: string;
21
+ suggest?: string[];
22
+ severity?: RuleSeverity;
23
+ };
24
+ export declare type Assertion = RawAssertion & {
25
+ assertionId: string;
26
+ };
27
+ export declare const Assertions: (opts: Record<string, Assertion>) => (Oas3Visitor | Oas2Visitor)[];
@@ -1,51 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Assertions = void 0;
4
- const asserts_1 = require("./asserts");
5
4
  const utils_1 = require("./utils");
5
+ const utils_2 = require("../../../utils");
6
6
  const Assertions = (opts) => {
7
- let visitors = [];
7
+ const visitors = [];
8
8
  // As 'Assertions' has an array of asserts,
9
9
  // that array spreads into an 'opts' object on init rules phase here
10
- // https://github.com/Redocly/redocly-cli/blob/master/packages/core/src/config/config.ts#L311
10
+ // https://github.com/Redocly/redocly-cli/blob/main/packages/core/src/config/config.ts#L311
11
11
  // that is why we need to iterate through 'opts' values;
12
12
  // before - filter only object 'opts' values
13
13
  const assertions = Object.values(opts).filter((opt) => typeof opt === 'object' && opt !== null);
14
- for (const [index, assertion] of assertions.entries()) {
15
- const assertId = (assertion.assertionId && `${assertion.assertionId} assertion`) || `assertion #${index + 1}`;
16
- if (!assertion.subject) {
17
- throw new Error(`${assertId}: 'subject' is required`);
18
- }
19
- const subjects = Array.isArray(assertion.subject)
20
- ? assertion.subject
21
- : [assertion.subject];
22
- const assertsToApply = Object.keys(asserts_1.asserts)
23
- .filter((assertName) => assertion[assertName] !== undefined)
24
- .map((assertName) => {
25
- return {
26
- assertId,
27
- name: assertName,
28
- conditions: assertion[assertName],
29
- message: assertion.message,
30
- severity: assertion.severity || 'error',
31
- suggest: assertion.suggest || [],
32
- runsOnKeys: asserts_1.runOnKeysSet.has(assertName),
33
- runsOnValues: asserts_1.runOnValuesSet.has(assertName),
34
- };
35
- });
36
- const shouldRunOnKeys = assertsToApply.find((assert) => assert.runsOnKeys && !assert.runsOnValues);
37
- const shouldRunOnValues = assertsToApply.find((assert) => assert.runsOnValues && !assert.runsOnKeys);
38
- if (shouldRunOnValues && !assertion.property) {
39
- throw new Error(`${shouldRunOnValues.name} can't be used on all keys. Please provide a single property.`);
40
- }
41
- if (shouldRunOnKeys && assertion.property) {
42
- throw new Error(`${shouldRunOnKeys.name} can't be used on a single property. Please use 'property'.`);
43
- }
44
- for (const subject of subjects) {
45
- const subjectVisitor = utils_1.buildSubjectVisitor(assertion.property, assertsToApply, assertion.context);
46
- const visitorObject = utils_1.buildVisitorObject(subject, assertion.context, subjectVisitor);
47
- visitors.push(visitorObject);
14
+ for (const [_, assertion] of assertions.entries()) {
15
+ if (!utils_2.isString(assertion.subject.type)) {
16
+ throw new Error(`${assertion.assertionId}: 'type' (String) is required`);
48
17
  }
18
+ const subjectVisitor = utils_1.buildSubjectVisitor(assertion.assertionId, assertion);
19
+ const visitorObject = utils_1.buildVisitorObject(assertion, subjectVisitor);
20
+ visitors.push(visitorObject);
49
21
  }
50
22
  return visitors;
51
23
  };
@@ -1,20 +1,28 @@
1
- import { ProblemSeverity, UserContext } from '../../../walk';
1
+ import { Asserts } from './asserts';
2
+ import type { AssertionContext, AssertResult } from '../../../config';
3
+ import type { Assertion, AssertionDefinition } from '.';
4
+ import type { Oas2Visitor, Oas3Visitor, VisitFunction } from '../../../visitors';
2
5
  export declare type OrderDirection = 'asc' | 'desc';
3
6
  export declare type OrderOptions = {
4
7
  direction: OrderDirection;
5
8
  property: string;
6
9
  };
7
10
  export declare type AssertToApply = {
8
- name: string;
9
- assertId?: string;
11
+ name: keyof Asserts;
10
12
  conditions: any;
11
- message?: string;
12
- severity?: ProblemSeverity;
13
- suggest?: string[];
14
13
  runsOnKeys: boolean;
15
14
  runsOnValues: boolean;
16
15
  };
17
- export declare function buildVisitorObject(subject: string, context: Record<string, any>[], subjectVisitor: any): Record<string, any>;
18
- export declare function buildSubjectVisitor(properties: string | string[], asserts: AssertToApply[], context?: Record<string, any>[]): (node: any, { report, location, key, type, resolve }: UserContext) => void;
16
+ declare type RunAssertionParams = {
17
+ ctx: AssertionContext;
18
+ assert: AssertToApply;
19
+ assertionProperty?: string;
20
+ };
21
+ export declare function getAssertsToApply(assertion: AssertionDefinition): AssertToApply[];
22
+ export declare function buildVisitorObject(assertion: Assertion, subjectVisitor: VisitFunction<any>): Oas2Visitor | Oas3Visitor;
23
+ export declare function buildSubjectVisitor(assertId: string, assertion: Assertion): VisitFunction<any>;
19
24
  export declare function getIntersectionLength(keys: string[], properties: string[]): number;
20
25
  export declare function isOrdered(value: any[], options: OrderOptions | OrderDirection): boolean;
26
+ export declare function runAssertion({ assert, ctx, assertionProperty, }: RunAssertionParams): AssertResult[];
27
+ export declare function regexFromString(input: string): RegExp | null;
28
+ export {};
@@ -1,86 +1,154 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isOrdered = exports.getIntersectionLength = exports.buildSubjectVisitor = exports.buildVisitorObject = void 0;
4
- const ref_utils_1 = require("../../../ref-utils");
3
+ exports.regexFromString = exports.runAssertion = exports.isOrdered = exports.getIntersectionLength = exports.buildSubjectVisitor = exports.buildVisitorObject = exports.getAssertsToApply = void 0;
5
4
  const asserts_1 = require("./asserts");
6
- function buildVisitorObject(subject, context, subjectVisitor) {
7
- if (!context) {
8
- return { [subject]: subjectVisitor };
5
+ const logger_1 = require("../../../logger");
6
+ const ref_utils_1 = require("../../../ref-utils");
7
+ const utils_1 = require("../../../utils");
8
+ const assertionMessageTemplates = {
9
+ problems: '{{problems}}',
10
+ };
11
+ function getPredicatesFromLocators(locators) {
12
+ const { filterInParentKeys, filterOutParentKeys, matchParentKeys } = locators;
13
+ const keyMatcher = matchParentKeys && regexFromString(matchParentKeys);
14
+ const matchKeysPredicate = keyMatcher && ((key) => keyMatcher.test(key.toString()));
15
+ const filterInPredicate = Array.isArray(filterInParentKeys) &&
16
+ ((key) => filterInParentKeys.includes(key.toString()));
17
+ const filterOutPredicate = Array.isArray(filterOutParentKeys) &&
18
+ ((key) => !filterOutParentKeys.includes(key.toString()));
19
+ return [matchKeysPredicate, filterInPredicate, filterOutPredicate].filter(utils_1.isTruthy);
20
+ }
21
+ function getAssertsToApply(assertion) {
22
+ const assertsToApply = utils_1.keysOf(asserts_1.asserts)
23
+ .filter((assertName) => assertion.assertions[assertName] !== undefined)
24
+ .map((assertName) => {
25
+ return {
26
+ name: assertName,
27
+ conditions: assertion.assertions[assertName],
28
+ runsOnKeys: asserts_1.runOnKeysSet.has(assertName),
29
+ runsOnValues: asserts_1.runOnValuesSet.has(assertName),
30
+ };
31
+ });
32
+ const shouldRunOnKeys = assertsToApply.find((assert) => assert.runsOnKeys && !assert.runsOnValues);
33
+ const shouldRunOnValues = assertsToApply.find((assert) => assert.runsOnValues && !assert.runsOnKeys);
34
+ if (shouldRunOnValues && !assertion.subject.property) {
35
+ throw new Error(`${shouldRunOnValues.name} can't be used on all keys. Please provide a single property`);
36
+ }
37
+ if (shouldRunOnKeys && assertion.subject.property) {
38
+ throw new Error(`${shouldRunOnKeys.name} can't be used on a single property. Please use 'property'.`);
39
+ }
40
+ return assertsToApply;
41
+ }
42
+ exports.getAssertsToApply = getAssertsToApply;
43
+ function getAssertionProperties({ subject }) {
44
+ return (Array.isArray(subject.property) ? subject.property : [subject === null || subject === void 0 ? void 0 : subject.property]).filter(Boolean);
45
+ }
46
+ function applyAssertions(assertionDefinition, asserts, ctx) {
47
+ const properties = getAssertionProperties(assertionDefinition);
48
+ const assertResults = [];
49
+ for (const assert of asserts) {
50
+ if (properties.length) {
51
+ for (const property of properties) {
52
+ assertResults.push(runAssertion({
53
+ assert,
54
+ ctx,
55
+ assertionProperty: property,
56
+ }));
57
+ }
58
+ }
59
+ else {
60
+ assertResults.push(runAssertion({
61
+ assert,
62
+ ctx,
63
+ }));
64
+ }
65
+ }
66
+ return assertResults.flat();
67
+ }
68
+ function buildVisitorObject(assertion, subjectVisitor) {
69
+ var _a, _b;
70
+ const targetVisitorLocatorPredicates = getPredicatesFromLocators(assertion.subject);
71
+ const targetVisitorSkipFunction = targetVisitorLocatorPredicates.length
72
+ ? (_, key) => !targetVisitorLocatorPredicates.every((predicate) => predicate(key))
73
+ : undefined;
74
+ const targetVisitor = {
75
+ [assertion.subject.type]: Object.assign({ enter: subjectVisitor }, (targetVisitorSkipFunction && { skip: targetVisitorSkipFunction })),
76
+ };
77
+ if (!Array.isArray(assertion.where)) {
78
+ return targetVisitor;
9
79
  }
10
80
  let currentVisitorLevel = {};
11
81
  const visitor = currentVisitorLevel;
82
+ const context = assertion.where;
12
83
  for (let index = 0; index < context.length; index++) {
13
- const node = context[index];
14
- if (context.length === index + 1 && node.type === subject) {
15
- // Visitors don't work properly for the same type nested nodes, so
16
- // as a workaround for that we don't create separate visitor for the last element
17
- // which is the same as subject;
18
- // we will check includes/excludes it in the last visitor.
19
- continue;
20
- }
21
- const matchParentKeys = node.matchParentKeys;
22
- const excludeParentKeys = node.excludeParentKeys;
23
- if (matchParentKeys && excludeParentKeys) {
24
- throw new Error(`Both 'matchParentKeys' and 'excludeParentKeys' can't be under one context item`);
84
+ const assertionDefinitionNode = context[index];
85
+ if (!utils_1.isString((_a = assertionDefinitionNode.subject) === null || _a === void 0 ? void 0 : _a.type)) {
86
+ throw new Error(`${assertion.assertionId} -> where -> [${index}]: 'type' (String) is required`);
25
87
  }
26
- if (matchParentKeys || excludeParentKeys) {
27
- currentVisitorLevel[node.type] = {
28
- skip: (_value, key) => {
29
- if (matchParentKeys) {
30
- return !matchParentKeys.includes(key);
31
- }
32
- if (excludeParentKeys) {
33
- return excludeParentKeys.includes(key);
34
- }
35
- },
36
- };
88
+ const locatorPredicates = getPredicatesFromLocators(assertionDefinitionNode.subject);
89
+ const assertsToApply = getAssertsToApply(assertionDefinitionNode);
90
+ const skipFunction = (node, key, ctx) => !locatorPredicates.every((predicate) => predicate(key)) ||
91
+ !!applyAssertions(assertionDefinitionNode, assertsToApply, Object.assign(Object.assign({}, ctx), { node })).length;
92
+ const nodeVisitor = Object.assign({}, ((locatorPredicates.length || assertsToApply.length) && { skip: skipFunction }));
93
+ if (assertionDefinitionNode.subject.type === assertion.subject.type &&
94
+ index === context.length - 1) {
95
+ // We have to merge the visitors if the last node inside the `where` is the same as the subject.
96
+ targetVisitor[assertion.subject.type] = Object.assign({ enter: subjectVisitor }, ((nodeVisitor.skip && { skip: nodeVisitor.skip }) ||
97
+ (targetVisitorSkipFunction && {
98
+ skip: (node, key, ctx // We may have locators defined on assertion level and on where level for the same node type
99
+ ) => { var _a; return !!(((_a = nodeVisitor.skip) === null || _a === void 0 ? void 0 : _a.call(nodeVisitor, node, key, ctx)) || (targetVisitorSkipFunction === null || targetVisitorSkipFunction === void 0 ? void 0 : targetVisitorSkipFunction(node, key))); },
100
+ })));
37
101
  }
38
102
  else {
39
- currentVisitorLevel[node.type] = {};
103
+ currentVisitorLevel = currentVisitorLevel[(_b = assertionDefinitionNode.subject) === null || _b === void 0 ? void 0 : _b.type] =
104
+ nodeVisitor;
40
105
  }
41
- currentVisitorLevel = currentVisitorLevel[node.type];
42
106
  }
43
- currentVisitorLevel[subject] = subjectVisitor;
107
+ currentVisitorLevel[assertion.subject.type] = targetVisitor[assertion.subject.type];
44
108
  return visitor;
45
109
  }
46
110
  exports.buildVisitorObject = buildVisitorObject;
47
- function buildSubjectVisitor(properties, asserts, context) {
48
- return function (node, { report, location, key, type, resolve }) {
49
- var _a;
50
- // We need to check context's last node if it has the same type as subject node;
51
- // if yes - that means we didn't create context's last node visitor,
52
- // so we need to handle 'matchParentKeys' and 'excludeParentKeys' conditions here;
53
- if (context) {
54
- const lastContextNode = context[context.length - 1];
55
- if (lastContextNode.type === type.name) {
56
- const matchParentKeys = lastContextNode.matchParentKeys;
57
- const excludeParentKeys = lastContextNode.excludeParentKeys;
58
- if (matchParentKeys && !matchParentKeys.includes(key)) {
59
- return;
60
- }
61
- if (excludeParentKeys && excludeParentKeys.includes(key)) {
62
- return;
63
- }
64
- }
65
- }
66
- if (properties) {
67
- properties = Array.isArray(properties) ? properties : [properties];
68
- }
69
- for (const assert of asserts) {
70
- if (properties) {
71
- for (const property of properties) {
72
- // we can have resolvable scalar so need to resolve value here.
73
- const value = ref_utils_1.isRef(node[property]) ? (_a = resolve(node[property])) === null || _a === void 0 ? void 0 : _a.node : node[property];
74
- runAssertion(value, assert, location.child(property), report);
75
- }
76
- }
77
- else {
78
- runAssertion(Object.keys(node), assert, location.key(), report);
111
+ function buildSubjectVisitor(assertId, assertion) {
112
+ return (node, ctx) => {
113
+ const properties = getAssertionProperties(assertion);
114
+ const defaultMessage = `${logger_1.colorize.blue(assertId)} failed because the ${logger_1.colorize.blue(assertion.subject.type)} ${logger_1.colorize.blue(properties.join(', '))} didn't meet the assertions: ${assertionMessageTemplates.problems}`.replace(/ +/g, ' ');
115
+ const problems = applyAssertions(assertion, getAssertsToApply(assertion), Object.assign(Object.assign({}, ctx), { node }));
116
+ if (problems.length) {
117
+ for (const problemGroup of groupProblemsByPointer(problems)) {
118
+ const message = assertion.message || defaultMessage;
119
+ const problemMessage = getProblemsMessage(problemGroup);
120
+ ctx.report({
121
+ message: message.replace(assertionMessageTemplates.problems, problemMessage),
122
+ location: getProblemsLocation(problemGroup) || ctx.location,
123
+ forceSeverity: assertion.severity || 'error',
124
+ suggest: assertion.suggest || [],
125
+ ruleId: assertId,
126
+ });
79
127
  }
80
128
  }
81
129
  };
82
130
  }
83
131
  exports.buildSubjectVisitor = buildSubjectVisitor;
132
+ function groupProblemsByPointer(problems) {
133
+ const groups = {};
134
+ for (const problem of problems) {
135
+ if (!problem.location)
136
+ continue;
137
+ const pointer = problem.location.pointer;
138
+ groups[pointer] = groups[pointer] || [];
139
+ groups[pointer].push(problem);
140
+ }
141
+ return Object.values(groups);
142
+ }
143
+ function getProblemsLocation(problems) {
144
+ return problems.length ? problems[0].location : undefined;
145
+ }
146
+ function getProblemsMessage(problems) {
147
+ var _a;
148
+ return problems.length === 1
149
+ ? (_a = problems[0].message) !== null && _a !== void 0 ? _a : ''
150
+ : problems.map((problem) => { var _a; return `\n- ${(_a = problem.message) !== null && _a !== void 0 ? _a : ''}`; }).join('');
151
+ }
84
152
  function getIntersectionLength(keys, properties) {
85
153
  const props = new Set(properties);
86
154
  let count = 0;
@@ -99,11 +167,17 @@ function isOrdered(value, options) {
99
167
  let currValue = value[i];
100
168
  let prevVal = value[i - 1];
101
169
  if (property) {
102
- if (!value[i][property] || !value[i - 1][property]) {
170
+ const currPropValue = value[i][property];
171
+ const prevPropValue = value[i - 1][property];
172
+ if (!currPropValue || !prevPropValue) {
103
173
  return false; // property doesn't exist, so collection is not ordered
104
174
  }
105
- currValue = value[i][property];
106
- prevVal = value[i - 1][property];
175
+ currValue = currPropValue;
176
+ prevVal = prevPropValue;
177
+ }
178
+ if (typeof currValue === 'string' && typeof prevVal === 'string') {
179
+ currValue = currValue.toLowerCase();
180
+ prevVal = prevVal.toLowerCase();
107
181
  }
108
182
  const result = direction === 'asc' ? currValue >= prevVal : currValue <= prevVal;
109
183
  if (!result) {
@@ -113,15 +187,25 @@ function isOrdered(value, options) {
113
187
  return true;
114
188
  }
115
189
  exports.isOrdered = isOrdered;
116
- function runAssertion(values, assert, location, report) {
117
- const lintResult = asserts_1.asserts[assert.name](values, assert.conditions);
118
- if (!lintResult) {
119
- report({
120
- message: assert.message || `The ${assert.assertId} doesn't meet required conditions`,
121
- location,
122
- forceSeverity: assert.severity,
123
- suggest: assert.suggest,
124
- ruleId: assert.assertId,
125
- });
190
+ function runAssertion({ assert, ctx, assertionProperty, }) {
191
+ var _a;
192
+ const currentLocation = assert.name === 'ref' ? ctx.rawLocation : ctx.location;
193
+ if (assertionProperty) {
194
+ const values = ref_utils_1.isRef(ctx.node[assertionProperty])
195
+ ? (_a = ctx.resolve(ctx.node[assertionProperty])) === null || _a === void 0 ? void 0 : _a.node
196
+ : ctx.node[assertionProperty];
197
+ const rawValues = ctx.rawNode[assertionProperty];
198
+ const location = currentLocation.child(assertionProperty);
199
+ return asserts_1.asserts[assert.name](values, assert.conditions, Object.assign(Object.assign({}, ctx), { baseLocation: location, rawValue: rawValues }));
200
+ }
201
+ else {
202
+ const value = Array.isArray(ctx.node) ? ctx.node : Object.keys(ctx.node);
203
+ return asserts_1.asserts[assert.name](value, assert.conditions, Object.assign(Object.assign({}, ctx), { rawValue: ctx.rawNode, baseLocation: currentLocation }));
126
204
  }
127
205
  }
206
+ exports.runAssertion = runAssertion;
207
+ function regexFromString(input) {
208
+ const matches = input.match(/^\/(.*)\/(.*)|(.*)/);
209
+ return matches && new RegExp(matches[1] || matches[3], matches[2]);
210
+ }
211
+ exports.regexFromString = regexFromString;
@@ -1,2 +1,2 @@
1
1
  import { Oas3Rule, Oas2Rule } from '../../visitors';
2
- export declare const InfoLicense: Oas3Rule | Oas2Rule;
2
+ export declare const InfoLicenseUrl: Oas3Rule | Oas2Rule;
@@ -1,17 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InfoLicense = void 0;
3
+ exports.InfoLicenseUrl = void 0;
4
4
  const utils_1 = require("../utils");
5
- const InfoLicense = () => {
5
+ const InfoLicenseUrl = () => {
6
6
  return {
7
- Info(info, { report }) {
8
- if (!info.license) {
9
- report({
10
- message: utils_1.missingRequiredField('Info', 'license'),
11
- location: { reportOnKey: true }
12
- });
13
- }
7
+ License(license, ctx) {
8
+ utils_1.validateDefinedAndNonEmpty('url', license, ctx);
14
9
  },
15
10
  };
16
11
  };
17
- exports.InfoLicense = InfoLicense;
12
+ exports.InfoLicenseUrl = InfoLicenseUrl;
@@ -0,0 +1,2 @@
1
+ import { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const InfoLicense: Oas3Rule | Oas2Rule;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InfoLicense = void 0;
4
+ const utils_1 = require("../utils");
5
+ const InfoLicense = () => {
6
+ return {
7
+ Info(info, { report }) {
8
+ if (!info.license) {
9
+ report({
10
+ message: utils_1.missingRequiredField('Info', 'license'),
11
+ location: { reportOnKey: true },
12
+ });
13
+ }
14
+ },
15
+ };
16
+ };
17
+ exports.InfoLicense = InfoLicense;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NoAmbiguousPaths = void 0;
4
4
  const NoAmbiguousPaths = () => {
5
5
  return {
6
- PathMap(pathMap, { report, location }) {
6
+ Paths(pathMap, { report, location }) {
7
7
  const seenPaths = [];
8
8
  for (const currentPath of Object.keys(pathMap)) {
9
9
  const ambiguousPath = seenPaths.find((seenPath) => arePathsAmbiguous(seenPath, currentPath));
@@ -28,14 +28,12 @@ const NoEnumTypeMismatch = () => {
28
28
  if (mismatchedResults[enumValue].length !== schema.type.length)
29
29
  delete mismatchedResults[enumValue];
30
30
  }
31
- ;
32
31
  for (const mismatchedKey of Object.keys(mismatchedResults)) {
33
32
  report({
34
- message: `Enum value \`${mismatchedKey}\` must be of one type. Allowed types: \`${schema.type}\`.`,
33
+ message: `Enum value \`${mismatchedKey}\` must be of allowed types: \`${schema.type}\`.`,
35
34
  location: location.child(['enum', schema.enum.indexOf(mismatchedKey)]),
36
35
  });
37
36
  }
38
- ;
39
37
  }
40
38
  },
41
39
  };
@@ -3,11 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NoIdenticalPaths = void 0;
4
4
  const NoIdenticalPaths = () => {
5
5
  return {
6
- PathMap(pathMap, { report, location }) {
7
- const pathsMap = new Map();
6
+ Paths(pathMap, { report, location }) {
7
+ const Paths = new Map();
8
8
  for (const pathName of Object.keys(pathMap)) {
9
9
  const id = pathName.replace(/{.+?}/g, '{VARIABLE}');
10
- const existingSamePath = pathsMap.get(id);
10
+ const existingSamePath = Paths.get(id);
11
11
  if (existingSamePath) {
12
12
  report({
13
13
  message: `The path already exists which differs only by path parameter name(s): \`${existingSamePath}\` and \`${pathName}\`.`,
@@ -15,7 +15,7 @@ const NoIdenticalPaths = () => {
15
15
  });
16
16
  }
17
17
  else {
18
- pathsMap.set(id, pathName);
18
+ Paths.set(id, pathName);
19
19
  }
20
20
  }
21
21
  },
@@ -4,17 +4,17 @@ exports.NoInvalidParameterExamples = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const NoInvalidParameterExamples = (opts) => {
6
6
  var _a;
7
- const disallowAdditionalProperties = (_a = opts.disallowAdditionalProperties) !== null && _a !== void 0 ? _a : true;
7
+ const allowAdditionalProperties = (_a = utils_1.getAdditionalPropertiesOption(opts)) !== null && _a !== void 0 ? _a : false;
8
8
  return {
9
9
  Parameter: {
10
10
  leave(parameter, ctx) {
11
11
  if (parameter.example) {
12
- utils_1.validateExample(parameter.example, parameter.schema, ctx.location.child('example'), ctx, disallowAdditionalProperties);
12
+ utils_1.validateExample(parameter.example, parameter.schema, ctx.location.child('example'), ctx, allowAdditionalProperties);
13
13
  }
14
14
  if (parameter.examples) {
15
15
  for (const [key, example] of Object.entries(parameter.examples)) {
16
16
  if ('value' in example) {
17
- utils_1.validateExample(example.value, parameter.schema, ctx.location.child(['examples', key]), ctx, false);
17
+ utils_1.validateExample(example.value, parameter.schema, ctx.location.child(['examples', key]), ctx, true);
18
18
  }
19
19
  }
20
20
  }
@@ -4,17 +4,17 @@ exports.NoInvalidSchemaExamples = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const NoInvalidSchemaExamples = (opts) => {
6
6
  var _a;
7
- const disallowAdditionalProperties = (_a = opts.disallowAdditionalProperties) !== null && _a !== void 0 ? _a : true;
7
+ const allowAdditionalProperties = (_a = utils_1.getAdditionalPropertiesOption(opts)) !== null && _a !== void 0 ? _a : false;
8
8
  return {
9
9
  Schema: {
10
10
  leave(schema, ctx) {
11
11
  if (schema.examples) {
12
12
  for (const example of schema.examples) {
13
- utils_1.validateExample(example, schema, ctx.location.child(['examples', schema.examples.indexOf(example)]), ctx, disallowAdditionalProperties);
13
+ utils_1.validateExample(example, schema, ctx.location.child(['examples', schema.examples.indexOf(example)]), ctx, allowAdditionalProperties);
14
14
  }
15
15
  }
16
16
  if (schema.example) {
17
- utils_1.validateExample(schema.example, schema, ctx.location.child('example'), ctx, false);
17
+ utils_1.validateExample(schema.example, schema, ctx.location.child('example'), ctx, true);
18
18
  }
19
19
  },
20
20
  },
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Operation2xxResponse = void 0;
4
- const Operation2xxResponse = () => {
4
+ const utils_1 = require("../utils");
5
+ const Operation2xxResponse = ({ validateWebhooks }) => {
5
6
  return {
6
- ResponsesMap(responses, { report }) {
7
- const codes = Object.keys(responses);
8
- if (!codes.some((code) => code === 'default' || /2[Xx0-9]{2}/.test(code))) {
9
- report({
10
- message: 'Operation must have at least one `2xx` response.',
11
- location: { reportOnKey: true },
12
- });
13
- }
7
+ Paths: {
8
+ Responses(responses, { report }) {
9
+ const codes = Object.keys(responses || {});
10
+ utils_1.validateResponseCodes(codes, '2XX', { report });
11
+ },
12
+ },
13
+ WebhooksMap: {
14
+ Responses(responses, { report }) {
15
+ if (!validateWebhooks)
16
+ return;
17
+ const codes = Object.keys(responses || {});
18
+ utils_1.validateResponseCodes(codes, '2XX', { report });
19
+ },
14
20
  },
15
21
  };
16
22
  };
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Operation4xxResponse = void 0;
4
- const Operation4xxResponse = () => {
4
+ const utils_1 = require("../utils");
5
+ const Operation4xxResponse = ({ validateWebhooks }) => {
5
6
  return {
6
- ResponsesMap(responses, { report }) {
7
- const codes = Object.keys(responses);
8
- if (!codes.some((code) => /4[Xx0-9]{2}/.test(code))) {
9
- report({
10
- message: 'Operation must have at least one `4xx` response.',
11
- location: { reportOnKey: true },
12
- });
13
- }
7
+ Paths: {
8
+ Responses(responses, { report }) {
9
+ const codes = Object.keys(responses || {});
10
+ utils_1.validateResponseCodes(codes, '4XX', { report });
11
+ },
12
+ },
13
+ WebhooksMap: {
14
+ Responses(responses, { report }) {
15
+ if (!validateWebhooks)
16
+ return;
17
+ const codes = Object.keys(responses || {});
18
+ utils_1.validateResponseCodes(codes, '4XX', { report });
19
+ },
14
20
  },
15
21
  };
16
22
  };
@@ -4,13 +4,13 @@ exports.OperationOperationId = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const OperationOperationId = () => {
6
6
  return {
7
- DefinitionRoot: {
7
+ Root: {
8
8
  PathItem: {
9
9
  Operation(operation, ctx) {
10
10
  utils_1.validateDefinedAndNonEmpty('operationId', operation, ctx);
11
11
  },
12
12
  },
13
- }
13
+ },
14
14
  };
15
15
  };
16
16
  exports.OperationOperationId = OperationOperationId;