@redocly/openapi-core 1.0.0-beta.126 → 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 (275) hide show
  1. package/lib/bundle.js +5 -2
  2. package/lib/rules/common/spec.js +1 -0
  3. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  4. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  5. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +2 -2
  6. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +3 -3
  7. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  8. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  9. package/lib/walk.d.ts +6 -5
  10. package/lib/walk.js +23 -27
  11. package/package.json +1 -1
  12. package/__tests__/utils.ts +0 -88
  13. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -437
  14. package/src/__tests__/bundle.test.ts +0 -236
  15. package/src/__tests__/codeframes.test.ts +0 -530
  16. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +0 -5
  17. package/src/__tests__/fixtures/extension.js +0 -24
  18. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  19. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  20. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  21. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  22. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  23. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  24. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  25. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  26. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  27. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  28. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  29. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  30. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  31. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  32. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  33. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  34. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  35. package/src/__tests__/fixtures/resolve/description.md +0 -3
  36. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  37. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  38. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  39. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  40. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  41. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  42. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  43. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  44. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  45. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  46. package/src/__tests__/format.test.ts +0 -76
  47. package/src/__tests__/js-yaml.test.ts +0 -73
  48. package/src/__tests__/lint.test.ts +0 -388
  49. package/src/__tests__/logger-browser.test.ts +0 -53
  50. package/src/__tests__/logger.test.ts +0 -47
  51. package/src/__tests__/login.test.ts +0 -17
  52. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  53. package/src/__tests__/output-browser.test.ts +0 -18
  54. package/src/__tests__/output.test.ts +0 -15
  55. package/src/__tests__/ref-utils.test.ts +0 -120
  56. package/src/__tests__/resolve-http.test.ts +0 -77
  57. package/src/__tests__/resolve.test.ts +0 -430
  58. package/src/__tests__/utils-browser.test.ts +0 -11
  59. package/src/__tests__/utils.test.ts +0 -144
  60. package/src/__tests__/walk.test.ts +0 -1545
  61. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  62. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  63. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  64. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -35
  65. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  66. package/src/benchmark/benches/rebilly.yaml +0 -32275
  67. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  68. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  69. package/src/benchmark/benchmark.js +0 -311
  70. package/src/benchmark/colors.js +0 -29
  71. package/src/benchmark/fork.js +0 -83
  72. package/src/benchmark/utils.ts +0 -36
  73. package/src/bundle.ts +0 -399
  74. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -161
  75. package/src/config/__tests__/__snapshots__/config.test.ts.snap +0 -144
  76. package/src/config/__tests__/config-resolvers.test.ts +0 -491
  77. package/src/config/__tests__/config.test.ts +0 -307
  78. package/src/config/__tests__/fixtures/ingore-file.ts +0 -8
  79. package/src/config/__tests__/fixtures/load-redocly.yaml +0 -2
  80. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -2
  81. package/src/config/__tests__/fixtures/plugin.js +0 -56
  82. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -11
  83. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -69
  84. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -7
  85. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +0 -17
  86. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -18
  87. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +0 -15
  88. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -9
  89. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -80
  90. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -3
  91. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -4
  92. package/src/config/__tests__/load.test.ts +0 -167
  93. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  94. package/src/config/__tests__/utils.test.ts +0 -204
  95. package/src/config/all.ts +0 -73
  96. package/src/config/builtIn.ts +0 -37
  97. package/src/config/config-resolvers.ts +0 -465
  98. package/src/config/config.ts +0 -330
  99. package/src/config/index.ts +0 -7
  100. package/src/config/load.ts +0 -144
  101. package/src/config/minimal.ts +0 -60
  102. package/src/config/recommended.ts +0 -60
  103. package/src/config/rules.ts +0 -54
  104. package/src/config/types.ts +0 -216
  105. package/src/config/utils.ts +0 -333
  106. package/src/decorators/__tests__/filter-in.test.ts +0 -310
  107. package/src/decorators/__tests__/filter-out.test.ts +0 -335
  108. package/src/decorators/__tests__/media-type-examples-override.test.ts +0 -665
  109. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  110. package/src/decorators/__tests__/resources/request.yaml +0 -3
  111. package/src/decorators/__tests__/resources/response.yaml +0 -3
  112. package/src/decorators/common/filters/filter-helper.ts +0 -72
  113. package/src/decorators/common/filters/filter-in.ts +0 -18
  114. package/src/decorators/common/filters/filter-out.ts +0 -18
  115. package/src/decorators/common/info-description-override.ts +0 -24
  116. package/src/decorators/common/info-override.ts +0 -15
  117. package/src/decorators/common/media-type-examples-override.ts +0 -79
  118. package/src/decorators/common/operation-description-override.ts +0 -30
  119. package/src/decorators/common/registry-dependencies.ts +0 -25
  120. package/src/decorators/common/remove-x-internal.ts +0 -59
  121. package/src/decorators/common/tag-description-override.ts +0 -25
  122. package/src/decorators/oas2/index.ts +0 -20
  123. package/src/decorators/oas3/index.ts +0 -22
  124. package/src/env.ts +0 -5
  125. package/src/format/codeframes.ts +0 -216
  126. package/src/format/format.ts +0 -375
  127. package/src/index.ts +0 -71
  128. package/src/js-yaml/index.ts +0 -14
  129. package/src/lint.ts +0 -130
  130. package/src/logger.ts +0 -34
  131. package/src/oas-types.ts +0 -57
  132. package/src/output.ts +0 -7
  133. package/src/redocly/__tests__/redocly-client.test.ts +0 -146
  134. package/src/redocly/index.ts +0 -187
  135. package/src/redocly/redocly-client-types.ts +0 -10
  136. package/src/redocly/registry-api-types.ts +0 -32
  137. package/src/redocly/registry-api.ts +0 -149
  138. package/src/ref-utils.ts +0 -85
  139. package/src/resolve.ts +0 -417
  140. package/src/rules/__tests__/fixtures/code-sample.php +0 -9
  141. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  142. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  143. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -257
  144. package/src/rules/__tests__/utils.test.ts +0 -160
  145. package/src/rules/ajv.ts +0 -102
  146. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  147. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  148. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  149. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -210
  150. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  151. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  152. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -192
  153. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -231
  154. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  155. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  156. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  157. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  158. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  159. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  160. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -202
  161. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  162. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -264
  163. package/src/rules/common/__tests__/security-defined.test.ts +0 -175
  164. package/src/rules/common/__tests__/spec.test.ts +0 -555
  165. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  166. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  167. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -869
  168. package/src/rules/common/assertions/__tests__/index.test.ts +0 -100
  169. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -236
  170. package/src/rules/common/assertions/asserts.ts +0 -357
  171. package/src/rules/common/assertions/index.ts +0 -56
  172. package/src/rules/common/assertions/utils.ts +0 -331
  173. package/src/rules/common/info-contact.ts +0 -15
  174. package/src/rules/common/info-license-url.ts +0 -10
  175. package/src/rules/common/info-license.ts +0 -15
  176. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  177. package/src/rules/common/no-enum-type-mismatch.ts +0 -52
  178. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  179. package/src/rules/common/no-identical-paths.ts +0 -24
  180. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  181. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  182. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  183. package/src/rules/common/operation-2xx-response.ts +0 -24
  184. package/src/rules/common/operation-4xx-response.ts +0 -24
  185. package/src/rules/common/operation-description.ts +0 -13
  186. package/src/rules/common/operation-operationId-unique.ts +0 -21
  187. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  188. package/src/rules/common/operation-operationId.ts +0 -17
  189. package/src/rules/common/operation-parameters-unique.ts +0 -48
  190. package/src/rules/common/operation-singular-tag.ts +0 -17
  191. package/src/rules/common/operation-summary.ts +0 -13
  192. package/src/rules/common/operation-tag-defined.ts +0 -26
  193. package/src/rules/common/parameter-description.ts +0 -22
  194. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  195. package/src/rules/common/path-excludes-patterns.ts +0 -23
  196. package/src/rules/common/path-http-verbs-order.ts +0 -30
  197. package/src/rules/common/path-not-include-query.ts +0 -17
  198. package/src/rules/common/path-params-defined.ts +0 -65
  199. package/src/rules/common/path-segment-plural.ts +0 -31
  200. package/src/rules/common/paths-kebab-case.ts +0 -19
  201. package/src/rules/common/required-string-property-missing-min-length.ts +0 -44
  202. package/src/rules/common/response-contains-header.ts +0 -35
  203. package/src/rules/common/scalar-property-missing-example.ts +0 -58
  204. package/src/rules/common/security-defined.ts +0 -65
  205. package/src/rules/common/spec.ts +0 -174
  206. package/src/rules/common/tag-description.ts +0 -10
  207. package/src/rules/common/tags-alphabetical.ts +0 -20
  208. package/src/rules/no-unresolved-refs.ts +0 -51
  209. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  210. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  211. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  212. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  213. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  214. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  215. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  216. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -35
  217. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  218. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  219. package/src/rules/oas2/index.ts +0 -89
  220. package/src/rules/oas2/remove-unused-components.ts +0 -81
  221. package/src/rules/oas2/request-mime-type.ts +0 -17
  222. package/src/rules/oas2/response-contains-property.ts +0 -36
  223. package/src/rules/oas2/response-mime-type.ts +0 -17
  224. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  225. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  226. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  227. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  228. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -473
  229. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  230. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  231. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  232. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +0 -145
  233. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -389
  234. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  235. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  236. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  237. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  238. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  239. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  240. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  241. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -505
  242. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -298
  243. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  244. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +0 -305
  245. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  246. package/src/rules/oas3/index.ts +0 -109
  247. package/src/rules/oas3/no-empty-servers.ts +0 -22
  248. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  249. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -49
  250. package/src/rules/oas3/no-server-example.com.ts +0 -14
  251. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  252. package/src/rules/oas3/no-server-variables-empty-enum.ts +0 -66
  253. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  254. package/src/rules/oas3/no-unused-components.ts +0 -75
  255. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +0 -36
  256. package/src/rules/oas3/remove-unused-components.ts +0 -95
  257. package/src/rules/oas3/request-mime-type.ts +0 -31
  258. package/src/rules/oas3/response-contains-property.ts +0 -38
  259. package/src/rules/oas3/response-mime-type.ts +0 -31
  260. package/src/rules/oas3/spec-components-invalid-map-name.ts +0 -74
  261. package/src/rules/other/stats.ts +0 -73
  262. package/src/rules/utils.ts +0 -191
  263. package/src/types/index.ts +0 -149
  264. package/src/types/oas2.ts +0 -478
  265. package/src/types/oas3.ts +0 -597
  266. package/src/types/oas3_1.ts +0 -258
  267. package/src/types/redocly-yaml.ts +0 -1010
  268. package/src/typings/common.ts +0 -17
  269. package/src/typings/openapi.ts +0 -298
  270. package/src/typings/swagger.ts +0 -236
  271. package/src/utils.ts +0 -276
  272. package/src/visitors.ts +0 -491
  273. package/src/walk.ts +0 -453
  274. package/tsconfig.json +0 -8
  275. 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
- });