@redocly/openapi-core 1.0.0-beta.100

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