@redocly/openapi-core 0.0.0-snapshot.1737554067

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 (322) hide show
  1. package/README.md +268 -0
  2. package/lib/benchmark/benches/lint-with-many-rules.bench.d.ts +4 -0
  3. package/lib/benchmark/benches/lint-with-many-rules.bench.js +38 -0
  4. package/lib/benchmark/benches/lint-with-nested-rule.bench.d.ts +4 -0
  5. package/lib/benchmark/benches/lint-with-nested-rule.bench.js +44 -0
  6. package/lib/benchmark/benches/lint-with-no-rules.bench.d.ts +4 -0
  7. package/lib/benchmark/benches/lint-with-no-rules.bench.js +25 -0
  8. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.d.ts +4 -0
  9. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +37 -0
  10. package/lib/benchmark/benches/lint-with-top-level-rule.bench.d.ts +4 -0
  11. package/lib/benchmark/benches/lint-with-top-level-rule.bench.js +36 -0
  12. package/lib/benchmark/benches/recommended-oas3.bench.d.ts +3 -0
  13. package/lib/benchmark/benches/recommended-oas3.bench.js +21 -0
  14. package/lib/benchmark/benches/resolve-with-no-external.bench.d.ts +3 -0
  15. package/lib/benchmark/benches/resolve-with-no-external.bench.js +22 -0
  16. package/lib/benchmark/utils.d.ts +6 -0
  17. package/lib/benchmark/utils.js +34 -0
  18. package/lib/bundle.d.ts +50 -0
  19. package/lib/bundle.js +385 -0
  20. package/lib/config/all.d.ts +3 -0
  21. package/lib/config/all.js +227 -0
  22. package/lib/config/builtIn.d.ts +3 -0
  23. package/lib/config/builtIn.js +53 -0
  24. package/lib/config/config-resolvers.d.ts +30 -0
  25. package/lib/config/config-resolvers.js +447 -0
  26. package/lib/config/config.d.ts +53 -0
  27. package/lib/config/config.js +320 -0
  28. package/lib/config/index.d.ts +7 -0
  29. package/lib/config/index.js +23 -0
  30. package/lib/config/load.d.ts +38 -0
  31. package/lib/config/load.js +140 -0
  32. package/lib/config/minimal.d.ts +3 -0
  33. package/lib/config/minimal.js +203 -0
  34. package/lib/config/recommended-strict.d.ts +3 -0
  35. package/lib/config/recommended-strict.js +203 -0
  36. package/lib/config/recommended.d.ts +3 -0
  37. package/lib/config/recommended.js +203 -0
  38. package/lib/config/rules.d.ts +10 -0
  39. package/lib/config/rules.js +37 -0
  40. package/lib/config/spec.d.ts +3 -0
  41. package/lib/config/spec.js +29 -0
  42. package/lib/config/types.d.ts +189 -0
  43. package/lib/config/types.js +2 -0
  44. package/lib/config/utils.d.ts +19 -0
  45. package/lib/config/utils.js +308 -0
  46. package/lib/decorators/arazzo/index.d.ts +1 -0
  47. package/lib/decorators/arazzo/index.js +4 -0
  48. package/lib/decorators/async2/index.d.ts +1 -0
  49. package/lib/decorators/async2/index.js +4 -0
  50. package/lib/decorators/async3/index.d.ts +1 -0
  51. package/lib/decorators/async3/index.js +4 -0
  52. package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
  53. package/lib/decorators/common/filters/filter-helper.js +66 -0
  54. package/lib/decorators/common/filters/filter-in.d.ts +2 -0
  55. package/lib/decorators/common/filters/filter-in.js +17 -0
  56. package/lib/decorators/common/filters/filter-out.d.ts +2 -0
  57. package/lib/decorators/common/filters/filter-out.js +17 -0
  58. package/lib/decorators/common/info-description-override.d.ts +2 -0
  59. package/lib/decorators/common/info-description-override.js +24 -0
  60. package/lib/decorators/common/info-override.d.ts +2 -0
  61. package/lib/decorators/common/info-override.js +17 -0
  62. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  63. package/lib/decorators/common/media-type-examples-override.js +59 -0
  64. package/lib/decorators/common/operation-description-override.d.ts +2 -0
  65. package/lib/decorators/common/operation-description-override.js +29 -0
  66. package/lib/decorators/common/registry-dependencies.d.ts +2 -0
  67. package/lib/decorators/common/registry-dependencies.js +24 -0
  68. package/lib/decorators/common/remove-x-internal.d.ts +2 -0
  69. package/lib/decorators/common/remove-x-internal.js +69 -0
  70. package/lib/decorators/common/tag-description-override.d.ts +2 -0
  71. package/lib/decorators/common/tag-description-override.js +25 -0
  72. package/lib/decorators/oas2/index.d.ts +11 -0
  73. package/lib/decorators/oas2/index.js +21 -0
  74. package/lib/decorators/oas2/remove-unused-components.d.ts +2 -0
  75. package/lib/decorators/oas2/remove-unused-components.js +89 -0
  76. package/lib/decorators/oas3/index.d.ts +12 -0
  77. package/lib/decorators/oas3/index.js +23 -0
  78. package/lib/decorators/oas3/remove-unused-components.d.ts +2 -0
  79. package/lib/decorators/oas3/remove-unused-components.js +100 -0
  80. package/lib/env.d.ts +2 -0
  81. package/lib/env.js +7 -0
  82. package/lib/format/codeframes.d.ts +22 -0
  83. package/lib/format/codeframes.js +185 -0
  84. package/lib/format/format.d.ts +20 -0
  85. package/lib/format/format.js +365 -0
  86. package/lib/index.d.ts +26 -0
  87. package/lib/index.js +98 -0
  88. package/lib/js-yaml/index.d.ts +3 -0
  89. package/lib/js-yaml/index.js +15 -0
  90. package/lib/lint.d.ts +32 -0
  91. package/lib/lint.js +118 -0
  92. package/lib/logger.d.ts +10 -0
  93. package/lib/logger.js +31 -0
  94. package/lib/oas-types.d.ts +36 -0
  95. package/lib/oas-types.js +92 -0
  96. package/lib/output.d.ts +3 -0
  97. package/lib/output.js +9 -0
  98. package/lib/redocly/domains.d.ts +14 -0
  99. package/lib/redocly/domains.js +41 -0
  100. package/lib/redocly/index.d.ts +30 -0
  101. package/lib/redocly/index.js +131 -0
  102. package/lib/redocly/redocly-client-types.d.ts +8 -0
  103. package/lib/redocly/redocly-client-types.js +2 -0
  104. package/lib/redocly/registry-api-types.d.ts +29 -0
  105. package/lib/redocly/registry-api-types.js +2 -0
  106. package/lib/redocly/registry-api.d.ts +17 -0
  107. package/lib/redocly/registry-api.js +96 -0
  108. package/lib/ref-utils.d.ts +27 -0
  109. package/lib/ref-utils.js +85 -0
  110. package/lib/resolve.d.ts +66 -0
  111. package/lib/resolve.js +342 -0
  112. package/lib/rules/ajv.d.ts +10 -0
  113. package/lib/rules/ajv.js +82 -0
  114. package/lib/rules/arazzo/criteria-unique.d.ts +2 -0
  115. package/lib/rules/arazzo/criteria-unique.js +71 -0
  116. package/lib/rules/arazzo/index.d.ts +3 -0
  117. package/lib/rules/arazzo/index.js +36 -0
  118. package/lib/rules/arazzo/parameters-unique.d.ts +2 -0
  119. package/lib/rules/arazzo/parameters-unique.js +32 -0
  120. package/lib/rules/arazzo/requestBody-replacements-unique.d.ts +2 -0
  121. package/lib/rules/arazzo/requestBody-replacements-unique.js +28 -0
  122. package/lib/rules/arazzo/sourceDescription-type.d.ts +2 -0
  123. package/lib/rules/arazzo/sourceDescription-type.js +22 -0
  124. package/lib/rules/arazzo/sourceDescriptions-name-unique.d.ts +2 -0
  125. package/lib/rules/arazzo/sourceDescriptions-name-unique.js +24 -0
  126. package/lib/rules/arazzo/sourceDescriptions-not-empty.d.ts +2 -0
  127. package/lib/rules/arazzo/sourceDescriptions-not-empty.js +18 -0
  128. package/lib/rules/arazzo/step-onFailure-unique.d.ts +2 -0
  129. package/lib/rules/arazzo/step-onFailure-unique.js +32 -0
  130. package/lib/rules/arazzo/step-onSuccess-unique.d.ts +2 -0
  131. package/lib/rules/arazzo/step-onSuccess-unique.js +32 -0
  132. package/lib/rules/arazzo/stepId-unique.d.ts +2 -0
  133. package/lib/rules/arazzo/stepId-unique.js +26 -0
  134. package/lib/rules/arazzo/workflow-dependsOn.d.ts +2 -0
  135. package/lib/rules/arazzo/workflow-dependsOn.js +56 -0
  136. package/lib/rules/arazzo/workflowId-unique.d.ts +2 -0
  137. package/lib/rules/arazzo/workflowId-unique.js +22 -0
  138. package/lib/rules/async2/channels-kebab-case.d.ts +2 -0
  139. package/lib/rules/async2/channels-kebab-case.js +19 -0
  140. package/lib/rules/async2/index.d.ts +3 -0
  141. package/lib/rules/async2/index.js +27 -0
  142. package/lib/rules/async2/no-channel-trailing-slash.d.ts +2 -0
  143. package/lib/rules/async2/no-channel-trailing-slash.js +16 -0
  144. package/lib/rules/async3/channels-kebab-case.d.ts +2 -0
  145. package/lib/rules/async3/channels-kebab-case.js +19 -0
  146. package/lib/rules/async3/index.d.ts +3 -0
  147. package/lib/rules/async3/index.js +27 -0
  148. package/lib/rules/async3/no-channel-trailing-slash.d.ts +2 -0
  149. package/lib/rules/async3/no-channel-trailing-slash.js +16 -0
  150. package/lib/rules/common/assertions/asserts.d.ts +30 -0
  151. package/lib/rules/common/assertions/asserts.js +281 -0
  152. package/lib/rules/common/assertions/index.d.ts +27 -0
  153. package/lib/rules/common/assertions/index.js +24 -0
  154. package/lib/rules/common/assertions/utils.d.ts +28 -0
  155. package/lib/rules/common/assertions/utils.js +226 -0
  156. package/lib/rules/common/info-contact.d.ts +2 -0
  157. package/lib/rules/common/info-contact.js +17 -0
  158. package/lib/rules/common/info-license-strict.d.ts +2 -0
  159. package/lib/rules/common/info-license-strict.js +26 -0
  160. package/lib/rules/common/info-license-url.d.ts +2 -0
  161. package/lib/rules/common/info-license-url.js +12 -0
  162. package/lib/rules/common/info-license.d.ts +2 -0
  163. package/lib/rules/common/info-license.js +17 -0
  164. package/lib/rules/common/no-ambiguous-paths.d.ts +2 -0
  165. package/lib/rules/common/no-ambiguous-paths.js +45 -0
  166. package/lib/rules/common/no-enum-type-mismatch.d.ts +2 -0
  167. package/lib/rules/common/no-enum-type-mismatch.js +41 -0
  168. package/lib/rules/common/no-http-verbs-in-paths.d.ts +2 -0
  169. package/lib/rules/common/no-http-verbs-in-paths.js +33 -0
  170. package/lib/rules/common/no-identical-paths.d.ts +2 -0
  171. package/lib/rules/common/no-identical-paths.js +24 -0
  172. package/lib/rules/common/no-invalid-parameter-examples.d.ts +1 -0
  173. package/lib/rules/common/no-invalid-parameter-examples.js +24 -0
  174. package/lib/rules/common/no-invalid-schema-examples.d.ts +1 -0
  175. package/lib/rules/common/no-invalid-schema-examples.js +22 -0
  176. package/lib/rules/common/no-path-trailing-slash.d.ts +2 -0
  177. package/lib/rules/common/no-path-trailing-slash.js +16 -0
  178. package/lib/rules/common/no-required-schema-properties-undefined.d.ts +2 -0
  179. package/lib/rules/common/no-required-schema-properties-undefined.js +36 -0
  180. package/lib/rules/common/operation-2xx-response.d.ts +2 -0
  181. package/lib/rules/common/operation-2xx-response.js +23 -0
  182. package/lib/rules/common/operation-4xx-response.d.ts +2 -0
  183. package/lib/rules/common/operation-4xx-response.js +23 -0
  184. package/lib/rules/common/operation-description.d.ts +2 -0
  185. package/lib/rules/common/operation-description.js +12 -0
  186. package/lib/rules/common/operation-operationId-unique.d.ts +2 -0
  187. package/lib/rules/common/operation-operationId-unique.js +20 -0
  188. package/lib/rules/common/operation-operationId-url-safe.d.ts +2 -0
  189. package/lib/rules/common/operation-operationId-url-safe.js +18 -0
  190. package/lib/rules/common/operation-operationId.d.ts +2 -0
  191. package/lib/rules/common/operation-operationId.js +16 -0
  192. package/lib/rules/common/operation-parameters-unique.d.ts +2 -0
  193. package/lib/rules/common/operation-parameters-unique.js +40 -0
  194. package/lib/rules/common/operation-singular-tag.d.ts +2 -0
  195. package/lib/rules/common/operation-singular-tag.js +16 -0
  196. package/lib/rules/common/operation-summary.d.ts +2 -0
  197. package/lib/rules/common/operation-summary.js +12 -0
  198. package/lib/rules/common/operation-tag-defined.d.ts +2 -0
  199. package/lib/rules/common/operation-tag-defined.js +24 -0
  200. package/lib/rules/common/parameter-description.d.ts +2 -0
  201. package/lib/rules/common/parameter-description.js +22 -0
  202. package/lib/rules/common/path-declaration-must-exist.d.ts +2 -0
  203. package/lib/rules/common/path-declaration-must-exist.js +16 -0
  204. package/lib/rules/common/path-excludes-patterns.d.ts +2 -0
  205. package/lib/rules/common/path-excludes-patterns.js +22 -0
  206. package/lib/rules/common/path-http-verbs-order.d.ts +2 -0
  207. package/lib/rules/common/path-http-verbs-order.js +26 -0
  208. package/lib/rules/common/path-not-include-query.d.ts +2 -0
  209. package/lib/rules/common/path-not-include-query.js +18 -0
  210. package/lib/rules/common/path-params-defined.d.ts +2 -0
  211. package/lib/rules/common/path-params-defined.js +58 -0
  212. package/lib/rules/common/path-segment-plural.d.ts +2 -0
  213. package/lib/rules/common/path-segment-plural.js +33 -0
  214. package/lib/rules/common/paths-kebab-case.d.ts +2 -0
  215. package/lib/rules/common/paths-kebab-case.js +20 -0
  216. package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
  217. package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
  218. package/lib/rules/common/response-contains-header.d.ts +2 -0
  219. package/lib/rules/common/response-contains-header.js +29 -0
  220. package/lib/rules/common/scalar-property-missing-example.d.ts +2 -0
  221. package/lib/rules/common/scalar-property-missing-example.js +42 -0
  222. package/lib/rules/common/security-defined.d.ts +2 -0
  223. package/lib/rules/common/security-defined.js +65 -0
  224. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  225. package/lib/rules/common/spec-strict-refs.js +30 -0
  226. package/lib/rules/common/struct.d.ts +2 -0
  227. package/lib/rules/common/struct.js +158 -0
  228. package/lib/rules/common/tag-description.d.ts +2 -0
  229. package/lib/rules/common/tag-description.js +12 -0
  230. package/lib/rules/common/tags-alphabetical.d.ts +2 -0
  231. package/lib/rules/common/tags-alphabetical.js +23 -0
  232. package/lib/rules/no-unresolved-refs.d.ts +5 -0
  233. package/lib/rules/no-unresolved-refs.js +46 -0
  234. package/lib/rules/oas2/boolean-parameter-prefixes.d.ts +5 -0
  235. package/lib/rules/oas2/boolean-parameter-prefixes.js +22 -0
  236. package/lib/rules/oas2/index.d.ts +3 -0
  237. package/lib/rules/oas2/index.js +98 -0
  238. package/lib/rules/oas2/request-mime-type.d.ts +2 -0
  239. package/lib/rules/oas2/request-mime-type.js +17 -0
  240. package/lib/rules/oas2/response-contains-property.d.ts +2 -0
  241. package/lib/rules/oas2/response-contains-property.js +37 -0
  242. package/lib/rules/oas2/response-mime-type.d.ts +2 -0
  243. package/lib/rules/oas2/response-mime-type.js +17 -0
  244. package/lib/rules/oas3/array-parameter-serialization.d.ts +5 -0
  245. package/lib/rules/oas3/array-parameter-serialization.js +29 -0
  246. package/lib/rules/oas3/boolean-parameter-prefixes.d.ts +5 -0
  247. package/lib/rules/oas3/boolean-parameter-prefixes.js +24 -0
  248. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  249. package/lib/rules/oas3/component-name-unique.js +133 -0
  250. package/lib/rules/oas3/index.d.ts +3 -0
  251. package/lib/rules/oas3/index.js +122 -0
  252. package/lib/rules/oas3/no-empty-servers.d.ts +2 -0
  253. package/lib/rules/oas3/no-empty-servers.js +23 -0
  254. package/lib/rules/oas3/no-example-value-and-externalValue.d.ts +2 -0
  255. package/lib/rules/oas3/no-example-value-and-externalValue.js +16 -0
  256. package/lib/rules/oas3/no-invalid-media-type-examples.d.ts +2 -0
  257. package/lib/rules/oas3/no-invalid-media-type-examples.js +39 -0
  258. package/lib/rules/oas3/no-server-example.com.d.ts +2 -0
  259. package/lib/rules/oas3/no-server-example.com.js +18 -0
  260. package/lib/rules/oas3/no-server-trailing-slash.d.ts +2 -0
  261. package/lib/rules/oas3/no-server-trailing-slash.js +18 -0
  262. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  263. package/lib/rules/oas3/no-server-variables-empty-enum.js +66 -0
  264. package/lib/rules/oas3/no-undefined-server-variable.d.ts +2 -0
  265. package/lib/rules/oas3/no-undefined-server-variable.js +31 -0
  266. package/lib/rules/oas3/no-unused-components.d.ts +2 -0
  267. package/lib/rules/oas3/no-unused-components.js +73 -0
  268. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  269. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  270. package/lib/rules/oas3/request-mime-type.d.ts +2 -0
  271. package/lib/rules/oas3/request-mime-type.js +31 -0
  272. package/lib/rules/oas3/response-contains-property.d.ts +2 -0
  273. package/lib/rules/oas3/response-contains-property.js +39 -0
  274. package/lib/rules/oas3/response-mime-type.d.ts +2 -0
  275. package/lib/rules/oas3/response-mime-type.js +31 -0
  276. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  277. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  278. package/lib/rules/other/stats.d.ts +41 -0
  279. package/lib/rules/other/stats.js +75 -0
  280. package/lib/rules/spot/no-criteria-xpath.d.ts +2 -0
  281. package/lib/rules/spot/no-criteria-xpath.js +21 -0
  282. package/lib/rules/spot/spot-supported-versions.d.ts +2 -0
  283. package/lib/rules/spot/spot-supported-versions.js +21 -0
  284. package/lib/rules/utils.d.ts +22 -0
  285. package/lib/rules/utils.js +183 -0
  286. package/lib/types/arazzo.d.ts +2 -0
  287. package/lib/types/arazzo.js +311 -0
  288. package/lib/types/asyncapi2.d.ts +17 -0
  289. package/lib/types/asyncapi2.js +1008 -0
  290. package/lib/types/asyncapi3.d.ts +2 -0
  291. package/lib/types/asyncapi3.js +347 -0
  292. package/lib/types/index.d.ts +57 -0
  293. package/lib/types/index.js +94 -0
  294. package/lib/types/json-schema-adapter.d.ts +3 -0
  295. package/lib/types/json-schema-adapter.js +159 -0
  296. package/lib/types/oas2.d.ts +3 -0
  297. package/lib/types/oas2.js +456 -0
  298. package/lib/types/oas3.d.ts +7 -0
  299. package/lib/types/oas3.js +554 -0
  300. package/lib/types/oas3_1.d.ts +6 -0
  301. package/lib/types/oas3_1.js +285 -0
  302. package/lib/types/redocly-yaml.d.ts +26 -0
  303. package/lib/types/redocly-yaml.js +1126 -0
  304. package/lib/typings/arazzo.d.ts +131 -0
  305. package/lib/typings/arazzo.js +5 -0
  306. package/lib/typings/asyncapi.d.ts +21 -0
  307. package/lib/typings/asyncapi.js +2 -0
  308. package/lib/typings/asyncapi3.d.ts +53 -0
  309. package/lib/typings/asyncapi3.js +2 -0
  310. package/lib/typings/common.d.ts +8 -0
  311. package/lib/typings/common.js +2 -0
  312. package/lib/typings/openapi.d.ts +355 -0
  313. package/lib/typings/openapi.js +2 -0
  314. package/lib/typings/swagger.d.ts +217 -0
  315. package/lib/typings/swagger.js +2 -0
  316. package/lib/utils.d.ts +70 -0
  317. package/lib/utils.js +301 -0
  318. package/lib/visitors.d.ts +229 -0
  319. package/lib/visitors.js +176 -0
  320. package/lib/walk.d.ts +78 -0
  321. package/lib/walk.js +290 -0
  322. package/package.json +59 -0
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathHttpVerbsOrder = void 0;
4
+ const defaultOrder = ['get', 'head', 'post', 'put', 'patch', 'delete', 'options', 'trace'];
5
+ const PathHttpVerbsOrder = (opts) => {
6
+ const order = (opts && opts.order) || defaultOrder;
7
+ if (!Array.isArray(order)) {
8
+ throw new Error('path-http-verbs-order `order` option must be an array');
9
+ }
10
+ return {
11
+ PathItem(path, { report, location }) {
12
+ const httpVerbs = Object.keys(path).filter((k) => order.includes(k));
13
+ for (let i = 0; i < httpVerbs.length - 1; i++) {
14
+ const aIdx = order.indexOf(httpVerbs[i]);
15
+ const bIdx = order.indexOf(httpVerbs[i + 1]);
16
+ if (bIdx < aIdx) {
17
+ report({
18
+ message: 'Operation http verbs must be ordered.',
19
+ location: { reportOnKey: true, ...location.child(httpVerbs[i + 1]) },
20
+ });
21
+ }
22
+ }
23
+ },
24
+ };
25
+ };
26
+ exports.PathHttpVerbsOrder = PathHttpVerbsOrder;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const PathNotIncludeQuery: Oas3Rule | Oas2Rule;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathNotIncludeQuery = void 0;
4
+ const PathNotIncludeQuery = () => {
5
+ return {
6
+ Paths: {
7
+ PathItem(_operation, { report, key }) {
8
+ if (key.toString().includes('?')) {
9
+ report({
10
+ message: `Don't put query string items in the path, they belong in parameters with \`in: query\`.`,
11
+ location: { reportOnKey: true },
12
+ });
13
+ }
14
+ },
15
+ },
16
+ };
17
+ };
18
+ exports.PathNotIncludeQuery = PathNotIncludeQuery;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const PathParamsDefined: Oas3Rule | Oas2Rule;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathParamsDefined = void 0;
4
+ const pathRegex = /\{([a-zA-Z0-9_.-]+)\}+/g;
5
+ const PathParamsDefined = () => {
6
+ let pathTemplateParams;
7
+ let definedPathParams;
8
+ let currentPath;
9
+ let definedOperationParams;
10
+ return {
11
+ PathItem: {
12
+ enter(_, { key }) {
13
+ definedPathParams = new Set();
14
+ currentPath = key;
15
+ pathTemplateParams = new Set(Array.from(key.toString().matchAll(pathRegex)).map((m) => m[1]));
16
+ },
17
+ Parameter(parameter, { report, location }) {
18
+ if (parameter.in === 'path' && parameter.name) {
19
+ definedPathParams.add(parameter.name);
20
+ if (!pathTemplateParams.has(parameter.name)) {
21
+ report({
22
+ message: `Path parameter \`${parameter.name}\` is not used in the path \`${currentPath}\`.`,
23
+ location: location.child(['name']),
24
+ });
25
+ }
26
+ }
27
+ },
28
+ Operation: {
29
+ enter() {
30
+ definedOperationParams = new Set();
31
+ },
32
+ leave(_op, { report, location }) {
33
+ for (const templateParam of Array.from(pathTemplateParams.keys())) {
34
+ if (!definedOperationParams.has(templateParam) &&
35
+ !definedPathParams.has(templateParam)) {
36
+ report({
37
+ message: `The operation does not define the path parameter \`{${templateParam}}\` expected by path \`${currentPath}\`.`,
38
+ location: location.child(['parameters']).key(), // report on operation
39
+ });
40
+ }
41
+ }
42
+ },
43
+ Parameter(parameter, { report, location }) {
44
+ if (parameter.in === 'path' && parameter.name) {
45
+ definedOperationParams.add(parameter.name);
46
+ if (!pathTemplateParams.has(parameter.name)) {
47
+ report({
48
+ message: `Path parameter \`${parameter.name}\` is not used in the path \`${currentPath}\`.`,
49
+ location: location.child(['name']),
50
+ });
51
+ }
52
+ }
53
+ },
54
+ },
55
+ },
56
+ };
57
+ };
58
+ exports.PathParamsDefined = PathParamsDefined;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const PathSegmentPlural: Oas3Rule | Oas2Rule;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathSegmentPlural = void 0;
4
+ const pluralize = require("pluralize");
5
+ const utils_1 = require("../../utils");
6
+ const PathSegmentPlural = (opts) => {
7
+ const { ignoreLastPathSegment, exceptions } = opts;
8
+ return {
9
+ PathItem: {
10
+ leave(_path, { report, key, location }) {
11
+ const pathKey = key.toString();
12
+ if (pathKey.startsWith('/')) {
13
+ const pathSegments = pathKey.split('/');
14
+ pathSegments.shift();
15
+ if (ignoreLastPathSegment && pathSegments.length > 1) {
16
+ pathSegments.pop();
17
+ }
18
+ for (const pathSegment of pathSegments) {
19
+ if (exceptions && exceptions.includes(pathSegment))
20
+ continue;
21
+ if (!(0, utils_1.isPathParameter)(pathSegment) && pluralize.isSingular(pathSegment)) {
22
+ report({
23
+ message: `path segment \`${pathSegment}\` should be plural.`,
24
+ location: location.key(),
25
+ });
26
+ }
27
+ }
28
+ }
29
+ },
30
+ },
31
+ };
32
+ };
33
+ exports.PathSegmentPlural = PathSegmentPlural;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const PathsKebabCase: Oas3Rule | Oas2Rule;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PathsKebabCase = void 0;
4
+ const PathsKebabCase = () => {
5
+ return {
6
+ PathItem(_path, { report, key }) {
7
+ const segments = key
8
+ .substr(1)
9
+ .split('/')
10
+ .filter((s) => s !== ''); // filter out empty segments
11
+ if (!segments.every((segment) => /^{.+}$/.test(segment) || /^[a-z0-9-.]+$/.test(segment))) {
12
+ report({
13
+ message: `\`${key}\` does not use kebab-case.`,
14
+ location: { reportOnKey: true },
15
+ });
16
+ }
17
+ },
18
+ };
19
+ };
20
+ exports.PathsKebabCase = PathsKebabCase;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule } from 'core/src/visitors';
2
+ export declare const RequiredStringPropertyMissingMinLength: Oas3Rule;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequiredStringPropertyMissingMinLength = void 0;
4
+ const RequiredStringPropertyMissingMinLength = () => {
5
+ let skipSchemaProperties;
6
+ let requiredPropertiesSet;
7
+ return {
8
+ Schema: {
9
+ enter(schema) {
10
+ if (!schema?.required) {
11
+ skipSchemaProperties = true;
12
+ return;
13
+ }
14
+ requiredPropertiesSet = new Set(schema.required);
15
+ skipSchemaProperties = false;
16
+ },
17
+ SchemaProperties: {
18
+ skip() {
19
+ return skipSchemaProperties;
20
+ },
21
+ Schema: {
22
+ enter(schema, { key, location, report }) {
23
+ if (requiredPropertiesSet.has(key) && schema.type === 'string') {
24
+ if (!schema?.minLength) {
25
+ report({
26
+ message: 'Property minLength is required.',
27
+ location: location.key(),
28
+ });
29
+ }
30
+ }
31
+ },
32
+ },
33
+ },
34
+ },
35
+ };
36
+ };
37
+ exports.RequiredStringPropertyMissingMinLength = RequiredStringPropertyMissingMinLength;
@@ -0,0 +1,2 @@
1
+ import type { Oas2Rule, Oas3Rule } from '../../visitors';
2
+ export declare const ResponseContainsHeader: Oas3Rule | Oas2Rule;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseContainsHeader = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const ResponseContainsHeader = (options) => {
6
+ const names = options.names || {};
7
+ return {
8
+ Operation: {
9
+ Response: {
10
+ enter: (response, { report, location, key }) => {
11
+ const expectedHeaders = names[key] ||
12
+ names[(0, utils_1.getMatchingStatusCodeRange)(key)] ||
13
+ names[(0, utils_1.getMatchingStatusCodeRange)(key).toLowerCase()] ||
14
+ [];
15
+ for (const expectedHeader of expectedHeaders) {
16
+ if (!response?.headers ||
17
+ !Object.keys(response?.headers).some((header) => header.toLowerCase() === expectedHeader.toLowerCase())) {
18
+ report({
19
+ message: `Response object must contain a "${expectedHeader}" header.`,
20
+ location: location.child('headers').key(),
21
+ });
22
+ }
23
+ }
24
+ },
25
+ },
26
+ },
27
+ };
28
+ };
29
+ exports.ResponseContainsHeader = ResponseContainsHeader;
@@ -0,0 +1,2 @@
1
+ import type { Oas2Rule, Oas3Rule } from '../../visitors';
2
+ export declare const ScalarPropertyMissingExample: Oas3Rule | Oas2Rule;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScalarPropertyMissingExample = void 0;
4
+ const oas_types_1 = require("../../oas-types");
5
+ const SCALAR_TYPES = ['string', 'integer', 'number', 'boolean', 'null'];
6
+ const ScalarPropertyMissingExample = () => {
7
+ return {
8
+ SchemaProperties(properties, { report, location, oasVersion, resolve }) {
9
+ for (const propName of Object.keys(properties)) {
10
+ const propSchema = resolve(properties[propName]).node;
11
+ if (!propSchema || !isScalarSchema(propSchema)) {
12
+ continue;
13
+ }
14
+ if (propSchema.example === undefined &&
15
+ propSchema.examples === undefined) {
16
+ report({
17
+ message: `Scalar property should have "example"${oasVersion === oas_types_1.SpecVersion.OAS3_1 ? ' or "examples"' : ''} defined.`,
18
+ location: location.child(propName).key(),
19
+ });
20
+ }
21
+ }
22
+ },
23
+ };
24
+ };
25
+ exports.ScalarPropertyMissingExample = ScalarPropertyMissingExample;
26
+ function isScalarSchema(schema) {
27
+ if (!schema.type) {
28
+ return false;
29
+ }
30
+ if (schema.allOf || schema.anyOf || schema.oneOf) {
31
+ // Skip allOf/oneOf/anyOf as it's complicated to validate it right now.
32
+ // We need core support for checking contrstrains through those keywords.
33
+ return false;
34
+ }
35
+ if (schema.format === 'binary') {
36
+ return false;
37
+ }
38
+ if (Array.isArray(schema.type)) {
39
+ return schema.type.every((t) => SCALAR_TYPES.includes(t));
40
+ }
41
+ return SCALAR_TYPES.includes(schema.type);
42
+ }
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const SecurityDefined: Oas3Rule | Oas2Rule;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecurityDefined = void 0;
4
+ const SecurityDefined = (opts) => {
5
+ const referencedSchemes = new Map();
6
+ const operationsWithoutSecurity = [];
7
+ let eachOperationHasSecurity = true;
8
+ let path;
9
+ return {
10
+ Root: {
11
+ leave(root, { report }) {
12
+ for (const [name, scheme] of referencedSchemes.entries()) {
13
+ if (scheme.defined)
14
+ continue;
15
+ for (const reportedFromLocation of scheme.from) {
16
+ report({
17
+ message: `There is no \`${name}\` security scheme defined.`,
18
+ location: reportedFromLocation.key(),
19
+ });
20
+ }
21
+ }
22
+ if (root.security || eachOperationHasSecurity) {
23
+ return;
24
+ }
25
+ else {
26
+ for (const operationLocation of operationsWithoutSecurity) {
27
+ report({
28
+ message: `Every operation should have security defined on it or on the root level.`,
29
+ location: operationLocation.key(),
30
+ });
31
+ }
32
+ }
33
+ },
34
+ },
35
+ SecurityScheme(_securityScheme, { key }) {
36
+ referencedSchemes.set(key.toString(), { defined: true, from: [] });
37
+ },
38
+ SecurityRequirement(requirements, { location }) {
39
+ for (const requirement of Object.keys(requirements)) {
40
+ const authScheme = referencedSchemes.get(requirement);
41
+ const requirementLocation = location.child([requirement]);
42
+ if (!authScheme) {
43
+ referencedSchemes.set(requirement, { from: [requirementLocation] });
44
+ }
45
+ else {
46
+ authScheme.from.push(requirementLocation);
47
+ }
48
+ }
49
+ },
50
+ PathItem: {
51
+ enter(pathItem, { key }) {
52
+ path = key;
53
+ },
54
+ Operation(operation, { location, key }) {
55
+ const isException = opts.exceptions?.some((item) => item.path === path &&
56
+ (!item.methods || item.methods?.some((method) => method.toLowerCase() === key)));
57
+ if (!operation?.security && !isException) {
58
+ eachOperationHasSecurity = false;
59
+ operationsWithoutSecurity.push(location);
60
+ }
61
+ },
62
+ },
63
+ };
64
+ };
65
+ exports.SecurityDefined = SecurityDefined;
@@ -0,0 +1,2 @@
1
+ import type { Oas2Rule, Oas3Rule } from '../../visitors';
2
+ export declare const SpecStrictRefs: Oas3Rule | Oas2Rule;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpecStrictRefs = void 0;
4
+ const ref_utils_1 = require("../../ref-utils");
5
+ const SpecStrictRefs = () => {
6
+ const nodesToSkip = [
7
+ 'Schema',
8
+ 'Response',
9
+ 'Parameter',
10
+ 'RequestBody',
11
+ 'Example',
12
+ 'Header',
13
+ 'SecurityScheme',
14
+ 'Link',
15
+ 'Callback',
16
+ 'PathItem',
17
+ ];
18
+ return {
19
+ any(_node, { report, rawNode, rawLocation, type }) {
20
+ const shouldCheck = !nodesToSkip.includes(type.name);
21
+ if (shouldCheck && (0, ref_utils_1.isRef)(rawNode)) {
22
+ report({
23
+ message: 'Field $ref is not expected here.',
24
+ location: rawLocation.child('$ref').key(),
25
+ });
26
+ }
27
+ },
28
+ };
29
+ };
30
+ exports.SpecStrictRefs = SpecStrictRefs;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule, Async2Rule, Async3Rule, Arazzo1Rule } from '../../visitors';
2
+ export declare const Struct: Oas3Rule | Oas2Rule | Async2Rule | Async3Rule | Arazzo1Rule;
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Struct = void 0;
4
+ const types_1 = require("../../types");
5
+ const utils_1 = require("../utils");
6
+ const ref_utils_1 = require("../../ref-utils");
7
+ const utils_2 = require("../../utils");
8
+ const Struct = () => {
9
+ return {
10
+ any(node, { report, type, location, rawLocation, key, resolve, ignoreNextVisitorsOnNode }) {
11
+ const nodeType = (0, utils_1.oasTypeOf)(node);
12
+ const refLocation = rawLocation !== location ? rawLocation : undefined;
13
+ if (type.items) {
14
+ if (nodeType !== 'array') {
15
+ report({
16
+ message: `Expected type \`${type.name}\` (array) but got \`${nodeType}\``,
17
+ from: refLocation,
18
+ });
19
+ ignoreNextVisitorsOnNode();
20
+ }
21
+ return;
22
+ }
23
+ else if (nodeType !== 'object') {
24
+ if (type !== types_1.SpecExtension) {
25
+ // do not validate unknown extensions structure
26
+ report({
27
+ message: `Expected type \`${type.name}\` (object) but got \`${nodeType}\``,
28
+ from: refLocation,
29
+ });
30
+ }
31
+ ignoreNextVisitorsOnNode();
32
+ return;
33
+ }
34
+ const required = typeof type.required === 'function' ? type.required(node, key) : type.required;
35
+ for (const propName of required || []) {
36
+ if (!node.hasOwnProperty(propName)) {
37
+ report({
38
+ message: `The field \`${propName}\` must be present on this level.`,
39
+ from: refLocation,
40
+ location: [{ reportOnKey: true }],
41
+ });
42
+ }
43
+ }
44
+ const allowed = type.allowed?.(node);
45
+ if (allowed && (0, utils_2.isPlainObject)(node)) {
46
+ for (const propName in node) {
47
+ if (allowed.includes(propName) ||
48
+ (type.extensionsPrefix && propName.startsWith(type.extensionsPrefix)) ||
49
+ !Object.keys(type.properties).includes(propName)) {
50
+ continue;
51
+ }
52
+ report({
53
+ message: `The field \`${propName}\` is not allowed here.`,
54
+ from: refLocation,
55
+ location: location.child([propName]).key(),
56
+ });
57
+ }
58
+ }
59
+ const requiredOneOf = type.requiredOneOf || null;
60
+ if (requiredOneOf) {
61
+ let hasProperty = false;
62
+ for (const propName of requiredOneOf || []) {
63
+ if (node.hasOwnProperty(propName)) {
64
+ hasProperty = true;
65
+ }
66
+ }
67
+ if (!hasProperty)
68
+ report({
69
+ message: `Must contain at least one of the following fields: ${type.requiredOneOf?.join(', ')}.`,
70
+ from: refLocation,
71
+ location: [{ reportOnKey: true }],
72
+ });
73
+ }
74
+ for (const propName of Object.keys(node)) {
75
+ const propLocation = location.child([propName]);
76
+ let propValue = node[propName];
77
+ let propType = type.properties[propName];
78
+ if (propType === undefined)
79
+ propType = type.additionalProperties;
80
+ if (typeof propType === 'function')
81
+ propType = propType(propValue, propName);
82
+ if ((0, types_1.isNamedType)(propType)) {
83
+ continue; // do nothing for named schema, it is executed with the next any call
84
+ }
85
+ const propSchema = propType;
86
+ const propValueType = (0, utils_1.oasTypeOf)(propValue);
87
+ if (propSchema === undefined) {
88
+ if (propName.startsWith('x-'))
89
+ continue;
90
+ report({
91
+ message: `Property \`${propName}\` is not expected here.`,
92
+ suggest: (0, utils_1.getSuggest)(propName, Object.keys(type.properties)),
93
+ from: refLocation,
94
+ location: propLocation.key(),
95
+ });
96
+ continue;
97
+ }
98
+ if (propSchema === null) {
99
+ continue; // just defined, no validation
100
+ }
101
+ if (propSchema.resolvable !== false && (0, ref_utils_1.isRef)(propValue)) {
102
+ propValue = resolve(propValue).node;
103
+ }
104
+ if (propSchema.items && propSchema.items?.enum && Array.isArray(propValue)) {
105
+ for (let i = 0; i < propValue.length; i++) {
106
+ (0, utils_1.validateSchemaEnumType)(propSchema.items?.enum, propValue[i], propName, refLocation, {
107
+ report,
108
+ location: location.child([propName, i]),
109
+ });
110
+ }
111
+ }
112
+ if (propSchema.enum) {
113
+ (0, utils_1.validateSchemaEnumType)(propSchema.enum, propValue, propName, refLocation, {
114
+ report,
115
+ location: location.child([propName]),
116
+ });
117
+ }
118
+ else if (propSchema.type && !(0, utils_1.matchesJsonSchemaType)(propValue, propSchema.type, false)) {
119
+ report({
120
+ message: `Expected type \`${propSchema.type}\` but got \`${propValueType}\`.`,
121
+ from: refLocation,
122
+ location: propLocation,
123
+ });
124
+ ignoreNextVisitorsOnNode();
125
+ }
126
+ else if (propValueType === 'array' && propSchema.items?.type) {
127
+ const itemsType = propSchema.items?.type;
128
+ for (let i = 0; i < propValue.length; i++) {
129
+ const item = propValue[i];
130
+ if (!(0, utils_1.matchesJsonSchemaType)(item, itemsType, false)) {
131
+ report({
132
+ message: `Expected type \`${itemsType}\` but got \`${(0, utils_1.oasTypeOf)(item)}\`.`,
133
+ from: refLocation,
134
+ location: propLocation.child([i]),
135
+ });
136
+ }
137
+ }
138
+ }
139
+ if (typeof propSchema.minimum === 'number') {
140
+ if (propSchema.minimum > node[propName]) {
141
+ report({
142
+ message: `The value of the ${propName} field must be greater than or equal to ${propSchema.minimum}`,
143
+ from: refLocation,
144
+ location: location.child([propName]),
145
+ });
146
+ }
147
+ }
148
+ if (propName === 'nullable' && !node.type) {
149
+ report({
150
+ message: 'The `type` field must be defined when the `nullable` field is used.',
151
+ location: location.child([propName]),
152
+ });
153
+ }
154
+ }
155
+ },
156
+ };
157
+ };
158
+ exports.Struct = Struct;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const TagDescription: Oas3Rule | Oas2Rule;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagDescription = void 0;
4
+ const utils_1 = require("../utils");
5
+ const TagDescription = () => {
6
+ return {
7
+ Tag(tag, ctx) {
8
+ (0, utils_1.validateDefinedAndNonEmpty)('description', tag, ctx);
9
+ },
10
+ };
11
+ };
12
+ exports.TagDescription = TagDescription;
@@ -0,0 +1,2 @@
1
+ import type { Oas3Rule, Oas2Rule } from '../../visitors';
2
+ export declare const TagsAlphabetical: Oas3Rule | Oas2Rule;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagsAlphabetical = void 0;
4
+ const TagsAlphabetical = ({ ignoreCase = false }) => {
5
+ return {
6
+ Root(root, { report, location }) {
7
+ if (!root.tags)
8
+ return;
9
+ for (let i = 0; i < root.tags.length - 1; i++) {
10
+ if (getTagName(root.tags[i], ignoreCase) > getTagName(root.tags[i + 1], ignoreCase)) {
11
+ report({
12
+ message: 'The `tags` array should be in alphabetical order.',
13
+ location: location.child(['tags', i]),
14
+ });
15
+ }
16
+ }
17
+ },
18
+ };
19
+ };
20
+ exports.TagsAlphabetical = TagsAlphabetical;
21
+ function getTagName(tag, ignoreCase) {
22
+ return ignoreCase ? tag.name.toLowerCase() : tag.name;
23
+ }
@@ -0,0 +1,5 @@
1
+ import type { Oas3Rule } from '../visitors';
2
+ import type { ResolveResult, Problem } from '../walk';
3
+ import type { Location } from '../ref-utils';
4
+ export declare const NoUnresolvedRefs: Oas3Rule;
5
+ export declare function reportUnresolvedRef(resolved: ResolveResult<any>, report: (m: Problem) => void, location: Location): void;