@redocly/openapi-core 1.0.0-beta.98 → 1.0.0-rc.1

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 (380) hide show
  1. package/README.md +6 -6
  2. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +0 -1
  3. package/lib/benchmark/benches/recommended-oas3.bench.js +1 -1
  4. package/lib/benchmark/benches/resolve-with-no-external.bench.js +1 -1
  5. package/lib/benchmark/utils.d.ts +2 -2
  6. package/lib/benchmark/utils.js +2 -2
  7. package/lib/bundle.d.ts +12 -15
  8. package/lib/bundle.js +38 -15
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +17 -6
  11. package/lib/config/builtIn.d.ts +2 -2
  12. package/lib/config/builtIn.js +2 -2
  13. package/lib/config/config-resolvers.d.ts +5 -5
  14. package/lib/config/config-resolvers.js +121 -66
  15. package/lib/config/config.d.ts +12 -18
  16. package/lib/config/config.js +42 -26
  17. package/lib/config/load.d.ts +16 -3
  18. package/lib/config/load.js +36 -14
  19. package/lib/config/minimal.d.ts +2 -2
  20. package/lib/config/minimal.js +10 -6
  21. package/lib/config/recommended.d.ts +2 -2
  22. package/lib/config/recommended.js +10 -6
  23. package/lib/config/rules.d.ts +7 -4
  24. package/lib/config/rules.js +5 -4
  25. package/lib/config/types.d.ts +72 -23
  26. package/lib/config/types.js +13 -0
  27. package/lib/config/utils.d.ts +6 -5
  28. package/lib/config/utils.js +110 -32
  29. package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
  30. package/lib/decorators/common/filters/filter-helper.js +67 -0
  31. package/lib/decorators/common/filters/filter-in.d.ts +2 -0
  32. package/lib/decorators/common/filters/filter-in.js +17 -0
  33. package/lib/decorators/common/filters/filter-out.d.ts +2 -0
  34. package/lib/decorators/common/filters/filter-out.js +17 -0
  35. package/lib/decorators/common/info-override.d.ts +2 -0
  36. package/lib/decorators/common/info-override.js +28 -0
  37. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  38. package/lib/decorators/common/media-type-examples-override.js +53 -0
  39. package/lib/decorators/common/registry-dependencies.js +2 -2
  40. package/lib/decorators/common/remove-x-internal.js +2 -2
  41. package/lib/decorators/oas2/index.d.ts +3 -0
  42. package/lib/decorators/oas2/index.js +7 -1
  43. package/lib/decorators/oas3/index.d.ts +4 -0
  44. package/lib/decorators/oas3/index.js +9 -1
  45. package/lib/env.d.ts +3 -0
  46. package/lib/env.js +8 -0
  47. package/lib/format/codeframes.js +16 -10
  48. package/lib/format/format.d.ts +1 -1
  49. package/lib/format/format.js +64 -32
  50. package/lib/index.d.ts +6 -6
  51. package/lib/index.js +7 -2
  52. package/lib/js-yaml/index.js +2 -6
  53. package/lib/lint.d.ts +4 -2
  54. package/lib/lint.js +36 -11
  55. package/lib/logger.d.ts +10 -0
  56. package/lib/logger.js +31 -0
  57. package/lib/output.d.ts +3 -0
  58. package/lib/output.js +9 -0
  59. package/lib/redocly/index.js +10 -9
  60. package/lib/redocly/registry-api-types.d.ts +28 -28
  61. package/lib/redocly/registry-api.d.ts +3 -3
  62. package/lib/redocly/registry-api.js +10 -2
  63. package/lib/ref-utils.d.ts +1 -0
  64. package/lib/ref-utils.js +8 -2
  65. package/lib/resolve.d.ts +1 -1
  66. package/lib/resolve.js +33 -3
  67. package/lib/rules/ajv.d.ts +2 -2
  68. package/lib/rules/ajv.js +12 -12
  69. package/lib/rules/common/assertions/asserts.d.ts +29 -4
  70. package/lib/rules/common/assertions/asserts.js +227 -97
  71. package/lib/rules/common/assertions/index.d.ts +27 -2
  72. package/lib/rules/common/assertions/index.js +9 -37
  73. package/lib/rules/common/assertions/utils.d.ts +16 -8
  74. package/lib/rules/common/assertions/utils.js +160 -76
  75. package/lib/rules/common/info-license-url.d.ts +1 -1
  76. package/lib/rules/common/info-license-url.js +5 -10
  77. package/lib/rules/common/info-license.d.ts +2 -0
  78. package/lib/rules/common/info-license.js +17 -0
  79. package/lib/rules/common/no-ambiguous-paths.js +1 -1
  80. package/lib/rules/common/no-enum-type-mismatch.js +1 -3
  81. package/lib/rules/common/no-identical-paths.js +4 -4
  82. package/lib/rules/common/no-invalid-parameter-examples.js +3 -3
  83. package/lib/rules/common/no-invalid-schema-examples.js +3 -3
  84. package/lib/rules/common/operation-2xx-response.js +15 -9
  85. package/lib/rules/common/operation-4xx-response.js +15 -9
  86. package/lib/rules/common/operation-operationId.js +2 -2
  87. package/lib/rules/common/operation-tag-defined.js +1 -1
  88. package/lib/rules/common/path-not-include-query.js +2 -2
  89. package/lib/rules/common/path-params-defined.js +7 -2
  90. package/lib/rules/common/paths-kebab-case.js +4 -1
  91. package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
  92. package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
  93. package/lib/rules/common/response-contains-header.d.ts +2 -0
  94. package/lib/rules/common/response-contains-header.js +29 -0
  95. package/lib/rules/common/scalar-property-missing-example.d.ts +2 -0
  96. package/lib/rules/common/scalar-property-missing-example.js +42 -0
  97. package/lib/rules/common/security-defined.d.ts +2 -0
  98. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  99. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  100. package/lib/rules/common/spec-strict-refs.js +30 -0
  101. package/lib/rules/common/spec.js +41 -18
  102. package/lib/rules/common/tags-alphabetical.js +1 -1
  103. package/lib/rules/oas2/index.d.ts +6 -2
  104. package/lib/rules/oas2/index.js +16 -8
  105. package/lib/rules/oas2/remove-unused-components.js +6 -6
  106. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/request-mime-type.js +1 -1
  108. package/lib/rules/oas2/response-contains-property.d.ts +2 -0
  109. package/lib/rules/oas2/response-contains-property.js +38 -0
  110. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  111. package/lib/rules/oas2/response-mime-type.js +1 -1
  112. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  113. package/lib/rules/oas3/component-name-unique.js +124 -0
  114. package/lib/rules/oas3/index.js +24 -10
  115. package/lib/rules/oas3/no-empty-servers.js +2 -2
  116. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  117. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  118. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  119. package/lib/rules/oas3/no-unused-components.js +2 -2
  120. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  121. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  122. package/lib/rules/oas3/remove-unused-components.js +6 -6
  123. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  124. package/lib/rules/oas3/request-mime-type.js +1 -1
  125. package/lib/rules/oas3/response-contains-property.d.ts +2 -0
  126. package/lib/rules/oas3/response-contains-property.js +40 -0
  127. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  128. package/lib/rules/oas3/response-mime-type.js +1 -1
  129. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  130. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  131. package/lib/rules/other/stats.d.ts +2 -2
  132. package/lib/rules/other/stats.js +45 -16
  133. package/lib/rules/utils.d.ts +5 -2
  134. package/lib/rules/utils.js +54 -6
  135. package/lib/types/config-external-schemas.d.ts +2193 -0
  136. package/lib/types/config-external-schemas.js +805 -0
  137. package/lib/types/index.d.ts +3 -2
  138. package/lib/types/index.js +9 -1
  139. package/lib/types/oas2.js +91 -15
  140. package/lib/types/oas3.js +139 -49
  141. package/lib/types/oas3_1.js +32 -26
  142. package/lib/types/redocly-yaml.js +414 -58
  143. package/lib/typings/openapi.d.ts +3 -2
  144. package/lib/utils.d.ts +15 -3
  145. package/lib/utils.js +73 -7
  146. package/lib/visitors.d.ts +20 -16
  147. package/lib/visitors.js +28 -3
  148. package/lib/walk.d.ts +11 -19
  149. package/lib/walk.js +74 -53
  150. package/package.json +5 -6
  151. package/__tests__/__snapshots__/bundle.test.ts.snap +0 -229
  152. package/__tests__/bundle.test.ts +0 -132
  153. package/__tests__/codeframes.test.ts +0 -531
  154. package/__tests__/fixtures/extension.js +0 -24
  155. package/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/__tests__/fixtures/refs/param-b.yaml +0 -1
  163. package/__tests__/fixtures/refs/param-c.yaml +0 -1
  164. package/__tests__/fixtures/refs/rename.yaml +0 -1
  165. package/__tests__/fixtures/refs/requestBody.yaml +0 -9
  166. package/__tests__/fixtures/refs/schema-a.yaml +0 -1
  167. package/__tests__/fixtures/refs/simple.yaml +0 -1
  168. package/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  169. package/__tests__/fixtures/resolve/External.yaml +0 -10
  170. package/__tests__/fixtures/resolve/External2.yaml +0 -4
  171. package/__tests__/fixtures/resolve/description.md +0 -3
  172. package/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  173. package/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  174. package/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  175. package/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  176. package/__tests__/fixtures/resolve/openapi.yaml +0 -28
  177. package/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  178. package/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  179. package/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  180. package/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  181. package/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  182. package/__tests__/lint.test.ts +0 -17
  183. package/__tests__/login.test.ts +0 -17
  184. package/__tests__/normalizeVisitors.test.ts +0 -151
  185. package/__tests__/ref-utils.test.ts +0 -120
  186. package/__tests__/resolve-http.test.ts +0 -77
  187. package/__tests__/resolve.test.ts +0 -405
  188. package/__tests__/utils.ts +0 -86
  189. package/__tests__/walk.test.ts +0 -1485
  190. package/lib/rules/common/info-description.d.ts +0 -2
  191. package/lib/rules/common/info-description.js +0 -12
  192. package/lib/rules/common/license-url.d.ts +0 -2
  193. package/lib/rules/common/license-url.js +0 -12
  194. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  195. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  196. package/src/__tests__/js-yaml.test.ts +0 -71
  197. package/src/__tests__/lint.test.ts +0 -182
  198. package/src/__tests__/utils.test.ts +0 -74
  199. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  200. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  201. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  202. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  203. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  204. package/src/benchmark/benches/rebilly.yaml +0 -32267
  205. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  206. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  207. package/src/benchmark/benchmark.js +0 -307
  208. package/src/benchmark/colors.js +0 -29
  209. package/src/benchmark/fork.js +0 -83
  210. package/src/benchmark/utils.ts +0 -36
  211. package/src/bundle.ts +0 -371
  212. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  213. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  214. package/src/config/__tests__/config.test.ts +0 -244
  215. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  216. package/src/config/__tests__/fixtures/plugin.js +0 -56
  217. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  218. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  219. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  220. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  221. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  222. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  223. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  224. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  225. package/src/config/__tests__/load.test.ts +0 -83
  226. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  227. package/src/config/all.ts +0 -65
  228. package/src/config/builtIn.ts +0 -37
  229. package/src/config/config-resolvers.ts +0 -359
  230. package/src/config/config.ts +0 -312
  231. package/src/config/index.ts +0 -7
  232. package/src/config/load.ts +0 -84
  233. package/src/config/minimal.ts +0 -58
  234. package/src/config/recommended.ts +0 -58
  235. package/src/config/rules.ts +0 -46
  236. package/src/config/types.ts +0 -168
  237. package/src/config/utils.ts +0 -208
  238. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  239. package/src/decorators/common/info-description-override.ts +0 -24
  240. package/src/decorators/common/operation-description-override.ts +0 -30
  241. package/src/decorators/common/registry-dependencies.ts +0 -25
  242. package/src/decorators/common/remove-x-internal.ts +0 -59
  243. package/src/decorators/common/tag-description-override.ts +0 -25
  244. package/src/decorators/oas2/index.ts +0 -14
  245. package/src/decorators/oas3/index.ts +0 -14
  246. package/src/format/codeframes.ts +0 -210
  247. package/src/format/format.ts +0 -339
  248. package/src/index.ts +0 -68
  249. package/src/js-yaml/index.ts +0 -18
  250. package/src/lint.ts +0 -125
  251. package/src/oas-types.ts +0 -62
  252. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  253. package/src/redocly/index.ts +0 -182
  254. package/src/redocly/redocly-client-types.ts +0 -10
  255. package/src/redocly/registry-api-types.ts +0 -32
  256. package/src/redocly/registry-api.ts +0 -134
  257. package/src/ref-utils.ts +0 -79
  258. package/src/resolve.ts +0 -378
  259. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  260. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  261. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  262. package/src/rules/ajv.ts +0 -103
  263. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  264. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  265. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  266. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  267. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  268. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  269. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  270. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  271. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  272. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  273. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  274. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  275. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  276. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  277. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  278. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  279. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  280. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  281. package/src/rules/common/__tests__/spec.test.ts +0 -62
  282. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  283. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  284. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  285. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  286. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  287. package/src/rules/common/assertions/asserts.ts +0 -137
  288. package/src/rules/common/assertions/index.ts +0 -75
  289. package/src/rules/common/assertions/utils.ts +0 -167
  290. package/src/rules/common/info-contact.ts +0 -15
  291. package/src/rules/common/info-description.ts +0 -10
  292. package/src/rules/common/info-license-url.ts +0 -15
  293. package/src/rules/common/license-url.ts +0 -10
  294. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  295. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  296. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  297. package/src/rules/common/no-identical-paths.ts +0 -24
  298. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  299. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  300. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  301. package/src/rules/common/operation-2xx-response.ts +0 -16
  302. package/src/rules/common/operation-4xx-response.ts +0 -17
  303. package/src/rules/common/operation-description.ts +0 -13
  304. package/src/rules/common/operation-operationId-unique.ts +0 -21
  305. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  306. package/src/rules/common/operation-operationId.ts +0 -17
  307. package/src/rules/common/operation-parameters-unique.ts +0 -48
  308. package/src/rules/common/operation-security-defined.ts +0 -45
  309. package/src/rules/common/operation-singular-tag.ts +0 -17
  310. package/src/rules/common/operation-summary.ts +0 -13
  311. package/src/rules/common/operation-tag-defined.ts +0 -26
  312. package/src/rules/common/parameter-description.ts +0 -22
  313. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  314. package/src/rules/common/path-excludes-patterns.ts +0 -23
  315. package/src/rules/common/path-http-verbs-order.ts +0 -30
  316. package/src/rules/common/path-not-include-query.ts +0 -17
  317. package/src/rules/common/path-params-defined.ts +0 -58
  318. package/src/rules/common/path-segment-plural.ts +0 -31
  319. package/src/rules/common/paths-kebab-case.ts +0 -16
  320. package/src/rules/common/spec.ts +0 -143
  321. package/src/rules/common/tag-description.ts +0 -10
  322. package/src/rules/common/tags-alphabetical.ts +0 -20
  323. package/src/rules/no-unresolved-refs.ts +0 -51
  324. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  325. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  326. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  327. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  328. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  329. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  330. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  331. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  332. package/src/rules/oas2/index.ts +0 -83
  333. package/src/rules/oas2/remove-unused-components.ts +0 -76
  334. package/src/rules/oas2/request-mime-type.ts +0 -17
  335. package/src/rules/oas2/response-mime-type.ts +0 -17
  336. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  337. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  338. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  339. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  340. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  341. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  342. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  343. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  344. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  345. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  346. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  347. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  348. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  349. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  350. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  351. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  352. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  353. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  354. package/src/rules/oas3/index.ts +0 -99
  355. package/src/rules/oas3/no-empty-servers.ts +0 -22
  356. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  357. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  358. package/src/rules/oas3/no-server-example.com.ts +0 -14
  359. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  360. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  361. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  362. package/src/rules/oas3/no-unused-components.ts +0 -75
  363. package/src/rules/oas3/remove-unused-components.ts +0 -84
  364. package/src/rules/oas3/request-mime-type.ts +0 -31
  365. package/src/rules/oas3/response-mime-type.ts +0 -31
  366. package/src/rules/other/stats.ts +0 -44
  367. package/src/rules/utils.ts +0 -123
  368. package/src/types/index.ts +0 -138
  369. package/src/types/oas2.ts +0 -397
  370. package/src/types/oas3.ts +0 -506
  371. package/src/types/oas3_1.ts +0 -251
  372. package/src/types/redocly-yaml.ts +0 -637
  373. package/src/typings/common.ts +0 -9
  374. package/src/typings/openapi.ts +0 -297
  375. package/src/typings/swagger.ts +0 -236
  376. package/src/utils.ts +0 -190
  377. package/src/visitors.ts +0 -448
  378. package/src/walk.ts +0 -416
  379. package/tsconfig.json +0 -8
  380. package/tsconfig.tsbuildinfo +0 -1
