@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,330 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { parseYaml, stringifyYaml } from '../js-yaml';
4
- import { slash, doesYamlFileExist } from '../utils';
5
- import { NormalizedProblem } from '../walk';
6
- import { OasVersion, OasMajorVersion, Oas2RuleSet, Oas3RuleSet } from '../oas-types';
7
- import { isBrowser, env } from '../env';
8
-
9
- import type { NodeType } from '../types';
10
- import type {
11
- DecoratorConfig,
12
- Plugin,
13
- PreprocessorConfig,
14
- Region,
15
- ResolveConfig,
16
- ResolvedApi,
17
- ResolvedConfig,
18
- ResolvedStyleguideConfig,
19
- RuleConfig,
20
- RuleSettings,
21
- ThemeRawConfig,
22
- } from './types';
23
- import { getResolveConfig } from './utils';
24
- import { isAbsoluteUrl } from '../ref-utils';
25
-
26
- export const IGNORE_FILE = '.redocly.lint-ignore.yaml';
27
- const IGNORE_BANNER =
28
- `# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API.\n` +
29
- `# See https://redoc.ly/docs/cli/ for more information.\n`;
30
-
31
- export const DEFAULT_REGION = 'us';
32
-
33
- function getDomains() {
34
- const domains: { [region in Region]: string } = {
35
- us: 'redocly.com',
36
- eu: 'eu.redocly.com',
37
- };
38
-
39
- // FIXME: temporary fix for our lab environments
40
- const domain = env.REDOCLY_DOMAIN;
41
- if (domain?.endsWith('.redocly.host')) {
42
- domains[domain.split('.')[0] as Region] = domain;
43
- }
44
- if (domain === 'redoc.online') {
45
- domains[domain as Region] = domain;
46
- }
47
- return domains;
48
- }
49
-
50
- function getIgnoreFilePath(configFile?: string): string | undefined {
51
- if (configFile) {
52
- return doesYamlFileExist(configFile)
53
- ? path.join(path.dirname(configFile), IGNORE_FILE)
54
- : path.join(configFile, IGNORE_FILE);
55
- } else {
56
- return isBrowser ? undefined : path.join(process.cwd(), IGNORE_FILE);
57
- }
58
- }
59
-
60
- export const DOMAINS = getDomains();
61
- export const AVAILABLE_REGIONS = Object.keys(DOMAINS) as Region[];
62
-
63
- export class StyleguideConfig {
64
- plugins: Plugin[];
65
- ignore: Record<string, Record<string, Set<string>>> = {};
66
- doNotResolveExamples: boolean;
67
- rules: Record<OasVersion, Record<string, RuleConfig>>;
68
- preprocessors: Record<OasVersion, Record<string, PreprocessorConfig>>;
69
- decorators: Record<OasVersion, Record<string, DecoratorConfig>>;
70
-
71
- private _usedRules: Set<string> = new Set();
72
- private _usedVersions: Set<OasVersion> = new Set();
73
-
74
- recommendedFallback: boolean;
75
-
76
- extendPaths: string[];
77
- pluginPaths: string[];
78
-
79
- constructor(public rawConfig: ResolvedStyleguideConfig, public configFile?: string) {
80
- this.plugins = rawConfig.plugins || [];
81
- this.doNotResolveExamples = !!rawConfig.doNotResolveExamples;
82
-
83
- this.recommendedFallback = rawConfig.recommendedFallback || false;
84
-
85
- this.rules = {
86
- [OasVersion.Version2]: { ...rawConfig.rules, ...rawConfig.oas2Rules },
87
- [OasVersion.Version3_0]: { ...rawConfig.rules, ...rawConfig.oas3_0Rules },
88
- [OasVersion.Version3_1]: { ...rawConfig.rules, ...rawConfig.oas3_1Rules },
89
- };
90
-
91
- this.preprocessors = {
92
- [OasVersion.Version2]: { ...rawConfig.preprocessors, ...rawConfig.oas2Preprocessors },
93
- [OasVersion.Version3_0]: { ...rawConfig.preprocessors, ...rawConfig.oas3_0Preprocessors },
94
- [OasVersion.Version3_1]: { ...rawConfig.preprocessors, ...rawConfig.oas3_1Preprocessors },
95
- };
96
-
97
- this.decorators = {
98
- [OasVersion.Version2]: { ...rawConfig.decorators, ...rawConfig.oas2Decorators },
99
- [OasVersion.Version3_0]: { ...rawConfig.decorators, ...rawConfig.oas3_0Decorators },
100
- [OasVersion.Version3_1]: { ...rawConfig.decorators, ...rawConfig.oas3_1Decorators },
101
- };
102
-
103
- this.extendPaths = rawConfig.extendPaths || [];
104
- this.pluginPaths = rawConfig.pluginPaths || [];
105
- this.resolveIgnore(getIgnoreFilePath(configFile));
106
- }
107
-
108
- resolveIgnore(ignoreFile?: string) {
109
- if (!ignoreFile || !doesYamlFileExist(ignoreFile)) return;
110
-
111
- this.ignore =
112
- (parseYaml(fs.readFileSync(ignoreFile, 'utf-8')) as Record<
113
- string,
114
- Record<string, Set<string>>
115
- >) || {};
116
-
117
- // resolve ignore paths
118
- for (const fileName of Object.keys(this.ignore)) {
119
- this.ignore[
120
- isAbsoluteUrl(fileName) ? fileName : path.resolve(path.dirname(ignoreFile), fileName)
121
- ] = this.ignore[fileName];
122
-
123
- for (const ruleId of Object.keys(this.ignore[fileName])) {
124
- this.ignore[fileName][ruleId] = new Set(this.ignore[fileName][ruleId]);
125
- }
126
-
127
- if (!isAbsoluteUrl(fileName)) {
128
- delete this.ignore[fileName];
129
- }
130
- }
131
- }
132
-
133
- saveIgnore() {
134
- const dir = this.configFile ? path.dirname(this.configFile) : process.cwd();
135
- const ignoreFile = path.join(dir, IGNORE_FILE);
136
- const mapped: Record<string, any> = {};
137
- for (const absFileName of Object.keys(this.ignore)) {
138
- const mappedDefinitionName = isAbsoluteUrl(absFileName)
139
- ? absFileName
140
- : slash(path.relative(dir, absFileName));
141
- const ignoredRules = (mapped[mappedDefinitionName] = this.ignore[absFileName]);
142
-
143
- for (const ruleId of Object.keys(ignoredRules)) {
144
- ignoredRules[ruleId] = Array.from(ignoredRules[ruleId]) as any;
145
- }
146
- }
147
- fs.writeFileSync(ignoreFile, IGNORE_BANNER + stringifyYaml(mapped));
148
- }
149
-
150
- addIgnore(problem: NormalizedProblem) {
151
- const ignore = this.ignore;
152
- const loc = problem.location[0];
153
- if (loc.pointer === undefined) return;
154
-
155
- const fileIgnore = (ignore[loc.source.absoluteRef] = ignore[loc.source.absoluteRef] || {});
156
- const ruleIgnore = (fileIgnore[problem.ruleId] = fileIgnore[problem.ruleId] || new Set());
157
-
158
- ruleIgnore.add(loc.pointer);
159
- }
160
-
161
- addProblemToIgnore(problem: NormalizedProblem) {
162
- const loc = problem.location[0];
163
- if (loc.pointer === undefined) return problem;
164
-
165
- const fileIgnore = this.ignore[loc.source.absoluteRef] || {};
166
- const ruleIgnore = fileIgnore[problem.ruleId];
167
- const ignored = ruleIgnore && ruleIgnore.has(loc.pointer);
168
- return ignored
169
- ? {
170
- ...problem,
171
- ignored,
172
- }
173
- : problem;
174
- }
175
-
176
- extendTypes(types: Record<string, NodeType>, version: OasVersion) {
177
- let extendedTypes = types;
178
- for (const plugin of this.plugins) {
179
- if (plugin.typeExtension !== undefined) {
180
- switch (version) {
181
- case OasVersion.Version3_0:
182
- case OasVersion.Version3_1:
183
- if (!plugin.typeExtension.oas3) continue;
184
- extendedTypes = plugin.typeExtension.oas3(extendedTypes, version);
185
- break;
186
- case OasVersion.Version2:
187
- if (!plugin.typeExtension.oas2) continue;
188
- extendedTypes = plugin.typeExtension.oas2(extendedTypes, version);
189
- break;
190
- default:
191
- throw new Error('Not implemented');
192
- }
193
- }
194
- }
195
- return extendedTypes;
196
- }
197
-
198
- getRuleSettings(ruleId: string, oasVersion: OasVersion): RuleSettings {
199
- this._usedRules.add(ruleId);
200
- this._usedVersions.add(oasVersion);
201
- const settings = this.rules[oasVersion][ruleId] || 'off';
202
- if (typeof settings === 'string') {
203
- return {
204
- severity: settings,
205
- };
206
- } else {
207
- return { severity: 'error', ...settings };
208
- }
209
- }
210
-
211
- getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings {
212
- this._usedRules.add(ruleId);
213
- this._usedVersions.add(oasVersion);
214
-
215
- const settings = this.preprocessors[oasVersion][ruleId] || 'off';
216
- if (typeof settings === 'string') {
217
- return {
218
- severity: settings === 'on' ? 'error' : settings,
219
- };
220
- } else {
221
- return { severity: 'error', ...settings };
222
- }
223
- }
224
-
225
- getDecoratorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings {
226
- this._usedRules.add(ruleId);
227
- this._usedVersions.add(oasVersion);
228
- const settings = this.decorators[oasVersion][ruleId] || 'off';
229
- if (typeof settings === 'string') {
230
- return {
231
- severity: settings === 'on' ? 'error' : settings,
232
- };
233
- } else {
234
- return { severity: 'error', ...settings };
235
- }
236
- }
237
-
238
- getUnusedRules() {
239
- const rules = [];
240
- const decorators = [];
241
- const preprocessors = [];
242
-
243
- for (const usedVersion of Array.from(this._usedVersions)) {
244
- rules.push(
245
- ...Object.keys(this.rules[usedVersion]).filter((name) => !this._usedRules.has(name))
246
- );
247
- decorators.push(
248
- ...Object.keys(this.decorators[usedVersion]).filter((name) => !this._usedRules.has(name))
249
- );
250
- preprocessors.push(
251
- ...Object.keys(this.preprocessors[usedVersion]).filter((name) => !this._usedRules.has(name))
252
- );
253
- }
254
-
255
- return {
256
- rules,
257
- preprocessors,
258
- decorators,
259
- };
260
- }
261
-
262
- getRulesForOasVersion(version: OasMajorVersion) {
263
- switch (version) {
264
- case OasMajorVersion.Version3:
265
- // eslint-disable-next-line no-case-declarations
266
- const oas3Rules: Oas3RuleSet[] = []; // default ruleset
267
- this.plugins.forEach((p) => p.preprocessors?.oas3 && oas3Rules.push(p.preprocessors.oas3));
268
- this.plugins.forEach((p) => p.rules?.oas3 && oas3Rules.push(p.rules.oas3));
269
- this.plugins.forEach((p) => p.decorators?.oas3 && oas3Rules.push(p.decorators.oas3));
270
- return oas3Rules;
271
- case OasMajorVersion.Version2:
272
- // eslint-disable-next-line no-case-declarations
273
- const oas2Rules: Oas2RuleSet[] = []; // default ruleset
274
- this.plugins.forEach((p) => p.preprocessors?.oas2 && oas2Rules.push(p.preprocessors.oas2));
275
- this.plugins.forEach((p) => p.rules?.oas2 && oas2Rules.push(p.rules.oas2));
276
- this.plugins.forEach((p) => p.decorators?.oas2 && oas2Rules.push(p.decorators.oas2));
277
- return oas2Rules;
278
- }
279
- }
280
-
281
- skipRules(rules?: string[]) {
282
- for (const ruleId of rules || []) {
283
- for (const version of Object.values(OasVersion)) {
284
- if (this.rules[version][ruleId]) {
285
- this.rules[version][ruleId] = 'off';
286
- }
287
- }
288
- }
289
- }
290
-
291
- skipPreprocessors(preprocessors?: string[]) {
292
- for (const preprocessorId of preprocessors || []) {
293
- for (const version of Object.values(OasVersion)) {
294
- if (this.preprocessors[version][preprocessorId]) {
295
- this.preprocessors[version][preprocessorId] = 'off';
296
- }
297
- }
298
- }
299
- }
300
-
301
- skipDecorators(decorators?: string[]) {
302
- for (const decoratorId of decorators || []) {
303
- for (const version of Object.values(OasVersion)) {
304
- if (this.decorators[version][decoratorId]) {
305
- this.decorators[version][decoratorId] = 'off';
306
- }
307
- }
308
- }
309
- }
310
- }
311
-
312
- export class Config {
313
- apis: Record<string, ResolvedApi>;
314
- styleguide: StyleguideConfig;
315
- resolve: ResolveConfig;
316
- licenseKey?: string;
317
- region?: Region;
318
- theme: ThemeRawConfig;
319
- organization?: string;
320
- files: string[];
321
- constructor(public rawConfig: ResolvedConfig, public configFile?: string) {
322
- this.apis = rawConfig.apis || {};
323
- this.styleguide = new StyleguideConfig(rawConfig.styleguide || {}, configFile);
324
- this.theme = rawConfig.theme || {};
325
- this.resolve = getResolveConfig(rawConfig?.resolve);
326
- this.region = rawConfig.region;
327
- this.organization = rawConfig.organization;
328
- this.files = rawConfig.files || [];
329
- }
330
- }
@@ -1,7 +0,0 @@
1
- export * from './config';
2
- export * from './types';
3
- export * from './rules';
4
- export * from './builtIn';
5
- export * from './load';
6
- export * from './utils';
7
- export * from './config-resolvers';
@@ -1,144 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { RedoclyClient } from '../redocly';
4
- import { isEmptyObject, loadYaml, doesYamlFileExist } from '../utils';
5
- import { parseYaml } from '../js-yaml';
6
- import { Config, DOMAINS } from './config';
7
- import { transformConfig } from './utils';
8
- import { resolveConfig } from './config-resolvers';
9
-
10
- import type { DeprecatedInRawConfig, FlatRawConfig, RawConfig, Region } from './types';
11
- import { RegionalTokenWithValidity } from '../redocly/redocly-client-types';
12
-
13
- async function addConfigMetadata({
14
- rawConfig,
15
- customExtends,
16
- configPath,
17
- tokens,
18
- files,
19
- region,
20
- }: {
21
- rawConfig: RawConfig;
22
- customExtends?: string[];
23
- configPath?: string;
24
- tokens?: RegionalTokenWithValidity[];
25
- files?: string[];
26
- region?: Region;
27
- }): Promise<Config> {
28
- if (customExtends !== undefined) {
29
- rawConfig.styleguide = rawConfig.styleguide || {};
30
- rawConfig.styleguide.extends = customExtends;
31
- } else if (isEmptyObject(rawConfig)) {
32
- rawConfig.styleguide = { extends: ['recommended'], recommendedFallback: true };
33
- }
34
-
35
- if (tokens?.length) {
36
- if (!rawConfig.resolve) rawConfig.resolve = {};
37
- if (!rawConfig.resolve.http) rawConfig.resolve.http = {};
38
- rawConfig.resolve.http.headers = [...(rawConfig.resolve.http.headers ?? [])];
39
-
40
- for (const item of tokens) {
41
- const domain = DOMAINS[item.region as Region];
42
- rawConfig.resolve.http.headers.push(
43
- {
44
- matches: `https://api.${domain}/registry/**`,
45
- name: 'Authorization',
46
- envVariable: undefined,
47
- value: item.token,
48
- },
49
- //support redocly.com domain for future compatibility
50
- ...(item.region === 'us'
51
- ? [
52
- {
53
- matches: `https://api.redoc.ly/registry/**`,
54
- name: 'Authorization',
55
- envVariable: undefined,
56
- value: item.token,
57
- },
58
- ]
59
- : [])
60
- );
61
- }
62
- }
63
-
64
- return resolveConfig(
65
- { ...rawConfig, files: files ?? rawConfig.files, region: region ?? rawConfig.region },
66
- configPath
67
- );
68
- }
69
-
70
- export async function loadConfig(
71
- options: {
72
- configPath?: string;
73
- customExtends?: string[];
74
- processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>;
75
- files?: string[];
76
- region?: Region;
77
- } = {}
78
- ): Promise<Config> {
79
- const { configPath = findConfig(), customExtends, processRawConfig, files, region } = options;
80
- const rawConfig = await getConfig(configPath, processRawConfig);
81
-
82
- const redoclyClient = new RedoclyClient();
83
- const tokens = await redoclyClient.getTokens();
84
-
85
- return addConfigMetadata({
86
- rawConfig,
87
- customExtends,
88
- configPath,
89
- tokens,
90
- files,
91
- region,
92
- });
93
- }
94
-
95
- export const CONFIG_FILE_NAMES = ['redocly.yaml', 'redocly.yml', '.redocly.yaml', '.redocly.yml'];
96
-
97
- export function findConfig(dir?: string): string | undefined {
98
- if (!fs.hasOwnProperty('existsSync')) return;
99
- const existingConfigFiles = CONFIG_FILE_NAMES.map((name) =>
100
- dir ? path.resolve(dir, name) : name
101
- ).filter(fs.existsSync);
102
- if (existingConfigFiles.length > 1) {
103
- throw new Error(`
104
- Multiple configuration files are not allowed.
105
- Found the following files: ${existingConfigFiles.join(', ')}.
106
- Please use 'redocly.yaml' instead.
107
- `);
108
- }
109
- return existingConfigFiles[0];
110
- }
111
-
112
- export async function getConfig(
113
- configPath: string | undefined = findConfig(),
114
- processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>
115
- ): Promise<RawConfig> {
116
- if (!configPath || !doesYamlFileExist(configPath)) return {};
117
- try {
118
- const rawConfig =
119
- (await loadYaml<RawConfig & DeprecatedInRawConfig & FlatRawConfig>(configPath)) || {};
120
- if (typeof processRawConfig === 'function') {
121
- await processRawConfig(rawConfig);
122
- }
123
- return transformConfig(rawConfig);
124
- } catch (e) {
125
- throw new Error(`Error parsing config file at '${configPath}': ${e.message}`);
126
- }
127
- }
128
-
129
- type CreateConfigOptions = {
130
- extends?: string[];
131
- tokens?: RegionalTokenWithValidity[];
132
- };
133
-
134
- export async function createConfig(
135
- config: string | RawConfig,
136
- options?: CreateConfigOptions
137
- ): Promise<Config> {
138
- return addConfigMetadata({
139
- rawConfig: transformConfig(
140
- typeof config === 'string' ? (parseYaml(config) as RawConfig) : config
141
- ),
142
- ...options,
143
- });
144
- }
@@ -1,60 +0,0 @@
1
- import type { PluginStyleguideConfig } from './types';
2
-
3
- export default {
4
- rules: {
5
- 'info-contact': 'off',
6
- 'info-license': 'off',
7
- 'info-license-url': 'off',
8
- 'tag-description': 'warn',
9
- 'tags-alphabetical': 'off',
10
- 'parameter-description': 'off',
11
- 'no-path-trailing-slash': 'warn',
12
- 'no-identical-paths': 'warn',
13
- 'no-ambiguous-paths': 'warn',
14
- 'path-declaration-must-exist': 'warn',
15
- 'path-not-include-query': 'warn',
16
- 'path-parameters-defined': 'warn',
17
- 'operation-description': 'off',
18
- 'operation-2xx-response': 'warn',
19
- 'operation-4xx-response': 'off',
20
- assertions: 'warn',
21
- 'operation-operationId': 'warn',
22
- 'operation-summary': 'warn',
23
- 'operation-operationId-unique': 'warn',
24
- 'operation-parameters-unique': 'warn',
25
- 'operation-tag-defined': 'off',
26
- 'security-defined': 'warn',
27
- 'operation-operationId-url-safe': 'warn',
28
- 'operation-singular-tag': 'off',
29
- 'no-unresolved-refs': 'error',
30
- 'no-enum-type-mismatch': 'warn',
31
- 'boolean-parameter-prefixes': 'off',
32
- 'paths-kebab-case': 'off',
33
- spec: 'error',
34
- },
35
- oas3_0Rules: {
36
- 'no-invalid-media-type-examples': {
37
- severity: 'warn',
38
- allowAdditionalProperties: false,
39
- },
40
- 'no-server-example.com': 'warn',
41
- 'no-server-trailing-slash': 'error',
42
- 'no-empty-servers': 'warn',
43
- 'no-example-value-and-externalValue': 'warn',
44
- 'no-unused-components': 'warn',
45
- 'no-undefined-server-variable': 'warn',
46
- 'no-server-variables-empty-enum': 'error',
47
- 'spec-components-invalid-map-name': 'warn',
48
- },
49
- oas3_1Rules: {
50
- 'no-invalid-media-type-examples': 'warn',
51
- 'no-server-example.com': 'warn',
52
- 'no-server-trailing-slash': 'error',
53
- 'no-empty-servers': 'warn',
54
- 'no-example-value-and-externalValue': 'warn',
55
- 'no-unused-components': 'warn',
56
- 'no-undefined-server-variable': 'warn',
57
- 'no-server-variables-empty-enum': 'error',
58
- 'spec-components-invalid-map-name': 'warn',
59
- },
60
- } as PluginStyleguideConfig;
@@ -1,60 +0,0 @@
1
- import type { PluginStyleguideConfig } from './types';
2
-
3
- export default {
4
- rules: {
5
- 'info-contact': 'off',
6
- 'info-license': 'warn',
7
- 'info-license-url': 'warn',
8
- 'tag-description': 'warn',
9
- 'tags-alphabetical': 'off',
10
- 'parameter-description': 'off',
11
- 'no-path-trailing-slash': 'error',
12
- 'no-identical-paths': 'error',
13
- 'no-ambiguous-paths': 'warn',
14
- 'path-declaration-must-exist': 'error',
15
- 'path-not-include-query': 'error',
16
- 'path-parameters-defined': 'error',
17
- 'operation-description': 'off',
18
- 'operation-2xx-response': 'warn',
19
- assertions: 'warn',
20
- 'operation-4xx-response': 'warn',
21
- 'operation-operationId': 'warn',
22
- 'operation-summary': 'error',
23
- 'operation-operationId-unique': 'error',
24
- 'operation-operationId-url-safe': 'error',
25
- 'operation-parameters-unique': 'error',
26
- 'operation-tag-defined': 'off',
27
- 'security-defined': 'error',
28
- 'operation-singular-tag': 'off',
29
- 'no-unresolved-refs': 'error',
30
- 'no-enum-type-mismatch': 'error',
31
- 'boolean-parameter-prefixes': 'off',
32
- 'paths-kebab-case': 'off',
33
- spec: 'error',
34
- },
35
- oas3_0Rules: {
36
- 'no-invalid-media-type-examples': {
37
- severity: 'warn',
38
- allowAdditionalProperties: false,
39
- },
40
- 'no-server-example.com': 'warn',
41
- 'no-server-trailing-slash': 'error',
42
- 'no-empty-servers': 'error',
43
- 'no-example-value-and-externalValue': 'error',
44
- 'no-unused-components': 'warn',
45
- 'no-undefined-server-variable': 'error',
46
- 'no-server-variables-empty-enum': 'error',
47
- 'spec-components-invalid-map-name': 'error',
48
- },
49
- oas3_1Rules: {
50
- 'no-invalid-media-type-examples': 'warn',
51
- 'no-server-example.com': 'warn',
52
- 'no-server-trailing-slash': 'error',
53
- 'no-empty-servers': 'error',
54
- 'no-example-value-and-externalValue': 'error',
55
- 'no-unused-components': 'warn',
56
- 'no-undefined-server-variable': 'error',
57
- 'no-server-variables-empty-enum': 'error',
58
- 'spec-components-invalid-map-name': 'error',
59
- },
60
- } as PluginStyleguideConfig;
@@ -1,54 +0,0 @@
1
- import { RuleSet, OasVersion } from '../oas-types';
2
- import { StyleguideConfig } from './config';
3
- import { isDefined } from '../utils';
4
- import type { ProblemSeverity } from '../walk';
5
-
6
- type InitializedRule = {
7
- severity: ProblemSeverity;
8
- ruleId: string;
9
- visitor: any;
10
- };
11
-
12
- export function initRules<T extends Function, P extends RuleSet<T>>(
13
- rules: P[],
14
- config: StyleguideConfig,
15
- type: 'rules' | 'preprocessors' | 'decorators',
16
- oasVersion: OasVersion
17
- ): InitializedRule[] {
18
- return rules
19
- .flatMap((ruleset) =>
20
- Object.keys(ruleset).map((ruleId) => {
21
- const rule = ruleset[ruleId];
22
-
23
- const ruleSettings =
24
- type === 'rules'
25
- ? config.getRuleSettings(ruleId, oasVersion)
26
- : type === 'preprocessors'
27
- ? config.getPreprocessorSettings(ruleId, oasVersion)
28
- : config.getDecoratorSettings(ruleId, oasVersion);
29
-
30
- if (ruleSettings.severity === 'off') {
31
- return undefined;
32
- }
33
- const severity: ProblemSeverity = ruleSettings.severity;
34
-
35
- const visitors = rule(ruleSettings);
36
-
37
- if (Array.isArray(visitors)) {
38
- return visitors.map((visitor: any) => ({
39
- severity,
40
- ruleId,
41
- visitor: visitor,
42
- }));
43
- }
44
-
45
- return {
46
- severity,
47
- ruleId,
48
- visitor: visitors, // note: actually it is only one visitor object
49
- };
50
- })
51
- )
52
- .flatMap((visitor) => visitor)
53
- .filter(isDefined);
54
- }