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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/lib/bundle.js +21 -4
  2. package/lib/config/all.js +1 -0
  3. package/lib/config/config-resolvers.js +8 -2
  4. package/lib/config/minimal.js +1 -0
  5. package/lib/config/recommended.js +1 -0
  6. package/lib/config/types.d.ts +1 -1
  7. package/lib/config/utils.js +15 -1
  8. package/lib/lint.js +17 -2
  9. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  10. package/lib/rules/common/spec-strict-refs.js +30 -0
  11. package/lib/rules/common/spec.js +1 -0
  12. package/lib/rules/oas2/index.d.ts +1 -0
  13. package/lib/rules/oas2/index.js +2 -0
  14. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  15. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  16. package/lib/rules/oas3/index.js +2 -0
  17. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +2 -2
  18. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +3 -3
  19. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  20. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  21. package/lib/rules/oas3/spec-components-invalid-map-name.js +0 -5
  22. package/lib/types/redocly-yaml.js +6 -1
  23. package/lib/walk.d.ts +6 -5
  24. package/lib/walk.js +26 -31
  25. package/package.json +1 -1
  26. package/__tests__/utils.ts +0 -88
  27. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -437
  28. package/src/__tests__/bundle.test.ts +0 -236
  29. package/src/__tests__/codeframes.test.ts +0 -530
  30. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +0 -5
  31. package/src/__tests__/fixtures/extension.js +0 -24
  32. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  33. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  34. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  35. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  36. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  37. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  38. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  39. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  40. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  41. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  42. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  43. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  44. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  45. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  46. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  47. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  48. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  49. package/src/__tests__/fixtures/resolve/description.md +0 -3
  50. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  51. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  52. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  53. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  54. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  55. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  56. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  57. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  58. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  59. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  60. package/src/__tests__/format.test.ts +0 -76
  61. package/src/__tests__/js-yaml.test.ts +0 -73
  62. package/src/__tests__/lint.test.ts +0 -388
  63. package/src/__tests__/logger-browser.test.ts +0 -53
  64. package/src/__tests__/logger.test.ts +0 -47
  65. package/src/__tests__/login.test.ts +0 -17
  66. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  67. package/src/__tests__/output-browser.test.ts +0 -18
  68. package/src/__tests__/output.test.ts +0 -15
  69. package/src/__tests__/ref-utils.test.ts +0 -120
  70. package/src/__tests__/resolve-http.test.ts +0 -77
  71. package/src/__tests__/resolve.test.ts +0 -430
  72. package/src/__tests__/utils-browser.test.ts +0 -11
  73. package/src/__tests__/utils.test.ts +0 -144
  74. package/src/__tests__/walk.test.ts +0 -1545
  75. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  76. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  77. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  78. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -35
  79. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  80. package/src/benchmark/benches/rebilly.yaml +0 -32275
  81. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  82. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  83. package/src/benchmark/benchmark.js +0 -311
  84. package/src/benchmark/colors.js +0 -29
  85. package/src/benchmark/fork.js +0 -83
  86. package/src/benchmark/utils.ts +0 -36
  87. package/src/bundle.ts +0 -399
  88. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -161
  89. package/src/config/__tests__/__snapshots__/config.test.ts.snap +0 -144
  90. package/src/config/__tests__/config-resolvers.test.ts +0 -491
  91. package/src/config/__tests__/config.test.ts +0 -307
  92. package/src/config/__tests__/fixtures/ingore-file.ts +0 -8
  93. package/src/config/__tests__/fixtures/load-redocly.yaml +0 -2
  94. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -2
  95. package/src/config/__tests__/fixtures/plugin.js +0 -56
  96. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -11
  97. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -69
  98. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -7
  99. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +0 -17
  100. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -18
  101. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +0 -15
  102. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -9
  103. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -80
  104. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -3
  105. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -4
  106. package/src/config/__tests__/load.test.ts +0 -167
  107. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  108. package/src/config/__tests__/utils.test.ts +0 -204
  109. package/src/config/all.ts +0 -73
  110. package/src/config/builtIn.ts +0 -37
  111. package/src/config/config-resolvers.ts +0 -465
  112. package/src/config/config.ts +0 -330
  113. package/src/config/index.ts +0 -7
  114. package/src/config/load.ts +0 -144
  115. package/src/config/minimal.ts +0 -60
  116. package/src/config/recommended.ts +0 -60
  117. package/src/config/rules.ts +0 -54
  118. package/src/config/types.ts +0 -216
  119. package/src/config/utils.ts +0 -333
  120. package/src/decorators/__tests__/filter-in.test.ts +0 -310
  121. package/src/decorators/__tests__/filter-out.test.ts +0 -335
  122. package/src/decorators/__tests__/media-type-examples-override.test.ts +0 -665
  123. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  124. package/src/decorators/__tests__/resources/request.yaml +0 -3
  125. package/src/decorators/__tests__/resources/response.yaml +0 -3
  126. package/src/decorators/common/filters/filter-helper.ts +0 -72
  127. package/src/decorators/common/filters/filter-in.ts +0 -18
  128. package/src/decorators/common/filters/filter-out.ts +0 -18
  129. package/src/decorators/common/info-description-override.ts +0 -24
  130. package/src/decorators/common/info-override.ts +0 -15
  131. package/src/decorators/common/media-type-examples-override.ts +0 -79
  132. package/src/decorators/common/operation-description-override.ts +0 -30
  133. package/src/decorators/common/registry-dependencies.ts +0 -25
  134. package/src/decorators/common/remove-x-internal.ts +0 -59
  135. package/src/decorators/common/tag-description-override.ts +0 -25
  136. package/src/decorators/oas2/index.ts +0 -20
  137. package/src/decorators/oas3/index.ts +0 -22
  138. package/src/env.ts +0 -5
  139. package/src/format/codeframes.ts +0 -216
  140. package/src/format/format.ts +0 -375
  141. package/src/index.ts +0 -71
  142. package/src/js-yaml/index.ts +0 -14
  143. package/src/lint.ts +0 -130
  144. package/src/logger.ts +0 -34
  145. package/src/oas-types.ts +0 -57
  146. package/src/output.ts +0 -7
  147. package/src/redocly/__tests__/redocly-client.test.ts +0 -146
  148. package/src/redocly/index.ts +0 -187
  149. package/src/redocly/redocly-client-types.ts +0 -10
  150. package/src/redocly/registry-api-types.ts +0 -32
  151. package/src/redocly/registry-api.ts +0 -149
  152. package/src/ref-utils.ts +0 -85
  153. package/src/resolve.ts +0 -417
  154. package/src/rules/__tests__/fixtures/code-sample.php +0 -9
  155. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  156. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  157. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -257
  158. package/src/rules/__tests__/utils.test.ts +0 -160
  159. package/src/rules/ajv.ts +0 -102
  160. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  161. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  162. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  163. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -210
  164. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  165. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  166. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -192
  167. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -231
  168. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  169. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  170. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  171. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  172. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  173. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  174. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -202
  175. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  176. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -264
  177. package/src/rules/common/__tests__/security-defined.test.ts +0 -175
  178. package/src/rules/common/__tests__/spec.test.ts +0 -555
  179. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  180. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  181. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -869
  182. package/src/rules/common/assertions/__tests__/index.test.ts +0 -100
  183. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -236
  184. package/src/rules/common/assertions/asserts.ts +0 -357
  185. package/src/rules/common/assertions/index.ts +0 -56
  186. package/src/rules/common/assertions/utils.ts +0 -331
  187. package/src/rules/common/info-contact.ts +0 -15
  188. package/src/rules/common/info-license-url.ts +0 -10
  189. package/src/rules/common/info-license.ts +0 -15
  190. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  191. package/src/rules/common/no-enum-type-mismatch.ts +0 -52
  192. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  193. package/src/rules/common/no-identical-paths.ts +0 -24
  194. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  195. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  196. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  197. package/src/rules/common/operation-2xx-response.ts +0 -24
  198. package/src/rules/common/operation-4xx-response.ts +0 -24
  199. package/src/rules/common/operation-description.ts +0 -13
  200. package/src/rules/common/operation-operationId-unique.ts +0 -21
  201. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  202. package/src/rules/common/operation-operationId.ts +0 -17
  203. package/src/rules/common/operation-parameters-unique.ts +0 -48
  204. package/src/rules/common/operation-singular-tag.ts +0 -17
  205. package/src/rules/common/operation-summary.ts +0 -13
  206. package/src/rules/common/operation-tag-defined.ts +0 -26
  207. package/src/rules/common/parameter-description.ts +0 -22
  208. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  209. package/src/rules/common/path-excludes-patterns.ts +0 -23
  210. package/src/rules/common/path-http-verbs-order.ts +0 -30
  211. package/src/rules/common/path-not-include-query.ts +0 -17
  212. package/src/rules/common/path-params-defined.ts +0 -65
  213. package/src/rules/common/path-segment-plural.ts +0 -31
  214. package/src/rules/common/paths-kebab-case.ts +0 -19
  215. package/src/rules/common/required-string-property-missing-min-length.ts +0 -44
  216. package/src/rules/common/response-contains-header.ts +0 -35
  217. package/src/rules/common/scalar-property-missing-example.ts +0 -58
  218. package/src/rules/common/security-defined.ts +0 -65
  219. package/src/rules/common/spec.ts +0 -174
  220. package/src/rules/common/tag-description.ts +0 -10
  221. package/src/rules/common/tags-alphabetical.ts +0 -20
  222. package/src/rules/no-unresolved-refs.ts +0 -51
  223. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  224. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  225. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  226. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  227. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  228. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  229. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  230. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -35
  231. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  232. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  233. package/src/rules/oas2/index.ts +0 -89
  234. package/src/rules/oas2/remove-unused-components.ts +0 -81
  235. package/src/rules/oas2/request-mime-type.ts +0 -17
  236. package/src/rules/oas2/response-contains-property.ts +0 -36
  237. package/src/rules/oas2/response-mime-type.ts +0 -17
  238. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  239. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  240. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  241. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  242. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -473
  243. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  244. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  245. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  246. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +0 -145
  247. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -389
  248. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  249. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  250. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  251. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  252. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  253. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  254. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  255. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -505
  256. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -298
  257. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  258. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +0 -305
  259. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  260. package/src/rules/oas3/index.ts +0 -109
  261. package/src/rules/oas3/no-empty-servers.ts +0 -22
  262. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  263. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -49
  264. package/src/rules/oas3/no-server-example.com.ts +0 -14
  265. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  266. package/src/rules/oas3/no-server-variables-empty-enum.ts +0 -66
  267. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  268. package/src/rules/oas3/no-unused-components.ts +0 -75
  269. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +0 -36
  270. package/src/rules/oas3/remove-unused-components.ts +0 -95
  271. package/src/rules/oas3/request-mime-type.ts +0 -31
  272. package/src/rules/oas3/response-contains-property.ts +0 -38
  273. package/src/rules/oas3/response-mime-type.ts +0 -31
  274. package/src/rules/oas3/spec-components-invalid-map-name.ts +0 -74
  275. package/src/rules/other/stats.ts +0 -73
  276. package/src/rules/utils.ts +0 -191
  277. package/src/types/index.ts +0 -149
  278. package/src/types/oas2.ts +0 -478
  279. package/src/types/oas3.ts +0 -597
  280. package/src/types/oas3_1.ts +0 -258
  281. package/src/types/redocly-yaml.ts +0 -1010
  282. package/src/typings/common.ts +0 -17
  283. package/src/typings/openapi.ts +0 -298
  284. package/src/typings/swagger.ts +0 -236
  285. package/src/utils.ts +0 -276
  286. package/src/visitors.ts +0 -491
  287. package/src/walk.ts +0 -453
  288. package/tsconfig.json +0 -8
  289. package/tsconfig.tsbuildinfo +0 -1
