@redocly/openapi-core 1.0.0-beta.125 → 1.0.0-beta.127

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 (281) hide show
  1. package/lib/bundle.js +5 -2
  2. package/lib/config/all.js +8 -1
  3. package/lib/resolve.js +5 -1
  4. package/lib/rules/common/required-string-property-missing-min-length.d.ts +1 -1
  5. package/lib/rules/common/required-string-property-missing-min-length.js +3 -3
  6. package/lib/rules/common/spec.js +1 -0
  7. package/lib/rules/oas2/index.js +1 -1
  8. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  9. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  10. package/lib/rules/oas3/index.js +1 -1
  11. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +2 -2
  12. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +3 -3
  13. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  14. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  15. package/lib/walk.d.ts +6 -5
  16. package/lib/walk.js +23 -27
  17. package/package.json +1 -1
  18. package/__tests__/utils.ts +0 -88
  19. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -437
  20. package/src/__tests__/bundle.test.ts +0 -236
  21. package/src/__tests__/codeframes.test.ts +0 -530
  22. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +0 -5
  23. package/src/__tests__/fixtures/extension.js +0 -24
  24. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  25. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  26. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  27. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  28. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  29. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  30. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  31. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  32. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  33. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  34. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  35. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  36. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  37. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  38. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  39. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  40. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  41. package/src/__tests__/fixtures/resolve/description.md +0 -3
  42. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  43. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  44. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  45. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  46. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  47. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  48. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  49. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  50. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  51. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  52. package/src/__tests__/format.test.ts +0 -76
  53. package/src/__tests__/js-yaml.test.ts +0 -73
  54. package/src/__tests__/lint.test.ts +0 -388
  55. package/src/__tests__/logger-browser.test.ts +0 -53
  56. package/src/__tests__/logger.test.ts +0 -47
  57. package/src/__tests__/login.test.ts +0 -17
  58. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  59. package/src/__tests__/output-browser.test.ts +0 -18
  60. package/src/__tests__/output.test.ts +0 -15
  61. package/src/__tests__/ref-utils.test.ts +0 -120
  62. package/src/__tests__/resolve-http.test.ts +0 -77
  63. package/src/__tests__/resolve.test.ts +0 -408
  64. package/src/__tests__/utils-browser.test.ts +0 -11
  65. package/src/__tests__/utils.test.ts +0 -144
  66. package/src/__tests__/walk.test.ts +0 -1545
  67. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  68. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  69. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  70. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -35
  71. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  72. package/src/benchmark/benches/rebilly.yaml +0 -32275
  73. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  74. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  75. package/src/benchmark/benchmark.js +0 -311
  76. package/src/benchmark/colors.js +0 -29
  77. package/src/benchmark/fork.js +0 -83
  78. package/src/benchmark/utils.ts +0 -36
  79. package/src/bundle.ts +0 -399
  80. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -161
  81. package/src/config/__tests__/__snapshots__/config.test.ts.snap +0 -144
  82. package/src/config/__tests__/config-resolvers.test.ts +0 -491
  83. package/src/config/__tests__/config.test.ts +0 -307
  84. package/src/config/__tests__/fixtures/ingore-file.ts +0 -8
  85. package/src/config/__tests__/fixtures/load-redocly.yaml +0 -2
  86. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -2
  87. package/src/config/__tests__/fixtures/plugin.js +0 -56
  88. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -11
  89. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -69
  90. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -7
  91. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +0 -17
  92. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -18
  93. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +0 -15
  94. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -9
  95. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -80
  96. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -3
  97. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -4
  98. package/src/config/__tests__/load.test.ts +0 -167
  99. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  100. package/src/config/__tests__/utils.test.ts +0 -204
  101. package/src/config/all.ts +0 -66
  102. package/src/config/builtIn.ts +0 -37
  103. package/src/config/config-resolvers.ts +0 -465
  104. package/src/config/config.ts +0 -330
  105. package/src/config/index.ts +0 -7
  106. package/src/config/load.ts +0 -144
  107. package/src/config/minimal.ts +0 -60
  108. package/src/config/recommended.ts +0 -60
  109. package/src/config/rules.ts +0 -54
  110. package/src/config/types.ts +0 -216
  111. package/src/config/utils.ts +0 -333
  112. package/src/decorators/__tests__/filter-in.test.ts +0 -310
  113. package/src/decorators/__tests__/filter-out.test.ts +0 -335
  114. package/src/decorators/__tests__/media-type-examples-override.test.ts +0 -665
  115. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  116. package/src/decorators/__tests__/resources/request.yaml +0 -3
  117. package/src/decorators/__tests__/resources/response.yaml +0 -3
  118. package/src/decorators/common/filters/filter-helper.ts +0 -72
  119. package/src/decorators/common/filters/filter-in.ts +0 -18
  120. package/src/decorators/common/filters/filter-out.ts +0 -18
  121. package/src/decorators/common/info-description-override.ts +0 -24
  122. package/src/decorators/common/info-override.ts +0 -15
  123. package/src/decorators/common/media-type-examples-override.ts +0 -79
  124. package/src/decorators/common/operation-description-override.ts +0 -30
  125. package/src/decorators/common/registry-dependencies.ts +0 -25
  126. package/src/decorators/common/remove-x-internal.ts +0 -59
  127. package/src/decorators/common/tag-description-override.ts +0 -25
  128. package/src/decorators/oas2/index.ts +0 -20
  129. package/src/decorators/oas3/index.ts +0 -22
  130. package/src/env.ts +0 -5
  131. package/src/format/codeframes.ts +0 -216
  132. package/src/format/format.ts +0 -375
  133. package/src/index.ts +0 -71
  134. package/src/js-yaml/index.ts +0 -14
  135. package/src/lint.ts +0 -130
  136. package/src/logger.ts +0 -34
  137. package/src/oas-types.ts +0 -57
  138. package/src/output.ts +0 -7
  139. package/src/redocly/__tests__/redocly-client.test.ts +0 -146
  140. package/src/redocly/index.ts +0 -187
  141. package/src/redocly/redocly-client-types.ts +0 -10
  142. package/src/redocly/registry-api-types.ts +0 -32
  143. package/src/redocly/registry-api.ts +0 -149
  144. package/src/ref-utils.ts +0 -85
  145. package/src/resolve.ts +0 -412
  146. package/src/rules/__tests__/fixtures/code-sample.php +0 -9
  147. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  148. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  149. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -257
  150. package/src/rules/__tests__/utils.test.ts +0 -160
  151. package/src/rules/ajv.ts +0 -102
  152. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  153. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  154. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  155. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -210
  156. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  157. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  158. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -192
  159. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -231
  160. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  161. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  162. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  163. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  164. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  165. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  166. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -202
  167. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  168. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -264
  169. package/src/rules/common/__tests__/security-defined.test.ts +0 -175
  170. package/src/rules/common/__tests__/spec.test.ts +0 -555
  171. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  172. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  173. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -869
  174. package/src/rules/common/assertions/__tests__/index.test.ts +0 -100
  175. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -236
  176. package/src/rules/common/assertions/asserts.ts +0 -357
  177. package/src/rules/common/assertions/index.ts +0 -56
  178. package/src/rules/common/assertions/utils.ts +0 -331
  179. package/src/rules/common/info-contact.ts +0 -15
  180. package/src/rules/common/info-license-url.ts +0 -10
  181. package/src/rules/common/info-license.ts +0 -15
  182. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  183. package/src/rules/common/no-enum-type-mismatch.ts +0 -52
  184. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  185. package/src/rules/common/no-identical-paths.ts +0 -24
  186. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  187. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  188. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  189. package/src/rules/common/operation-2xx-response.ts +0 -24
  190. package/src/rules/common/operation-4xx-response.ts +0 -24
  191. package/src/rules/common/operation-description.ts +0 -13
  192. package/src/rules/common/operation-operationId-unique.ts +0 -21
  193. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  194. package/src/rules/common/operation-operationId.ts +0 -17
  195. package/src/rules/common/operation-parameters-unique.ts +0 -48
  196. package/src/rules/common/operation-singular-tag.ts +0 -17
  197. package/src/rules/common/operation-summary.ts +0 -13
  198. package/src/rules/common/operation-tag-defined.ts +0 -26
  199. package/src/rules/common/parameter-description.ts +0 -22
  200. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  201. package/src/rules/common/path-excludes-patterns.ts +0 -23
  202. package/src/rules/common/path-http-verbs-order.ts +0 -30
  203. package/src/rules/common/path-not-include-query.ts +0 -17
  204. package/src/rules/common/path-params-defined.ts +0 -65
  205. package/src/rules/common/path-segment-plural.ts +0 -31
  206. package/src/rules/common/paths-kebab-case.ts +0 -19
  207. package/src/rules/common/required-string-property-missing-min-length.ts +0 -44
  208. package/src/rules/common/response-contains-header.ts +0 -35
  209. package/src/rules/common/scalar-property-missing-example.ts +0 -58
  210. package/src/rules/common/security-defined.ts +0 -65
  211. package/src/rules/common/spec.ts +0 -174
  212. package/src/rules/common/tag-description.ts +0 -10
  213. package/src/rules/common/tags-alphabetical.ts +0 -20
  214. package/src/rules/no-unresolved-refs.ts +0 -51
  215. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  216. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  217. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  218. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  219. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  220. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  221. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  222. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -35
  223. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  224. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  225. package/src/rules/oas2/index.ts +0 -89
  226. package/src/rules/oas2/remove-unused-components.ts +0 -81
  227. package/src/rules/oas2/request-mime-type.ts +0 -17
  228. package/src/rules/oas2/response-contains-property.ts +0 -36
  229. package/src/rules/oas2/response-mime-type.ts +0 -17
  230. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  231. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  232. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  233. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  234. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -473
  235. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  236. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  237. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  238. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +0 -145
  239. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -389
  240. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  241. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  242. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  243. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  244. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  245. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  246. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  247. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -505
  248. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -298
  249. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  250. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +0 -305
  251. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  252. package/src/rules/oas3/index.ts +0 -109
  253. package/src/rules/oas3/no-empty-servers.ts +0 -22
  254. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  255. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -49
  256. package/src/rules/oas3/no-server-example.com.ts +0 -14
  257. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  258. package/src/rules/oas3/no-server-variables-empty-enum.ts +0 -66
  259. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  260. package/src/rules/oas3/no-unused-components.ts +0 -75
  261. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +0 -36
  262. package/src/rules/oas3/remove-unused-components.ts +0 -95
  263. package/src/rules/oas3/request-mime-type.ts +0 -31
  264. package/src/rules/oas3/response-contains-property.ts +0 -38
  265. package/src/rules/oas3/response-mime-type.ts +0 -31
  266. package/src/rules/oas3/spec-components-invalid-map-name.ts +0 -74
  267. package/src/rules/other/stats.ts +0 -73
  268. package/src/rules/utils.ts +0 -191
  269. package/src/types/index.ts +0 -149
  270. package/src/types/oas2.ts +0 -478
  271. package/src/types/oas3.ts +0 -597
  272. package/src/types/oas3_1.ts +0 -258
  273. package/src/types/redocly-yaml.ts +0 -1010
  274. package/src/typings/common.ts +0 -17
  275. package/src/typings/openapi.ts +0 -298
  276. package/src/typings/swagger.ts +0 -236
  277. package/src/utils.ts +0 -276
  278. package/src/visitors.ts +0 -491
  279. package/src/walk.ts +0 -453
  280. package/tsconfig.json +0 -8
  281. package/tsconfig.tsbuildinfo +0 -1
