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