@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,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
- }