@redocly/openapi-core 1.0.0-beta.126 → 1.0.0-beta.128

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 (289) hide show
  1. package/lib/bundle.js +21 -4
  2. package/lib/config/all.js +1 -0
  3. package/lib/config/config-resolvers.js +8 -2
  4. package/lib/config/minimal.js +1 -0
  5. package/lib/config/recommended.js +1 -0
  6. package/lib/config/types.d.ts +1 -1
  7. package/lib/config/utils.js +15 -1
  8. package/lib/lint.js +17 -2
  9. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  10. package/lib/rules/common/spec-strict-refs.js +30 -0
  11. package/lib/rules/common/spec.js +1 -0
  12. package/lib/rules/oas2/index.d.ts +1 -0
  13. package/lib/rules/oas2/index.js +2 -0
  14. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  15. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  16. package/lib/rules/oas3/index.js +2 -0
  17. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +2 -2
  18. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +3 -3
  19. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  20. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  21. package/lib/rules/oas3/spec-components-invalid-map-name.js +0 -5
  22. package/lib/types/redocly-yaml.js +6 -1
  23. package/lib/walk.d.ts +6 -5
  24. package/lib/walk.js +26 -31
  25. package/package.json +1 -1
  26. package/__tests__/utils.ts +0 -88
  27. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -437
  28. package/src/__tests__/bundle.test.ts +0 -236
  29. package/src/__tests__/codeframes.test.ts +0 -530
  30. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +0 -5
  31. package/src/__tests__/fixtures/extension.js +0 -24
  32. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  33. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  34. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  35. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  36. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  37. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  38. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  39. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  40. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  41. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  42. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  43. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  44. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  45. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  46. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  47. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  48. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  49. package/src/__tests__/fixtures/resolve/description.md +0 -3
  50. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  51. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  52. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  53. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  54. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  55. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  56. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  57. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  58. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  59. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  60. package/src/__tests__/format.test.ts +0 -76
  61. package/src/__tests__/js-yaml.test.ts +0 -73
  62. package/src/__tests__/lint.test.ts +0 -388
  63. package/src/__tests__/logger-browser.test.ts +0 -53
  64. package/src/__tests__/logger.test.ts +0 -47
  65. package/src/__tests__/login.test.ts +0 -17
  66. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  67. package/src/__tests__/output-browser.test.ts +0 -18
  68. package/src/__tests__/output.test.ts +0 -15
  69. package/src/__tests__/ref-utils.test.ts +0 -120
  70. package/src/__tests__/resolve-http.test.ts +0 -77
  71. package/src/__tests__/resolve.test.ts +0 -430
  72. package/src/__tests__/utils-browser.test.ts +0 -11
  73. package/src/__tests__/utils.test.ts +0 -144
  74. package/src/__tests__/walk.test.ts +0 -1545
  75. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  76. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  77. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  78. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -35
  79. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  80. package/src/benchmark/benches/rebilly.yaml +0 -32275
  81. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  82. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  83. package/src/benchmark/benchmark.js +0 -311
  84. package/src/benchmark/colors.js +0 -29
  85. package/src/benchmark/fork.js +0 -83
  86. package/src/benchmark/utils.ts +0 -36
  87. package/src/bundle.ts +0 -399
  88. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -161
  89. package/src/config/__tests__/__snapshots__/config.test.ts.snap +0 -144
  90. package/src/config/__tests__/config-resolvers.test.ts +0 -491
  91. package/src/config/__tests__/config.test.ts +0 -307
  92. package/src/config/__tests__/fixtures/ingore-file.ts +0 -8
  93. package/src/config/__tests__/fixtures/load-redocly.yaml +0 -2
  94. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -2
  95. package/src/config/__tests__/fixtures/plugin.js +0 -56
  96. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -11
  97. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -69
  98. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -7
  99. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +0 -17
  100. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -18
  101. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +0 -15
  102. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -9
  103. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -80
  104. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -3
  105. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -4
  106. package/src/config/__tests__/load.test.ts +0 -167
  107. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  108. package/src/config/__tests__/utils.test.ts +0 -204
  109. package/src/config/all.ts +0 -73
  110. package/src/config/builtIn.ts +0 -37
  111. package/src/config/config-resolvers.ts +0 -465
  112. package/src/config/config.ts +0 -330
  113. package/src/config/index.ts +0 -7
  114. package/src/config/load.ts +0 -144
  115. package/src/config/minimal.ts +0 -60
  116. package/src/config/recommended.ts +0 -60
  117. package/src/config/rules.ts +0 -54
  118. package/src/config/types.ts +0 -216
  119. package/src/config/utils.ts +0 -333
  120. package/src/decorators/__tests__/filter-in.test.ts +0 -310
  121. package/src/decorators/__tests__/filter-out.test.ts +0 -335
  122. package/src/decorators/__tests__/media-type-examples-override.test.ts +0 -665
  123. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  124. package/src/decorators/__tests__/resources/request.yaml +0 -3
  125. package/src/decorators/__tests__/resources/response.yaml +0 -3
  126. package/src/decorators/common/filters/filter-helper.ts +0 -72
  127. package/src/decorators/common/filters/filter-in.ts +0 -18
  128. package/src/decorators/common/filters/filter-out.ts +0 -18
  129. package/src/decorators/common/info-description-override.ts +0 -24
  130. package/src/decorators/common/info-override.ts +0 -15
  131. package/src/decorators/common/media-type-examples-override.ts +0 -79
  132. package/src/decorators/common/operation-description-override.ts +0 -30
  133. package/src/decorators/common/registry-dependencies.ts +0 -25
  134. package/src/decorators/common/remove-x-internal.ts +0 -59
  135. package/src/decorators/common/tag-description-override.ts +0 -25
  136. package/src/decorators/oas2/index.ts +0 -20
  137. package/src/decorators/oas3/index.ts +0 -22
  138. package/src/env.ts +0 -5
  139. package/src/format/codeframes.ts +0 -216
  140. package/src/format/format.ts +0 -375
  141. package/src/index.ts +0 -71
  142. package/src/js-yaml/index.ts +0 -14
  143. package/src/lint.ts +0 -130
  144. package/src/logger.ts +0 -34
  145. package/src/oas-types.ts +0 -57
  146. package/src/output.ts +0 -7
  147. package/src/redocly/__tests__/redocly-client.test.ts +0 -146
  148. package/src/redocly/index.ts +0 -187
  149. package/src/redocly/redocly-client-types.ts +0 -10
  150. package/src/redocly/registry-api-types.ts +0 -32
  151. package/src/redocly/registry-api.ts +0 -149
  152. package/src/ref-utils.ts +0 -85
  153. package/src/resolve.ts +0 -417
  154. package/src/rules/__tests__/fixtures/code-sample.php +0 -9
  155. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  156. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  157. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -257
  158. package/src/rules/__tests__/utils.test.ts +0 -160
  159. package/src/rules/ajv.ts +0 -102
  160. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  161. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  162. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  163. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -210
  164. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  165. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  166. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -192
  167. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -231
  168. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  169. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  170. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  171. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  172. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  173. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  174. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -202
  175. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  176. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -264
  177. package/src/rules/common/__tests__/security-defined.test.ts +0 -175
  178. package/src/rules/common/__tests__/spec.test.ts +0 -555
  179. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  180. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  181. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -869
  182. package/src/rules/common/assertions/__tests__/index.test.ts +0 -100
  183. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -236
  184. package/src/rules/common/assertions/asserts.ts +0 -357
  185. package/src/rules/common/assertions/index.ts +0 -56
  186. package/src/rules/common/assertions/utils.ts +0 -331
  187. package/src/rules/common/info-contact.ts +0 -15
  188. package/src/rules/common/info-license-url.ts +0 -10
  189. package/src/rules/common/info-license.ts +0 -15
  190. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  191. package/src/rules/common/no-enum-type-mismatch.ts +0 -52
  192. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  193. package/src/rules/common/no-identical-paths.ts +0 -24
  194. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  195. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  196. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  197. package/src/rules/common/operation-2xx-response.ts +0 -24
  198. package/src/rules/common/operation-4xx-response.ts +0 -24
  199. package/src/rules/common/operation-description.ts +0 -13
  200. package/src/rules/common/operation-operationId-unique.ts +0 -21
  201. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  202. package/src/rules/common/operation-operationId.ts +0 -17
  203. package/src/rules/common/operation-parameters-unique.ts +0 -48
  204. package/src/rules/common/operation-singular-tag.ts +0 -17
  205. package/src/rules/common/operation-summary.ts +0 -13
  206. package/src/rules/common/operation-tag-defined.ts +0 -26
  207. package/src/rules/common/parameter-description.ts +0 -22
  208. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  209. package/src/rules/common/path-excludes-patterns.ts +0 -23
  210. package/src/rules/common/path-http-verbs-order.ts +0 -30
  211. package/src/rules/common/path-not-include-query.ts +0 -17
  212. package/src/rules/common/path-params-defined.ts +0 -65
  213. package/src/rules/common/path-segment-plural.ts +0 -31
  214. package/src/rules/common/paths-kebab-case.ts +0 -19
  215. package/src/rules/common/required-string-property-missing-min-length.ts +0 -44
  216. package/src/rules/common/response-contains-header.ts +0 -35
  217. package/src/rules/common/scalar-property-missing-example.ts +0 -58
  218. package/src/rules/common/security-defined.ts +0 -65
  219. package/src/rules/common/spec.ts +0 -174
  220. package/src/rules/common/tag-description.ts +0 -10
  221. package/src/rules/common/tags-alphabetical.ts +0 -20
  222. package/src/rules/no-unresolved-refs.ts +0 -51
  223. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  224. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  225. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  226. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  227. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  228. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  229. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  230. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -35
  231. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  232. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  233. package/src/rules/oas2/index.ts +0 -89
  234. package/src/rules/oas2/remove-unused-components.ts +0 -81
  235. package/src/rules/oas2/request-mime-type.ts +0 -17
  236. package/src/rules/oas2/response-contains-property.ts +0 -36
  237. package/src/rules/oas2/response-mime-type.ts +0 -17
  238. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  239. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  240. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  241. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  242. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -473
  243. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  244. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  245. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  246. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +0 -145
  247. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -389
  248. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  249. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  250. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  251. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  252. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  253. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  254. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  255. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -505
  256. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -298
  257. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  258. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +0 -305
  259. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  260. package/src/rules/oas3/index.ts +0 -109
  261. package/src/rules/oas3/no-empty-servers.ts +0 -22
  262. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  263. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -49
  264. package/src/rules/oas3/no-server-example.com.ts +0 -14
  265. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  266. package/src/rules/oas3/no-server-variables-empty-enum.ts +0 -66
  267. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  268. package/src/rules/oas3/no-unused-components.ts +0 -75
  269. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +0 -36
  270. package/src/rules/oas3/remove-unused-components.ts +0 -95
  271. package/src/rules/oas3/request-mime-type.ts +0 -31
  272. package/src/rules/oas3/response-contains-property.ts +0 -38
  273. package/src/rules/oas3/response-mime-type.ts +0 -31
  274. package/src/rules/oas3/spec-components-invalid-map-name.ts +0 -74
  275. package/src/rules/other/stats.ts +0 -73
  276. package/src/rules/utils.ts +0 -191
  277. package/src/types/index.ts +0 -149
  278. package/src/types/oas2.ts +0 -478
  279. package/src/types/oas3.ts +0 -597
  280. package/src/types/oas3_1.ts +0 -258
  281. package/src/types/redocly-yaml.ts +0 -1010
  282. package/src/typings/common.ts +0 -17
  283. package/src/typings/openapi.ts +0 -298
  284. package/src/typings/swagger.ts +0 -236
  285. package/src/utils.ts +0 -276
  286. package/src/visitors.ts +0 -491
  287. package/src/walk.ts +0 -453
  288. package/tsconfig.json +0 -8
  289. package/tsconfig.tsbuildinfo +0 -1
