@redocly/openapi-core 1.0.0-beta.99 → 1.0.0-rc.2

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,288 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import { lintDocument } from '../../../../lint';
3
- import { parseYamlToDocument, replaceSourceWithRef } from '../../../../../__tests__/utils';
4
- import { LintConfig, defaultPlugin, resolvePlugins, resolvePreset } from '../../../../config';
5
-
6
- import { BaseResolver } from '../../../../resolve';
7
-
8
- const plugins = resolvePlugins([defaultPlugin]);
9
- const pressets = resolvePreset('all', plugins);
10
- const allConfig = new LintConfig({ ...pressets, plugins });
11
- describe('Oas3 Structural visitor basic', () => {
12
- it('should report wrong types', async () => {
13
- const document = parseYamlToDocument(
14
- outdent`
15
- openapi: 3.0.0
16
- tags:
17
- - 25.3
18
- - test
19
- servers:
20
- - url: 'http://example.com'
21
- variables:
22
- a:
23
- default: test
24
- enum:
25
- - 123
26
- - test
27
- info:
28
- title: Test
29
- version: '1.0'
30
- description: test description
31
- contact:
32
- name: string
33
- url: []
34
- email: false
35
- license: invalid
36
- paths: {}
37
- `,
38
- 'foobar.yaml',
39
- );
40
-
41
- const results = await lintDocument({
42
- externalRefResolver: new BaseResolver(),
43
- document,
44
- config: allConfig,
45
- });
46
-
47
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
48
- Array [
49
- Object {
50
- "location": Array [
51
- Object {
52
- "pointer": "#/info/contact/url",
53
- "reportOnKey": false,
54
- "source": "foobar.yaml",
55
- },
56
- ],
57
- "message": "Expected type \`string\` but got \`array\`.",
58
- "ruleId": "spec",
59
- "severity": "error",
60
- "suggest": Array [],
61
- },
62
- Object {
63
- "location": Array [
64
- Object {
65
- "pointer": "#/info/contact/email",
66
- "reportOnKey": false,
67
- "source": "foobar.yaml",
68
- },
69
- ],
70
- "message": "Expected type \`string\` but got \`boolean\`.",
71
- "ruleId": "spec",
72
- "severity": "error",
73
- "suggest": Array [],
74
- },
75
- Object {
76
- "location": Array [
77
- Object {
78
- "pointer": "#/info/license",
79
- "reportOnKey": false,
80
- "source": "foobar.yaml",
81
- },
82
- ],
83
- "message": "Expected type \`License\` (object) but got \`string\`",
84
- "ruleId": "spec",
85
- "severity": "error",
86
- "suggest": Array [],
87
- },
88
- Object {
89
- "from": Object {
90
- "pointer": "#/servers/0/url",
91
- "source": "foobar.yaml",
92
- },
93
- "location": Array [
94
- Object {
95
- "pointer": "#/servers/0/variables/a",
96
- "reportOnKey": true,
97
- "source": "foobar.yaml",
98
- },
99
- ],
100
- "message": "The \`a\` variable is not used in the server's \`url\` field.",
101
- "ruleId": "no-undefined-server-variable",
102
- "severity": "error",
103
- "suggest": Array [],
104
- },
105
- Object {
106
- "location": Array [
107
- Object {
108
- "pointer": "#/servers/0/variables/a/enum/0",
109
- "reportOnKey": false,
110
- "source": "foobar.yaml",
111
- },
112
- ],
113
- "message": "Expected type \`string\` but got \`number\`.",
114
- "ruleId": "spec",
115
- "severity": "error",
116
- "suggest": Array [],
117
- },
118
- Object {
119
- "location": Array [
120
- Object {
121
- "pointer": "#/tags/0",
122
- "reportOnKey": false,
123
- "source": "foobar.yaml",
124
- },
125
- ],
126
- "message": "Expected type \`Tag\` (object) but got \`number\`",
127
- "ruleId": "spec",
128
- "severity": "error",
129
- "suggest": Array [],
130
- },
131
- Object {
132
- "location": Array [
133
- Object {
134
- "pointer": "#/tags/1",
135
- "reportOnKey": false,
136
- "source": "foobar.yaml",
137
- },
138
- ],
139
- "message": "Expected type \`Tag\` (object) but got \`string\`",
140
- "ruleId": "spec",
141
- "severity": "error",
142
- "suggest": Array [],
143
- },
144
- ]
145
- `);
146
- });
147
-
148
- it('should report unexpected properties', async () => {
149
- const document = parseYamlToDocument(
150
- outdent`
151
- openapi: 3.0.0
152
- components1: 1
153
- info:
154
- title: Test
155
- version: '1.0'
156
- description: test description
157
- license:
158
- name: MIT
159
- url: google.com
160
- contact:
161
- name: string
162
- test: blah
163
- x-test: vendor
164
- paths: {}
165
- `,
166
- 'foobar.yaml',
167
- );
168
-
169
- const results = await lintDocument({
170
- externalRefResolver: new BaseResolver(),
171
- document,
172
- config: allConfig,
173
- });
174
-
175
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
176
- Array [
177
- Object {
178
- "location": Array [
179
- Object {
180
- "pointer": "#/components1",
181
- "reportOnKey": true,
182
- "source": "foobar.yaml",
183
- },
184
- ],
185
- "message": "Property \`components1\` is not expected here.",
186
- "ruleId": "spec",
187
- "severity": "error",
188
- "suggest": Array [
189
- "components",
190
- ],
191
- },
192
- Object {
193
- "location": Array [
194
- Object {
195
- "pointer": "#/openapi",
196
- "reportOnKey": true,
197
- "source": "foobar.yaml",
198
- },
199
- ],
200
- "message": "Servers must be present.",
201
- "ruleId": "no-empty-servers",
202
- "severity": "error",
203
- "suggest": Array [],
204
- },
205
- Object {
206
- "location": Array [
207
- Object {
208
- "pointer": "#/info/contact/test",
209
- "reportOnKey": true,
210
- "source": "foobar.yaml",
211
- },
212
- ],
213
- "message": "Property \`test\` is not expected here.",
214
- "ruleId": "spec",
215
- "severity": "error",
216
- "suggest": Array [],
217
- },
218
- ]
219
- `);
220
- });
221
-
222
- it('should report required properties missing', async () => {
223
- const document = parseYamlToDocument(
224
- outdent`
225
- openapi: 3.0.0
226
- info:
227
- version: '1.0'
228
- description: test description
229
- license:
230
- name: MIT
231
- url: google.com
232
- contact:
233
- name: string
234
- `,
235
- 'foobar.yaml',
236
- );
237
-
238
- const results = await lintDocument({
239
- externalRefResolver: new BaseResolver(),
240
- document,
241
- config: allConfig,
242
- });
243
-
244
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
245
- Array [
246
- Object {
247
- "location": Array [
248
- Object {
249
- "pointer": "#/",
250
- "reportOnKey": true,
251
- "source": "foobar.yaml",
252
- },
253
- ],
254
- "message": "The field \`paths\` must be present on this level.",
255
- "ruleId": "spec",
256
- "severity": "error",
257
- "suggest": Array [],
258
- },
259
- Object {
260
- "location": Array [
261
- Object {
262
- "pointer": "#/openapi",
263
- "reportOnKey": true,
264
- "source": "foobar.yaml",
265
- },
266
- ],
267
- "message": "Servers must be present.",
268
- "ruleId": "no-empty-servers",
269
- "severity": "error",
270
- "suggest": Array [],
271
- },
272
- Object {
273
- "location": Array [
274
- Object {
275
- "pointer": "#/info",
276
- "reportOnKey": true,
277
- "source": "foobar.yaml",
278
- },
279
- ],
280
- "message": "The field \`title\` must be present on this level.",
281
- "ruleId": "spec",
282
- "severity": "error",
283
- "suggest": Array [],
284
- },
285
- ]
286
- `);
287
- });
288
- });
@@ -1,32 +0,0 @@
1
- import { LintConfig, RuleConfig, resolveLint } from '../../../../config';
2
- import { parseYamlToDocument } from '../../../../../__tests__/utils';
3
- import { lintDocument } from '../../../../lint';
4
- import { BaseResolver } from '../../../../resolve';
5
-
6
- export async function validateDoc(
7
- source: string,
8
- rules: Record<string, RuleConfig> = { spec: 'error' },
9
- ) {
10
- const document = parseYamlToDocument(source, 'foobar.yaml');
11
-
12
- const results = await lintDocument({
13
- externalRefResolver: new BaseResolver(),
14
- document,
15
- config: new LintConfig(
16
- await resolveLint({
17
- lintConfig: {
18
- plugins: [],
19
- extends: [],
20
- rules,
21
- },
22
- }),
23
- ),
24
- });
25
-
26
- return results.map((res) => {
27
- return {
28
- message: res.message,
29
- location: res.location[0].pointer || '',
30
- };
31
- });
32
- }
@@ -1,28 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export type BooleanParameterPrefixesOptions = {
4
- prefixes?: string[];
5
- };
6
-
7
- export const BooleanParameterPrefixes: Oas3Rule = (options: BooleanParameterPrefixesOptions) => {
8
- const prefixes = options.prefixes || ['is', 'has'];
9
- const regexp = new RegExp(`^(${prefixes.join('|')})[A-Z-_]`);
10
- const wrappedPrefixes = prefixes.map((p) => `\`${p}\``);
11
- const prefixesString =
12
- wrappedPrefixes.length === 1
13
- ? wrappedPrefixes[0]
14
- : wrappedPrefixes.slice(0, -1).join(', ') + ' or ' + wrappedPrefixes[prefixes.length - 1];
15
-
16
- return {
17
- Parameter: {
18
- Schema(schema, { report, parentLocations }, parents) {
19
- if (schema.type === 'boolean' && !regexp.test(parents.Parameter.name)) {
20
- report({
21
- message: `Boolean parameter \`${parents.Parameter.name}\` should have ${prefixesString} prefix.`,
22
- location: parentLocations.Parameter.child(['name']),
23
- });
24
- }
25
- },
26
- },
27
- };
28
- };
@@ -1,105 +0,0 @@
1
- import { Oas3RuleSet } from '../../oas-types';
2
- import { OasSpec } from '../common/spec';
3
- import { Operation2xxResponse } from '../common/operation-2xx-response';
4
- import { Operation4xxResponse } from '../common/operation-4xx-response';
5
- import { Assertions } from '../common/assertions';
6
- import { OperationIdUnique } from '../common/operation-operationId-unique';
7
- import { OperationParametersUnique } from '../common/operation-parameters-unique';
8
- import { PathParamsDefined } from '../common/path-params-defined';
9
- import { OperationTagDefined } from '../common/operation-tag-defined';
10
- import { NoExampleValueAndExternalValue } from './no-example-value-and-externalValue';
11
- import { NoEnumTypeMismatch } from '../common/no-enum-type-mismatch';
12
- import { NoPathTrailingSlash } from '../common/no-path-trailing-slash';
13
- import { PathDeclarationMustExist } from '../common/path-declaration-must-exist';
14
- import { OperationIdUrlSafe } from '../common/operation-operationId-url-safe';
15
- import { TagsAlphabetical } from '../common/tags-alphabetical';
16
- import { NoServerExample } from './no-server-example.com';
17
- import { NoServerTrailingSlash } from './no-server-trailing-slash';
18
- import { InfoDescription } from '../common/info-description';
19
- import { TagDescription } from '../common/tag-description';
20
- import { InfoContact } from '../common/info-contact';
21
- import { InfoLicense } from '../common/info-license-url';
22
- import { OperationDescription } from '../common/operation-description';
23
- import { NoUnusedComponents } from './no-unused-components';
24
- import { PathNotIncludeQuery } from '../common/path-not-include-query';
25
- import { ParameterDescription } from '../common/parameter-description';
26
- import { OperationSingularTag } from '../common/operation-singular-tag';
27
- import { InfoLicenseUrl } from '../common/license-url';
28
- import { OperationSecurityDefined } from '../common/operation-security-defined';
29
- import { NoUnresolvedRefs } from '../no-unresolved-refs';
30
- import { BooleanParameterPrefixes } from './boolean-parameter-prefixes';
31
- import { PathsKebabCase } from '../common/paths-kebab-case';
32
- import { PathHttpVerbsOrder } from '../common/path-http-verbs-order';
33
- import { NoEmptyServers } from './no-empty-servers';
34
- import { ValidContentExamples } from './no-invalid-media-type-examples';
35
- import { NoIdenticalPaths } from '../common/no-identical-paths';
36
- import { NoUndefinedServerVariable } from './no-undefined-server-variable';
37
- import { OperationOperationId } from '../common/operation-operationId';
38
- import { OperationSummary } from '../common/operation-summary';
39
- import { NoAmbiguousPaths } from '../common/no-ambiguous-paths';
40
- import { NoEmptyEnumServers } from './no-servers-empty-enum';
41
- import { NoHttpVerbsInPaths } from '../common/no-http-verbs-in-paths';
42
- import { RequestMimeType } from './request-mime-type';
43
- import { ResponseMimeType } from './response-mime-type';
44
- import { PathSegmentPlural } from '../common/path-segment-plural';
45
- import { PathExcludesPatterns } from '../common/path-excludes-patterns';
46
- import { NoInvalidSchemaExamples } from '../common/no-invalid-schema-examples';
47
- import { NoInvalidParameterExamples } from '../common/no-invalid-parameter-examples';
48
- import { ResponseContainsHeader } from '../common/response-contains-header';
49
- import { ResponseContainsProperty } from './response-contains-property';
50
- import { ScalarPropertyMissingExample } from '../common/scalar-property-missing-example';
51
-
52
- export const rules = {
53
- spec: OasSpec,
54
- 'info-description': InfoDescription,
55
- 'info-contact': InfoContact,
56
- 'info-license': InfoLicense,
57
- 'info-license-url': InfoLicenseUrl,
58
- 'operation-2xx-response': Operation2xxResponse,
59
- 'operation-4xx-response': Operation4xxResponse,
60
- 'assertions': Assertions,
61
- 'operation-operationId-unique': OperationIdUnique,
62
- 'operation-parameters-unique': OperationParametersUnique,
63
- 'path-parameters-defined': PathParamsDefined,
64
- 'operation-tag-defined': OperationTagDefined,
65
- 'no-example-value-and-externalValue': NoExampleValueAndExternalValue,
66
- 'no-enum-type-mismatch': NoEnumTypeMismatch,
67
- 'no-path-trailing-slash': NoPathTrailingSlash,
68
- 'no-empty-servers': NoEmptyServers,
69
- 'path-declaration-must-exist': PathDeclarationMustExist,
70
- 'operation-operationId-url-safe': OperationIdUrlSafe,
71
- 'operation-operationId': OperationOperationId,
72
- 'operation-summary': OperationSummary,
73
- 'tags-alphabetical': TagsAlphabetical,
74
- 'no-server-example.com': NoServerExample,
75
- 'no-server-trailing-slash': NoServerTrailingSlash,
76
- 'tag-description': TagDescription,
77
- 'operation-description': OperationDescription,
78
- 'no-unused-components': NoUnusedComponents,
79
- 'path-not-include-query': PathNotIncludeQuery,
80
- 'path-params-defined': PathParamsDefined,
81
- 'parameter-description': ParameterDescription,
82
- 'operation-singular-tag': OperationSingularTag,
83
- 'operation-security-defined': OperationSecurityDefined,
84
- 'no-unresolved-refs': NoUnresolvedRefs,
85
- 'paths-kebab-case': PathsKebabCase,
86
- 'boolean-parameter-prefixes': BooleanParameterPrefixes,
87
- 'path-http-verbs-order': PathHttpVerbsOrder,
88
- 'no-invalid-media-type-examples': ValidContentExamples,
89
- 'no-identical-paths': NoIdenticalPaths,
90
- 'no-ambiguous-paths': NoAmbiguousPaths,
91
- 'no-undefined-server-variable': NoUndefinedServerVariable,
92
- 'no-servers-empty-enum': NoEmptyEnumServers,
93
- 'no-http-verbs-in-paths': NoHttpVerbsInPaths,
94
- 'path-excludes-patterns': PathExcludesPatterns,
95
- 'request-mime-type': RequestMimeType,
96
- 'response-mime-type': ResponseMimeType,
97
- 'path-segment-plural': PathSegmentPlural,
98
- 'no-invalid-schema-examples': NoInvalidSchemaExamples,
99
- 'no-invalid-parameter-examples': NoInvalidParameterExamples,
100
- 'response-contains-header': ResponseContainsHeader,
101
- 'response-contains-property': ResponseContainsProperty,
102
- 'scalar-property-missing-example': ScalarPropertyMissingExample,
103
- } as Oas3RuleSet;
104
-
105
- export const preprocessors = {};
@@ -1,22 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export const NoEmptyServers: Oas3Rule = () => {
4
- return {
5
- DefinitionRoot(root, { report, location }) {
6
- if (!root.hasOwnProperty('servers')) {
7
- report({
8
- message: 'Servers must be present.',
9
- location: location.child(['openapi']).key()
10
- });
11
- return;
12
- }
13
-
14
- if (!Array.isArray(root.servers) || root.servers.length === 0) {
15
- report({
16
- message: 'Servers must be a non-empty array.',
17
- location: location.child(['servers']).key(),
18
- });
19
- }
20
- },
21
- };
22
- };
@@ -1,14 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export const NoExampleValueAndExternalValue: Oas3Rule = () => {
4
- return {
5
- Example(example, { report, location }) {
6
- if (example.value && example.externalValue) {
7
- report({
8
- message: 'Example object can have either `value` or `externalValue` fields.',
9
- location: location.child(['value']).key(),
10
- });
11
- }
12
- },
13
- };
14
- };
@@ -1,41 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
- import { Location, isRef } from '../../ref-utils';
3
- import { Oas3Example } from '../../typings/openapi';
4
- import { validateExample } from '../utils';
5
- import { UserContext } from '../../walk';
6
-
7
- export const ValidContentExamples: Oas3Rule = (opts) => {
8
- const disallowAdditionalProperties = opts.disallowAdditionalProperties ?? true;
9
-
10
- return {
11
- MediaType: {
12
- leave(mediaType, ctx: UserContext) {
13
- const { location, resolve } = ctx;
14
- if (!mediaType.schema) return;
15
- if (mediaType.example) {
16
- resolveAndValidateExample(mediaType.example, location.child('example'));
17
- } else if (mediaType.examples) {
18
- for (const exampleName of Object.keys(mediaType.examples)) {
19
- resolveAndValidateExample(mediaType.examples[exampleName], location.child(['examples', exampleName, 'value']), true);
20
- }
21
- }
22
-
23
- function resolveAndValidateExample(example: Oas3Example | any, location: Location, isMultiple?: boolean) {
24
- if (isRef(example)) {
25
- const resolved = resolve<Oas3Example>(example);
26
- if (!resolved.location) return;
27
- location = isMultiple ? resolved.location.child('value') : resolved.location;
28
- example = resolved.node;
29
- }
30
- validateExample(
31
- isMultiple ? example.value : example,
32
- mediaType.schema!,
33
- location,
34
- ctx,
35
- disallowAdditionalProperties,
36
- );
37
- }
38
- },
39
- },
40
- };
41
- };
@@ -1,14 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export const NoServerExample: Oas3Rule = () => {
4
- return {
5
- Server(server, { report, location }) {
6
- if (['example.com', 'localhost'].indexOf(server.url) !== -1) {
7
- report({
8
- message: 'Server `url` should not point at example.com.',
9
- location: location.child(['url']),
10
- });
11
- }
12
- },
13
- };
14
- };
@@ -1,15 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export const NoServerTrailingSlash: Oas3Rule = () => {
4
- return {
5
- Server(server, { report, location }) {
6
- if (!server.url) return;
7
- if (server.url.endsWith('/') && server.url !== '/') {
8
- report({
9
- message: 'Server `url` should not have a trailing slash.',
10
- location: location.child(['url']),
11
- });
12
- }
13
- },
14
- };
15
- };
@@ -1,67 +0,0 @@
1
- import { Oas3Server } from 'core/src/typings/openapi';
2
- import { Oas3Rule } from '../../visitors';
3
-
4
- enum enumError {
5
- empty = 'empty',
6
- invalidDefaultValue = 'invalidDefaultValue',
7
- }
8
-
9
- export const NoEmptyEnumServers: Oas3Rule = () => {
10
- return {
11
- DefinitionRoot(root, { report, location }) {
12
- if (!root.servers || root.servers.length === 0) return;
13
-
14
- const invalidVariables: enumError[] = [];
15
-
16
- if (Array.isArray(root.servers)) {
17
- for (const server of root.servers) {
18
- const enumErrors = checkEnumVariables(server);
19
- if (!enumErrors) continue;
20
- invalidVariables.push(...enumErrors);
21
- }
22
- } else {
23
- const enumErrors = checkEnumVariables(root.servers);
24
- if (!enumErrors) return;
25
- invalidVariables.push(...enumErrors);
26
- }
27
-
28
- for(const invalidVariable of invalidVariables) {
29
- if(invalidVariable === enumError.empty) {
30
- report({
31
- message: 'Server variable with `enum` must be a non-empty array.',
32
- location: location.child(['servers']).key(),
33
- });
34
- }
35
- if(invalidVariable === enumError.invalidDefaultValue) {
36
- report({
37
- message: 'Server variable define `enum` and `default`. `enum` must include default value',
38
- location: location.child(['servers']).key(),
39
- });
40
- }
41
- }
42
- },
43
- };
44
- };
45
-
46
- function checkEnumVariables(server: Oas3Server): enumError[] | undefined{
47
- if (server.variables && Object.keys(server.variables).length === 0)
48
- return;
49
-
50
- const errors: enumError[] = [];
51
- for(var variable in server.variables) {
52
- const serverVariable = server.variables[variable];
53
- if (!serverVariable.enum) continue;
54
-
55
- if (Array.isArray(serverVariable.enum) && serverVariable.enum?.length === 0)
56
- errors.push(enumError.empty);
57
-
58
- if (!serverVariable.default)
59
- continue;
60
-
61
- const defaultValue = server.variables[variable].default;
62
- if (serverVariable.enum && !serverVariable.enum.includes(defaultValue))
63
- errors.push(enumError.invalidDefaultValue);
64
- }
65
- if (errors.length) return errors;
66
- return;
67
- }
@@ -1,30 +0,0 @@
1
- import { Oas3Rule } from '../../visitors';
2
-
3
- export const NoUndefinedServerVariable: Oas3Rule = () => {
4
- return {
5
- Server(server, { report, location }) {
6
- if (!server.url) return;
7
- const urlVariables = server.url.match(/{[^}]+}/g)?.map((e) => e.slice(1, e.length - 1)) || [];
8
- const definedVariables = (server?.variables && Object.keys(server.variables)) || [];
9
-
10
- for (const serverVar of urlVariables) {
11
- if (!definedVariables.includes(serverVar)) {
12
- report({
13
- message: `The \`${serverVar}\` variable is not defined in the \`variables\` objects.`,
14
- location: location.child(['url']),
15
- });
16
- }
17
- }
18
-
19
- for (const definedServerVar of definedVariables) {
20
- if (!urlVariables.includes(definedServerVar)) {
21
- report({
22
- message: `The \`${definedServerVar}\` variable is not used in the server's \`url\` field.`,
23
- location: location.child(['variables', definedServerVar]).key(),
24
- from: location.child('url'),
25
- });
26
- }
27
- }
28
- },
29
- };
30
- };