@redocly/openapi-core 1.0.0-beta.99 → 1.0.0-rc.2

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 (382) 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 +10 -15
  8. package/lib/bundle.js +32 -12
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +16 -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 +7 -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.js +2 -2
  94. package/lib/rules/common/scalar-property-missing-example.js +2 -1
  95. package/lib/rules/common/security-defined.d.ts +2 -0
  96. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  97. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  98. package/lib/rules/common/spec-strict-refs.js +30 -0
  99. package/lib/rules/common/spec.js +41 -18
  100. package/lib/rules/common/tags-alphabetical.js +1 -1
  101. package/lib/rules/oas2/index.d.ts +3 -2
  102. package/lib/rules/oas2/index.js +10 -8
  103. package/lib/rules/oas2/remove-unused-components.js +6 -6
  104. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  105. package/lib/rules/oas2/request-mime-type.js +1 -1
  106. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/response-mime-type.js +1 -1
  108. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  109. package/lib/rules/oas3/component-name-unique.js +124 -0
  110. package/lib/rules/oas3/index.js +18 -10
  111. package/lib/rules/oas3/no-empty-servers.js +2 -2
  112. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  113. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  114. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  115. package/lib/rules/oas3/no-unused-components.js +2 -2
  116. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  117. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  118. package/lib/rules/oas3/remove-unused-components.js +6 -6
  119. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  120. package/lib/rules/oas3/request-mime-type.js +1 -1
  121. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  122. package/lib/rules/oas3/response-mime-type.js +1 -1
  123. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  124. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  125. package/lib/rules/other/stats.d.ts +2 -2
  126. package/lib/rules/other/stats.js +45 -16
  127. package/lib/rules/utils.d.ts +5 -2
  128. package/lib/rules/utils.js +54 -6
  129. package/lib/types/config-external-schemas.d.ts +2193 -0
  130. package/lib/types/config-external-schemas.js +805 -0
  131. package/lib/types/index.d.ts +3 -2
  132. package/lib/types/index.js +9 -1
  133. package/lib/types/oas2.js +91 -15
  134. package/lib/types/oas3.js +125 -46
  135. package/lib/types/oas3_1.js +23 -19
  136. package/lib/types/redocly-yaml.js +406 -60
  137. package/lib/utils.d.ts +15 -4
  138. package/lib/utils.js +72 -8
  139. package/lib/visitors.d.ts +20 -16
  140. package/lib/visitors.js +28 -3
  141. package/lib/walk.d.ts +11 -19
  142. package/lib/walk.js +74 -53
  143. package/package.json +5 -6
  144. package/__tests__/utils.ts +0 -86
  145. package/lib/rules/common/info-description.d.ts +0 -2
  146. package/lib/rules/common/info-description.js +0 -12
  147. package/lib/rules/common/license-url.d.ts +0 -2
  148. package/lib/rules/common/license-url.js +0 -12
  149. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  150. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  151. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -255
  152. package/src/__tests__/bundle.test.ts +0 -156
  153. package/src/__tests__/codeframes.test.ts +0 -531
  154. package/src/__tests__/fixtures/extension.js +0 -24
  155. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  163. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  164. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  165. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  166. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  167. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  168. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  169. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  170. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  171. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  172. package/src/__tests__/fixtures/resolve/description.md +0 -3
  173. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  174. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  175. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  176. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  177. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  178. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  179. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  180. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  181. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  182. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  183. package/src/__tests__/js-yaml.test.ts +0 -71
  184. package/src/__tests__/lint.test.ts +0 -195
  185. package/src/__tests__/login.test.ts +0 -17
  186. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  187. package/src/__tests__/ref-utils.test.ts +0 -120
  188. package/src/__tests__/resolve-http.test.ts +0 -77
  189. package/src/__tests__/resolve.test.ts +0 -405
  190. package/src/__tests__/utils.test.ts +0 -85
  191. package/src/__tests__/walk.test.ts +0 -1485
  192. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  193. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  194. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  195. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  196. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  197. package/src/benchmark/benches/rebilly.yaml +0 -32267
  198. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  199. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  200. package/src/benchmark/benchmark.js +0 -307
  201. package/src/benchmark/colors.js +0 -29
  202. package/src/benchmark/fork.js +0 -83
  203. package/src/benchmark/utils.ts +0 -36
  204. package/src/bundle.ts +0 -386
  205. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  206. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  207. package/src/config/__tests__/config.test.ts +0 -244
  208. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  209. package/src/config/__tests__/fixtures/plugin.js +0 -56
  210. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  211. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  212. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  213. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  214. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  215. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  216. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  217. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  218. package/src/config/__tests__/load.test.ts +0 -83
  219. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  220. package/src/config/all.ts +0 -66
  221. package/src/config/builtIn.ts +0 -37
  222. package/src/config/config-resolvers.ts +0 -359
  223. package/src/config/config.ts +0 -312
  224. package/src/config/index.ts +0 -7
  225. package/src/config/load.ts +0 -84
  226. package/src/config/minimal.ts +0 -58
  227. package/src/config/recommended.ts +0 -58
  228. package/src/config/rules.ts +0 -46
  229. package/src/config/types.ts +0 -168
  230. package/src/config/utils.ts +0 -208
  231. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  232. package/src/decorators/common/info-description-override.ts +0 -24
  233. package/src/decorators/common/operation-description-override.ts +0 -30
  234. package/src/decorators/common/registry-dependencies.ts +0 -25
  235. package/src/decorators/common/remove-x-internal.ts +0 -59
  236. package/src/decorators/common/tag-description-override.ts +0 -25
  237. package/src/decorators/oas2/index.ts +0 -14
  238. package/src/decorators/oas3/index.ts +0 -14
  239. package/src/format/codeframes.ts +0 -210
  240. package/src/format/format.ts +0 -339
  241. package/src/index.ts +0 -68
  242. package/src/js-yaml/index.ts +0 -18
  243. package/src/lint.ts +0 -125
  244. package/src/oas-types.ts +0 -62
  245. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  246. package/src/redocly/index.ts +0 -182
  247. package/src/redocly/redocly-client-types.ts +0 -10
  248. package/src/redocly/registry-api-types.ts +0 -32
  249. package/src/redocly/registry-api.ts +0 -134
  250. package/src/ref-utils.ts +0 -80
  251. package/src/resolve.ts +0 -378
  252. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  253. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  254. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  255. package/src/rules/ajv.ts +0 -103
  256. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  257. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  258. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  259. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  260. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  261. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  262. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  263. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  264. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  265. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  266. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  267. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  268. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  269. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  270. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  271. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  272. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  273. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  274. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -207
  275. package/src/rules/common/__tests__/spec.test.ts +0 -62
  276. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  277. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  278. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  279. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  280. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  281. package/src/rules/common/assertions/asserts.ts +0 -137
  282. package/src/rules/common/assertions/index.ts +0 -75
  283. package/src/rules/common/assertions/utils.ts +0 -167
  284. package/src/rules/common/info-contact.ts +0 -15
  285. package/src/rules/common/info-description.ts +0 -10
  286. package/src/rules/common/info-license-url.ts +0 -15
  287. package/src/rules/common/license-url.ts +0 -10
  288. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  289. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  290. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  291. package/src/rules/common/no-identical-paths.ts +0 -24
  292. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  293. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  294. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  295. package/src/rules/common/operation-2xx-response.ts +0 -16
  296. package/src/rules/common/operation-4xx-response.ts +0 -17
  297. package/src/rules/common/operation-description.ts +0 -13
  298. package/src/rules/common/operation-operationId-unique.ts +0 -21
  299. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  300. package/src/rules/common/operation-operationId.ts +0 -17
  301. package/src/rules/common/operation-parameters-unique.ts +0 -48
  302. package/src/rules/common/operation-security-defined.ts +0 -45
  303. package/src/rules/common/operation-singular-tag.ts +0 -17
  304. package/src/rules/common/operation-summary.ts +0 -13
  305. package/src/rules/common/operation-tag-defined.ts +0 -26
  306. package/src/rules/common/parameter-description.ts +0 -22
  307. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  308. package/src/rules/common/path-excludes-patterns.ts +0 -23
  309. package/src/rules/common/path-http-verbs-order.ts +0 -30
  310. package/src/rules/common/path-not-include-query.ts +0 -17
  311. package/src/rules/common/path-params-defined.ts +0 -58
  312. package/src/rules/common/path-segment-plural.ts +0 -31
  313. package/src/rules/common/paths-kebab-case.ts +0 -16
  314. package/src/rules/common/response-contains-header.ts +0 -30
  315. package/src/rules/common/scalar-property-missing-example.ts +0 -55
  316. package/src/rules/common/spec.ts +0 -143
  317. package/src/rules/common/tag-description.ts +0 -10
  318. package/src/rules/common/tags-alphabetical.ts +0 -20
  319. package/src/rules/no-unresolved-refs.ts +0 -51
  320. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  321. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  322. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  323. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  324. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  325. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  326. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  327. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  328. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  329. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  330. package/src/rules/oas2/index.ts +0 -89
  331. package/src/rules/oas2/remove-unused-components.ts +0 -76
  332. package/src/rules/oas2/request-mime-type.ts +0 -17
  333. package/src/rules/oas2/response-contains-property.ts +0 -36
  334. package/src/rules/oas2/response-mime-type.ts +0 -17
  335. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  336. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  337. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  338. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  339. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  340. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  341. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  342. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  343. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -273
  344. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  345. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  346. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  347. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  348. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  349. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  350. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  351. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  352. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  353. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  354. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  355. package/src/rules/oas3/index.ts +0 -105
  356. package/src/rules/oas3/no-empty-servers.ts +0 -22
  357. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  358. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  359. package/src/rules/oas3/no-server-example.com.ts +0 -14
  360. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  361. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  362. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  363. package/src/rules/oas3/no-unused-components.ts +0 -75
  364. package/src/rules/oas3/remove-unused-components.ts +0 -84
  365. package/src/rules/oas3/request-mime-type.ts +0 -31
  366. package/src/rules/oas3/response-contains-property.ts +0 -38
  367. package/src/rules/oas3/response-mime-type.ts +0 -31
  368. package/src/rules/other/stats.ts +0 -44
  369. package/src/rules/utils.ts +0 -123
  370. package/src/types/index.ts +0 -138
  371. package/src/types/oas2.ts +0 -397
  372. package/src/types/oas3.ts +0 -515
  373. package/src/types/oas3_1.ts +0 -253
  374. package/src/types/redocly-yaml.ts +0 -647
  375. package/src/typings/common.ts +0 -9
  376. package/src/typings/openapi.ts +0 -298
  377. package/src/typings/swagger.ts +0 -236
  378. package/src/utils.ts +0 -193
  379. package/src/visitors.ts +0 -448
  380. package/src/walk.ts +0 -416
  381. package/tsconfig.json +0 -8
  382. package/tsconfig.tsbuildinfo +0 -1