@@ -20,62 +20,87 @@ var __rest = (this && this.__rest) || function (s, e) {
20
20
  return t;
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.resolvePreset = exports.resolveLint = exports.resolveApis = exports.resolvePlugins = exports.resolveConfig = void 0;
23
+ exports.resolvePreset = exports.resolveStyleguideConfig = exports.resolveApis = exports.resolvePlugins = exports.resolveConfig = void 0;
24
24
  const path = require("path");
25
- const colorette_1 = require("colorette");
26
25
  const ref_utils_1 = require("../ref-utils");
26
+ const utils_1 = require("../utils");
27
27
  const resolve_1 = require("../resolve");
28
28
  const builtIn_1 = require("./builtIn");
29
- const utils_1 = require("./utils");
30
- const utils_2 = require("../utils");
29
+ const utils_2 = require("./utils");
30
+ const env_1 = require("../env");
31
+ const utils_3 = require("../utils");
31
32
  const config_1 = require("./config");
33
+ const logger_1 = require("../logger");
34
+ const asserts_1 = require("../rules/common/assertions/asserts");
32
35
  function resolveConfig(rawConfig, configPath) {
33
- var _a, _b, _c, _d, _e;
36
+ var _a, _b;
34
37
  return __awaiter(this, void 0, void 0, function* () {
35
- if ((_b = (_a = rawConfig.lint) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_2.isNotString)) {
38
+ if ((_b = (_a = rawConfig.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
36
39
  throw new Error(`Error configuration format not detected in extends value must contain strings`);
37
40
  }
38
- const resolver = new resolve_1.BaseResolver(utils_1.getResolveConfig(rawConfig.resolve));
39
- const configExtends = (_d = (_c = rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint) === null || _c === void 0 ? void 0 : _c.extends) !== null && _d !== void 0 ? _d : ['recommended'];
40
- const recommendedFallback = !((_e = rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint) === null || _e === void 0 ? void 0 : _e.extends);
41
- const lintConfig = Object.assign(Object.assign({}, rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.lint), { extends: configExtends, recommendedFallback });
41
+ const resolver = new resolve_1.BaseResolver(utils_2.getResolveConfig(rawConfig.resolve));
42
42
  const apis = yield resolveApis({
43
- rawConfig: Object.assign(Object.assign({}, rawConfig), { lint: lintConfig }),
43
+ rawConfig,
44
44
  configPath,
45
45
  resolver,
46
46
  });
47
- const lint = yield resolveLint({
48
- lintConfig,
47
+ const styleguide = yield resolveStyleguideConfig({
48
+ styleguideConfig: rawConfig.styleguide,
49
49
  configPath,
50
50
  resolver,
51
51
  });
52
52
  return new config_1.Config(Object.assign(Object.assign({}, rawConfig), { apis,
53
- lint }), configPath);
53
+ styleguide }), configPath);
54
54
  });
55
55
  }
56
56
  exports.resolveConfig = resolveConfig;
57
57
  function resolvePlugins(plugins, configPath = '') {
58
58
  if (!plugins)
59
59
  return [];
60
- // @ts-ignore
61
- const requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require;
60
+ // TODO: implement or reuse Resolver approach so it will work in node and browser envs
61
+ const requireFunc = (plugin) => {
62
+ if (env_1.isBrowser && utils_3.isString(plugin)) {
63
+ logger_1.logger.error(`Cannot load ${plugin}. Plugins aren't supported in browser yet.`);
64
+ return undefined;
65
+ }
66
+ if (utils_3.isString(plugin)) {
67
+ try {
68
+ const absoltePluginPath = path.resolve(path.dirname(configPath), plugin);
69
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
70
+ // @ts-ignore
71
+ return typeof __webpack_require__ === 'function'
72
+ ? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
73
+ // @ts-ignore
74
+ __non_webpack_require__(absoltePluginPath)
75
+ : require(absoltePluginPath);
76
+ }
77
+ catch (e) {
78
+ if (e instanceof SyntaxError) {
79
+ throw e;
80
+ }
81
+ throw new Error(`Failed to load plugin "${plugin}". Please provide a valid path`);
82
+ }
83
+ }
84
+ return plugin;
85
+ };
62
86
  const seenPluginIds = new Map();
63
87
  return plugins
64
88
  .map((p) => {
65
- if (utils_2.isString(p) && ref_utils_1.isAbsoluteUrl(p)) {
66
- throw new Error(colorette_1.red(`We don't support remote plugins yet.`));
89
+ if (utils_3.isString(p) && ref_utils_1.isAbsoluteUrl(p)) {
90
+ throw new Error(logger_1.colorize.red(`We don't support remote plugins yet.`));
67
91
  }
68
92
  // TODO: resolve npm packages similar to eslint
69
- const pluginModule = utils_2.isString(p)
70
- ? requireFunc(path.resolve(path.dirname(configPath), p))
71
- : p;
93
+ const pluginModule = requireFunc(p);
94
+ if (!pluginModule) {
95
+ return;
96
+ }
72
97
  const id = pluginModule.id;
73
98
  if (typeof id !== 'string') {
74
- throw new Error(colorette_1.red(`Plugin must define \`id\` property in ${colorette_1.blue(p.toString())}.`));
99
+ throw new Error(logger_1.colorize.red(`Plugin must define \`id\` property in ${logger_1.colorize.blue(p.toString())}.`));
75
100
  }
76
101
  if (seenPluginIds.has(id)) {
77
102
  const pluginPath = seenPluginIds.get(id);
78
- throw new Error(colorette_1.red(`Plugin "id" must be unique. Plugin ${colorette_1.blue(p.toString())} uses id "${colorette_1.blue(id)}" already seen in ${colorette_1.blue(pluginPath)}`));
103
+ throw new Error(logger_1.colorize.red(`Plugin "id" must be unique. Plugin ${logger_1.colorize.blue(p.toString())} uses id "${logger_1.colorize.blue(id)}" already seen in ${logger_1.colorize.blue(pluginPath)}`));
79
104
  }
80
105
  seenPluginIds.set(id, p.toString());
81
106
  const plugin = Object.assign(Object.assign({ id }, (pluginModule.configs ? { configs: pluginModule.configs } : {})), (pluginModule.typeExtension ? { typeExtension: pluginModule.typeExtension } : {}));
@@ -85,10 +110,10 @@ function resolvePlugins(plugins, configPath = '') {
85
110
  }
86
111
  plugin.rules = {};
87
112
  if (pluginModule.rules.oas3) {
88
- plugin.rules.oas3 = utils_1.prefixRules(pluginModule.rules.oas3, id);
113
+ plugin.rules.oas3 = utils_2.prefixRules(pluginModule.rules.oas3, id);
89
114
  }
90
115
  if (pluginModule.rules.oas2) {
91
- plugin.rules.oas2 = utils_1.prefixRules(pluginModule.rules.oas2, id);
116
+ plugin.rules.oas2 = utils_2.prefixRules(pluginModule.rules.oas2, id);
92
117
  }
93
118
  }
94
119
  if (pluginModule.preprocessors) {
@@ -97,10 +122,10 @@ function resolvePlugins(plugins, configPath = '') {
97
122
  }
98
123
  plugin.preprocessors = {};
99
124
  if (pluginModule.preprocessors.oas3) {
100
- plugin.preprocessors.oas3 = utils_1.prefixRules(pluginModule.preprocessors.oas3, id);
125
+ plugin.preprocessors.oas3 = utils_2.prefixRules(pluginModule.preprocessors.oas3, id);
101
126
  }
102
127
  if (pluginModule.preprocessors.oas2) {
103
- plugin.preprocessors.oas2 = utils_1.prefixRules(pluginModule.preprocessors.oas2, id);
128
+ plugin.preprocessors.oas2 = utils_2.prefixRules(pluginModule.preprocessors.oas2, id);
104
129
  }
105
130
  }
106
131
  if (pluginModule.decorators) {
@@ -109,50 +134,53 @@ function resolvePlugins(plugins, configPath = '') {
109
134
  }
110
135
  plugin.decorators = {};
111
136
  if (pluginModule.decorators.oas3) {
112
- plugin.decorators.oas3 = utils_1.prefixRules(pluginModule.decorators.oas3, id);
137
+ plugin.decorators.oas3 = utils_2.prefixRules(pluginModule.decorators.oas3, id);
113
138
  }
114
139
  if (pluginModule.decorators.oas2) {
115
- plugin.decorators.oas2 = utils_1.prefixRules(pluginModule.decorators.oas2, id);
140
+ plugin.decorators.oas2 = utils_2.prefixRules(pluginModule.decorators.oas2, id);
116
141
  }
117
142
  }
143
+ if (pluginModule.assertions) {
144
+ plugin.assertions = pluginModule.assertions;
145
+ }
118
146
  return plugin;
119
147
  })
120
- .filter(utils_2.notUndefined);
148
+ .filter(utils_3.isDefined);
121
149
  }
122
150
  exports.resolvePlugins = resolvePlugins;
123
151
  function resolveApis({ rawConfig, configPath = '', resolver, }) {
124
152
  var _a, _b;
125
153
  return __awaiter(this, void 0, void 0, function* () {
126
- const { apis = {}, lint: lintConfig = {} } = rawConfig;
127
- let resolvedApis = {};
154
+ const { apis = {}, styleguide: styleguideConfig = {} } = rawConfig;
155
+ const resolvedApis = {};
128
156
  for (const [apiName, apiContent] of Object.entries(apis || {})) {
129
- if ((_b = (_a = apiContent.lint) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_2.isNotString)) {
157
+ if ((_b = (_a = apiContent.styleguide) === null || _a === void 0 ? void 0 : _a.extends) === null || _b === void 0 ? void 0 : _b.some(utils_3.isNotString)) {
130
158
  throw new Error(`Error configuration format not detected in extends value must contain strings`);
131
159
  }
132
- const rawLintConfig = getMergedLintRawConfig(lintConfig, apiContent.lint);
133
- const apiLint = yield resolveLint({
134
- lintConfig: rawLintConfig,
160
+ const rawStyleguideConfig = getMergedRawStyleguideConfig(styleguideConfig, apiContent.styleguide);
161
+ const resolvedApiConfig = yield resolveStyleguideConfig({
162
+ styleguideConfig: rawStyleguideConfig,
135
163
  configPath,
136
164
  resolver,
137
165
  });
138
- resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), { lint: apiLint });
166
+ resolvedApis[apiName] = Object.assign(Object.assign({}, apiContent), { styleguide: resolvedApiConfig });
139
167
  }
140
168
  return resolvedApis;
141
169
  });
142
170
  }
143
171
  exports.resolveApis = resolveApis;
144
- function resolveAndMergeNestedLint({ lintConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
172
+ function resolveAndMergeNestedStyleguideConfig({ styleguideConfig, configPath = '', resolver = new resolve_1.BaseResolver(), }, parentConfigPaths = [], extendPaths = []) {
145
173
  var _a, _b, _c;
146
174
  return __awaiter(this, void 0, void 0, function* () {
147
175
  if (parentConfigPaths.includes(configPath)) {
148
176
  throw new Error(`Circular dependency in config file: "${configPath}"`);
149
177
  }
150
- const plugins = utils_1.getUniquePlugins(resolvePlugins([...((lintConfig === null || lintConfig === void 0 ? void 0 : lintConfig.plugins) || []), builtIn_1.defaultPlugin], configPath));
151
- const pluginPaths = (_a = lintConfig === null || lintConfig === void 0 ? void 0 : lintConfig.plugins) === null || _a === void 0 ? void 0 : _a.filter(utils_2.isString).map((p) => path.resolve(path.dirname(configPath), p));
178
+ const plugins = utils_2.getUniquePlugins(resolvePlugins([...((styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) || []), builtIn_1.defaultPlugin], configPath));
179
+ const pluginPaths = (_a = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.plugins) === null || _a === void 0 ? void 0 : _a.filter(utils_3.isString).map((p) => path.resolve(path.dirname(configPath), p));
152
180
  const resolvedConfigPath = ref_utils_1.isAbsoluteUrl(configPath)
153
181
  ? configPath
154
182
  : configPath && path.resolve(configPath);
155
- const extendConfigs = yield Promise.all(((_b = lintConfig === null || lintConfig === void 0 ? void 0 : lintConfig.extends) === null || _b === void 0 ? void 0 : _b.map((presetItem) => __awaiter(this, void 0, void 0, function* () {
183
+ const extendConfigs = yield Promise.all(((_b = styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.extends) === null || _b === void 0 ? void 0 : _b.map((presetItem) => __awaiter(this, void 0, void 0, function* () {
156
184
  if (!ref_utils_1.isAbsoluteUrl(presetItem) && !path.extname(presetItem)) {
157
185
  return resolvePreset(presetItem, plugins);
158
186
  }
@@ -161,63 +189,65 @@ function resolveAndMergeNestedLint({ lintConfig, configPath = '', resolver = new
161
189
  : ref_utils_1.isAbsoluteUrl(configPath)
162
190
  ? new URL(presetItem, configPath).href
163
191
  : path.resolve(path.dirname(configPath), presetItem);
164
- const extendedLintConfig = yield loadExtendLintConfig(pathItem, resolver);
165
- return yield resolveAndMergeNestedLint({
166
- lintConfig: extendedLintConfig,
192
+ const extendedStyleguideConfig = yield loadExtendStyleguideConfig(pathItem, resolver);
193
+ return yield resolveAndMergeNestedStyleguideConfig({
194
+ styleguideConfig: extendedStyleguideConfig,
167
195
  configPath: pathItem,
168
196
  resolver: resolver,
169
197
  }, [...parentConfigPaths, resolvedConfigPath], extendPaths);
170
198
  }))) || []);
171
- const _d = utils_1.mergeExtends([
199
+ const _d = utils_2.mergeExtends([
172
200
  ...extendConfigs,
173
- Object.assign(Object.assign({}, lintConfig), { plugins, extends: undefined, extendPaths: [...parentConfigPaths, resolvedConfigPath], pluginPaths }),
174
- ]), { plugins: mergedPlugins = [] } = _d, lint = __rest(_d, ["plugins"]);
175
- return Object.assign(Object.assign({}, lint), { extendPaths: (_c = lint.extendPaths) === null || _c === void 0 ? void 0 : _c.filter((path) => path && !ref_utils_1.isAbsoluteUrl(path)), plugins: utils_1.getUniquePlugins(mergedPlugins), recommendedFallback: lintConfig === null || lintConfig === void 0 ? void 0 : lintConfig.recommendedFallback, doNotResolveExamples: lintConfig === null || lintConfig === void 0 ? void 0 : lintConfig.doNotResolveExamples });
201
+ Object.assign(Object.assign({}, styleguideConfig), { plugins, extends: undefined, extendPaths: [...parentConfigPaths, resolvedConfigPath], pluginPaths }),
202
+ ]), { plugins: mergedPlugins = [] } = _d, styleguide = __rest(_d, ["plugins"]);
203
+ return Object.assign(Object.assign({}, styleguide), { extendPaths: (_c = styleguide.extendPaths) === null || _c === void 0 ? void 0 : _c.filter((path) => path && !ref_utils_1.isAbsoluteUrl(path)), plugins: utils_2.getUniquePlugins(mergedPlugins), recommendedFallback: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.recommendedFallback, doNotResolveExamples: styleguideConfig === null || styleguideConfig === void 0 ? void 0 : styleguideConfig.doNotResolveExamples });
176
204
  });
177
205
  }
178
- function resolveLint(lintOpts, parentConfigPaths = [], extendPaths = []) {
206
+ function resolveStyleguideConfig(opts, parentConfigPaths = [], extendPaths = []) {
179
207
  return __awaiter(this, void 0, void 0, function* () {
180
- const resolvedLint = yield resolveAndMergeNestedLint(lintOpts, parentConfigPaths, extendPaths);
181
- return Object.assign(Object.assign({}, resolvedLint), { rules: resolvedLint.rules && groupLintAssertionRules(resolvedLint.rules) });
208
+ const resolvedStyleguideConfig = yield resolveAndMergeNestedStyleguideConfig(opts, parentConfigPaths, extendPaths);
209
+ return Object.assign(Object.assign({}, resolvedStyleguideConfig), { rules: resolvedStyleguideConfig.rules && groupStyleguideAssertionRules(resolvedStyleguideConfig) });
182
210
  });
183
211
  }
184
- exports.resolveLint = resolveLint;
212
+ exports.resolveStyleguideConfig = resolveStyleguideConfig;
185
213
  function resolvePreset(presetName, plugins) {
186
214
  var _a;
187
- const { pluginId, configName } = utils_1.parsePresetName(presetName);
215
+ const { pluginId, configName } = utils_2.parsePresetName(presetName);
188
216
  const plugin = plugins.find((p) => p.id === pluginId);
189
217
  if (!plugin) {
190
- throw new Error(`Invalid config ${colorette_1.red(presetName)}: plugin ${pluginId} is not included.`);
218
+ throw new Error(`Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} is not included.`);
191
219
  }
192
220
  const preset = (_a = plugin.configs) === null || _a === void 0 ? void 0 : _a[configName];
193
221
  if (!preset) {
194
222
  throw new Error(pluginId
195
- ? `Invalid config ${colorette_1.red(presetName)}: plugin ${pluginId} doesn't export config with name ${configName}.`
196
- : `Invalid config ${colorette_1.red(presetName)}: there is no such built-in config.`);
223
+ ? `Invalid config ${logger_1.colorize.red(presetName)}: plugin ${pluginId} doesn't export config with name ${configName}.`
224
+ : `Invalid config ${logger_1.colorize.red(presetName)}: there is no such built-in config.`);
197
225
  }
198
226
  return preset;
199
227
  }
200
228
  exports.resolvePreset = resolvePreset;
201
- function loadExtendLintConfig(filePath, resolver) {
229
+ function loadExtendStyleguideConfig(filePath, resolver) {
202
230
  return __awaiter(this, void 0, void 0, function* () {
203
231
  try {
204
232
  const fileSource = yield resolver.loadExternalRef(filePath);
205
- const rawConfig = utils_1.transformConfig(utils_2.parseYaml(fileSource.body));
206
- if (!rawConfig.lint) {
207
- throw new Error(`Lint configuration format not detected: "${filePath}"`);
233
+ const rawConfig = utils_2.transformConfig(utils_3.parseYaml(fileSource.body));
234
+ if (!rawConfig.styleguide) {
235
+ throw new Error(`Styleguide configuration format not detected: "${filePath}"`);
208
236
  }
209
- return rawConfig.lint;
237
+ return rawConfig.styleguide;
210
238
  }
211
239
  catch (error) {
212
240
  throw new Error(`Failed to load "${filePath}": ${error.message}`);
213
241
  }
214
242
  });
215
243
  }
216
- function getMergedLintRawConfig(configLint, apiLint) {
217
- const resultLint = Object.assign(Object.assign(Object.assign({}, configLint), apiLint), { rules: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.rules), apiLint === null || apiLint === void 0 ? void 0 : apiLint.rules), oas2Rules: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas2Rules), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas2Rules), oas3_0Rules: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_0Rules), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_0Rules), oas3_1Rules: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_1Rules), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_1Rules), preprocessors: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.preprocessors), apiLint === null || apiLint === void 0 ? void 0 : apiLint.preprocessors), oas2Preprocessors: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas2Preprocessors), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas2Preprocessors), oas3_0Preprocessors: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_0Preprocessors), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_0Preprocessors), oas3_1Preprocessors: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_1Preprocessors), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_1Preprocessors), decorators: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.decorators), apiLint === null || apiLint === void 0 ? void 0 : apiLint.decorators), oas2Decorators: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas2Decorators), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas2Decorators), oas3_0Decorators: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_0Decorators), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_0Decorators), oas3_1Decorators: Object.assign(Object.assign({}, configLint === null || configLint === void 0 ? void 0 : configLint.oas3_1Decorators), apiLint === null || apiLint === void 0 ? void 0 : apiLint.oas3_1Decorators), recommendedFallback: (apiLint === null || apiLint === void 0 ? void 0 : apiLint.extends) ? false : configLint.recommendedFallback });
244
+ function getMergedRawStyleguideConfig(rootStyleguideConfig, apiStyleguideConfig) {
245
+ const resultLint = Object.assign(Object.assign(Object.assign({}, rootStyleguideConfig), utils_1.pickDefined(apiStyleguideConfig)), { rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.rules), oas2Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Rules), oas3_0Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Rules), oas3_1Rules: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Rules), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Rules), preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.preprocessors), oas2Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Preprocessors), oas3_0Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Preprocessors), oas3_1Preprocessors: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Preprocessors), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Preprocessors), decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.decorators), oas2Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas2Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas2Decorators), oas3_0Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_0Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_0Decorators), oas3_1Decorators: Object.assign(Object.assign({}, rootStyleguideConfig === null || rootStyleguideConfig === void 0 ? void 0 : rootStyleguideConfig.oas3_1Decorators), apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.oas3_1Decorators), recommendedFallback: (apiStyleguideConfig === null || apiStyleguideConfig === void 0 ? void 0 : apiStyleguideConfig.extends)
246
+ ? false
247
+ : rootStyleguideConfig.recommendedFallback });
218
248
  return resultLint;
