@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,465 +0,0 @@
1
- import * as path from 'path';
2
- import { isAbsoluteUrl } from '../ref-utils';
3
- import { pickDefined } from '../utils';
4
- import { BaseResolver } from '../resolve';
5
- import { defaultPlugin } from './builtIn';
6
- import {
7
- getResolveConfig,
8
- getUniquePlugins,
9
- mergeExtends,
10
- parsePresetName,
11
- prefixRules,
12
- transformConfig,
13
- } from './utils';
14
- import type {
15
- StyleguideRawConfig,
16
- ApiStyleguideRawConfig,
17
- Plugin,
18
- RawConfig,
19
- ResolvedApi,
20
- ResolvedStyleguideConfig,
21
- RuleConfig,
22
- DeprecatedInRawConfig,
23
- } from './types';
24
- import { isBrowser } from '../env';
25
- import { isNotString, isString, isDefined, parseYaml, keysOf } from '../utils';
26
- import { Config } from './config';
27
- import { colorize, logger } from '../logger';
28
- import {
29
- Asserts,
30
- AssertionFn,
31
- asserts,
32
- buildAssertCustomFunction,
33
- } from '../rules/common/assertions/asserts';
34
- import type { Assertion, AssertionDefinition, RawAssertion } from '../rules/common/assertions';
35
-
36
- export async function resolveConfig(rawConfig: RawConfig, configPath?: string): Promise<Config> {
37
- if (rawConfig.styleguide?.extends?.some(isNotString)) {
38
- throw new Error(
39
- `Error configuration format not detected in extends value must contain strings`
40
- );
41
- }
42
-
43
- const resolver = new BaseResolver(getResolveConfig(rawConfig.resolve));
44
-
45
- const apis = await resolveApis({
46
- rawConfig,
47
- configPath,
48
- resolver,
49
- });
50
-
51
- const styleguide = await resolveStyleguideConfig({
52
- styleguideConfig: rawConfig.styleguide,
53
- configPath,
54
- resolver,
55
- });
56
-
57
- return new Config(
58
- {
59
- ...rawConfig,
60
- apis,
61
- styleguide,
62
- },
63
- configPath
64
- );
65
- }
66
-
67
- export function resolvePlugins(
68
- plugins: (string | Plugin)[] | null,
69
- configPath: string = ''
70
- ): Plugin[] {
71
- if (!plugins) return [];
72
-
73
- // TODO: implement or reuse Resolver approach so it will work in node and browser envs
74
- const requireFunc = (plugin: string | Plugin): Plugin | undefined => {
75
- if (isBrowser && isString(plugin)) {
76
- logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
77
-
78
- return undefined;
79
- }
80
-
81
- if (isString(plugin)) {
82
- try {
83
- const absoltePluginPath = path.resolve(path.dirname(configPath), plugin);
84
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
85
- // @ts-ignore
86
- return typeof __webpack_require__ === 'function'
87
- ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
88
- // @ts-ignore
89
- __non_webpack_require__(absoltePluginPath)
90
- : require(absoltePluginPath);
91
- } catch (e) {
92
- throw new Error(`Failed to load plugin "${plugin}". Please provide a valid path`);
93
- }
94
- }
95
-
96
- return plugin;
97
- };
98
-
99
- const seenPluginIds = new Map<string, string>();
100
-
101
- return plugins
102
- .map((p) => {
103
- if (isString(p) && isAbsoluteUrl(p)) {
104
- throw new Error(colorize.red(`We don't support remote plugins yet.`));
105
- }
106
-
107
- // TODO: resolve npm packages similar to eslint
108
- const pluginModule = requireFunc(p);
109
-
110
- if (!pluginModule) {
111
- return;
112
- }
113
-
114
- const id = pluginModule.id;
115
- if (typeof id !== 'string') {
116
- throw new Error(
117
- colorize.red(`Plugin must define \`id\` property in ${colorize.blue(p.toString())}.`)
118
- );
119
- }
120
-
121
- if (seenPluginIds.has(id)) {
122
- const pluginPath = seenPluginIds.get(id)!;
123
- throw new Error(
124
- colorize.red(
125
- `Plugin "id" must be unique. Plugin ${colorize.blue(
126
- p.toString()
127
- )} uses id "${colorize.blue(id)}" already seen in ${colorize.blue(pluginPath)}`
128
- )
129
- );
130
- }
131
-
132
- seenPluginIds.set(id, p.toString());
133
-
134
- const plugin: Plugin = {
135
- id,
136
- ...(pluginModule.configs ? { configs: pluginModule.configs } : {}),
137
- ...(pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}),
138
- };
139
-
140
- if (pluginModule.rules) {
141
- if (!pluginModule.rules.oas3 && !pluginModule.rules.oas2) {
142
- throw new Error(`Plugin rules must have \`oas3\` or \`oas2\` rules "${p}.`);
143
- }
144
- plugin.rules = {};
145
- if (pluginModule.rules.oas3) {
146
- plugin.rules.oas3 = prefixRules(pluginModule.rules.oas3, id);
147
- }
148
- if (pluginModule.rules.oas2) {
149
- plugin.rules.oas2 = prefixRules(pluginModule.rules.oas2, id);
150
- }
151
- }
152
- if (pluginModule.preprocessors) {
153
- if (!pluginModule.preprocessors.oas3 && !pluginModule.preprocessors.oas2) {
154
- throw new Error(
155
- `Plugin \`preprocessors\` must have \`oas3\` or \`oas2\` preprocessors "${p}.`
156
- );
157
- }
158
- plugin.preprocessors = {};
159
- if (pluginModule.preprocessors.oas3) {
160
- plugin.preprocessors.oas3 = prefixRules(pluginModule.preprocessors.oas3, id);
161
- }
162
- if (pluginModule.preprocessors.oas2) {
163
- plugin.preprocessors.oas2 = prefixRules(pluginModule.preprocessors.oas2, id);
164
- }
165
- }
166
-
167
- if (pluginModule.decorators) {
168
- if (!pluginModule.decorators.oas3 && !pluginModule.decorators.oas2) {
169
- throw new Error(`Plugin \`decorators\` must have \`oas3\` or \`oas2\` decorators "${p}.`);
170
- }
171
- plugin.decorators = {};
172
- if (pluginModule.decorators.oas3) {
173
- plugin.decorators.oas3 = prefixRules(pluginModule.decorators.oas3, id);
174
- }
175
- if (pluginModule.decorators.oas2) {
176
- plugin.decorators.oas2 = prefixRules(pluginModule.decorators.oas2, id);
177
- }
178
- }
179
-
180
- if (pluginModule.assertions) {
181
- plugin.assertions = pluginModule.assertions;
182
- }
183
-
184
- return plugin;
185
- })
186
- .filter(isDefined);
187
- }
188
-
189
- export async function resolveApis({
190
- rawConfig,
191
- configPath = '',
192
- resolver,
193
- }: {
194
- rawConfig: RawConfig;
195
- configPath?: string;
196
- resolver?: BaseResolver;
197
- }): Promise<Record<string, ResolvedApi>> {
198
- const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
199
- const resolvedApis: Record<string, ResolvedApi> = {};
200
- for (const [apiName, apiContent] of Object.entries(apis || {})) {
201
- if (apiContent.styleguide?.extends?.some(isNotString)) {
202
- throw new Error(
203
- `Error configuration format not detected in extends value must contain strings`
204
- );
205
- }
206
- const rawStyleguideConfig = getMergedRawStyleguideConfig(
207
- styleguideConfig,
208
- apiContent.styleguide
209
- );
210
- const resolvedApiConfig = await resolveStyleguideConfig({
211
- styleguideConfig: rawStyleguideConfig,
212
- configPath,
213
- resolver,
214
- });
215
- resolvedApis[apiName] = { ...apiContent, styleguide: resolvedApiConfig };
216
- }
217
- return resolvedApis;
218
- }
219
-
220
- async function resolveAndMergeNestedStyleguideConfig(
221
- {
222
- styleguideConfig,
223
- configPath = '',
224
- resolver = new BaseResolver(),
225
- }: {
226
- styleguideConfig?: StyleguideRawConfig;
227
- configPath?: string;
228
- resolver?: BaseResolver;
229
- },
230
- parentConfigPaths: string[] = [],
231
- extendPaths: string[] = []
232
- ): Promise<ResolvedStyleguideConfig> {
233
- if (parentConfigPaths.includes(configPath)) {
234
- throw new Error(`Circular dependency in config file: "${configPath}"`);
235
- }
236
- const plugins = getUniquePlugins(
237
- resolvePlugins([...(styleguideConfig?.plugins || []), defaultPlugin], configPath)
238
- );
239
- const pluginPaths = styleguideConfig?.plugins
240
- ?.filter(isString)
241
- .map((p) => path.resolve(path.dirname(configPath), p));
242
-
243
- const resolvedConfigPath = isAbsoluteUrl(configPath)
244
- ? configPath
245
- : configPath && path.resolve(configPath);
246
-
247
- const extendConfigs: ResolvedStyleguideConfig[] = await Promise.all(
248
- styleguideConfig?.extends?.map(async (presetItem) => {
249
- if (!isAbsoluteUrl(presetItem) && !path.extname(presetItem)) {
250
- return resolvePreset(presetItem, plugins);
251
- }
252
- const pathItem = isAbsoluteUrl(presetItem)
253
- ? presetItem
254
- : isAbsoluteUrl(configPath)
255
- ? new URL(presetItem, configPath).href
256
- : path.resolve(path.dirname(configPath), presetItem);
257
- const extendedStyleguideConfig = await loadExtendStyleguideConfig(pathItem, resolver);
258
- return await resolveAndMergeNestedStyleguideConfig(
259
- {
260
- styleguideConfig: extendedStyleguideConfig,
261
- configPath: pathItem,
262
- resolver: resolver,
263
- },
264
- [...parentConfigPaths, resolvedConfigPath],
265
- extendPaths
266
- );
267
- }) || []
268
- );
269
-
270
- const { plugins: mergedPlugins = [], ...styleguide } = mergeExtends([
271
- ...extendConfigs,
272
- {
273
- ...styleguideConfig,
274
- plugins,
275
- extends: undefined,
276
- extendPaths: [...parentConfigPaths, resolvedConfigPath],
277
- pluginPaths,
278
- },
279
- ]);
280
-
281
- return {
282
- ...styleguide,
283
- extendPaths: styleguide.extendPaths?.filter((path) => path && !isAbsoluteUrl(path)),
284
- plugins: getUniquePlugins(mergedPlugins),
285
- recommendedFallback: styleguideConfig?.recommendedFallback,
286
- doNotResolveExamples: styleguideConfig?.doNotResolveExamples,
287
- };
288
- }
289
-
290
- export async function resolveStyleguideConfig(
291
- opts: {
292
- styleguideConfig?: StyleguideRawConfig;
293
- configPath?: string;
294
- resolver?: BaseResolver;
295
- },
296
- parentConfigPaths: string[] = [],
297
- extendPaths: string[] = []
298
- ): Promise<ResolvedStyleguideConfig> {
299
- const resolvedStyleguideConfig = await resolveAndMergeNestedStyleguideConfig(
300
- opts,
301
- parentConfigPaths,
302
- extendPaths
303
- );
304
-
305
- return {
306
- ...resolvedStyleguideConfig,
307
- rules:
308
- resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig),
309
- };
310
- }
311
-
312
- export function resolvePreset(presetName: string, plugins: Plugin[]): ResolvedStyleguideConfig {
313
- const { pluginId, configName } = parsePresetName(presetName);
314
- const plugin = plugins.find((p) => p.id === pluginId);
315
- if (!plugin) {
316
- throw new Error(
317
- `Invalid config ${colorize.red(presetName)}: plugin ${pluginId} is not included.`
318
- );
319
- }
320
-
321
- const preset = plugin.configs?.[configName];
322
- if (!preset) {
323
- throw new Error(
324
- pluginId
325
- ? `Invalid config ${colorize.red(
326
- presetName
327
- )}: plugin ${pluginId} doesn't export config with name ${configName}.`
328
- : `Invalid config ${colorize.red(presetName)}: there is no such built-in config.`
329
- );
330
- }
331
- return preset;
332
- }
333
-
334
- async function loadExtendStyleguideConfig(
335
- filePath: string,
336
- resolver: BaseResolver
337
- ): Promise<StyleguideRawConfig> {
338
- try {
339
- const fileSource = await resolver.loadExternalRef(filePath);
340
- const rawConfig = transformConfig(
341
- parseYaml(fileSource.body) as RawConfig & DeprecatedInRawConfig
342
- );
343
- if (!rawConfig.styleguide) {
344
- throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
345
- }
346
-
347
- return rawConfig.styleguide;
348
- } catch (error) {
349
- throw new Error(`Failed to load "${filePath}": ${error.message}`);
350
- }
351
- }
352
-
353
- function getMergedRawStyleguideConfig(
354
- rootStyleguideConfig: StyleguideRawConfig,
355
- apiStyleguideConfig?: ApiStyleguideRawConfig
356
- ) {
357
- const resultLint = {
358
- ...rootStyleguideConfig,
359
- ...pickDefined(apiStyleguideConfig),
360
- rules: { ...rootStyleguideConfig?.rules, ...apiStyleguideConfig?.rules },
361
- oas2Rules: { ...rootStyleguideConfig?.oas2Rules, ...apiStyleguideConfig?.oas2Rules },
362
- oas3_0Rules: { ...rootStyleguideConfig?.oas3_0Rules, ...apiStyleguideConfig?.oas3_0Rules },
363
- oas3_1Rules: { ...rootStyleguideConfig?.oas3_1Rules, ...apiStyleguideConfig?.oas3_1Rules },
364
- preprocessors: {
365
- ...rootStyleguideConfig?.preprocessors,
366
- ...apiStyleguideConfig?.preprocessors,
367
- },
368
- oas2Preprocessors: {
369
- ...rootStyleguideConfig?.oas2Preprocessors,
370
- ...apiStyleguideConfig?.oas2Preprocessors,
371
- },
372
- oas3_0Preprocessors: {
373
- ...rootStyleguideConfig?.oas3_0Preprocessors,
374
- ...apiStyleguideConfig?.oas3_0Preprocessors,
375
- },
376
- oas3_1Preprocessors: {
377
- ...rootStyleguideConfig?.oas3_1Preprocessors,
378
- ...apiStyleguideConfig?.oas3_1Preprocessors,
379
- },
380
- decorators: { ...rootStyleguideConfig?.decorators, ...apiStyleguideConfig?.decorators },
381
- oas2Decorators: {
382
- ...rootStyleguideConfig?.oas2Decorators,
383
- ...apiStyleguideConfig?.oas2Decorators,
384
- },
385
- oas3_0Decorators: {
386
- ...rootStyleguideConfig?.oas3_0Decorators,
387
- ...apiStyleguideConfig?.oas3_0Decorators,
388
- },
389
- oas3_1Decorators: {
390
- ...rootStyleguideConfig?.oas3_1Decorators,
391
- ...apiStyleguideConfig?.oas3_1Decorators,
392
- },
393
- recommendedFallback: apiStyleguideConfig?.extends
394
- ? false
395
- : rootStyleguideConfig.recommendedFallback,
396
- };
397
- return resultLint;
398
- }
399
-
400
- function groupStyleguideAssertionRules({
401
- rules,
402
- plugins,
403
- }: ResolvedStyleguideConfig): Record<string, RuleConfig> | undefined {
404
- if (!rules) {
405
- return rules;
406
- }
407
-
408
- // Create a new record to avoid mutating original
409
- const transformedRules: Record<string, RuleConfig> = {};
410
-
411
- // Collect assertion rules
412
- const assertions: Assertion[] = [];
413
- for (const [ruleKey, rule] of Object.entries(rules)) {
414
- if (ruleKey.startsWith('assert/') && typeof rule === 'object' && rule !== null) {
415
- const assertion = rule as RawAssertion;
416
-
417
- if (plugins) {
418
- registerCustomAssertions(plugins, assertion);
419
-
420
- // We may have custom assertion inside where block
421
- for (const context of assertion.where || []) {
422
- registerCustomAssertions(plugins, context);
423
- }
424
- }
425
- assertions.push({
426
- ...assertion,
427
- assertionId: ruleKey.replace('assert/', ''),
428
- });
429
- } else {
430
- // If it's not an assertion, keep it as is
431
- transformedRules[ruleKey] = rule;
432
- }
433
- }
434
- if (assertions.length > 0) {
435
- transformedRules.assertions = assertions;
436
- }
437
-
438
- return transformedRules;
439
- }
440
-
441
- function registerCustomAssertions(plugins: Plugin[], assertion: AssertionDefinition) {
442
- for (const field of keysOf(assertion.assertions)) {
443
- const [pluginId, fn] = field.split('/');
444
-
445
- if (!pluginId || !fn) continue;
446
-
447
- const plugin = plugins.find((plugin) => plugin.id === pluginId);
448
-
449
- if (!plugin) {
450
- throw Error(colorize.red(`Plugin ${colorize.blue(pluginId)} isn't found.`));
451
- }
452
-
453
- if (!plugin.assertions || !plugin.assertions[fn]) {
454
- throw Error(
455
- `Plugin ${colorize.red(
456
- pluginId
457
- )} doesn't export assertions function with name ${colorize.red(fn)}.`
458
- );
459
- }
460
-
461
- (asserts as Asserts & { [name: string]: AssertionFn })[field] = buildAssertCustomFunction(
462
- plugin.assertions[fn]
463
- );
464
- }
465
- }