@@ -1,174 +0,0 @@
1
- import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
- import { isNamedType, SpecExtension } from '../../types';
3
- import { oasTypeOf, matchesJsonSchemaType, getSuggest, validateSchemaEnumType } from '../utils';
4
- import { isRef } from '../../ref-utils';
5
- import { isPlainObject } from '../../utils';
6
- import { UserContext } from '../../walk';
7
-
8
- export const OasSpec: Oas3Rule | Oas2Rule = () => {
9
- return {
10
- any(
11
- node: any,
12
- { report, type, location, rawLocation, key, resolve, ignoreNextVisitorsOnNode }
13
- ) {
14
- const nodeType = oasTypeOf(node);
15
- const refLocation = rawLocation !== location ? rawLocation : undefined;
16
-
17
- if (type.items) {
18
- if (nodeType !== 'array') {
19
- report({
20
- message: `Expected type \`${type.name}\` (array) but got \`${nodeType}\``,
21
- from: refLocation,
22
- });
23
- ignoreNextVisitorsOnNode();
24
- }
25
- return;
26
- } else if (nodeType !== 'object') {
27
- if (type !== SpecExtension) {
28
- // do not validate unknown extensions structure
29
- report({
30
- message: `Expected type \`${type.name}\` (object) but got \`${nodeType}\``,
31
- from: refLocation,
32
- });
33
- }
34
- ignoreNextVisitorsOnNode();
35
- return;
36
- }
37
-
38
- const required =
39
- typeof type.required === 'function' ? type.required(node, key) : type.required;
40
-
41
- for (const propName of required || []) {
42
- if (!(node as object).hasOwnProperty(propName)) {
43
- report({
44
- message: `The field \`${propName}\` must be present on this level.`,
45
- from: refLocation,
46
- location: [{ reportOnKey: true }],
47
- });
48
- }
49
- }
50
-
51
- const allowed = type.allowed?.(node);
52
- if (allowed && isPlainObject(node)) {
53
- for (const propName in node) {
54
- if (
55
- allowed.includes(propName) ||
56
- (type.extensionsPrefix && propName.startsWith(type.extensionsPrefix)) ||
57
- !Object.keys(type.properties).includes(propName)
58
- ) {
59
- continue;
60
- }
61
- report({
62
- message: `The field \`${propName}\` is not allowed here.`,
63
- from: refLocation,
64
- location: location.child([propName]).key(),
65
- });
66
- }
67
- }
68
-
69
- const requiredOneOf = type.requiredOneOf || null;
70
- if (requiredOneOf) {
71
- let hasProperty = false;
72
- for (const propName of requiredOneOf || []) {
73
- if ((node as object).hasOwnProperty(propName)) {
74
- hasProperty = true;
75
- }
76
- }
77
- if (!hasProperty)
78
- report({
79
- message: `Must contain at least one of the following fields: ${type.requiredOneOf?.join(
80
- ', '
81
- )}.`,
82
- from: refLocation,
83
- location: [{ reportOnKey: true }],
84
- });
85
- }
86
-
87
- for (const propName of Object.keys(node)) {
88
- const propLocation = location.child([propName]);
89
- let propValue = node[propName];
90
-
91
- let propType = type.properties[propName];
92
- if (propType === undefined) propType = type.additionalProperties;
93
- if (typeof propType === 'function') propType = propType(propValue, propName);
94
-
95
- if (isNamedType(propType)) {
96
- continue; // do nothing for named schema, it is executed with the next any call
97
- }
98
-
99
- const propSchema = propType;
100
- const propValueType = oasTypeOf(propValue);
101
-
102
- if (propSchema === undefined) {
103
- if (propName.startsWith('x-')) continue;
104
- report({
105
- message: `Property \`${propName}\` is not expected here.`,
106
- suggest: getSuggest(propName, Object.keys(type.properties)),
107
- from: refLocation,
108
- location: propLocation.key(),
109
- });
110
- continue;
111
- }
112
-
113
- if (propSchema === null) {
114
- continue; // just defined, no validation
115
- }
116
-
117
- if (propSchema.resolvable !== false && isRef(propValue)) {
118
- propValue = resolve(propValue).node;
119
- }
120
-
121
- if (propSchema.items && propSchema.items?.enum && Array.isArray(propValue)) {
122
- for (let i = 0; i < propValue.length; i++) {
123
- validateSchemaEnumType(propSchema.items?.enum, propValue[i], propName, refLocation, {
124
- report,
125
- location: location.child([propName, i]),
126
- } as UserContext);
127
- }
128
- }
129
-
130
- if (propSchema.enum) {
131
- validateSchemaEnumType(propSchema.enum, propValue, propName, refLocation, {
132
- report,
133
- location: location.child([propName]),
134
- } as UserContext);
135
- } else if (propSchema.type && !matchesJsonSchemaType(propValue, propSchema.type, false)) {
136
- report({
137
- message: `Expected type \`${propSchema.type}\` but got \`${propValueType}\`.`,
138
- from: refLocation,
139
- location: propLocation,
140
- });
141
- } else if (propValueType === 'array' && propSchema.items?.type) {
142
- const itemsType = propSchema.items?.type;
143
- for (let i = 0; i < propValue.length; i++) {
144
- const item = propValue[i];
145
- if (!matchesJsonSchemaType(item, itemsType, false)) {
146
- report({
147
- message: `Expected type \`${itemsType}\` but got \`${oasTypeOf(item)}\`.`,
148
- from: refLocation,
149
- location: propLocation.child([i]),
150
- });
151
- }
152
- }
153
- }
154
-
155
- if (typeof propSchema.minimum === 'number') {
156
- if (propSchema.minimum > node[propName]) {
157
- report({
158
- message: `The value of the ${propName} field must be greater than or equal to ${propSchema.minimum}`,
159
- from: refLocation,
160
- location: location.child([propName]),
161
- });
162
- }
163
- }
164
-
165
- if (propName === 'nullable' && !node.type) {
166
- report({
167
- message: 'The `type` field must be defined when the `nullable` field is used.',
168
- location: location.child([propName]),
169
- });
170
- }
171
- }
172
- },
173
- };
174
- };
@@ -1,10 +0,0 @@
1
- import { Oas3Rule, Oas2Rule } from '../../visitors';
2
- import { validateDefinedAndNonEmpty } from '../utils';
3
-
4
- export const TagDescription: Oas3Rule | Oas2Rule = () => {
5
- return {
6
- Tag(tag, ctx) {
7
- validateDefinedAndNonEmpty('description', tag, ctx);
8
- },
9
- };
10
- };
@@ -1,20 +0,0 @@
1
- import { Oas3Rule, Oas2Rule } from '../../visitors';
2
- import { Oas2Definition } from '../../typings/swagger';
3
- import { Oas3Definition } from '../../typings/openapi';
4
- import { UserContext } from '../../walk';
5
-
6
- export const TagsAlphabetical: Oas3Rule | Oas2Rule = () => {
7
- return {
8
- Root(root: Oas2Definition | Oas3Definition, { report, location }: UserContext) {
9
- if (!root.tags) return;
10
- for (let i = 0; i < root.tags.length - 1; i++) {
11
- if (root.tags[i].name > root.tags[i + 1].name) {
12
- report({
13
- message: 'The `tags` array should be in alphabetical order.',
14
- location: location.child(['tags', i]),
15
- });
16
- }
17
- }
18
- },
19
- };
20
- };
@@ -1,51 +0,0 @@
1
- import { Oas3Rule } from '../visitors';
2
- import { YamlParseError } from '../resolve';
3
- import { ResolveResult, Problem } from '../walk';
4
- import { Location } from '../ref-utils';
5
-
6
- export const NoUnresolvedRefs: Oas3Rule = () => {
7
- return {
8
- ref: {
9
- leave(_, { report, location }, resolved) {
10
- if (resolved.node !== undefined) return;
11
- reportUnresolvedRef(resolved, report, location);
12
- },
13
- },
14
- DiscriminatorMapping(mapping, { report, resolve, location }) {
15
- for (const mappingName of Object.keys(mapping)) {
16
- const resolved = resolve({ $ref: mapping[mappingName] });
17
- if (resolved.node !== undefined) return;
18
-
19
- reportUnresolvedRef(resolved, report, location.child(mappingName));
20
- }
21
- },
22
- };
23
- };
24
-
25
- export function reportUnresolvedRef(
26
- resolved: ResolveResult<any>,
27
- report: (m: Problem) => void,
28
- location: Location
29
- ) {
30
- const error = resolved.error;
31
- if (error instanceof YamlParseError) {
32
- report({
33
- message: 'Failed to parse: ' + error.message,
34
- location: {
35
- source: error.source,
36
- pointer: undefined,
37
- start: {
38
- col: error.col,
39
- line: error.line,
40
- },
41
- },
42
- });
43
- }
44
-
45
- const message = resolved.error?.message;
46
-
47
- report({
48
- location,
49
- message: `Can't resolve $ref${message ? ': ' + message : ''}`,
50
- });
51
- }
@@ -1,110 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import { parseYamlToDocument, replaceSourceWithRef, makeConfig } from '../../../../__tests__/utils';
3
- import { lintDocument } from '../../../lint';
4
- import { BaseResolver } from '../../../resolve';
5
-
6
- describe('oas2 boolean-parameter-prefixes', () => {
7
- it('should report on boolean param without prefix', async () => {
8
- const document = parseYamlToDocument(
9
- outdent`
10
- swagger: '2.0'
11
- paths:
12
- '/test':
13
- parameters:
14
- - name: a
15
- in: path
16
- type: boolean
17
- `,
18
- 'foobar.yaml'
19
- );
20
-
21
- const results = await lintDocument({
22
- externalRefResolver: new BaseResolver(),
23
- document,
24
- config: await makeConfig({ 'boolean-parameter-prefixes': 'error' }),
25
- });
26
-
27
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
28
- Array [
29
- Object {
30
- "location": Array [
31
- Object {
32
- "pointer": "#/paths/~1test/parameters/0/name",
33
- "reportOnKey": false,
34
- "source": "foobar.yaml",
35
- },
36
- ],
37
- "message": "Boolean parameter \`a\` should have \`is\` or \`has\` prefix.",
38
- "ruleId": "boolean-parameter-prefixes",
39
- "severity": "error",
40
- "suggest": Array [],
41
- },
42
- ]
43
- `);
44
- });
45
-
46
- it('should not report on boolean param with prefix', async () => {
47
- const document = parseYamlToDocument(
48
- outdent`
49
- openapi: 3.0.0
50
- paths:
51
- '/test':
52
- parameters:
53
- - name: hasA
54
- in: path
55
- schema:
56
- type: boolean
57
- - name: isA
58
- in: path
59
- schema:
60
- type: boolean
61
- - name: has_a
62
- in: path
63
- schema:
64
- type: boolean
65
- - name: is-a
66
- in: path
67
- schema:
68
- type: boolean
69
- `,
70
- 'foobar.yaml'
71
- );
72
-
73
- const results = await lintDocument({
74
- externalRefResolver: new BaseResolver(),
75
- document,
76
- config: await makeConfig({ 'boolean-parameter-prefixes': 'error' }),
77
- });
78
-
79
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
80
- });
81
-
82
- it('should not report on boolean param with custom prefix', async () => {
83
- const document = parseYamlToDocument(
84
- outdent`
85
- openapi: 3.0.0
86
- paths:
87
- '/test':
88
- parameters:
89
- - name: should-a
90
- in: query
91
- schema:
92
- type: boolean
93
- `,
94
- 'foobar.yaml'
95
- );
96
-
97
- const results = await lintDocument({
98
- externalRefResolver: new BaseResolver(),
99
- document,
100
- config: await makeConfig({
101
- 'boolean-parameter-prefixes': {
102
- severity: 'error',
103
- prefixes: ['should'],
104
- },
105
- }),
106
- });
107
-
108
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
109
- });
110
- });
@@ -1,174 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import { lintDocument } from '../../../lint';
3
- import { parseYamlToDocument, makeConfig } from '../../../../__tests__/utils';
4
- import { BaseResolver } from '../../../resolve';
5
-
6
- describe('Oas2 response-contains-header', () => {
7
- it('should report a response object not containing the header', async () => {
8
- const document = parseYamlToDocument(outdent`
9
- swagger: '2.0'
10
- schemes:
11
- - https
12
- basePath: /v2
13
- paths:
14
- '/accounts/{accountId}':
15
- get:
16
- description: Retrieve a sub account under the master account.
17
- operationId: account
18
- responses:
19
- '201':
20
- description: Account Created
21
- headers:
22
- Content-Location:
23
- description: Location of created Account
24
- type: string
25
- '404':
26
- description: User not found
27
- `);
28
- const results = await lintDocument({
29
- externalRefResolver: new BaseResolver(),
30
- document,
31
- config: await makeConfig({
32
- 'response-contains-header': {
33
- severity: 'error',
34
- names: { '2xx': ['Content-Length'], '4xx': ['Content-Length'] },
35
- },
36
- }),
37
- });
38
- expect(results).toMatchInlineSnapshot(`
39
- Array [
40
- Object {
41
- "location": Array [
42
- Object {
43
- "pointer": "#/paths/~1accounts~1{accountId}/get/responses/201/headers",
44
- "reportOnKey": true,
45
- "source": Source {
46
- "absoluteRef": "",
47
- "body": "swagger: '2.0'
48
- schemes:
49
- - https
50
- basePath: /v2
51
- paths:
52
- '/accounts/{accountId}':
53
- get:
54
- description: Retrieve a sub account under the master account.
55
- operationId: account
56
- responses:
57
- '201':
58
- description: Account Created
59
- headers:
60
- Content-Location:
61
- description: Location of created Account
62
- type: string
63
- '404':
64
- description: User not found",
65
- "mimeType": undefined,
66
- },
67
- },
68
- ],
69
- "message": "Response object must contain a \\"Content-Length\\" header.",
70
- "ruleId": "response-contains-header",
71
- "severity": "error",
72
- "suggest": Array [],
73
- },
74
- Object {
75
- "location": Array [
76
- Object {
77
- "pointer": "#/paths/~1accounts~1{accountId}/get/responses/404/headers",
78
- "reportOnKey": true,
79
- "source": Source {
80
- "absoluteRef": "",
81
- "body": "swagger: '2.0'
82
- schemes:
83
- - https
84
- basePath: /v2
85
- paths:
86
- '/accounts/{accountId}':
87
- get:
88
- description: Retrieve a sub account under the master account.
89
- operationId: account
90
- responses:
91
- '201':
92
- description: Account Created
93
- headers:
94
- Content-Location:
95
- description: Location of created Account
96
- type: string
97
- '404':
98
- description: User not found",
99
- "mimeType": undefined,
100
- },
101
- },
102
- ],
103
- "message": "Response object must contain a \\"Content-Length\\" header.",
104
- "ruleId": "response-contains-header",
105
- "severity": "error",
106
- "suggest": Array [],
107
- },
108
- ]
109
- `);
110
- });
111
-
112
- it('should not report a response object containing the header nor not applicable', async () => {
113
- const document = parseYamlToDocument(outdent`
114
- swagger: '2.0'
115
- schemes:
116
- - https
117
- basePath: /v2
118
- paths:
119
- '/accounts/{accountId}':
120
- get:
121
- description: Retrieve a sub account under the master account.
122
- operationId: account
123
- responses:
124
- '201':
125
- description: Account Created
126
- headers:
127
- Content-Length:
128
- description: calls per hour allowed by the user
129
- schema:
130
- type: integer
131
- format: int32
132
- '404':
133
- description: User not found
134
- `);
135
- const results = await lintDocument({
136
- externalRefResolver: new BaseResolver(),
137
- document,
138
- config: await makeConfig({
139
- 'response-contains-header': {
140
- severity: 'error',
141
- names: { '2xx': ['Content-Length'], '400': ['Content-Length'] },
142
- },
143
- }),
144
- });
145
- expect(results).toMatchInlineSnapshot(`Array []`);
146
- });
147
-
148
- it('should not report a response object when there is no `names` section defined', async () => {
149
- const document = parseYamlToDocument(outdent`
150
- swagger: '2.0'
151
- schemes:
152
- - https
153
- basePath: /v2
154
- paths:
155
- '/accounts/{accountId}':
156
- get:
157
- description: Retrieve a sub account under the master account.
158
- operationId: account
159
- responses:
160
- '404':
161
- description: User not found
162
- `);
163
- const results = await lintDocument({
164
- externalRefResolver: new BaseResolver(),
165
- document,
166
- config: await makeConfig({
167
- 'response-contains-header': {
168
- severity: 'error',
169
- },
170
- }),
171
- });
172
- expect(results).toMatchInlineSnapshot(`Array []`);
173
- });
174
- });
@@ -1,155 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import { lintDocument } from '../../../lint';
3
- import { parseYamlToDocument, makeConfig } from '../../../../__tests__/utils';
4
- import { BaseResolver } from '../../../resolve';
5
-
6
- describe('Oas2 response-contains-property', () => {
7
- it('should report a response object not containing the property', async () => {
8
- const document = parseYamlToDocument(outdent`
9
- swagger: '2.0'
10
- schemes:
11
- - https
12
- basePath: /v2
13
- paths:
14
- '/accounts/{accountId}':
15
- get:
16
- description: Retrieve a sub account under the master account.
17
- operationId: account
18
- responses:
19
- '200':
20
- description: Account object returned
21
- schema:
22
- type: object
23
- properties:
24
- created_at:
25
- description: Account creation date/time
26
- format: date-time
27
- type: string
28
- owner_email:
29
- description: Account Owner email
30
- type: string
31
- '404':
32
- description: User not found
33
- `);
34
- const results = await lintDocument({
35
- externalRefResolver: new BaseResolver(),
36
- document,
37
- config: await makeConfig({
38
- 'response-contains-property': {
39
- severity: 'error',
40
- names: { '2xx': ['id'], '4xx': ['id'] },
41
- },
42
- }),
43
- });
44
- expect(results).toMatchInlineSnapshot(`
45
- Array [
46
- Object {
47
- "location": Array [
48
- Object {
49
- "pointer": "#/paths/~1accounts~1{accountId}/get/responses/200/schema/properties",
50
- "reportOnKey": true,
51
- "source": Source {
52
- "absoluteRef": "",
53
- "body": "swagger: '2.0'
54
- schemes:
55
- - https
56
- basePath: /v2
57
- paths:
58
- '/accounts/{accountId}':
59
- get:
60
- description: Retrieve a sub account under the master account.
61
- operationId: account
62
- responses:
63
- '200':
64
- description: Account object returned
65
- schema:
66
- type: object
67
- properties:
68
- created_at:
69
- description: Account creation date/time
70
- format: date-time
71
- type: string
72
- owner_email:
73
- description: Account Owner email
74
- type: string
75
- '404':
76
- description: User not found",
77
- "mimeType": undefined,
78
- },
79
- },
80
- ],
81
- "message": "Response object must contain a top-level \\"id\\" property.",
82
- "ruleId": "response-contains-property",
83
- "severity": "error",
84
- "suggest": Array [],
85
- },
86
- ]
87
- `);
88
- });
89
-
90
- it('should not report a response object containing the expected property', async () => {
91
- const document = parseYamlToDocument(outdent`
92
- swagger: '2.0'
93
- schemes:
94
- - https
95
- basePath: /v2
96
- paths:
97
- '/accounts/{accountId}':
98
- get:
99
- description: Retrieve a sub account under the master account.
100
- operationId: account
101
- responses:
102
- '200':
103
- description: Account object returned
104
- schema:
105
- type: object
106
- properties:
107
- created_at:
108
- description: Account creation date/time
109
- format: date-time
110
- type: string
111
- id: some-id
112
- '404':
113
- description: User not found
114
- id: some-id
115
- `);
116
- const results = await lintDocument({
117
- externalRefResolver: new BaseResolver(),
118
- document,
119
- config: await makeConfig({
120
- 'response-contains-property': {
121
- severity: 'error',
122
- names: { '200': ['id'], '4xx': ['id'] },
123
- },
124
- }),
125
- });
126
- expect(results).toMatchInlineSnapshot(`Array []`);
127
- });
128
-
129
- it('should not report a response object when there is no `names` section defined', async () => {
130
- const document = parseYamlToDocument(outdent`
131
- swagger: '2.0'
132
- schemes:
133
- - https
134
- basePath: /v2
135
- paths:
136
- '/accounts/{accountId}':
137
- get:
138
- description: Retrieve a sub account under the master account.
139
- operationId: account
140
- responses:
141
- '404':
142
- description: User not found
143
- `);
144
- const results = await lintDocument({
145
- externalRefResolver: new BaseResolver(),
146
- document,
147
- config: await makeConfig({
148
- 'response-contains-property': {
149
- severity: 'error',
150
- },
151
- }),
152
- });
153
- expect(results).toMatchInlineSnapshot(`Array []`);
154
- });
155
- });