package/src/index.ts DELETED
@@ -1,71 +0,0 @@
1
- export { BundleOutputFormat, readFileFromUrl, slash, doesYamlFileExist, isTruthy } from './utils';
2
- export { Oas3_1Types } from './types/oas3_1';
3
- export { Oas3Types } from './types/oas3';
4
- export { Oas2Types } from './types/oas2';
5
- export { ConfigTypes } from './types/redocly-yaml';
6
- export type {
7
- Oas3Definition,
8
- Oas3_1Definition,
9
- Oas3Components,
10
- Oas3PathItem,
11
- Oas3Paths,
12
- Oas3ComponentName,
13
- Oas3Schema,
14
- Oas3_1Schema,
15
- Oas3Tag,
16
- Oas3_1Webhooks,
17
- Referenced,
18
- OasRef,
19
- } from './typings/openapi';
20
- export type { Oas2Definition } from './typings/swagger';
21
- export type { StatsAccumulator, StatsName } from './typings/common';
22
- export { normalizeTypes } from './types';
23
- export { Stats } from './rules/other/stats';
24
-
25
- export {
26
- Config,
27
- StyleguideConfig,
28
- RawConfig,
29
- IGNORE_FILE,
30
- Region,
31
- getMergedConfig,
32
- transformConfig,
33
- loadConfig,
34
- getConfig,
35
- findConfig,
36
- CONFIG_FILE_NAMES,
37
- RuleSeverity,
38
- createConfig,
39
- ResolvedApi,
40
- } from './config';
41
-
42
- export { RedoclyClient, isRedoclyRegistryURL } from './redocly';
43
-
44
- export {
45
- Source,
46
- BaseResolver,
47
- Document,
48
- resolveDocument,
49
- ResolveError,
50
- YamlParseError,
51
- makeDocumentFromString,
52
- } from './resolve';
53
- export { parseYaml, stringifyYaml } from './js-yaml';
54
- export { unescapePointer, isRef, isAbsoluteUrl } from './ref-utils';
55
- export { detectOpenAPI, OasMajorVersion, openAPIMajor, OasVersion } from './oas-types';
56
- export { normalizeVisitors } from './visitors';
57
-
58
- export {
59
- WalkContext,
60
- walkDocument,
61
- NormalizedProblem,
62
- ProblemSeverity,
63
- LineColLocationObject,
64
- LocationObject,
65
- Loc,
66
- } from './walk';
67
-
68
- export { getAstNodeByPointer, getLineColLocation } from './format/codeframes';
69
- export { formatProblems, OutputFormat, getTotals, Totals } from './format/format';
70
- export { lint, lint as validate, lintDocument, lintFromString, lintConfig } from './lint';
71
- export { bundle, bundleDocument, mapTypeToComponent } from './bundle';
@@ -1,14 +0,0 @@
1
- // TODO: add a type for "types" https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/js-yaml/index.d.ts
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3
- // @ts-ignore
4
- import { JSON_SCHEMA, types, LoadOptions, DumpOptions, load, dump } from 'js-yaml';
5
-
6
- const DEFAULT_SCHEMA_WITHOUT_TIMESTAMP = JSON_SCHEMA.extend({
7
- implicit: [types.merge],
8
- explicit: [types.binary, types.omap, types.pairs, types.set],
9
- });
10
-
11
- export const parseYaml = (str: string, opts?: LoadOptions): unknown =>
12
- load(str, { schema: DEFAULT_SCHEMA_WITHOUT_TIMESTAMP, ...opts });
13
-
14
- export const stringifyYaml = (obj: any, opts?: DumpOptions): string => dump(obj, opts);
package/src/lint.ts DELETED
@@ -1,130 +0,0 @@
1
- import { BaseResolver, resolveDocument, Document, makeDocumentFromString } from './resolve';
2
- import { normalizeVisitors } from './visitors';
3
- import { Oas3_1Types } from './types/oas3_1';
4
- import { Oas3Types } from './types/oas3';
5
- import { Oas2Types } from './types/oas2';
6
- import { NodeType } from './types';
7
- import { ProblemSeverity, WalkContext, walkDocument } from './walk';
8
- import { StyleguideConfig, Config, initRules, defaultPlugin, resolvePlugins } from './config';
9
- import { normalizeTypes } from './types';
10
- import { releaseAjvInstance } from './rules/ajv';
11
- import { detectOpenAPI, Oas3RuleSet, OasMajorVersion, OasVersion, openAPIMajor } from './oas-types';
12
- import { ConfigTypes } from './types/redocly-yaml';
13
- import { OasSpec } from './rules/common/spec';
14
-
15
- export async function lint(opts: {
16
- ref: string;
17
- config: Config;
18
- externalRefResolver?: BaseResolver;
19
- }) {
20
- const { ref, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
21
- const document = (await externalRefResolver.resolveDocument(null, ref, true)) as Document;
22
-
23
- return lintDocument({
24
- document,
25
- ...opts,
26
- externalRefResolver,
27
- config: opts.config.styleguide,
28
- });
29
- }
30
-
31
- export async function lintFromString(opts: {
32
- source: string;
33
- absoluteRef?: string;
34
- config: Config;
35
- externalRefResolver?: BaseResolver;
36
- }) {
37
- const { source, absoluteRef, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
38
- const document = makeDocumentFromString(source, absoluteRef || '/');
39
-
40
- return lintDocument({
41
- document,
42
- ...opts,
43
- externalRefResolver,
44
- config: opts.config.styleguide,
45
- });
46
- }
47
-
48
- export async function lintDocument(opts: {
49
- document: Document;
50
- config: StyleguideConfig;
51
- customTypes?: Record<string, NodeType>;
52
- externalRefResolver: BaseResolver;
53
- }) {
54
- releaseAjvInstance(); // FIXME: preprocessors can modify nodes which are then cached to ajv-instance by absolute path
55
-
56
- const { document, customTypes, externalRefResolver, config } = opts;
57
- const oasVersion = detectOpenAPI(document.parsed);
58
- const oasMajorVersion = openAPIMajor(oasVersion);
59
- const rules = config.getRulesForOasVersion(oasMajorVersion);
60
- const types = normalizeTypes(
61
- config.extendTypes(
62
- customTypes ?? oasMajorVersion === OasMajorVersion.Version3
63
- ? oasVersion === OasVersion.Version3_1
64
- ? Oas3_1Types
65
- : Oas3Types
66
- : Oas2Types,
67
- oasVersion
68
- ),
69
- config
70
- );
71
-
72
- const ctx: WalkContext = {
73
- problems: [],
74
- oasVersion: oasVersion,
75
- visitorsData: {},
76
- };
77
-
78
- const preprocessors = initRules(rules as any, config, 'preprocessors', oasVersion);
79
- const regularRules = initRules(rules as Oas3RuleSet[], config, 'rules', oasVersion);
80
- const normalizedVisitors = normalizeVisitors([...preprocessors, ...regularRules] as any, types);
81
- const resolvedRefMap = await resolveDocument({
82
- rootDocument: document,
83
- rootType: types.Root,
84
- externalRefResolver,
85
- });
86
-
87
- walkDocument({
88
- document,
89
- rootType: types.Root,
90
- normalizedVisitors,
91
- resolvedRefMap,
92
- ctx,
93
- });
94
- return ctx.problems.map((problem) => config.addProblemToIgnore(problem));
95
- }
96
-
97
- export async function lintConfig(opts: { document: Document; severity?: ProblemSeverity }) {
98
- const { document, severity } = opts;
99
-
100
- const ctx: WalkContext = {
101
- problems: [],
102
- oasVersion: OasVersion.Version3_0,
103
- visitorsData: {},
104
- };
105
- const plugins = resolvePlugins([defaultPlugin]);
106
- const config = new StyleguideConfig({
107
- plugins,
108
- rules: { spec: 'error' },
109
- });
110
-
111
- const types = normalizeTypes(ConfigTypes, config);
112
- const rules = [
113
- {
114
- severity: severity || 'error',
115
- ruleId: 'configuration spec',
116
- visitor: OasSpec({ severity: 'error' }),
117
- },
118
- ];
119
- const normalizedVisitors = normalizeVisitors(rules, types);
120
-
121
- walkDocument({
122
- document,
123
- rootType: types.ConfigRoot,
124
- normalizedVisitors,
125
- resolvedRefMap: new Map(),
126
- ctx,
127
- });
128
-
129
- return ctx.problems;
130
- }
package/src/logger.ts DELETED
@@ -1,34 +0,0 @@
1
- import * as colorette from 'colorette';
2
- export { options as colorOptions } from 'colorette';
3
-
4
- import { isBrowser } from './env';
5
- import { identity } from './utils';
6
-
7
- export const colorize = new Proxy(colorette, {
8
- get(target: typeof colorette, prop: string): typeof identity {
9
- if (isBrowser) {
10
- return identity;
11
- }
12
-
13
- return (target as any)[prop];
14
- },
15
- });
16
- class Logger {
17
- protected stderr(str: string) {
18
- return process.stderr.write(str);
19
- }
20
-
21
- info(str: string) {
22
- return isBrowser ? console.log(str) : this.stderr(str);
23
- }
24
-
25
- warn(str: string) {
26
- return isBrowser ? console.warn(str) : this.stderr(colorize.yellow(str));
27
- }
28
-
29
- error(str: string) {
30
- return isBrowser ? console.error(str) : this.stderr(colorize.red(str));
31
- }
32
- }
33
-
34
- export const logger = new Logger();
package/src/oas-types.ts DELETED
@@ -1,57 +0,0 @@
1
- import { Oas3Rule, Oas3Preprocessor, Oas2Rule, Oas2Preprocessor } from './visitors';
2
-
3
- export type RuleSet<T> = Record<string, T>;
4
-
5
- export enum OasVersion {
6
- Version2 = 'oas2',
7
- Version3_0 = 'oas3_0',
8
- Version3_1 = 'oas3_1',
9
- }
10
-
11
- export enum OasMajorVersion {
12
- Version2 = 'oas2',
13
- Version3 = 'oas3',
14
- }
15
-
16
- export type Oas3RuleSet = Record<string, Oas3Rule>;
17
- export type Oas2RuleSet = Record<string, Oas2Rule>;
18
- export type Oas3PreprocessorsSet = Record<string, Oas3Preprocessor>;
19
- export type Oas2PreprocessorsSet = Record<string, Oas2Preprocessor>;
20
- export type Oas3DecoratorsSet = Record<string, Oas3Preprocessor>;
21
- export type Oas2DecoratorsSet = Record<string, Oas2Preprocessor>;
22
-
23
- export function detectOpenAPI(root: any): OasVersion {
24
- if (typeof root !== 'object') {
25
- throw new Error(`Document must be JSON object, got ${typeof root}`);
26
- }
27
-
28
- if (!(root.openapi || root.swagger)) {
29
- throw new Error('This doesn’t look like an OpenAPI document.\n');
30
- }
31
-
32
- if (root.openapi && typeof root.openapi !== 'string') {
33
- throw new Error(`Invalid OpenAPI version: should be a string but got "${typeof root.openapi}"`);
34
- }
35
-
36
- if (root.openapi && root.openapi.startsWith('3.0')) {
37
- return OasVersion.Version3_0;
38
- }
39
-
40
- if (root.openapi && root.openapi.startsWith('3.1')) {
41
- return OasVersion.Version3_1;
42
- }
43
-
44
- if (root.swagger && root.swagger === '2.0') {
45
- return OasVersion.Version2;
46
- }
47
-
48
- throw new Error(`Unsupported OpenAPI Version: ${root.openapi || root.swagger}`);
49
- }
50
-
51
- export function openAPIMajor(version: OasVersion): OasMajorVersion {
52
- if (version === OasVersion.Version2) {
53
- return OasMajorVersion.Version2;
54
- } else {
55
- return OasMajorVersion.Version3;
56
- }
57
- }
package/src/output.ts DELETED
@@ -1,7 +0,0 @@
1
- import { isBrowser } from './env';
2
-
3
- export const output = {
4
- write(str: string) {
5
- return isBrowser ? undefined : process.stdout.write(str);
6
- },
7
- };
@@ -1,146 +0,0 @@
1
- import { RedoclyClient } from '../index';
2
-
3
- jest.mock('node-fetch', () => ({
4
- default: jest.fn(() => ({
5
- ok: true,
6
- json: jest.fn().mockResolvedValue({}),
7
- })),
8
- }));
9
-
10
- describe('RedoclyClient', () => {
11
- const REDOCLY_DOMAIN_US = 'redocly.com';
12
- const REDOCLY_DOMAIN_EU = 'eu.redocly.com';
13
- const REDOCLY_AUTHORIZATION_TOKEN = 'redocly-auth-token';
14
- const testRedoclyDomain = 'redoclyDomain.com';
15
- const testToken = 'test-token';
16
-
17
- afterEach(() => {
18
- delete process.env.REDOCLY_DOMAIN;
19
- });
20
-
21
- it('should resolve the US domain by default', () => {
22
- const client = new RedoclyClient();
23
- expect(client.domain).toBe(REDOCLY_DOMAIN_US);
24
- });
25
-
26
- it('should resolve domain from RedoclyDomain env', () => {
27
- process.env.REDOCLY_DOMAIN = testRedoclyDomain;
28
- const client = new RedoclyClient();
29
- expect(client.domain).toBe(testRedoclyDomain);
30
- });
31
-
32
- it('should resolve a domain by US region', () => {
33
- const client = new RedoclyClient('us');
34
- expect(client.domain).toBe(REDOCLY_DOMAIN_US);
35
- });
36
-
37
- it('should resolve a domain by EU region', () => {
38
- const client = new RedoclyClient('eu');
39
- expect(client.domain).toBe(REDOCLY_DOMAIN_EU);
40
- });
41
-
42
- it('should resolve domain by EU region prioritizing flag over env variable', () => {
43
- process.env.REDOCLY_DOMAIN = testRedoclyDomain;
44
- const client = new RedoclyClient('eu');
45
- expect(client.domain).toBe(REDOCLY_DOMAIN_EU);
46
- });
47
-
48
- it('should resolve domain by US region prioritizing flag over env variable', () => {
49
- process.env.REDOCLY_DOMAIN = testRedoclyDomain;
50
- const client = new RedoclyClient('us');
51
- expect(client.domain).toBe(REDOCLY_DOMAIN_US);
52
- });
53
-
54
- it('should resolve domain by US region when REDOCLY_DOMAIN consists EU domain', () => {
55
- process.env.REDOCLY_DOMAIN = REDOCLY_DOMAIN_EU;
56
- const client = new RedoclyClient();
57
- expect(client.getRegion()).toBe('eu');
58
- });
59
-
60
- it('should resolve all tokens', async () => {
61
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => {
62
- return { token: 'accessToken', us: 'accessToken', eu: 'eu-accessToken' };
63
- });
64
- const client = new RedoclyClient();
65
- const tokens = client.getAllTokens();
66
- expect(tokens).toStrictEqual([
67
- { region: 'us', token: 'accessToken' },
68
- { region: 'eu', token: 'eu-accessToken' },
69
- ]);
70
- spy.mockRestore();
71
- });
72
-
73
- it('should resolve valid tokens data', async () => {
74
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => {
75
- return { us: 'accessToken', eu: 'eu-accessToken' };
76
- });
77
- const client = new RedoclyClient();
78
- const tokens = await client.getValidTokens();
79
- expect(tokens).toStrictEqual([
80
- { region: 'us', token: 'accessToken', valid: true },
81
- { region: 'eu', token: 'eu-accessToken', valid: true },
82
- ]);
83
- spy.mockRestore();
84
- });
85
-
86
- it('should not call setAccessTokens by default', () => {
87
- let spy = jest
88
- .spyOn(RedoclyClient.prototype, 'readCredentialsFile')
89
- .mockImplementation(() => ({}));
90
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
91
- const client = new RedoclyClient();
92
- expect(client.setAccessTokens).not.toHaveBeenCalled();
93
- spy.mockRestore();
94
- });
95
-
96
- it('should set correct accessTokens - backward compatibility: default US region', () => {
97
- let spy = jest
98
- .spyOn(RedoclyClient.prototype, 'readCredentialsFile')
99
- .mockImplementation(() => ({ token: testToken }));
100
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
101
- const client = new RedoclyClient();
102
- expect(client.setAccessTokens).toBeCalledWith(expect.objectContaining({ us: testToken }));
103
- spy.mockRestore();
104
- });
105
-
106
- it('should set correct accessTokens - backward compatibility: EU region', () => {
107
- let spy = jest
108
- .spyOn(RedoclyClient.prototype, 'readCredentialsFile')
109
- .mockImplementation(() => ({ token: testToken }));
110
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
111
- const client = new RedoclyClient('eu');
112
- expect(client.setAccessTokens).toBeCalledWith(expect.objectContaining({ eu: testToken }));
113
- spy.mockRestore();
114
- });
115
-
116
- it('should set correct accessTokens - REDOCLY_AUTHORIZATION env', () => {
117
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
118
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation();
119
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
120
- const client = new RedoclyClient();
121
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(1, { us: REDOCLY_AUTHORIZATION_TOKEN });
122
- spy.mockRestore();
123
- });
124
-
125
- it('should set correct accessTokens prioritizing REDOCLY_AUTHORIZATION env over token in file', () => {
126
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
127
- let spy = jest
128
- .spyOn(RedoclyClient.prototype, 'readCredentialsFile')
129
- .mockImplementation(() => ({ token: testToken }));
130
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
131
- const client = new RedoclyClient();
132
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(2, { us: REDOCLY_AUTHORIZATION_TOKEN });
133
- spy.mockRestore();
134
- });
135
-
136
- it('should set correct accessTokens prioritizing REDOCLY_AUTHORIZATION env over EU token', () => {
137
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
138
- let spy = jest
139
- .spyOn(RedoclyClient.prototype, 'readCredentialsFile')
140
- .mockImplementation(() => ({ us: testToken }));
141
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
142
- const client = new RedoclyClient('eu');
143
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(2, { eu: REDOCLY_AUTHORIZATION_TOKEN });
144
- spy.mockRestore();
145
- });
146
- });
@@ -1,187 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
2
- import { resolve } from 'path';
3
- import { homedir } from 'os';
4
- import { RegistryApi } from './registry-api';
5
- import { DEFAULT_REGION, DOMAINS, AVAILABLE_REGIONS } from '../config/config';
6
- import { env } from '../env';
7
- import { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
8
- import { isNotEmptyObject } from '../utils';
9
- import { colorize } from '../logger';
10
-
11
- import type { AccessTokens, Region } from '../config/types';
12
-
13
- const TOKEN_FILENAME = '.redocly-config.json';
14
-
15
- export class RedoclyClient {
16
- private accessTokens: AccessTokens = {};
17
- private region: Region;
18
- domain: string;
19
- registryApi: RegistryApi;
20
-
21
- constructor(region?: Region) {
22
- this.region = this.loadRegion(region);
23
- this.loadTokens();
24
- this.domain = region ? DOMAINS[region] : env.REDOCLY_DOMAIN || DOMAINS[DEFAULT_REGION];
25
-
26
- env.REDOCLY_DOMAIN = this.domain; // isRedoclyRegistryURL depends on the value to be set
27
- this.registryApi = new RegistryApi(this.accessTokens, this.region);
28
- }
29
-
30
- loadRegion(region?: Region) {
31
- if (region && !DOMAINS[region]) {
32
- throw new Error(
33
- `Invalid argument: region in config file.\nGiven: ${colorize.green(
34
- region
35
- )}, choices: "us", "eu".`
36
- );
37
- }
38
-
39
- if (env.REDOCLY_DOMAIN) {
40
- return (AVAILABLE_REGIONS.find(
41
- (region) => DOMAINS[region as Region] === env.REDOCLY_DOMAIN
42
- ) || DEFAULT_REGION) as Region;
43
- }
44
- return region || DEFAULT_REGION;
45
- }
46
-
47
- getRegion(): Region {
48
- return this.region;
49
- }
50
-
51
- hasTokens(): boolean {
52
- return isNotEmptyObject(this.accessTokens);
53
- }
54
-
55
- // <backward compatibility: old versions of portal>
56
- hasToken() {
57
- return !!this.accessTokens[this.region];
58
- }
59
-
60
- async getAuthorizationHeader(): Promise<string | undefined> {
61
- return this.accessTokens[this.region];
62
- }
63
- // </backward compatibility: portal>
64
-
65
- setAccessTokens(accessTokens: AccessTokens) {
66
- this.accessTokens = accessTokens;
67
- }
68
-
69
- loadTokens(): void {
70
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
71
- const credentials = this.readCredentialsFile(credentialsPath);
72
- if (isNotEmptyObject(credentials)) {
73
- this.setAccessTokens({
74
- ...credentials,
75
- ...(credentials.token &&
76
- !credentials[this.region] && {
77
- [this.region]: credentials.token,
78
- }),
79
- });
80
- }
81
- if (env.REDOCLY_AUTHORIZATION) {
82
- this.setAccessTokens({
83
- ...this.accessTokens,
84
- [this.region]: env.REDOCLY_AUTHORIZATION,
85
- });
86
- }
87
- }
88
-
89
- getAllTokens(): RegionalToken[] {
90
- return (<[Region, string][]>Object.entries(this.accessTokens))
91
- .filter(([region]) => AVAILABLE_REGIONS.includes(region))
92
- .map(([region, token]) => ({ region, token }));
93
- }
94
-
95
- async getValidTokens(): Promise<RegionalTokenWithValidity[]> {
96
- const allTokens = this.getAllTokens();
97
-
98
- const verifiedTokens = await Promise.allSettled(
99
- allTokens.map(({ token, region }) => this.verifyToken(token, region))
100
- );
101
-
102
- return allTokens
103
- .filter((_, index) => verifiedTokens[index].status === 'fulfilled')
104
- .map(({ token, region }) => ({ token, region, valid: true }));
105
- }
106
-
107
- async getTokens() {
108
- return this.hasTokens() ? await this.getValidTokens() : [];
109
- }
110
-
111
- async isAuthorizedWithRedoclyByRegion(): Promise<boolean> {
112
- if (!this.hasTokens()) {
113
- return false;
114
- }
115
-
116
- const accessToken = this.accessTokens[this.region];
117
-
118
- if (!accessToken) {
119
- return false;
120
- }
121
-
122
- try {
123
- await this.verifyToken(accessToken, this.region);
124
-
125
- return true;
126
- } catch (err) {
127
- return false;
128
- }
129
- }
130
-
131
- async isAuthorizedWithRedocly(): Promise<boolean> {
132
- return this.hasTokens() && isNotEmptyObject(await this.getValidTokens());
133
- }
134
-
135
- readCredentialsFile(credentialsPath: string) {
136
- return existsSync(credentialsPath) ? JSON.parse(readFileSync(credentialsPath, 'utf-8')) : {};
137
- }
138
-
139
- async verifyToken(
140
- accessToken: string,
141
- region: Region,
142
- verbose: boolean = false
143
- ): Promise<{ viewerId: string; organizations: string[] }> {
144
- return this.registryApi.authStatus(accessToken, region, verbose);
145
- }
146
-
147
- async login(accessToken: string, verbose: boolean = false) {
148
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
149
-
150
- try {
151
- await this.verifyToken(accessToken, this.region, verbose);
152
- } catch (err) {
153
- throw new Error('Authorization failed. Please check if you entered a valid API key.');
154
- }
155
-
156
- const credentials = {
157
- ...this.readCredentialsFile(credentialsPath),
158
- [this.region]: accessToken,
159
- token: accessToken, // FIXME: backward compatibility, remove on 1.0.0
160
- };
161
- this.accessTokens = credentials;
162
- this.registryApi.setAccessTokens(credentials);
163
- writeFileSync(credentialsPath, JSON.stringify(credentials, null, 2));
164
- }
165
-
166
- logout(): void {
167
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
168
- if (existsSync(credentialsPath)) {
169
- unlinkSync(credentialsPath);
170
- }
171
- }
172
- }
173
-
174
- export function isRedoclyRegistryURL(link: string): boolean {
175
- const domain = env.REDOCLY_DOMAIN || DOMAINS[DEFAULT_REGION];
176
-
177
- const legacyDomain = domain === 'redocly.com' ? 'redoc.ly' : domain;
178
-
179
- if (
180
- !link.startsWith(`https://api.${domain}/registry/`) &&
181
- !link.startsWith(`https://api.${legacyDomain}/registry/`)
182
- ) {
183
- return false;
184
- }
185
-
186
- return true;
187
- }
@@ -1,10 +0,0 @@
1
- import type { Region } from '../config/types';
2
-
3
- export interface RegionalToken {
4
- region: Region;
5
- token: string;
6
- }
7
-
8
- export interface RegionalTokenWithValidity extends RegionalToken {
9
- valid: boolean;
10
- }
@@ -1,32 +0,0 @@
1
- interface VersionParams {
2
- organizationId: string;
3
- name: string;
4
- version: string;
5
- }
6
-
7
- export interface PrepareFileuploadParams extends VersionParams {
8
- filesHash: string;
9
- filename: string;
10
- isUpsert?: boolean;
11
- }
12
-
13
- export interface PushApiParams extends VersionParams {
14
- rootFilePath: string;
15
- filePaths: string[];
16
- branch?: string;
17
- isUpsert?: boolean;
18
- isPublic?: boolean;
19
- batchId?: string;
20
- batchSize?: number;
21
- }
22
-
23
- export interface PrepareFileuploadOKResponse {
24
- filePath: string;
25
- signedUploadUrl: string;
26
- }
27
-
28
- export interface NotFoundProblemResponse {
29
- status: 404;
30
- title: 'Not Found';
31
- code: 'ORGANIZATION_NOT_FOUND' | 'API_VERSION_NOT_FOUND';
32
- }