@redocly/openapi-core 1.0.0-rc.3 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/__tests__/utils.ts +88 -0
  3. package/lib/config/all.js +0 -1
  4. package/lib/config/minimal.js +0 -1
  5. package/lib/config/recommended.js +0 -1
  6. package/package.json +1 -1
  7. package/src/__tests__/__snapshots__/bundle.test.ts.snap +437 -0
  8. package/src/__tests__/bundle.test.ts +236 -0
  9. package/src/__tests__/codeframes.test.ts +530 -0
  10. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +5 -0
  11. package/src/__tests__/fixtures/extension.js +24 -0
  12. package/src/__tests__/fixtures/refs/definitions.yaml +3 -0
  13. package/src/__tests__/fixtures/refs/examples.yaml +8 -0
  14. package/src/__tests__/fixtures/refs/external-request-body.yaml +13 -0
  15. package/src/__tests__/fixtures/refs/externalref.yaml +35 -0
  16. package/src/__tests__/fixtures/refs/hosted.yaml +35 -0
  17. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +21 -0
  18. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +33 -0
  19. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +18 -0
  20. package/src/__tests__/fixtures/refs/param-b.yaml +1 -0
  21. package/src/__tests__/fixtures/refs/param-c.yaml +1 -0
  22. package/src/__tests__/fixtures/refs/rename.yaml +1 -0
  23. package/src/__tests__/fixtures/refs/requestBody.yaml +9 -0
  24. package/src/__tests__/fixtures/refs/schema-a.yaml +1 -0
  25. package/src/__tests__/fixtures/refs/simple.yaml +1 -0
  26. package/src/__tests__/fixtures/refs/vendor.schema.yaml +20 -0
  27. package/src/__tests__/fixtures/resolve/External.yaml +10 -0
  28. package/src/__tests__/fixtures/resolve/External2.yaml +4 -0
  29. package/src/__tests__/fixtures/resolve/description.md +3 -0
  30. package/src/__tests__/fixtures/resolve/externalInfo.yaml +4 -0
  31. package/src/__tests__/fixtures/resolve/externalLicense.yaml +1 -0
  32. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +13 -0
  33. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +5 -0
  34. package/src/__tests__/fixtures/resolve/openapi.yaml +28 -0
  35. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +10 -0
  36. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +6 -0
  37. package/src/__tests__/fixtures/resolve/transitive/a.yaml +1 -0
  38. package/src/__tests__/fixtures/resolve/transitive/components.yaml +5 -0
  39. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +3 -0
  40. package/src/__tests__/format.test.ts +76 -0
  41. package/src/__tests__/js-yaml.test.ts +73 -0
  42. package/src/__tests__/lint.test.ts +392 -0
  43. package/src/__tests__/logger-browser.test.ts +53 -0
  44. package/src/__tests__/logger.test.ts +47 -0
  45. package/src/__tests__/login.test.ts +17 -0
  46. package/src/__tests__/normalizeVisitors.test.ts +151 -0
  47. package/src/__tests__/output-browser.test.ts +18 -0
  48. package/src/__tests__/output.test.ts +15 -0
  49. package/src/__tests__/ref-utils.test.ts +120 -0
  50. package/src/__tests__/resolve-http.test.ts +77 -0
  51. package/src/__tests__/resolve.test.ts +431 -0
  52. package/src/__tests__/utils-browser.test.ts +11 -0
  53. package/src/__tests__/utils.test.ts +144 -0
  54. package/src/__tests__/walk.test.ts +1545 -0
  55. package/src/benchmark/benches/lint-with-many-rules.bench.ts +35 -0
  56. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +39 -0
  57. package/src/benchmark/benches/lint-with-no-rules.bench.ts +20 -0
  58. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +35 -0
  59. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +32 -0
  60. package/src/benchmark/benches/rebilly.yaml +32275 -0
  61. package/src/benchmark/benches/recommended-oas3.bench.ts +22 -0
  62. package/src/benchmark/benches/resolve-with-no-external.bench.ts +23 -0
  63. package/src/benchmark/benchmark.js +311 -0
  64. package/src/benchmark/colors.js +29 -0
  65. package/src/benchmark/fork.js +83 -0
  66. package/src/benchmark/utils.ts +36 -0
  67. package/src/bundle.ts +417 -0
  68. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +164 -0
  69. package/src/config/__tests__/__snapshots__/config.test.ts.snap +144 -0
  70. package/src/config/__tests__/config-resolvers.test.ts +491 -0
  71. package/src/config/__tests__/config.test.ts +312 -0
  72. package/src/config/__tests__/fixtures/ingore-file.ts +8 -0
  73. package/src/config/__tests__/fixtures/load-redocly.yaml +2 -0
  74. package/src/config/__tests__/fixtures/plugin-config.yaml +2 -0
  75. package/src/config/__tests__/fixtures/plugin.js +56 -0
  76. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +11 -0
  77. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +69 -0
  78. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +7 -0
  79. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +17 -0
  80. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +18 -0
  81. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +15 -0
  82. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +9 -0
  83. package/src/config/__tests__/fixtures/resolve-config/plugin.js +80 -0
  84. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +3 -0
  85. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +4 -0
  86. package/src/config/__tests__/load.test.ts +167 -0
  87. package/src/config/__tests__/resolve-plugins.test.ts +27 -0
  88. package/src/config/__tests__/utils.test.ts +204 -0
  89. package/src/config/all.ts +74 -0
  90. package/src/config/builtIn.ts +37 -0
  91. package/src/config/config-resolvers.ts +474 -0
  92. package/src/config/config.ts +332 -0
  93. package/src/config/index.ts +7 -0
  94. package/src/config/load.ts +144 -0
  95. package/src/config/minimal.ts +61 -0
  96. package/src/config/recommended.ts +61 -0
  97. package/src/config/rules.ts +54 -0
  98. package/src/config/types.ts +231 -0
  99. package/src/config/utils.ts +349 -0
  100. package/src/decorators/__tests__/filter-in.test.ts +310 -0
  101. package/src/decorators/__tests__/filter-out.test.ts +335 -0
  102. package/src/decorators/__tests__/media-type-examples-override.test.ts +665 -0
  103. package/src/decorators/__tests__/remove-x-internal.test.ts +316 -0
  104. package/src/decorators/__tests__/resources/request.yaml +3 -0
  105. package/src/decorators/__tests__/resources/response.yaml +3 -0
  106. package/src/decorators/common/filters/filter-helper.ts +72 -0
  107. package/src/decorators/common/filters/filter-in.ts +18 -0
  108. package/src/decorators/common/filters/filter-out.ts +18 -0
  109. package/src/decorators/common/info-description-override.ts +24 -0
  110. package/src/decorators/common/info-override.ts +15 -0
  111. package/src/decorators/common/media-type-examples-override.ts +79 -0
  112. package/src/decorators/common/operation-description-override.ts +30 -0
  113. package/src/decorators/common/registry-dependencies.ts +25 -0
  114. package/src/decorators/common/remove-x-internal.ts +59 -0
  115. package/src/decorators/common/tag-description-override.ts +25 -0
  116. package/src/decorators/oas2/index.ts +20 -0
  117. package/src/decorators/oas3/index.ts +22 -0
  118. package/src/env.ts +5 -0
  119. package/src/format/codeframes.ts +216 -0
  120. package/src/format/format.ts +375 -0
  121. package/src/index.ts +71 -0
  122. package/src/js-yaml/index.ts +14 -0
  123. package/src/lint.ts +148 -0
  124. package/src/logger.ts +34 -0
  125. package/src/oas-types.ts +57 -0
  126. package/src/output.ts +7 -0
  127. package/src/redocly/__tests__/redocly-client.test.ts +146 -0
  128. package/src/redocly/index.ts +187 -0
  129. package/src/redocly/redocly-client-types.ts +10 -0
  130. package/src/redocly/registry-api-types.ts +32 -0
  131. package/src/redocly/registry-api.ts +150 -0
  132. package/src/ref-utils.ts +85 -0
  133. package/src/resolve.ts +417 -0
  134. package/src/rules/__tests__/fixtures/code-sample.php +9 -0
  135. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +1 -0
  136. package/src/rules/__tests__/fixtures/ref.yaml +1 -0
  137. package/src/rules/__tests__/no-unresolved-refs.test.ts +257 -0
  138. package/src/rules/__tests__/utils.test.ts +160 -0
  139. package/src/rules/ajv.ts +102 -0
  140. package/src/rules/common/__tests__/info-license.test.ts +62 -0
  141. package/src/rules/common/__tests__/license-url.test.ts +63 -0
  142. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +96 -0
  143. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +210 -0
  144. package/src/rules/common/__tests__/no-identical-paths.test.ts +58 -0
  145. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +85 -0
  146. package/src/rules/common/__tests__/operation-2xx-response.test.ts +192 -0
  147. package/src/rules/common/__tests__/operation-4xx-response.test.ts +231 -0
  148. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +76 -0
  149. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +45 -0
  150. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +167 -0
  151. package/src/rules/common/__tests__/operation-singular-tag.test.ts +72 -0
  152. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +95 -0
  153. package/src/rules/common/__tests__/path-not-include-query.test.ts +64 -0
  154. package/src/rules/common/__tests__/path-params-defined.test.ts +202 -0
  155. package/src/rules/common/__tests__/paths-kebab-case.test.ts +108 -0
  156. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +264 -0
  157. package/src/rules/common/__tests__/security-defined.test.ts +175 -0
  158. package/src/rules/common/__tests__/spec-strict-refs.test.ts +69 -0
  159. package/src/rules/common/__tests__/spec.test.ts +610 -0
  160. package/src/rules/common/__tests__/tag-description.test.ts +65 -0
  161. package/src/rules/common/__tests__/tags-alphabetical.test.ts +64 -0
  162. package/src/rules/common/assertions/__tests__/asserts.test.ts +869 -0
  163. package/src/rules/common/assertions/__tests__/index.test.ts +100 -0
  164. package/src/rules/common/assertions/__tests__/utils.test.ts +236 -0
  165. package/src/rules/common/assertions/asserts.ts +357 -0
  166. package/src/rules/common/assertions/index.ts +53 -0
  167. package/src/rules/common/assertions/utils.ts +331 -0
  168. package/src/rules/common/info-contact.ts +15 -0
  169. package/src/rules/common/info-license-url.ts +10 -0
  170. package/src/rules/common/info-license.ts +15 -0
  171. package/src/rules/common/no-ambiguous-paths.ts +50 -0
  172. package/src/rules/common/no-enum-type-mismatch.ts +52 -0
  173. package/src/rules/common/no-http-verbs-in-paths.ts +36 -0
  174. package/src/rules/common/no-identical-paths.ts +24 -0
  175. package/src/rules/common/no-invalid-parameter-examples.ts +36 -0
  176. package/src/rules/common/no-invalid-schema-examples.ts +27 -0
  177. package/src/rules/common/no-path-trailing-slash.ts +15 -0
  178. package/src/rules/common/operation-2xx-response.ts +24 -0
  179. package/src/rules/common/operation-4xx-response.ts +24 -0
  180. package/src/rules/common/operation-description.ts +13 -0
  181. package/src/rules/common/operation-operationId-unique.ts +21 -0
  182. package/src/rules/common/operation-operationId-url-safe.ts +19 -0
  183. package/src/rules/common/operation-operationId.ts +17 -0
  184. package/src/rules/common/operation-parameters-unique.ts +48 -0
  185. package/src/rules/common/operation-singular-tag.ts +17 -0
  186. package/src/rules/common/operation-summary.ts +13 -0
  187. package/src/rules/common/operation-tag-defined.ts +26 -0
  188. package/src/rules/common/parameter-description.ts +22 -0
  189. package/src/rules/common/path-declaration-must-exist.ts +15 -0
  190. package/src/rules/common/path-excludes-patterns.ts +23 -0
  191. package/src/rules/common/path-http-verbs-order.ts +30 -0
  192. package/src/rules/common/path-not-include-query.ts +17 -0
  193. package/src/rules/common/path-params-defined.ts +65 -0
  194. package/src/rules/common/path-segment-plural.ts +31 -0
  195. package/src/rules/common/paths-kebab-case.ts +19 -0
  196. package/src/rules/common/required-string-property-missing-min-length.ts +44 -0
  197. package/src/rules/common/response-contains-header.ts +35 -0
  198. package/src/rules/common/scalar-property-missing-example.ts +58 -0
  199. package/src/rules/common/security-defined.ts +65 -0
  200. package/src/rules/common/spec-strict-refs.ts +30 -0
  201. package/src/rules/common/spec.ts +175 -0
  202. package/src/rules/common/tag-description.ts +10 -0
  203. package/src/rules/common/tags-alphabetical.ts +20 -0
  204. package/src/rules/no-unresolved-refs.ts +51 -0
  205. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +110 -0
  206. package/src/rules/oas2/__tests__/response-contains-header.test.ts +174 -0
  207. package/src/rules/oas2/__tests__/response-contains-property.test.ts +155 -0
  208. package/src/rules/oas2/__tests__/spec/fixtures/description.md +1 -0
  209. package/src/rules/oas2/__tests__/spec/info.test.ts +355 -0
  210. package/src/rules/oas2/__tests__/spec/operation.test.ts +123 -0
  211. package/src/rules/oas2/__tests__/spec/paths.test.ts +245 -0
  212. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +35 -0
  213. package/src/rules/oas2/__tests__/spec/utils.ts +32 -0
  214. package/src/rules/oas2/boolean-parameter-prefixes.ts +26 -0
  215. package/src/rules/oas2/index.ts +91 -0
  216. package/src/rules/oas2/remove-unused-components.ts +81 -0
  217. package/src/rules/oas2/request-mime-type.ts +16 -0
  218. package/src/rules/oas2/response-contains-property.ts +36 -0
  219. package/src/rules/oas2/response-mime-type.ts +16 -0
  220. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +111 -0
  221. package/src/rules/oas3/__tests__/component-name-unique.test.ts +823 -0
  222. package/src/rules/oas3/__tests__/fixtures/common.yaml +11 -0
  223. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +205 -0
  224. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +65 -0
  225. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +473 -0
  226. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +60 -0
  227. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +79 -0
  228. package/src/rules/oas3/__tests__/no-unused-components.test.ts +131 -0
  229. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +145 -0
  230. package/src/rules/oas3/__tests__/response-contains-header.test.ts +389 -0
  231. package/src/rules/oas3/__tests__/response-contains-property.test.ts +403 -0
  232. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +41 -0
  233. package/src/rules/oas3/__tests__/spec/fixtures/description.md +1 -0
  234. package/src/rules/oas3/__tests__/spec/info.test.ts +391 -0
  235. package/src/rules/oas3/__tests__/spec/operation.test.ts +253 -0
  236. package/src/rules/oas3/__tests__/spec/paths.test.ts +284 -0
  237. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +77 -0
  238. package/src/rules/oas3/__tests__/spec/servers.test.ts +505 -0
  239. package/src/rules/oas3/__tests__/spec/spec.test.ts +298 -0
  240. package/src/rules/oas3/__tests__/spec/utils.ts +32 -0
  241. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +276 -0
  242. package/src/rules/oas3/__tests__/utils/lint-document-for-test.ts +23 -0
  243. package/src/rules/oas3/boolean-parameter-prefixes.ts +28 -0
  244. package/src/rules/oas3/component-name-unique.ts +158 -0
  245. package/src/rules/oas3/index.ts +113 -0
  246. package/src/rules/oas3/no-empty-servers.ts +22 -0
  247. package/src/rules/oas3/no-example-value-and-externalValue.ts +14 -0
  248. package/src/rules/oas3/no-invalid-media-type-examples.ts +49 -0
  249. package/src/rules/oas3/no-server-example.com.ts +14 -0
  250. package/src/rules/oas3/no-server-trailing-slash.ts +15 -0
  251. package/src/rules/oas3/no-server-variables-empty-enum.ts +66 -0
  252. package/src/rules/oas3/no-undefined-server-variable.ts +30 -0
  253. package/src/rules/oas3/no-unused-components.ts +75 -0
  254. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +35 -0
  255. package/src/rules/oas3/remove-unused-components.ts +95 -0
  256. package/src/rules/oas3/request-mime-type.ts +30 -0
  257. package/src/rules/oas3/response-contains-property.ts +38 -0
  258. package/src/rules/oas3/response-mime-type.ts +30 -0
  259. package/src/rules/oas3/spec-components-invalid-map-name.ts +69 -0
  260. package/src/rules/other/stats.ts +73 -0
  261. package/src/rules/utils.ts +193 -0
  262. package/src/types/config-external-schemas.ts +917 -0
  263. package/src/types/index.ts +149 -0
  264. package/src/types/oas2.ts +478 -0
  265. package/src/types/oas3.ts +597 -0
  266. package/src/types/oas3_1.ts +258 -0
  267. package/src/types/redocly-yaml.ts +1040 -0
  268. package/src/typings/common.ts +17 -0
  269. package/src/typings/openapi.ts +298 -0
  270. package/src/typings/swagger.ts +236 -0
  271. package/src/utils.ts +276 -0
  272. package/src/visitors.ts +491 -0
  273. package/src/walk.ts +439 -0
  274. package/tsconfig.json +8 -0
  275. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,823 @@
