@redocly/openapi-core 1.0.0-beta.99 → 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 (382) 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 +10 -15
  8. package/lib/bundle.js +32 -12
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +16 -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 +7 -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.js +2 -2
  94. package/lib/rules/common/scalar-property-missing-example.js +2 -1
  95. package/lib/rules/common/security-defined.d.ts +2 -0
  96. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  97. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  98. package/lib/rules/common/spec-strict-refs.js +30 -0
  99. package/lib/rules/common/spec.js +41 -18
  100. package/lib/rules/common/tags-alphabetical.js +1 -1
  101. package/lib/rules/oas2/index.d.ts +3 -2
  102. package/lib/rules/oas2/index.js +10 -8
  103. package/lib/rules/oas2/remove-unused-components.js +6 -6
  104. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  105. package/lib/rules/oas2/request-mime-type.js +1 -1
  106. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/response-mime-type.js +1 -1
  108. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  109. package/lib/rules/oas3/component-name-unique.js +124 -0
  110. package/lib/rules/oas3/index.js +18 -10
  111. package/lib/rules/oas3/no-empty-servers.js +2 -2
  112. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  113. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  114. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  115. package/lib/rules/oas3/no-unused-components.js +2 -2
  116. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  117. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  118. package/lib/rules/oas3/remove-unused-components.js +6 -6
  119. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  120. package/lib/rules/oas3/request-mime-type.js +1 -1
  121. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  122. package/lib/rules/oas3/response-mime-type.js +1 -1
  123. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  124. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  125. package/lib/rules/other/stats.d.ts +2 -2
  126. package/lib/rules/other/stats.js +45 -16
  127. package/lib/rules/utils.d.ts +5 -2
  128. package/lib/rules/utils.js +54 -6
  129. package/lib/types/config-external-schemas.d.ts +2193 -0
  130. package/lib/types/config-external-schemas.js +805 -0
  131. package/lib/types/index.d.ts +3 -2
  132. package/lib/types/index.js +9 -1
  133. package/lib/types/oas2.js +91 -15
  134. package/lib/types/oas3.js +125 -46
  135. package/lib/types/oas3_1.js +23 -19
  136. package/lib/types/redocly-yaml.js +406 -60
  137. package/lib/utils.d.ts +15 -4
  138. package/lib/utils.js +72 -8
  139. package/lib/visitors.d.ts +20 -16
  140. package/lib/visitors.js +28 -3
  141. package/lib/walk.d.ts +11 -19
  142. package/lib/walk.js +74 -53
  143. package/package.json +5 -6
  144. package/__tests__/utils.ts +0 -86
  145. package/lib/rules/common/info-description.d.ts +0 -2
  146. package/lib/rules/common/info-description.js +0 -12
  147. package/lib/rules/common/license-url.d.ts +0 -2
  148. package/lib/rules/common/license-url.js +0 -12
  149. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  150. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  151. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -255
  152. package/src/__tests__/bundle.test.ts +0 -156
  153. package/src/__tests__/codeframes.test.ts +0 -531
  154. package/src/__tests__/fixtures/extension.js +0 -24
  155. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  163. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  164. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  165. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  166. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  167. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  168. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  169. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  170. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  171. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  172. package/src/__tests__/fixtures/resolve/description.md +0 -3
  173. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  174. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  175. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  176. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  177. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  178. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  179. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  180. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  181. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  182. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  183. package/src/__tests__/js-yaml.test.ts +0 -71
  184. package/src/__tests__/lint.test.ts +0 -195
  185. package/src/__tests__/login.test.ts +0 -17
  186. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  187. package/src/__tests__/ref-utils.test.ts +0 -120
  188. package/src/__tests__/resolve-http.test.ts +0 -77
  189. package/src/__tests__/resolve.test.ts +0 -405
  190. package/src/__tests__/utils.test.ts +0 -85
  191. package/src/__tests__/walk.test.ts +0 -1485
  192. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  193. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  194. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  195. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  196. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  197. package/src/benchmark/benches/rebilly.yaml +0 -32267
  198. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  199. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  200. package/src/benchmark/benchmark.js +0 -307
  201. package/src/benchmark/colors.js +0 -29
  202. package/src/benchmark/fork.js +0 -83
  203. package/src/benchmark/utils.ts +0 -36
  204. package/src/bundle.ts +0 -386
  205. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  206. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  207. package/src/config/__tests__/config.test.ts +0 -244
  208. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  209. package/src/config/__tests__/fixtures/plugin.js +0 -56
  210. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  211. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  212. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  213. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  214. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  215. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  216. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  217. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  218. package/src/config/__tests__/load.test.ts +0 -83
  219. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  220. package/src/config/all.ts +0 -66
  221. package/src/config/builtIn.ts +0 -37
  222. package/src/config/config-resolvers.ts +0 -359
  223. package/src/config/config.ts +0 -312
  224. package/src/config/index.ts +0 -7
  225. package/src/config/load.ts +0 -84
  226. package/src/config/minimal.ts +0 -58
  227. package/src/config/recommended.ts +0 -58
  228. package/src/config/rules.ts +0 -46
  229. package/src/config/types.ts +0 -168
  230. package/src/config/utils.ts +0 -208
  231. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  232. package/src/decorators/common/info-description-override.ts +0 -24
  233. package/src/decorators/common/operation-description-override.ts +0 -30
  234. package/src/decorators/common/registry-dependencies.ts +0 -25
  235. package/src/decorators/common/remove-x-internal.ts +0 -59
  236. package/src/decorators/common/tag-description-override.ts +0 -25
  237. package/src/decorators/oas2/index.ts +0 -14
  238. package/src/decorators/oas3/index.ts +0 -14
  239. package/src/format/codeframes.ts +0 -210
  240. package/src/format/format.ts +0 -339
  241. package/src/index.ts +0 -68
  242. package/src/js-yaml/index.ts +0 -18
  243. package/src/lint.ts +0 -125
  244. package/src/oas-types.ts +0 -62
  245. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  246. package/src/redocly/index.ts +0 -182
  247. package/src/redocly/redocly-client-types.ts +0 -10
  248. package/src/redocly/registry-api-types.ts +0 -32
  249. package/src/redocly/registry-api.ts +0 -134
  250. package/src/ref-utils.ts +0 -80
  251. package/src/resolve.ts +0 -378
  252. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  253. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  254. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  255. package/src/rules/ajv.ts +0 -103
  256. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  257. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  258. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  259. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  260. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  261. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  262. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  263. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  264. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  265. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  266. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  267. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  268. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  269. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  270. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  271. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  272. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  273. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  274. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -207
  275. package/src/rules/common/__tests__/spec.test.ts +0 -62
  276. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  277. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  278. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  279. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  280. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  281. package/src/rules/common/assertions/asserts.ts +0 -137
  282. package/src/rules/common/assertions/index.ts +0 -75
  283. package/src/rules/common/assertions/utils.ts +0 -167
  284. package/src/rules/common/info-contact.ts +0 -15
  285. package/src/rules/common/info-description.ts +0 -10
  286. package/src/rules/common/info-license-url.ts +0 -15
  287. package/src/rules/common/license-url.ts +0 -10
  288. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  289. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  290. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  291. package/src/rules/common/no-identical-paths.ts +0 -24
  292. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  293. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  294. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  295. package/src/rules/common/operation-2xx-response.ts +0 -16
  296. package/src/rules/common/operation-4xx-response.ts +0 -17
  297. package/src/rules/common/operation-description.ts +0 -13
  298. package/src/rules/common/operation-operationId-unique.ts +0 -21
  299. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  300. package/src/rules/common/operation-operationId.ts +0 -17
  301. package/src/rules/common/operation-parameters-unique.ts +0 -48
  302. package/src/rules/common/operation-security-defined.ts +0 -45
  303. package/src/rules/common/operation-singular-tag.ts +0 -17
  304. package/src/rules/common/operation-summary.ts +0 -13
  305. package/src/rules/common/operation-tag-defined.ts +0 -26
  306. package/src/rules/common/parameter-description.ts +0 -22
  307. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  308. package/src/rules/common/path-excludes-patterns.ts +0 -23
  309. package/src/rules/common/path-http-verbs-order.ts +0 -30
  310. package/src/rules/common/path-not-include-query.ts +0 -17
  311. package/src/rules/common/path-params-defined.ts +0 -58
  312. package/src/rules/common/path-segment-plural.ts +0 -31
  313. package/src/rules/common/paths-kebab-case.ts +0 -16
  314. package/src/rules/common/response-contains-header.ts +0 -30
  315. package/src/rules/common/scalar-property-missing-example.ts +0 -55
  316. package/src/rules/common/spec.ts +0 -143
  317. package/src/rules/common/tag-description.ts +0 -10
  318. package/src/rules/common/tags-alphabetical.ts +0 -20
  319. package/src/rules/no-unresolved-refs.ts +0 -51
  320. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  321. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  322. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  323. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  324. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  325. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  326. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  327. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  328. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  329. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  330. package/src/rules/oas2/index.ts +0 -89
  331. package/src/rules/oas2/remove-unused-components.ts +0 -76
  332. package/src/rules/oas2/request-mime-type.ts +0 -17
  333. package/src/rules/oas2/response-contains-property.ts +0 -36
  334. package/src/rules/oas2/response-mime-type.ts +0 -17
  335. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  336. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  337. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  338. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  339. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  340. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  341. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  342. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  343. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -273
  344. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  345. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  346. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  347. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  348. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  349. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  350. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  351. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  352. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  353. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  354. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  355. package/src/rules/oas3/index.ts +0 -105
  356. package/src/rules/oas3/no-empty-servers.ts +0 -22
  357. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  358. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  359. package/src/rules/oas3/no-server-example.com.ts +0 -14
  360. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  361. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  362. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  363. package/src/rules/oas3/no-unused-components.ts +0 -75
  364. package/src/rules/oas3/remove-unused-components.ts +0 -84
  365. package/src/rules/oas3/request-mime-type.ts +0 -31
  366. package/src/rules/oas3/response-contains-property.ts +0 -38
  367. package/src/rules/oas3/response-mime-type.ts +0 -31
  368. package/src/rules/other/stats.ts +0 -44
  369. package/src/rules/utils.ts +0 -123
  370. package/src/types/index.ts +0 -138
  371. package/src/types/oas2.ts +0 -397
  372. package/src/types/oas3.ts +0 -515
  373. package/src/types/oas3_1.ts +0 -253
  374. package/src/types/redocly-yaml.ts +0 -647
  375. package/src/typings/common.ts +0 -9
  376. package/src/typings/openapi.ts +0 -298
  377. package/src/typings/swagger.ts +0 -236
  378. package/src/utils.ts +0 -193
  379. package/src/visitors.ts +0 -448
  380. package/src/walk.ts +0 -416
  381. package/tsconfig.json +0 -8
  382. 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;