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

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