1
+ import { outdent } from 'outdent';
2
+ import { parseYamlToDocument, replaceSourceWithRef } from '../../../../__tests__/utils';
3
+ import { lintDocumentForTest } from './utils/lint-document-for-test';
4
+
5
+ describe('Oas3 component-name-unique', () => {
6
+ describe('schema', () => {
7
+ it('should report on multiple schemas with same name', async () => {
8
+ const document = parseYamlToDocument(
9
+ outdent`
10
+ openapi: 3.0.0
11
+ components:
12
+ schemas:
13
+ SomeSchema:
14
+ type: object
15
+ Test:
16
+ type: object
17
+ properties:
18
+ there:
19
+ $ref: '/test.yaml#/components/schemas/SomeSchema'
20
+ `,
21
+ '/foobar.yaml'
22
+ );
23
+ const additionalDocuments = [
24
+ {
25
+ absoluteRef: '/test.yaml',
26
+ body: outdent`
27
+ openapi: 3.0.0
28
+ components:
29
+ schemas:
30
+ SomeSchema:
31
+ type: object
32
+ `,
33
+ },
34
+ ];
35
+
36
+ const results = await lintDocumentForTest(
37
+ { 'component-name-unique': 'error' },
38
+ document,
39
+ additionalDocuments
40
+ );
41
+
42
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
43
+ Array [
44
+ Object {
45
+ "location": Array [
46
+ Object {
47
+ "pointer": "#/",
48
+ "reportOnKey": false,
49
+ "source": "/foobar.yaml",
50
+ },
51
+ ],
52
+ "message": "Component 'schemas/SomeSchema' is not unique. It is defined at:
53
+ - /foobar.yaml#/components/schemas/SomeSchema
54
+ - /test.yaml#/components/schemas/SomeSchema",
55
+ "ruleId": "component-name-unique",
56
+ "severity": "error",
57
+ "suggest": Array [],
58
+ },
59
+ ]
60
+ `);
61
+ });
62
+
63
+ it('should report on multiple schemas with same name - filename', async () => {
64
+ const document = parseYamlToDocument(
65
+ outdent`
66
+ openapi: 3.0.0
67
+ components:
68
+ schemas:
69
+ SomeSchema:
70
+ type: object
71
+ Test:
72
+ type: object
73
+ properties:
74
+ there:
75
+ $ref: '/SomeSchema.yaml'
76
+ `,
77
+ '/foobar.yaml'
78
+ );
79
+ const additionalDocuments = [
80
+ {
81
+ absoluteRef: '/SomeSchema.yaml',
82
+ body: outdent`
83
+ type: object
84
+ properties:
85
+ test:
86
+ type: number
87
+ `,
88
+ },
89
+ ];
90
+
91
+ const results = await lintDocumentForTest(
92
+ { 'component-name-unique': 'error' },
93
+ document,
94
+ additionalDocuments
95
+ );
96
+
97
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
98
+ Array [
99
+ Object {
100
+ "location": Array [
101
+ Object {
102
+ "pointer": "#/",
103
+ "reportOnKey": false,
104
+ "source": "/foobar.yaml",
105
+ },
106
+ ],
107
+ "message": "Component 'schemas/SomeSchema' is not unique. It is defined at:
108
+ - /foobar.yaml#/components/schemas/SomeSchema
109
+ - /SomeSchema.yaml",
110
+ "ruleId": "component-name-unique",
111
+ "severity": "error",
112
+ "suggest": Array [],
113
+ },
114
+ ]
115
+ `);
116
+ });
117
+
118
+ it('should not report on multiple schemas with different names', async () => {
119
+ const document = parseYamlToDocument(
120
+ outdent`
121
+ openapi: 3.0.0
122
+ components:
123
+ schemas:
124
+ SomeSchema:
125
+ type: object
126
+ Test:
127
+ type: object
128
+ properties:
129
+ there:
130
+ $ref: '/test.yaml#/components/schemas/OtherSchema'
131
+ `,
132
+ '/foobar.yaml'
133
+ );
134
+ const additionalDocuments = [
135
+ {
136
+ absoluteRef: '/test.yaml',
137
+ body: outdent`
138
+ openapi: 3.0.0
139
+ components:
140
+ schemas:
141
+ OtherSchema:
142
+ type: object
143
+ `,
144
+ },
145
+ ];
146
+
147
+ const results = await lintDocumentForTest(
148
+ { 'component-name-unique': 'error' },
149
+ document,
150
+ additionalDocuments
151
+ );
152
+
153
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot('Array []');
154
+ });
155
+ });
156
+
157
+ describe('parameter', () => {
158
+ it('should report if multiple parameters have same component name', async () => {
159
+ const document = parseYamlToDocument(
160
+ outdent`
161
+ openapi: 3.0.0
162
+ paths:
163
+ /test:
164
+ get:
165
+ parameters:
166
+ - $ref: '#/components/parameters/ParameterOne'
167
+ - $ref: '/test.yaml#/components/parameters/ParameterOne'
168
+ components:
169
+ parameters:
170
+ ParameterOne:
171
+ name: parameterOne
172
+ in: query
173
+ schema:
174
+ type: integer
175
+ `,
176
+ '/foobar.yaml'
177
+ );
178
+ const additionalDocuments = [
179
+ {
180
+ absoluteRef: '/test.yaml',
181
+ body: outdent`
182
+ openapi: 3.0.0
183
+ components:
184
+ parameters:
185
+ ParameterOne:
186
+ name: oneParameter
187
+ in: query
188
+ schema:
189
+ type: integer
190
+ `,
191
+ },
192
+ ];
193
+
194
+ const results = await lintDocumentForTest(
195
+ { 'component-name-unique': 'error' },
196
+ document,
197
+ additionalDocuments
198
+ );
199
+
200
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
201
+ Array [
202
+ Object {
203
+ "location": Array [
204
+ Object {
205
+ "pointer": "#/",
206
+ "reportOnKey": false,
207
+ "source": "/foobar.yaml",
208
+ },
209
+ ],
210
+ "message": "Component 'parameters/ParameterOne' is not unique. It is defined at:
211
+ - /foobar.yaml#/components/parameters/ParameterOne
212
+ - /test.yaml#/components/parameters/ParameterOne",
213
+ "ruleId": "component-name-unique",
214
+ "severity": "error",
215
+ "suggest": Array [],
216
+ },
217
+ ]
218
+ `);
219
+ });
220
+
221
+ it('should report on multiple parameters with same component name - filename', async () => {
222
+ const document = parseYamlToDocument(
223
+ outdent`
224
+ openapi: 3.0.0
225
+ paths:
226
+ /test:
227
+ get:
228
+ parameters:
229
+ - $ref: '#/components/parameters/ParameterOne'
230
+ - $ref: '/ParameterOne.yaml'
231
+ components:
232
+ parameters:
233
+ ParameterOne:
234
+ name: parameterOne
235
+ in: query
236
+ schema:
237
+ type: integer
238
+ `,
239
+ '/foobar.yaml'
240
+ );
241
+ const additionalDocuments = [
242
+ {
243
+ absoluteRef: '/ParameterOne.yaml',
244
+ body: outdent`
245
+ name: oneParameter
246
+ in: query
247
+ schema:
248
+ type: integer
249
+ `,
250
+ },
251
+ ];
252
+
253
+ const results = await lintDocumentForTest(
254
+ { 'component-name-unique': 'error' },
255
+ document,
256
+ additionalDocuments
257
+ );
258
+
259
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
260
+ Array [
261
+ Object {
262
+ "location": Array [
263
+ Object {
264
+ "pointer": "#/",
265
+ "reportOnKey": false,
266
+ "source": "/foobar.yaml",
267
+ },
268
+ ],
269
+ "message": "Component 'parameters/ParameterOne' is not unique. It is defined at:
270
+ - /foobar.yaml#/components/parameters/ParameterOne
271
+ - /ParameterOne.yaml",
272
+ "ruleId": "component-name-unique",
273
+ "severity": "error",
274
+ "suggest": Array [],
275
+ },
276
+ ]
277
+ `);
278
+ });
279
+
280
+ it('should not report on multiple parameters with different component names', async () => {
281
+ const document = parseYamlToDocument(
282
+ outdent`
283
+ openapi: 3.0.0
284
+ paths:
285
+ /test:
286
+ get:
287
+ parameters:
288
+ - $ref: '#/components/parameters/ParameterOne'
289
+ - $ref: '/test.yaml#/components/parameters/OneParameter'
290
+ components:
291
+ parameters:
292
+ ParameterOne:
293
+ name: parameterOne
294
+ in: query
295
+ schema:
296
+ type: integer
297
+ `,
298
+ '/foobar.yaml'
299
+ );
300
+ const additionalDocuments = [
301
+ {
302
+ absoluteRef: '/test.yaml',
303
+ body: outdent`
304
+ openapi: 3.0.0
305
+ components:
306
+ parameters:
307
+ OneParameter:
308
+ name: oneParameter
309
+ in: query
310
+ schema:
311
+ type: integer
312
+ `,
313
+ },
314
+ ];
315
+
316
+ const results = await lintDocumentForTest(
317
+ { 'component-name-unique': 'error' },
318
+ document,
319
+ additionalDocuments
320
+ );
321
+
322
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot('Array []');
323
+ });
324
+ });
325
+
326
+ describe('response', () => {
327
+ it('should report if multiple responses have same component name', async () => {
328
+ const document = parseYamlToDocument(
329
+ outdent`
330
+ openapi: 3.0.0
331
+ paths:
332
+ /test:
333
+ get:
334
+ responses:
335
+ '200':
336
+ $ref: '#/components/responses/SuccessResponse'
337
+ /test2:
338
+ get:
339
+ responses:
340
+ '200':
341
+ $ref: '/test.yaml#/components/responses/SuccessResponse'
342
+ components:
343
+ responses:
344
+ SuccessResponse:
345
+ description: Successful response
346
+ content:
347
+ application/json:
348
+ schema:
349
+ type: string
350
+ `,
351
+ '/foobar.yaml'
352
+ );
353
+ const additionalDocuments = [
354
+ {
355
+ absoluteRef: '/test.yaml',
356
+ body: outdent`
357
+ openapi: 3.0.0
358
+ components:
359
+ responses:
360
+ SuccessResponse:
361
+ description: Successful response
362
+ content:
363
+ application/json:
364
+ schema:
365
+ type: string
366
+ `,
367
+ },
368
+ ];
369
+
370
+ const results = await lintDocumentForTest(
371
+ { 'component-name-unique': 'error' },
372
+ document,
373
+ additionalDocuments
374
+ );
375
+
376
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
377
+ Array [
378
+ Object {
379
+ "location": Array [
380
+ Object {
381
+ "pointer": "#/",
382
+ "reportOnKey": false,
383
+ "source": "/foobar.yaml",
384
+ },
385
+ ],
386
+ "message": "Component 'responses/SuccessResponse' is not unique. It is defined at:
387
+ - /foobar.yaml#/components/responses/SuccessResponse
388
+ - /test.yaml#/components/responses/SuccessResponse",
389
+ "ruleId": "component-name-unique",
390
+ "severity": "error",
391
+ "suggest": Array [],
392
+ },
393
+ ]
394
+ `);
395
+ });
396
+
397
+ it('should report on multiple responses with same component name - filename', async () => {
398
+ const document = parseYamlToDocument(
399
+ outdent`
400
+ openapi: 3.0.0
401
+ paths:
402
+ /test:
403
+ get:
404
+ responses:
405
+ '200':
406
+ $ref: '#/components/responses/SuccessResponse'
407
+ /test2:
408
+ get:
409
+ responses:
410
+ '200':
411
+ $ref: '/SuccessResponse.yaml'
412
+ components:
413
+ responses:
414
+ SuccessResponse:
415
+ description: Successful response
416
+ content:
417
+ application/json:
418
+ schema:
419
+ type: string
420
+ `,
421
+ '/foobar.yaml'
422
+ );
423
+ const additionalDocuments = [
424
+ {
425
+ absoluteRef: '/SuccessResponse.yaml',
426
+ body: outdent`
427
+ description: Successful response
428
+ content:
429
+ application/json:
430
+ schema:
431
+ type: string
432
+ `,
433
+ },
434
+ ];
435
+
436
+ const results = await lintDocumentForTest(
437
+ { 'component-name-unique': 'error' },
438
+ document,
439
+ additionalDocuments
440
+ );
441
+
442
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
443
+ Array [
444
+ Object {
445
+ "location": Array [
446
+ Object {
447
+ "pointer": "#/",
448
+ "reportOnKey": false,
449
+ "source": "/foobar.yaml",
450
+ },
451
+ ],
452
+ "message": "Component 'responses/SuccessResponse' is not unique. It is defined at:
453
+ - /foobar.yaml#/components/responses/SuccessResponse
454
+ - /SuccessResponse.yaml",
455
+ "ruleId": "component-name-unique",
456
+ "severity": "error",
457
+ "suggest": Array [],
458
+ },
459
+ ]
460
+ `);
461
+ });
462
+
463
+ it('should not report on multiple responses with different component names', async () => {
464
+ const document = parseYamlToDocument(
465
+ outdent`
466
+ openapi: 3.0.0
467
+ paths:
468
+ /test:
469
+ get:
470
+ responses:
471
+ '200':
472
+ $ref: '#/components/responses/TestSuccessResponse'
473
+ /test2:
474
+ get:
475
+ responses:
476
+ '200':
477
+ $ref: '/test.yaml#/components/responses/Test2SuccessResponse'
478
+ components:
479
+ responses:
480
+ TestSuccessResponse:
481
+ description: Successful response
482
+ content:
483
+ application/json:
484
+ schema:
485
+ type: string
486
+ `,
487
+ '/foobar.yaml'
488
+ );
489
+ const additionalDocuments = [
490
+ {
491
+ absoluteRef: '/test.yaml',
492
+ body: outdent`
493
+ openapi: 3.0.0
494
+ components:
495
+ responses:
496
+ Test2SuccessResponse:
497
+ description: Successful response
498
+ content:
499
+ application/json:
500
+ schema:
501
+ type: string
502
+ `,
503
+ },
504
+ ];
505
+
506
+ const results = await lintDocumentForTest(
507
+ { 'component-name-unique': 'error' },
508
+ document,
509
+ additionalDocuments
510
+ );
511
+
512
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot('Array []');
513
+ });
514
+ });
515
+
516
+ describe('request-body', () => {
517
+ it('should report if multiple request bodies have same component name', async () => {
518
+ const document = parseYamlToDocument(
519
+ outdent`
520
+ openapi: 3.0.0
521
+ paths:
522
+ /test:
523
+ post:
524
+ requestBody:
525
+ $ref: '#/components/requestBodies/MyRequestBody'
526
+ /test2:
527
+ post:
528
+ requestBody:
529
+ $ref: '/test.yaml#/components/requestBodies/MyRequestBody'
530
+ components:
531
+ requestBodies:
532
+ MyRequestBody:
533
+ required: true
534
+ content:
535
+ application/json:
536
+ schema:
537
+ type: string
538
+ `,
539
+ '/foobar.yaml'
540
+ );
541
+ const additionalDocuments = [
542
+ {
543
+ absoluteRef: '/test.yaml',
544
+ body: outdent`
545
+ components:
546
+ requestBodies:
547
+ MyRequestBody:
548
+ required: true
549
+ content:
550
+ application/json:
551
+ schema:
552
+ type: string
553
+ `,
554
+ },
555
+ ];
556
+
557
+ const results = await lintDocumentForTest(
558
+ { 'component-name-unique': 'error' },
559
+ document,
560
+ additionalDocuments
561
+ );
562
+
563
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
564
+ Array [
565
+ Object {
566
+ "location": Array [
567
+ Object {
568
+ "pointer": "#/",
569
+ "reportOnKey": false,
570
+ "source": "/foobar.yaml",
571
+ },
572
+ ],
573
+ "message": "Component 'requestBodies/MyRequestBody' is not unique. It is defined at:
574
+ - /foobar.yaml#/components/requestBodies/MyRequestBody
575
+ - /test.yaml#/components/requestBodies/MyRequestBody",
576
+ "ruleId": "component-name-unique",
577
+ "severity": "error",
578
+ "suggest": Array [],
579
+ },
580
+ ]
581
+ `);
582
+ });
583
+
584
+ it('should report on multiple responses with same component name - filename', async () => {
585
+ const document = parseYamlToDocument(
586
+ outdent`
587
+ openapi: 3.0.0
588
+ paths:
589
+ /test:
590
+ post:
591
+ requestBody:
592
+ $ref: '#/components/requestBodies/MyRequestBody'
593
+ /test2:
594
+ post:
595
+ requestBody:
596
+ $ref: '/MyRequestBody.yaml'
597
+ components:
598
+ requestBodies:
599
+ MyRequestBody:
600
+ required: true
601
+ content:
602
+ application/json:
603
+ schema:
604
+ type: string
605
+ `,
606
+ '/foobar.yaml'
607
+ );
608
+ const additionalDocuments = [
609
+ {
610
+ absoluteRef: '/MyRequestBody.yaml',
611
+ body: outdent`
612
+ components:
613
+ requestBodies:
614
+ MyRequestBody:
615
+ required: true
616
+ content:
617
+ application/json:
618
+ schema:
619
+ type: string
620
+ `,
621
+ },
622
+ ];
623
+
624
+ const results = await lintDocumentForTest(
625
+ { 'component-name-unique': 'error' },
626
+ document,
627
+ additionalDocuments
628
+ );
629
+
630
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
631
+ Array [
632
+ Object {
633
+ "location": Array [
634
+ Object {
635
+ "pointer": "#/",
636
+ "reportOnKey": false,
637
+ "source": "/foobar.yaml",
638
+ },
639
+ ],
640
+ "message": "Component 'requestBodies/MyRequestBody' is not unique. It is defined at:
641
+ - /foobar.yaml#/components/requestBodies/MyRequestBody
642
+ - /MyRequestBody.yaml",
643
+ "ruleId": "component-name-unique",
644
+ "severity": "error",
645
+ "suggest": Array [],
646
+ },
647
+ ]
648
+ `);
649
+ });
650
+
651
+ it('should not report on multiple responses with different component names', async () => {
652
+ const document = parseYamlToDocument(
653
+ outdent`
654
+ openapi: 3.0.0
655
+ paths:
656
+ /test:
657
+ post:
658
+ requestBody:
659
+ $ref: '#/components/requestBodies/TestRequestBody'
660
+ /test2:
661
+ post:
662
+ requestBody:
663
+ $ref: '/test.yaml#/components/requestBodies/Test2RequestBody'
664
+ components:
665
+ requestBodies:
666
+ TestRequestBody:
667
+ required: true
668
+ content:
669
+ application/json:
670
+ schema:
671
+ type: string
672
+ `,
673
+ '/foobar.yaml'
674
+ );
675
+ const additionalDocuments = [
676
+ {
677
+ absoluteRef: '/test.yaml',
678
+ body: outdent`
679
+ components:
680
+ requestBodies:
681
+ Test2RequestBody:
682
+ required: true
683
+ content:
684
+ application/json:
685
+ schema:
686
+ type: string
687
+ `,
688
+ },
689
+ ];
690
+
691
+ const results = await lintDocumentForTest(
692
+ { 'component-name-unique': 'error' },
693
+ document,
694
+ additionalDocuments
695
+ );
696
+
697
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot('Array []');
698
+ });
699
+ });
700
+
701
+ describe('different severities', () => {
702
+ const document = parseYamlToDocument(
703
+ outdent`
704
+ openapi: 3.0.0
705
+ paths:
706
+ /test:
707
+ post:
708
+ requestBody:
709
+ $ref: '#/components/requestBodies/MyRequestBody'
710
+ /test2:
711
+ post:
712
+ requestBody:
713
+ $ref: '/test.yaml#/components/requestBodies/MyRequestBody'
714
+ components:
715
+ schemas:
716
+ SomeSchema:
717
+ type: object
718
+ Test:
719
+ type: object
720
+ properties:
721
+ there:
722
+ $ref: '/test.yaml#/components/schemas/SomeSchema'
723
+ requestBodies:
724
+ MyRequestBody:
725
+ required: true
726
+ content:
727
+ application/json:
728
+ schema:
729
+ type: string
730
+ `,
731
+ '/foobar.yaml'
732
+ );
733
+ const additionalDocuments = [
734
+ {
735
+ absoluteRef: '/test.yaml',
736
+ body: outdent`
737
+ components:
738
+ schemas:
739
+ SomeSchema:
740
+ type: object
741
+ requestBodies:
742
+ MyRequestBody:
743
+ required: true
744
+ content:
745
+ application/json:
746
+ schema:
747
+ type: string
748
+ `,
749
+ },
750
+ ];
751
+
752
+ it('should report both schema and request body', async () => {
753
+ const results = await lintDocumentForTest(
754
+ { 'component-name-unique': 'error' },
755
+ document,
756
+ additionalDocuments
757
+ );
758
+
759
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
760
+ Array [
761
+ Object {
762
+ "location": Array [
763
+ Object {
764
+ "pointer": "#/",
765
+ "reportOnKey": false,
766
+ "source": "/foobar.yaml",
767
+ },
768
+ ],
769
+ "message": "Component 'requestBodies/MyRequestBody' is not unique. It is defined at:
770
+ - /foobar.yaml#/components/requestBodies/MyRequestBody
771
+ - /test.yaml#/components/requestBodies/MyRequestBody",
772
+ "ruleId": "component-name-unique",
773
+ "severity": "error",
774
+ "suggest": Array [],
775
+ },
776
+ Object {
777
+ "location": Array [
778
+ Object {
779
+ "pointer": "#/",
780
+ "reportOnKey": false,
781
+ "source": "/foobar.yaml",
782
+ },
783
+ ],
784
+ "message": "Component 'schemas/SomeSchema' is not unique. It is defined at:
785
+ - /foobar.yaml#/components/schemas/SomeSchema
786
+ - /test.yaml#/components/schemas/SomeSchema",
787
+ "ruleId": "component-name-unique",
788
+ "severity": "error",
789
+ "suggest": Array [],
790
+ },
791
+ ]
792
+ `);
793
+ });
794
+
795
+ it('should not report if severity is off for specific component type', async () => {
796
+ const results = await lintDocumentForTest(
797
+ { 'component-name-unique': { severity: 'error', schemas: 'off' } },
798
+ document,
799
+ additionalDocuments
800
+ );
801
+
802
+ expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
803
+ Array [
804
+ Object {
805
+ "location": Array [
806
+ Object {
807
+ "pointer": "#/",
808
+ "reportOnKey": false,
809
+ "source": "/foobar.yaml",
810
+ },
811
+ ],
812
+ "message": "Component 'requestBodies/MyRequestBody' is not unique. It is defined at:
813
+ - /foobar.yaml#/components/requestBodies/MyRequestBody
814
+ - /test.yaml#/components/requestBodies/MyRequestBody",
815
+ "ruleId": "component-name-unique",
816
+ "severity": "error",
817
+ "suggest": Array [],
818
+ },
819
+ ]
820
+ `);
821
+ });
822
+ });
823
+ });