package/src/lint.ts DELETED
@@ -1,125 +0,0 @@
1
- import { BaseResolver, resolveDocument, Document, makeDocumentFromString } from './resolve';
2
- import {
3
- normalizeVisitors,
4
- } from './visitors';
5
- import { Oas3_1Types } from './types/oas3_1';
6
- import { Oas3Types } from './types/oas3';
7
- import { Oas2Types } from './types/oas2';
8
- import { NodeType } from './types';
9
- import { ProblemSeverity, WalkContext, walkDocument } from './walk';
10
- import { LintConfig, Config, initRules, defaultPlugin, resolvePlugins } from './config';
11
- import { normalizeTypes } from './types';
12
- import { releaseAjvInstance } from './rules/ajv';
13
- import { detectOpenAPI, Oas3RuleSet, OasMajorVersion, OasVersion, openAPIMajor } from './oas-types';
14
- import { ConfigTypes } from './types/redocly-yaml';
15
- import { OasSpec } from './rules/common/spec';
16
-
17
-
18
- export async function lint(opts: {
19
- ref: string;
20
- config: Config;
21
- externalRefResolver?: BaseResolver;
22
- }) {
23
- const { ref, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
24
- const document = (await externalRefResolver.resolveDocument(null, ref, true)) as Document;
25
-
26
- return lintDocument({
27
- document,
28
- ...opts,
29
- externalRefResolver,
30
- config: opts.config.lint,
31
- });
32
- }
33
-
34
- export async function lintFromString(opts: {
35
- source: string;
36
- absoluteRef?: string;
37
- config: Config;
38
- externalRefResolver?: BaseResolver;
39
- }) {
40
- const { source, absoluteRef, externalRefResolver = new BaseResolver(opts.config.resolve) } = opts;
41
- const document = makeDocumentFromString(source, absoluteRef || '/');
42
-
43
- return lintDocument({
44
- document,
45
- ...opts,
46
- externalRefResolver,
47
- config: opts.config.lint,
48
- });
49
- }
50
-
51
- export async function lintDocument(opts: {
52
- document: Document;
53
- config: LintConfig;
54
- customTypes?: Record<string, NodeType>;
55
- externalRefResolver: BaseResolver;
56
- }) {
57
- releaseAjvInstance(); // FIXME: preprocessors can modify nodes which are then cached to ajv-instance by absolute path
58
-
59
- const { document, customTypes, externalRefResolver, config } = opts;
60
- const oasVersion = detectOpenAPI(document.parsed);
61
- const oasMajorVersion = openAPIMajor(oasVersion);
62
- const rules = config.getRulesForOasVersion(oasMajorVersion);
63
- const types = normalizeTypes(
64
- config.extendTypes(
65
- customTypes ?? oasMajorVersion === OasMajorVersion.Version3 ? (oasVersion === OasVersion.Version3_1 ? Oas3_1Types : Oas3Types) : Oas2Types,
66
- oasVersion,
67
- ),
68
- config,
69
- );
70
-
71
- const ctx: WalkContext = {
72
- problems: [],
73
- oasVersion: oasVersion,
74
- visitorsData: {},
75
- };
76
-
77
- const preprocessors = initRules(rules as any, config, 'preprocessors', oasVersion);
78
- const regularRules = initRules(rules as Oas3RuleSet[], config, 'rules', oasVersion);
79
- const normalizedVisitors = normalizeVisitors([...preprocessors, ...regularRules] as any, types);
80
- const resolvedRefMap = await resolveDocument({
81
- rootDocument: document,
82
- rootType: types.DefinitionRoot,
83
- externalRefResolver
84
- });
85
-
86
- walkDocument({
87
- document,
88
- rootType: types.DefinitionRoot,
89
- normalizedVisitors,
90
- resolvedRefMap,
91
- ctx,
92
- });
93
- return ctx.problems.map((problem) => config.addProblemToIgnore(problem));
94
- }
95
-
96
- export async function lintConfig(opts: {
97
- document: Document,
98
- }) {
99
- const { document } = opts;
100
-
101
- const ctx: WalkContext = {
102
- problems: [],
103
- oasVersion: OasVersion.Version3_0,
104
- visitorsData: {},
105
- };
106
- const plugins = resolvePlugins([defaultPlugin]);
107
- const config = new LintConfig({
108
- plugins,
109
- rules: { spec: 'error' },
110
- });
111
-
112
- const types = normalizeTypes(ConfigTypes, config);
113
- const rules = [{ severity: 'error' as ProblemSeverity, ruleId: 'spec', visitor: OasSpec({ severity: 'error' }) }];
114
- const normalizedVisitors = normalizeVisitors(rules, types);
115
-
116
- walkDocument({
117
- document,
118
- rootType: types.ConfigRoot,
119
- normalizedVisitors,
120
- resolvedRefMap: new Map(),
121
- ctx,
122
- });
123
-
124
- return ctx.problems;
125
- }
package/src/oas-types.ts DELETED
@@ -1,62 +0,0 @@
1
- import {
2
- Oas3Rule,
3
- Oas3Preprocessor,
4
- Oas2Rule,
5
- Oas2Preprocessor,
6
- } from './visitors';
7
-
8
- export type RuleSet<T> = Record<string, T>;
9
-
10
- export enum OasVersion {
11
- Version2 = 'oas2',
12
- Version3_0 = 'oas3_0',
13
- Version3_1 = 'oas3_1',
14
- }
15
-
16
- export enum OasMajorVersion {
17
- Version2 = 'oas2',
18
- Version3 = 'oas3',
19
- }
20
-
21
- export type Oas3RuleSet = Record<string, Oas3Rule>;
22
- export type Oas2RuleSet = Record<string, Oas2Rule>;
23
- export type Oas3PreprocessorsSet = Record<string, Oas3Preprocessor>;
24
- export type Oas2PreprocessorsSet = Record<string, Oas2Preprocessor>;
25
- export type Oas3DecoratorsSet = Record<string, Oas3Preprocessor>;
26
- export type Oas2DecoratorsSet = Record<string, Oas2Preprocessor>;
27
-
28
- export function detectOpenAPI(root: any): OasVersion {
29
- if (typeof root !== 'object') {
30
- throw new Error(`Document must be JSON object, got ${typeof root}`);
31
- }
32
-
33
- if (!(root.openapi || root.swagger)) {
34
- throw new Error('This doesn’t look like an OpenAPI document.\n');
35
- }
36
-
37
- if (root.openapi && typeof root.openapi !== 'string') {
38
- throw new Error(`Invalid OpenAPI version: should be a string but got "${typeof root.openapi}"`);
39
- }
40
-
41
- if (root.openapi && root.openapi.startsWith('3.0')) {
42
- return OasVersion.Version3_0;
43
- }
44
-
45
- if (root.openapi && root.openapi.startsWith('3.1')) {
46
- return OasVersion.Version3_1;
47
- }
48
-
49
- if (root.swagger && root.swagger === '2.0') {
50
- return OasVersion.Version2;
51
- }
52
-
53
- throw new Error(`Unsupported OpenAPI Version: ${root.openapi || root.swagger}`);
54
- }
55
-
56
- export function openAPIMajor(version: OasVersion): OasMajorVersion {
57
- if (version === OasVersion.Version2) {
58
- return OasMajorVersion.Version2;
59
- } else {
60
- return OasMajorVersion.Version3;
61
- }
62
- }
@@ -1,140 +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.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => ({}));
88
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
89
- const client = new RedoclyClient();
90
- expect(client.setAccessTokens).not.toHaveBeenCalled()
91
- spy.mockRestore();
92
- });
93
-
94
- it('should set correct accessTokens - backward compatibility: default US region', () => {
95
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => ({ token: testToken }));
96
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
97
- const client = new RedoclyClient();
98
- expect(client.setAccessTokens).toBeCalledWith(
99
- expect.objectContaining({ us: testToken })
100
- );
101
- spy.mockRestore();
102
- });
103
-
104
- it('should set correct accessTokens - backward compatibility: EU region', () => {
105
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => ({ token: testToken }));
106
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
107
- const client = new RedoclyClient('eu');
108
- expect(client.setAccessTokens).toBeCalledWith(
109
- expect.objectContaining({ eu: testToken })
110
- );
111
- spy.mockRestore();
112
- });
113
-
114
- it('should set correct accessTokens - REDOCLY_AUTHORIZATION env', () => {
115
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
116
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation();
117
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
118
- const client = new RedoclyClient();
119
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(1, { "us": REDOCLY_AUTHORIZATION_TOKEN });
120
- spy.mockRestore();
121
- });
122
-
123
- it('should set correct accessTokens prioritizing REDOCLY_AUTHORIZATION env over token in file', () => {
124
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
125
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => ({ token: testToken }));
126
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
127
- const client = new RedoclyClient();
128
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(2, { "us": REDOCLY_AUTHORIZATION_TOKEN });
129
- spy.mockRestore();
130
- });
131
-
132
- it('should set correct accessTokens prioritizing REDOCLY_AUTHORIZATION env over EU token', () => {
133
- process.env.REDOCLY_AUTHORIZATION = REDOCLY_AUTHORIZATION_TOKEN;
134
- let spy = jest.spyOn(RedoclyClient.prototype, 'readCredentialsFile').mockImplementation(() => ({ us: testToken }));
135
- jest.spyOn(RedoclyClient.prototype, 'setAccessTokens').mockImplementation();
136
- const client = new RedoclyClient('eu');
137
- expect(client.setAccessTokens).toHaveBeenNthCalledWith(2, { "eu": REDOCLY_AUTHORIZATION_TOKEN });
138
- spy.mockRestore();
139
- });
140
- });
@@ -1,182 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
2
- import { resolve } from 'path';
3
- import { homedir } from 'os';
4
- import { green } from 'colorette';
5
- import { RegistryApi } from './registry-api';
6
- import { DEFAULT_REGION, DOMAINS, AVAILABLE_REGIONS, env } from '../config/config';
7
- import { RegionalToken, RegionalTokenWithValidity } from './redocly-client-types';
8
- import { isNotEmptyObject } from '../utils';
9
-
10
- import type { AccessTokens, Region } from '../config/types';
11
-
12
- const TOKEN_FILENAME = '.redocly-config.json';
13
-
14
- export class RedoclyClient {
15
- private accessTokens: AccessTokens = {};
16
- private region: Region;
17
- domain: string;
18
- registryApi: RegistryApi;
19
-
20
- constructor(region?: Region) {
21
- this.region = this.loadRegion(region);
22
- this.loadTokens();
23
- this.domain = region ? DOMAINS[region] : env.REDOCLY_DOMAIN || DOMAINS[DEFAULT_REGION];
24
-
25
- env.REDOCLY_DOMAIN = this.domain; // isRedoclyRegistryURL depends on the value to be set
26
- this.registryApi = new RegistryApi(this.accessTokens, this.region);
27
- }
28
-
29
- loadRegion(region?: Region) {
30
- if (region && !DOMAINS[region]) {
31
- throw new Error(`Invalid argument: region in config file.\nGiven: ${green(region)}, choices: "us", "eu".`);
32
- }
33
-
34
- if (env.REDOCLY_DOMAIN) {
35
- return (AVAILABLE_REGIONS.find(
36
- (region) => DOMAINS[region as Region] === env.REDOCLY_DOMAIN,
37
- ) || DEFAULT_REGION) as Region;
38
- }
39
- return region || DEFAULT_REGION;
40
- }
41
-
42
- getRegion(): Region {
43
- return this.region;
44
- }
45
-
46
- hasTokens(): boolean {
47
- return isNotEmptyObject(this.accessTokens);
48
- }
49
-
50
- // <backward compatibility: old versions of portal>
51
- hasToken() {
52
- return !!this.accessTokens[this.region];
53
- }
54
-
55
- async getAuthorizationHeader(): Promise<string | undefined> {
56
- return this.accessTokens[this.region];
57
- }
58
- // </backward compatibility: portal>
59
-
60
- setAccessTokens(accessTokens: AccessTokens) {
61
- this.accessTokens = accessTokens;
62
- }
63
-
64
- loadTokens(): void {
65
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
66
- const credentials = this.readCredentialsFile(credentialsPath);
67
- if (isNotEmptyObject(credentials)) {
68
- this.setAccessTokens({
69
- ...credentials,
70
- ...(credentials.token &&
71
- !credentials[this.region] && {
72
- [this.region]: credentials.token,
73
- }),
74
- });
75
- }
76
- if (env.REDOCLY_AUTHORIZATION) {
77
- this.setAccessTokens({
78
- ...this.accessTokens,
79
- [this.region]: env.REDOCLY_AUTHORIZATION,
80
- });
81
- }
82
- }
83
-
84
- getAllTokens(): RegionalToken[] {
85
- return (<[Region, string][]>Object.entries(this.accessTokens))
86
- .filter(([region]) => AVAILABLE_REGIONS.includes(region))
87
- .map(([region, token]) => ({ region, token }));
88
- }
89
-
90
- async getValidTokens(): Promise<RegionalTokenWithValidity[]> {
91
- const allTokens = this.getAllTokens();
92
-
93
- const verifiedTokens = await Promise.allSettled(
94
- allTokens.map(({ token, region }) => this.verifyToken(token, region)),
95
- );
96
-
97
- return allTokens
98
- .filter((_, index) => verifiedTokens[index].status === 'fulfilled')
99
- .map(({ token, region }) => ({ token, region, valid: true }));
100
- }
101
-
102
- async getTokens() {
103
- return this.hasTokens() ? await this.getValidTokens() : [];
104
- }
105
-
106
- async isAuthorizedWithRedoclyByRegion(): Promise<boolean> {
107
- if (!this.hasTokens()) {
108
- return false;
109
- }
110
-
111
- const accessToken = this.accessTokens[this.region];
112
-
113
- if (!accessToken) {
114
- return false;
115
- }
116
-
117
- try {
118
- await this.verifyToken(accessToken, this.region);
119
-
120
- return true;
121
- } catch (err) {
122
- return false;
123
- }
124
- }
125
-
126
- async isAuthorizedWithRedocly(): Promise<boolean> {
127
- return this.hasTokens() && isNotEmptyObject(await this.getValidTokens());
128
- }
129
-
130
- readCredentialsFile(credentialsPath: string) {
131
- return existsSync(credentialsPath) ? JSON.parse(readFileSync(credentialsPath, 'utf-8')) : {};
132
- }
133
-
134
- async verifyToken(
135
- accessToken: string,
136
- region: Region,
137
- verbose: boolean = false,
138
- ): Promise<{ viewerId: string; organizations: string[] }> {
139
- return this.registryApi.authStatus(accessToken, region, verbose);
140
- }
141
-
142
- async login(accessToken: string, verbose: boolean = false) {
143
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
144
-
145
- try {
146
- await this.verifyToken(accessToken, this.region, verbose);
147
- } catch (err) {
148
- throw new Error('Authorization failed. Please check if you entered a valid API key.');
149
- }
150
-
151
- const credentials = {
152
- ...this.readCredentialsFile(credentialsPath),
153
- [this.region!]: accessToken,
154
- token: accessToken, // FIXME: backward compatibility, remove on 1.0.0
155
- };
156
- this.accessTokens = credentials;
157
- this.registryApi.setAccessTokens(credentials);
158
- writeFileSync(credentialsPath, JSON.stringify(credentials, null, 2));
159
- }
160
-
161
- logout(): void {
162
- const credentialsPath = resolve(homedir(), TOKEN_FILENAME);
163
- if (existsSync(credentialsPath)) {
164
- unlinkSync(credentialsPath);
165
- }
166
- }
167
- }
168
-
169
- export function isRedoclyRegistryURL(link: string): boolean {
170
- const domain = env.REDOCLY_DOMAIN || DOMAINS[DEFAULT_REGION];
171
-
172
- const legacyDomain = domain === 'redocly.com' ? 'redoc.ly' : domain;
173
-
174
- if (
175
- !link.startsWith(`https://api.${domain}/registry/`) &&
176
- !link.startsWith(`https://api.${legacyDomain}/registry/`)
177
- ) {
178
- return false;
179
- }
180
-
181
- return true;
182
- }
@@ -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
- export namespace RegistryApiTypes {
2
- interface VersionParams {
3
- organizationId: string;
4
- name: string;
5
- version: string;
6
- }
7
-
8
- export interface PrepareFileuploadParams extends VersionParams {
9
- filesHash: string;
10
- filename: string;
11
- isUpsert?: boolean;
12
- }
13
-
14
- export interface PushApiParams extends VersionParams {
15
- rootFilePath: string;
16
- filePaths: string[];
17
- branch?: string;
18
- isUpsert?: boolean;
19
- isPublic?: boolean;
20
- }
21
-
22
- export interface PrepareFileuploadOKResponse {
23
- filePath: string;
24
- signedUploadUrl: string;
25
- }
26
-
27
- export interface NotFoundProblemResponse {
28
- status: 404;
29
- title: 'Not Found';
30
- code: 'ORGANIZATION_NOT_FOUND' | 'API_VERSION_NOT_FOUND';
31
- }
32
- }
@@ -1,134 +0,0 @@
1
- import fetch, { RequestInit, HeadersInit } from 'node-fetch';
2
- import { RegistryApiTypes } from './registry-api-types';
3
- import { DEFAULT_REGION, DOMAINS } from '../config/config';
4
- import { isNotEmptyObject } from '../utils';
5
- const version = require('../../package.json').version;
6
-
7
- import type { AccessTokens, Region } from '../config/types';
8
-
9
- export class RegistryApi {
10
- constructor(private accessTokens: AccessTokens, private region: Region) {}
11
-
12
- get accessToken() {
13
- return isNotEmptyObject(this.accessTokens) && this.accessTokens[this.region];
14
- }
15
-
16
- getBaseUrl(region: Region = DEFAULT_REGION) {
17
- return `https://api.${DOMAINS[region]}/registry`;
18
- }
19
-
20
- setAccessTokens(accessTokens: AccessTokens) {
21
- this.accessTokens = accessTokens;
22
- return this;
23
- }
24
-
25
- private async request(path = '', options: RequestInit = {}, region?: Region) {
26
- const headers = Object.assign({}, options.headers || {}, { 'x-redocly-cli-version': version });
27
-
28
- if (!headers.hasOwnProperty('authorization')) {
29
- throw new Error('Unauthorized');
30
- }
31
-
32
- const response = await fetch(
33
- `${this.getBaseUrl(region)}${path}`,
34
- Object.assign({}, options, { headers }),
35
- );
36
-
37
- if (response.status === 401) {
38
- throw new Error('Unauthorized');
39
- }
40
-
41
- if (response.status === 404) {
42
- const body: RegistryApiTypes.NotFoundProblemResponse = await response.json();
43
- throw new Error(body.code);
44
- }
45
-
46
- return response;
47
- }
48
-
49
- async authStatus(
50
- accessToken: string,
51
- region: Region,
52
- verbose = false,
53
- ): Promise<{ viewerId: string; organizations: string[] }> {
54
- try {
55
- const response = await this.request('', { headers: { authorization: accessToken } }, region);
56
-
57
- return await response.json();
58
- } catch (error) {
59
- if (verbose) {
60
- console.log(error);
61
- }
62
-
63
- throw error;
64
- }
65
- }
66
-
67
- async prepareFileUpload({
68
- organizationId,
69
- name,
70
- version,
71
- filesHash,
72
- filename,
73
- isUpsert,
74
- }: RegistryApiTypes.PrepareFileuploadParams): Promise<RegistryApiTypes.PrepareFileuploadOKResponse> {
75
- const response = await this.request(
76
- `/${organizationId}/${name}/${version}/prepare-file-upload`,
77
- {
78
- method: 'POST',
79
- headers: {
80
- 'content-type': 'application/json',
81
- authorization: this.accessToken,
82
- } as HeadersInit,
83
- body: JSON.stringify({
84
- filesHash,
85
- filename,
86
- isUpsert,
87
- }),
88
- },
89
- this.region,
90
- );
91
-
92
- if (response.ok) {
93
- return response.json();
94
- }
95
-
96
- throw new Error('Could not prepare file upload');
97
- }
98
-
99
- async pushApi({
100
- organizationId,
101
- name,
102
- version,
103
- rootFilePath,
104
- filePaths,
105
- branch,
106
- isUpsert,
107
- isPublic,
108
- }: RegistryApiTypes.PushApiParams) {
109
- const response = await this.request(
110
- `/${organizationId}/${name}/${version}`,
111
- {
112
- method: 'PUT',
113
- headers: {
114
- 'content-type': 'application/json',
115
- authorization: this.accessToken,
116
- } as HeadersInit,
117
- body: JSON.stringify({
118
- rootFilePath,
119
- filePaths,
120
- branch,
121
- isUpsert,
122
- isPublic,
123
- }),
124
- },
125
- this.region,
126
- );
127
-
128
- if (response.ok) {
129
- return;
130
- }
131
-
132
- throw new Error('Could not push api');
133
- }
134
- }