@@ -1,35 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import {
3
- parseYamlToDocument,
4
- replaceSourceWithRef,
5
- makeConfig,
6
- } from '../../../../../__tests__/utils';
7
- import { lintDocument } from '../../../../lint';
8
- import { BaseResolver } from '../../../../resolve';
9
-
10
- describe('Referenceable scalars', () => {
11
- it('should not report $ref description', async () => {
12
- const document = parseYamlToDocument(
13
- outdent`
14
- swagger: '2.0'
15
- info:
16
- title: Test
17
- version: '1.0'
18
- description:
19
- $ref: fixtures/description.md
20
- paths: {}
21
- `,
22
- __dirname + '/foobar.yaml'
23
- );
24
-
25
- const results = await lintDocument({
26
- externalRefResolver: new BaseResolver(),
27
- document,
28
- config: await makeConfig({
29
- spec: 'error',
30
- }),
31
- });
32
-
33
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
34
- });
35
- });
@@ -1,32 +0,0 @@
1
- import { StyleguideConfig, RuleConfig, resolveStyleguideConfig } from '../../../../config';
2
- import { parseYamlToDocument } from '../../../../../__tests__/utils';
3
- import { lintDocument } from '../../../../lint';
4
- import { BaseResolver } from '../../../../resolve';
5
-
6
- export async function lintDoc(
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 StyleguideConfig(
16
- await resolveStyleguideConfig({
17
- styleguideConfig: {
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,26 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
-
3
- export type BooleanParameterPrefixesOptions = {
4
- prefixes?: string[];
5
- };
6
-
7
- export const BooleanParameterPrefixes: Oas2Rule = (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(param, { report, location }) {
18
- if (param.type === 'boolean' && !regexp.test(param.name)) {
19
- report({
20
- message: `Boolean parameter \`${param.name}\` should have ${prefixesString} prefix.`,
21
- location: location.child('name'),
22
- });
23
- }
24
- },
25
- };
26
- };
@@ -1,89 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
- import { OasSpec } from '../common/spec';
3
- import { NoInvalidSchemaExamples } from '../common/no-invalid-schema-examples';
4
- import { NoInvalidParameterExamples } from '../common/no-invalid-parameter-examples';
5
- import { InfoContact } from '../common/info-contact';
6
- import { InfoLicense } from '../common/info-license';
7
- import { InfoLicenseUrl } from '../common/info-license-url';
8
- import { BooleanParameterPrefixes } from './boolean-parameter-prefixes';
9
- import { TagDescription } from '../common/tag-description';
10
- import { TagsAlphabetical } from '../common/tags-alphabetical';
11
- import { PathsKebabCase } from '../common/paths-kebab-case';
12
- import { NoEnumTypeMismatch } from '../common/no-enum-type-mismatch';
13
- import { NoPathTrailingSlash } from '../common/no-path-trailing-slash';
14
- import { Operation2xxResponse } from '../common/operation-2xx-response';
15
- import { Operation4xxResponse } from '../common/operation-4xx-response';
16
- import { Assertions } from '../common/assertions';
17
- import { OperationIdUnique } from '../common/operation-operationId-unique';
18
- import { OperationParametersUnique } from '../common/operation-parameters-unique';
19
- import { PathParamsDefined } from '../common/path-params-defined';
20
- import { OperationTagDefined } from '../common/operation-tag-defined';
21
- import { PathDeclarationMustExist } from '../common/path-declaration-must-exist';
22
- import { OperationIdUrlSafe } from '../common/operation-operationId-url-safe';
23
- import { OperationDescription } from '../common/operation-description';
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 { SecurityDefined } from '../common/security-defined';
28
- import { NoUnresolvedRefs } from '../no-unresolved-refs';
29
- import { PathHttpVerbsOrder } from '../common/path-http-verbs-order';
30
- import { NoIdenticalPaths } from '../common/no-identical-paths';
31
- import { OperationOperationId } from '../common/operation-operationId';
32
- import { OperationSummary } from '../common/operation-summary';
33
- import { NoAmbiguousPaths } from '../common/no-ambiguous-paths';
34
- import { NoHttpVerbsInPaths } from '../common/no-http-verbs-in-paths';
35
- import { PathExcludesPatterns } from '../common/path-excludes-patterns';
36
- import { RequestMimeType } from './request-mime-type';
37
- import { ResponseMimeType } from './response-mime-type';
38
- import { PathSegmentPlural } from '../common/path-segment-plural';
39
- import { ResponseContainsHeader } from '../common/response-contains-header';
40
- import { ResponseContainsProperty } from './response-contains-property';
41
- import { ScalarPropertyMissingExample } from '../common/scalar-property-missing-example';
42
- import { RequiredStringPropertyMissingMinLength } from '../common/required-string-property-missing-min-length';
43
-
44
- export const rules = {
45
- spec: OasSpec as Oas2Rule,
46
- 'no-invalid-schema-examples': NoInvalidSchemaExamples,
47
- 'no-invalid-parameter-examples': NoInvalidParameterExamples,
48
- 'info-contact': InfoContact as Oas2Rule,
49
- 'info-license': InfoLicense as Oas2Rule,
50
- 'info-license-url': InfoLicenseUrl as Oas2Rule,
51
- 'tag-description': TagDescription as Oas2Rule,
52
- 'tags-alphabetical': TagsAlphabetical as Oas2Rule,
53
- 'paths-kebab-case': PathsKebabCase as Oas2Rule,
54
- 'no-enum-type-mismatch': NoEnumTypeMismatch as Oas2Rule,
55
- 'boolean-parameter-prefixes': BooleanParameterPrefixes as Oas2Rule,
56
- 'no-path-trailing-slash': NoPathTrailingSlash as Oas2Rule,
57
- 'operation-2xx-response': Operation2xxResponse as Oas2Rule,
58
- 'operation-4xx-response': Operation4xxResponse as Oas2Rule,
59
- assertions: Assertions as Oas2Rule,
60
- 'operation-operationId-unique': OperationIdUnique as Oas2Rule,
61
- 'operation-parameters-unique': OperationParametersUnique as Oas2Rule,
62
- 'path-parameters-defined': PathParamsDefined as Oas2Rule,
63
- 'operation-tag-defined': OperationTagDefined as Oas2Rule,
64
- 'path-declaration-must-exist': PathDeclarationMustExist as Oas2Rule,
65
- 'operation-operationId-url-safe': OperationIdUrlSafe as Oas2Rule,
66
- 'operation-operationId': OperationOperationId as Oas2Rule,
67
- 'operation-summary': OperationSummary as Oas2Rule,
68
- 'operation-description': OperationDescription as Oas2Rule,
69
- 'path-not-include-query': PathNotIncludeQuery as Oas2Rule,
70
- 'path-params-defined': PathParamsDefined as Oas2Rule,
71
- 'parameter-description': ParameterDescription as Oas2Rule,
72
- 'operation-singular-tag': OperationSingularTag as Oas2Rule,
73
- 'security-defined': SecurityDefined as Oas2Rule,
74
- 'no-unresolved-refs': NoUnresolvedRefs as Oas2Rule,
75
- 'no-identical-paths': NoIdenticalPaths as Oas2Rule,
76
- 'no-ambiguous-paths': NoAmbiguousPaths as Oas2Rule,
77
- 'path-http-verbs-order': PathHttpVerbsOrder as Oas2Rule,
78
- 'no-http-verbs-in-paths': NoHttpVerbsInPaths as Oas2Rule,
79
- 'path-excludes-patterns': PathExcludesPatterns as Oas2Rule,
80
- 'request-mime-type': RequestMimeType as Oas2Rule,
81
- 'response-mime-type': ResponseMimeType as Oas2Rule,
82
- 'path-segment-plural': PathSegmentPlural as Oas2Rule,
83
- 'response-contains-header': ResponseContainsHeader as Oas2Rule,
84
- 'response-contains-property': ResponseContainsProperty as Oas2Rule,
85
- 'scalar-property-missing-example': ScalarPropertyMissingExample,
86
- 'required-string-property-missing-min-length': RequiredStringPropertyMissingMinLength,
87
- };
88
-
89
- export const preprocessors = {};
@@ -1,81 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
- import { Location } from '../../ref-utils';
3
- import { Oas2Components } from '../../typings/swagger';
4
- import { isEmptyObject } from '../../utils';
5
-
6
- export const RemoveUnusedComponents: Oas2Rule = () => {
7
- const components = new Map<
8
- string,
9
- { used: boolean; componentType?: keyof Oas2Components; name: string }
10
- >();
11
-
12
- function registerComponent(
13
- location: Location,
14
- componentType: keyof Oas2Components,
15
- name: string
16
- ): void {
17
- components.set(location.absolutePointer, {
18
- used: components.get(location.absolutePointer)?.used || false,
19
- componentType,
20
- name,
21
- });
22
- }
23
-
24
- return {
25
- ref: {
26
- leave(ref, { type, resolve, key }) {
27
- if (['Schema', 'Parameter', 'Response', 'SecurityScheme'].includes(type.name)) {
28
- const resolvedRef = resolve(ref);
29
- if (!resolvedRef.location) return;
30
- components.set(resolvedRef.location.absolutePointer, {
31
- used: true,
32
- name: key.toString(),
33
- });
34
- }
35
- },
36
- },
37
- Root: {
38
- leave(root, ctx) {
39
- const data = ctx.getVisitorData() as { removedCount: number };
40
- data.removedCount = 0;
41
-
42
- const rootComponents = new Set<keyof Oas2Components>();
43
- components.forEach((usageInfo) => {
44
- const { used, name, componentType } = usageInfo;
45
- if (!used && componentType) {
46
- rootComponents.add(componentType);
47
- delete root[componentType]![name];
48
- data.removedCount++;
49
- }
50
- });
51
- for (const component of rootComponents) {
52
- if (isEmptyObject(root[component])) {
53
- delete root[component];
54
- }
55
- }
56
- },
57
- },
58
- NamedSchemas: {
59
- Schema(schema, { location, key }) {
60
- if (!schema.allOf) {
61
- registerComponent(location, 'definitions', key.toString());
62
- }
63
- },
64
- },
65
- NamedParameters: {
66
- Parameter(_parameter, { location, key }) {
67
- registerComponent(location, 'parameters', key.toString());
68
- },
69
- },
70
- NamedResponses: {
71
- Response(_response, { location, key }) {
72
- registerComponent(location, 'responses', key.toString());
73
- },
74
- },
75
- NamedSecuritySchemes: {
76
- SecurityScheme(_securityScheme, { location, key }) {
77
- registerComponent(location, 'securityDefinitions', key.toString());
78
- },
79
- },
80
- };
81
- };
@@ -1,17 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
- import { UserContext } from '../../walk';
3
- import { Oas2Definition, Oas2Operation } from '../../typings/swagger';
4
- import { validateMimeType } from '../../utils';
5
-
6
- export const RequestMimeType: Oas2Rule = ({ allowedValues }) => {
7
- return {
8
- Root(root: Oas2Definition, ctx: UserContext) {
9
- validateMimeType({ type: 'consumes', value: root }, ctx, allowedValues);
10
- },
11
- Operation: {
12
- leave(operation: Oas2Operation, ctx: UserContext) {
13
- validateMimeType({ type: 'consumes', value: operation }, ctx, allowedValues);
14
- },
15
- },
16
- };
17
- };
@@ -1,36 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
- import { UserContext } from '../../walk';
3
- import { getMatchingStatusCodeRange } from '../../utils';
4
-
5
- export const ResponseContainsProperty: Oas2Rule = (options) => {
6
- const names: Record<string, string[]> = options.names || {};
7
- let key: string | number;
8
- return {
9
- Operation: {
10
- Response: {
11
- skip: (_response, key) => {
12
- return `${key}` === '204';
13
- },
14
- enter: (_response, ctx: UserContext) => {
15
- key = ctx.key;
16
- },
17
- Schema(schema, { report, location }) {
18
- if (schema.type !== 'object') return;
19
- const expectedProperties =
20
- names[key] ||
21
- names[getMatchingStatusCodeRange(key)] ||
22
- names[getMatchingStatusCodeRange(key).toLowerCase()] ||
23
- [];
24
- for (const expectedProperty of expectedProperties) {
25
- if (!schema.properties?.[expectedProperty]) {
26
- report({
27
- message: `Response object must contain a top-level "${expectedProperty}" property.`,
28
- location: location.child('properties').key(),
29
- });
30
- }
31
- }
32
- },
33
- },
34
- },
35
- };
36
- };
@@ -1,17 +0,0 @@
1
- import { Oas2Rule } from '../../visitors';
2
- import { UserContext } from '../../walk';
3
- import { Oas2Definition, Oas2Operation } from '../../typings/swagger';
4
- import { validateMimeType } from '../../utils';
5
-
6
- export const ResponseMimeType: Oas2Rule = ({ allowedValues }) => {
7
- return {
8
- Root(root: Oas2Definition, ctx: UserContext) {
9
- validateMimeType({ type: 'produces', value: root }, ctx, allowedValues);
10
- },
11
- Operation: {
12
- leave(operation: Oas2Operation, ctx: UserContext) {
13
- validateMimeType({ type: 'produces', value: operation }, ctx, allowedValues);
14
- },
15
- },
16
- };
17
- };
@@ -1,111 +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('oas3 boolean-parameter-prefixes', () => {
7
- it('should report on boolean param without prefix', async () => {
8
- const document = parseYamlToDocument(
9
- outdent`
10
- openapi: 3.0.0
11
- paths:
12
- '/test':
13
- parameters:
14
- - name: a
15
- in: path
16
- schema:
17
- type: boolean
18
- `,
19
- 'foobar.yaml'
20
- );
21
-
22
- const results = await lintDocument({
23
- externalRefResolver: new BaseResolver(),
24
- document,
25
- config: await makeConfig({ 'boolean-parameter-prefixes': 'error' }),
26
- });
27
-
28
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
29
- Array [
30
- Object {
31
- "location": Array [
32
- Object {
33
- "pointer": "#/paths/~1test/parameters/0/name",
34
- "reportOnKey": false,
35
- "source": "foobar.yaml",
36
- },
37
- ],
38
- "message": "Boolean parameter \`a\` should have \`is\` or \`has\` prefix.",
39
- "ruleId": "boolean-parameter-prefixes",
40
- "severity": "error",
41
- "suggest": Array [],
42
- },
43
- ]
44
- `);
45
- });
46
-
47
- it('should not report on boolean param with prefix', async () => {
48
- const document = parseYamlToDocument(
49
- outdent`
50
- openapi: 3.0.0
51
- paths:
52
- '/test':
53
- parameters:
54
- - name: hasA
55
- in: path
56
- schema:
57
- type: boolean
58
- - name: isA
59
- in: path
60
- schema:
61
- type: boolean
62
- - name: has_a
63
- in: path
64
- schema:
65
- type: boolean
66
- - name: is-a
67
- in: path
68
- schema:
69
- type: boolean
70
- `,
71
- 'foobar.yaml'
72
- );
73
-
74
- const results = await lintDocument({
75
- externalRefResolver: new BaseResolver(),
76
- document,
77
- config: await makeConfig({ 'boolean-parameter-prefixes': 'error' }),
78
- });
79
-
80
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
81
- });
82
-
83
- it('should not report on boolean param with custom prefix', async () => {
84
- const document = parseYamlToDocument(
85
- outdent`
86
- openapi: 3.0.0
87
- paths:
88
- '/test':
89
- parameters:
90
- - name: should-a
91
- in: query
92
- schema:
93
- type: boolean
94
- `,
95
- 'foobar.yaml'
96
- );
97
-
98
- const results = await lintDocument({
99
- externalRefResolver: new BaseResolver(),
100
- document,
101
- config: await makeConfig({
102
- 'boolean-parameter-prefixes': {
103
- severity: 'error',
104
- prefixes: ['should'],
105
- },
106
- }),
107
- });
108
-
109
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
110
- });
111
- });
@@ -1,11 +0,0 @@
1
- components:
2
- schemas:
3
- A:
4
- type: object
5
- properties:
6
- a:
7
- type: string
8
- b:
9
- $ref: '#/components/schemas/B'
10
- B:
11
- type: string
@@ -1,205 +0,0 @@
1
- import { outdent } from 'outdent';
2
- import { lintDocument } from '../../../lint';
3
- import { parseYamlToDocument, replaceSourceWithRef, makeConfig } from '../../../../__tests__/utils';
4
- import { BaseResolver } from '../../../resolve';
5
-
6
- describe('Oas3 as3-no-server-variables-empty-enum', () => {
7
- it('oas3-no-server-variables-empty-enum: should report on server object with empty enum and unknown enum value', async () => {
8
- const document = parseYamlToDocument(
9
- outdent`
10
- openapi: 3.0.0
11
- info:
12
- title: API
13
- version: 1.0.0
14
- servers:
15
- - url: https://example.com/{var}
16
- variables:
17
- var:
18
- enum: []
19
- default: a
20
- components: {}
21
- `
22
- );
23
-
24
- const results = await lintDocument({
25
- externalRefResolver: new BaseResolver(),
26
- document,
27
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
28
- });
29
-
30
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
31
- Array [
32
- Object {
33
- "location": Array [
34
- Object {
35
- "pointer": "#/servers",
36
- "reportOnKey": true,
37
- "source": "",
38
- },
39
- ],
40
- "message": "Server variable with \`enum\` must be a non-empty array.",
41
- "ruleId": "no-server-variables-empty-enum",
42
- "severity": "error",
43
- "suggest": Array [],
44
- },
45
- Object {
46
- "location": Array [
47
- Object {
48
- "pointer": "#/servers",
49
- "reportOnKey": true,
50
- "source": "",
51
- },
52
- ],
53
- "message": "Server variable define \`enum\` and \`default\`. \`enum\` must include default value",
54
- "ruleId": "no-server-variables-empty-enum",
55
- "severity": "error",
56
- "suggest": Array [],
57
- },
58
- ]
59
- `);
60
- });
61
-
62
- it('oas3-no-server-variables-empty-enum: should report on server object with empty enum', async () => {
63
- const document = parseYamlToDocument(
64
- outdent`
65
- openapi: 3.0.0
66
- info:
67
- title: API
68
- version: 1.0.0
69
- servers:
70
- - url: https://example.com/{var}
71
- variables:
72
- var:
73
- enum: []
74
- components: {}
75
- `
76
- );
77
-
78
- const results = await lintDocument({
79
- externalRefResolver: new BaseResolver(),
80
- document,
81
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
82
- });
83
-
84
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
85
- Array [
86
- Object {
87
- "location": Array [
88
- Object {
89
- "pointer": "#/servers",
90
- "reportOnKey": true,
91
- "source": "",
92
- },
93
- ],
94
- "message": "Server variable with \`enum\` must be a non-empty array.",
95
- "ruleId": "no-server-variables-empty-enum",
96
- "severity": "error",
97
- "suggest": Array [],
98
- },
99
- ]
100
- `);
101
- });
102
-
103
- it('oas3-no-server-variables-empty-enum: should be success because variables is empty object', async () => {
104
- const document = parseYamlToDocument(
105
- outdent`
106
- openapi: 3.0.0
107
- info:
108
- title: API
109
- version: 1.0.0
110
- servers:
111
- - url: https://example.com/{var}
112
- variables: {}
113
- components: {}
114
- `
115
- );
116
-
117
- const results = await lintDocument({
118
- externalRefResolver: new BaseResolver(),
119
- document,
120
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
121
- });
122
-
123
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
124
- });
125
-
126
- it('oas3-no-server-variables-empty-enum: should be success because variable is empty object', async () => {
127
- const document = parseYamlToDocument(
128
- outdent`
129
- openapi: 3.0.0
130
- info:
131
- title: API
132
- version: 1.0.0
133
- servers:
134
- - url: https://example.com/{var}
135
- variables:
136
- var: {}
137
- components: {}
138
- `
139
- );
140
-
141
- const results = await lintDocument({
142
- externalRefResolver: new BaseResolver(),
143
- document,
144
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
145
- });
146
-
147
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
148
- });
149
-
150
- it('oas3-no-server-variables-empty-enum: should be success because enum contains default value', async () => {
151
- const document = parseYamlToDocument(
152
- outdent`
153
- openapi: 3.0.0
154
- info:
155
- title: API
156
- version: 1.0.0
157
- servers:
158
- - url: https://example.com/{var}
159
- variables:
160
- var:
161
- enum:
162
- - a
163
- default: a
164
- components: {}
165
- `
166
- );
167
-
168
- const results = await lintDocument({
169
- externalRefResolver: new BaseResolver(),
170
- document,
171
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
172
- });
173
-
174
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
175
- });
176
-
177
- it('oas3-no-server-variables-empty-enum: should be success because enum contains default value', async () => {
178
- const document = parseYamlToDocument(
179
- outdent`
180
- openapi: 3.0.0
181
- info:
182
- title: API
183
- version: 1.0.0
184
- servers:
185
- - url: https://example.com/{var}
186
- variables:
187
- var:
188
- type: ['string', 'null']
189
- enum:
190
- - 'some string'
191
- - null
192
- default: 'some string'
193
- components: {}
194
- `
195
- );
196
-
197
- const results = await lintDocument({
198
- externalRefResolver: new BaseResolver(),
199
- document,
200
- config: await makeConfig({ 'no-server-variables-empty-enum': 'error' }),
201
- });
202
-
203
- expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`Array []`);
204
- });
205
- });