219
249
  }
220
- function groupLintAssertionRules(rules) {
250
+ function groupStyleguideAssertionRules({ rules, plugins, }) {
221
251
  if (!rules) {
222
252
  return rules;
223
253
  }
@@ -226,9 +256,19 @@ function groupLintAssertionRules(rules) {
226
256
  // Collect assertion rules
227
257
  const assertions = [];
228
258
  for (const [ruleKey, rule] of Object.entries(rules)) {
229
- if (ruleKey.startsWith('assert/') && typeof rule === 'object' && rule !== null) {
259
+ // keep the old assert/ syntax as an alias
260
+ if ((ruleKey.startsWith('rule/') || ruleKey.startsWith('assert/')) &&
261
+ typeof rule === 'object' &&
262
+ rule !== null) {
230
263
  const assertion = rule;
231
- assertions.push(Object.assign(Object.assign({}, assertion), { assertionId: ruleKey.replace('assert/', '') }));
264
+ if (plugins) {
265
+ registerCustomAssertions(plugins, assertion);
266
+ // We may have custom assertion inside where block
267
+ for (const context of assertion.where || []) {
268
+ registerCustomAssertions(plugins, context);
269
+ }
270
+ }
271
+ assertions.push(Object.assign(Object.assign({}, assertion), { assertionId: ruleKey }));
232
272
  }
233
273
  else {
234
274
  // If it's not an assertion, keep it as is
@@ -240,3 +280,18 @@ function groupLintAssertionRules(rules) {
240
280
  }
241
281
  return transformedRules;
242
282
  }
283
+ function registerCustomAssertions(plugins, assertion) {
284
+ for (const field of utils_3.keysOf(assertion.assertions)) {
285
+ const [pluginId, fn] = field.split('/');
286
+ if (!pluginId || !fn)
287
+ continue;
288
+ const plugin = plugins.find((plugin) => plugin.id === pluginId);
289
+ if (!plugin) {
290
+ throw Error(logger_1.colorize.red(`Plugin ${logger_1.colorize.blue(pluginId)} isn't found.`));
291
+ }
292
+ if (!plugin.assertions || !plugin.assertions[fn]) {
293
+ throw Error(`Plugin ${logger_1.colorize.red(pluginId)} doesn't export assertions function with name ${logger_1.colorize.red(fn)}.`);
294
+ }
295
+ asserts_1.asserts[field] = asserts_1.buildAssertCustomFunction(plugin.assertions[fn]);
296
+ }
297
+ }
@@ -1,9 +1,7 @@
1
- /// <reference types="node" />
2
1
  import { NormalizedProblem } from '../walk';
3
2
  import { OasVersion, OasMajorVersion, Oas2RuleSet, Oas3RuleSet } from '../oas-types';
4
3
  import type { NodeType } from '../types';
5
- import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig, ResolvedLintConfig, RuleConfig } from './types';
6
- export declare const env: NodeJS.ProcessEnv;
4
+ import type { DecoratorConfig, Plugin, PreprocessorConfig, Region, ResolveConfig, ResolvedApi, ResolvedConfig, ResolvedStyleguideConfig, RuleConfig, RuleSettings, Telemetry, ThemeRawConfig } from './types';
7
5
  export declare const IGNORE_FILE = ".redocly.lint-ignore.yaml";
8
6
  export declare const DEFAULT_REGION = "us";
9
7
  export declare const DOMAINS: {
@@ -11,8 +9,8 @@ export declare const DOMAINS: {
11
9
  eu: string;
12
10
  };
13
11
  export declare const AVAILABLE_REGIONS: Region[];
14
- export declare class LintConfig {
15
- rawConfig: ResolvedLintConfig;
12
+ export declare class StyleguideConfig {
13
+ rawConfig: ResolvedStyleguideConfig;
16
14
  configFile?: string | undefined;
17
15
  plugins: Plugin[];
18
16
  ignore: Record<string, Record<string, Set<string>>>;
@@ -25,20 +23,15 @@ export declare class LintConfig {
25
23
  recommendedFallback: boolean;
26
24
  extendPaths: string[];
27
25
  pluginPaths: string[];
28
- constructor(rawConfig: ResolvedLintConfig, configFile?: string | undefined);
26
+ constructor(rawConfig: ResolvedStyleguideConfig, configFile?: string | undefined);
27
+ resolveIgnore(ignoreFile?: string): void;
29
28
  saveIgnore(): void;
30
29
  addIgnore(problem: NormalizedProblem): void;
31
30
  addProblemToIgnore(problem: NormalizedProblem): NormalizedProblem;
32
31
  extendTypes(types: Record<string, NodeType>, version: OasVersion): Record<string, NodeType>;
33
- getRuleSettings(ruleId: string, oasVersion: OasVersion): {
34
- severity: import("../walk").ProblemSeverity | "off";
35
- };
36
- getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): {
37
- severity: import("../walk").ProblemSeverity | "off";
38
- };
39
- getDecoratorSettings(ruleId: string, oasVersion: OasVersion): {
40
- severity: import("../walk").ProblemSeverity | "off";
41
- };
32
+ getRuleSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
33
+ getPreprocessorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
34
+ getDecoratorSettings(ruleId: string, oasVersion: OasVersion): RuleSettings;
42
35
  getUnusedRules(): {
43
36
  rules: string[];
44
37
  preprocessors: string[];
@@ -53,12 +46,13 @@ export declare class Config {
53
46
  rawConfig: ResolvedConfig;
54
47
  configFile?: string | undefined;
55
48
  apis: Record<string, ResolvedApi>;
56
- lint: LintConfig;
49
+ styleguide: StyleguideConfig;
57
50
  resolve: ResolveConfig;
58
51
  licenseKey?: string;
59
52
  region?: Region;
60
- 'features.openapi': Record<string, any>;
61
- 'features.mockServer'?: Record<string, any>;
53
+ theme: ThemeRawConfig;
62
54
  organization?: string;
55
+ files: string[];
56
+ telemetry?: Telemetry;
63
57
  constructor(rawConfig: ResolvedConfig, configFile?: string | undefined);
64
58
  }
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Config = exports.LintConfig = exports.AVAILABLE_REGIONS = exports.DOMAINS = exports.DEFAULT_REGION = exports.IGNORE_FILE = exports.env = void 0;
3
+ exports.Config = exports.StyleguideConfig = exports.AVAILABLE_REGIONS = exports.DOMAINS = exports.DEFAULT_REGION = exports.IGNORE_FILE = void 0;
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
6
  const js_yaml_1 = require("../js-yaml");
7
7
  const utils_1 = require("../utils");
8
8
  const oas_types_1 = require("../oas-types");
9
+ const env_1 = require("../env");
9
10
  const utils_2 = require("./utils");
10
- // Alias environment here so this file can work in browser environments too.
11
- exports.env = typeof process !== 'undefined' ? process.env || {} : {};
11
+ const ref_utils_1 = require("../ref-utils");
12
12
  exports.IGNORE_FILE = '.redocly.lint-ignore.yaml';
13
13
  const IGNORE_BANNER = `# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API.\n` +
14
14
  `# See https://redoc.ly/docs/cli/ for more information.\n`;
@@ -19,7 +19,7 @@ function getDomains() {
19
19
  eu: 'eu.redocly.com',
20
20
  };
21
21
  // FIXME: temporary fix for our lab environments
22
- const domain = exports.env.REDOCLY_DOMAIN;
22
+ const domain = env_1.env.REDOCLY_DOMAIN;
23
23
  if (domain === null || domain === void 0 ? void 0 : domain.endsWith('.redocly.host')) {
24
24
  domains[domain.split('.')[0]] = domain;
25
25
  }
@@ -28,9 +28,19 @@ function getDomains() {
28
28
  }
29
29
  return domains;
30
30
  }
31
+ function getIgnoreFilePath(configFile) {
32
+ if (configFile) {
33
+ return utils_1.doesYamlFileExist(configFile)
34
+ ? path.join(path.dirname(configFile), exports.IGNORE_FILE)
35
+ : path.join(configFile, exports.IGNORE_FILE);
36
+ }
37
+ else {
38
+ return env_1.isBrowser ? undefined : path.join(process.cwd(), exports.IGNORE_FILE);
39
+ }
40
+ }
31
41
  exports.DOMAINS = getDomains();
32
42
  exports.AVAILABLE_REGIONS = Object.keys(exports.DOMAINS);
33
- class LintConfig {
43
+ class StyleguideConfig {
34
44
  constructor(rawConfig, configFile) {
35
45
  this.rawConfig = rawConfig;
36
46
  this.configFile = configFile;
@@ -57,21 +67,20 @@ class LintConfig {
57
67
  };
58
68
  this.extendPaths = rawConfig.extendPaths || [];
59
69
  this.pluginPaths = rawConfig.pluginPaths || [];
60
- const dir = this.configFile
61
- ? path.dirname(this.configFile)
62
- : (typeof process !== 'undefined' && process.cwd()) || '';
63
- const ignoreFile = path.join(dir, exports.IGNORE_FILE);
64
- /* no crash when using it on the client */
65
- if (fs.hasOwnProperty('existsSync') && fs.existsSync(ignoreFile)) {
66
- // TODO: parse errors
67
- this.ignore =
68
- js_yaml_1.parseYaml(fs.readFileSync(ignoreFile, 'utf-8')) || {};
69
- // resolve ignore paths
70
- for (const fileName of Object.keys(this.ignore)) {
71
- this.ignore[path.resolve(path.dirname(ignoreFile), fileName)] = this.ignore[fileName];
72
- for (const ruleId of Object.keys(this.ignore[fileName])) {
73
- this.ignore[fileName][ruleId] = new Set(this.ignore[fileName][ruleId]);
74
- }
70
+ this.resolveIgnore(getIgnoreFilePath(configFile));
71
+ }
72
+ resolveIgnore(ignoreFile) {
73
+ if (!ignoreFile || !utils_1.doesYamlFileExist(ignoreFile))
74
+ return;
75
+ this.ignore =
76
+ js_yaml_1.parseYaml(fs.readFileSync(ignoreFile, 'utf-8')) || {};
77
+ // resolve ignore paths
78
+ for (const fileName of Object.keys(this.ignore)) {
79
+ this.ignore[ref_utils_1.isAbsoluteUrl(fileName) ? fileName : path.resolve(path.dirname(ignoreFile), fileName)] = this.ignore[fileName];
80
+ for (const ruleId of Object.keys(this.ignore[fileName])) {
81
+ this.ignore[fileName][ruleId] = new Set(this.ignore[fileName][ruleId]);
82
+ }
83
+ if (!ref_utils_1.isAbsoluteUrl(fileName)) {
75
84
  delete this.ignore[fileName];
76
85
  }
77
86
  }
@@ -81,8 +90,10 @@ class LintConfig {
81
90
  const ignoreFile = path.join(dir, exports.IGNORE_FILE);
82
91
  const mapped = {};
83
92
  for (const absFileName of Object.keys(this.ignore)) {
84
- const ignoredRules = (mapped[utils_1.slash(path.relative(dir, absFileName))] =
85
- this.ignore[absFileName]);
93
+ const mappedDefinitionName = ref_utils_1.isAbsoluteUrl(absFileName)
94
+ ? absFileName
95
+ : utils_1.slash(path.relative(dir, absFileName));
96
+ const ignoredRules = (mapped[mappedDefinitionName] = this.ignore[absFileName]);
86
97
  for (const ruleId of Object.keys(ignoredRules)) {
87
98
  ignoredRules[ruleId] = Array.from(ignoredRules[ruleId]);
88
99
  }
@@ -118,10 +129,12 @@ class LintConfig {
118
129
  if (!plugin.typeExtension.oas3)
119
130
  continue;
120
131
  extendedTypes = plugin.typeExtension.oas3(extendedTypes, version);
132
+ break;
121
133
  case oas_types_1.OasVersion.Version2:
122
134
  if (!plugin.typeExtension.oas2)
123
135
  continue;
124
136
  extendedTypes = plugin.typeExtension.oas2(extendedTypes, version);
137
+ break;
125
138
  default:
126
139
  throw new Error('Not implemented');
127
140
  }
@@ -186,12 +199,14 @@ class LintConfig {
186
199
  getRulesForOasVersion(version) {
187
200
  switch (version) {
188
201
  case oas_types_1.OasMajorVersion.Version3:
202
+ // eslint-disable-next-line no-case-declarations
189
203
  const oas3Rules = []; // default ruleset
190
204
  this.plugins.forEach((p) => { var _a; return ((_a = p.preprocessors) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.preprocessors.oas3); });
191
205
  this.plugins.forEach((p) => { var _a; return ((_a = p.rules) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.rules.oas3); });
192
206
  this.plugins.forEach((p) => { var _a; return ((_a = p.decorators) === null || _a === void 0 ? void 0 : _a.oas3) && oas3Rules.push(p.decorators.oas3); });
193
207
  return oas3Rules;
194
208
  case oas_types_1.OasMajorVersion.Version2:
209
+ // eslint-disable-next-line no-case-declarations
195
210
  const oas2Rules = []; // default ruleset
196
211
  this.plugins.forEach((p) => { var _a; return ((_a = p.preprocessors) === null || _a === void 0 ? void 0 : _a.oas2) && oas2Rules.push(p.preprocessors.oas2); });
197
212
  this.plugins.forEach((p) => { var _a; return ((_a = p.rules) === null || _a === void 0 ? void 0 : _a.oas2) && oas2Rules.push(p.rules.oas2); });
@@ -227,18 +242,19 @@ class LintConfig {
227
242
  }
228
243
  }
229
244
  }
230
- exports.LintConfig = LintConfig;
245
+ exports.StyleguideConfig = StyleguideConfig;
231
246
  class Config {
232
247
  constructor(rawConfig, configFile) {
233
248
  this.rawConfig = rawConfig;
234
249
  this.configFile = configFile;
235
250
  this.apis = rawConfig.apis || {};
236
- this.lint = new LintConfig(rawConfig.lint || {}, configFile);
237
- this['features.openapi'] = rawConfig['features.openapi'] || {};
238
- this['features.mockServer'] = rawConfig['features.mockServer'] || {};
251
+ this.styleguide = new StyleguideConfig(rawConfig.styleguide || {}, configFile);
252
+ this.theme = rawConfig.theme || {};
239
253
  this.resolve = utils_2.getResolveConfig(rawConfig === null || rawConfig === void 0 ? void 0 : rawConfig.resolve);
240
254
  this.region = rawConfig.region;
241
255
  this.organization = rawConfig.organization;
256
+ this.files = rawConfig.files || [];
257
+ this.telemetry = rawConfig.telemetry;
242
258
  }
243
259
  }
244
260
  exports.Config = Config;
@@ -1,6 +1,19 @@
1
1
  import { Config } from './config';
2
- import type { RawConfig } from './types';
3
- export declare function loadConfig(configPath?: string | undefined, customExtends?: string[]): Promise<Config>;
2
+ import type { RawConfig, Region } from './types';
3
+ import { RegionalTokenWithValidity } from '../redocly/redocly-client-types';
4
+ export declare function loadConfig(options?: {
5
+ configPath?: string;
6
+ customExtends?: string[];
7
+ processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>;
8
+ files?: string[];
9
+ region?: Region;
10
+ }): Promise<Config>;
4
11
  export declare const CONFIG_FILE_NAMES: string[];
5
12
  export declare function findConfig(dir?: string): string | undefined;
6
- export declare function getConfig(configPath?: string | undefined): Promise<RawConfig>;
13
+ export declare function getConfig(configPath?: string | undefined, processRawConfig?: (rawConfig: RawConfig) => void | Promise<void>): Promise<RawConfig>;
14
+ declare type CreateConfigOptions = {
15
+ extends?: string[];
16
+ tokens?: RegionalTokenWithValidity[];
17
+ };
18
+ export declare function createConfig(config: string | RawConfig, options?: CreateConfigOptions): Promise<Config>;
19
+ export {};