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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +6 -6
  2. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +0 -1
  3. package/lib/benchmark/benches/recommended-oas3.bench.js +1 -1
  4. package/lib/benchmark/benches/resolve-with-no-external.bench.js +1 -1
  5. package/lib/benchmark/utils.d.ts +2 -2
  6. package/lib/benchmark/utils.js +2 -2
  7. package/lib/bundle.d.ts +12 -15
  8. package/lib/bundle.js +38 -15
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +17 -6
  11. package/lib/config/builtIn.d.ts +2 -2
  12. package/lib/config/builtIn.js +2 -2
  13. package/lib/config/config-resolvers.d.ts +5 -5
  14. package/lib/config/config-resolvers.js +121 -66
  15. package/lib/config/config.d.ts +12 -18
  16. package/lib/config/config.js +42 -26
  17. package/lib/config/load.d.ts +16 -3
  18. package/lib/config/load.js +36 -14
  19. package/lib/config/minimal.d.ts +2 -2
  20. package/lib/config/minimal.js +10 -6
  21. package/lib/config/recommended.d.ts +2 -2
  22. package/lib/config/recommended.js +10 -6
  23. package/lib/config/rules.d.ts +7 -4
  24. package/lib/config/rules.js +5 -4
  25. package/lib/config/types.d.ts +72 -23
  26. package/lib/config/types.js +13 -0
  27. package/lib/config/utils.d.ts +6 -5
  28. package/lib/config/utils.js +110 -32
  29. package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
  30. package/lib/decorators/common/filters/filter-helper.js +67 -0
  31. package/lib/decorators/common/filters/filter-in.d.ts +2 -0
  32. package/lib/decorators/common/filters/filter-in.js +17 -0
  33. package/lib/decorators/common/filters/filter-out.d.ts +2 -0
  34. package/lib/decorators/common/filters/filter-out.js +17 -0
  35. package/lib/decorators/common/info-override.d.ts +2 -0
  36. package/lib/decorators/common/info-override.js +28 -0
  37. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  38. package/lib/decorators/common/media-type-examples-override.js +53 -0
  39. package/lib/decorators/common/registry-dependencies.js +2 -2
  40. package/lib/decorators/common/remove-x-internal.js +2 -2
  41. package/lib/decorators/oas2/index.d.ts +3 -0
  42. package/lib/decorators/oas2/index.js +7 -1
  43. package/lib/decorators/oas3/index.d.ts +4 -0
  44. package/lib/decorators/oas3/index.js +9 -1
  45. package/lib/env.d.ts +3 -0
  46. package/lib/env.js +8 -0
  47. package/lib/format/codeframes.js +16 -10
  48. package/lib/format/format.d.ts +1 -1
  49. package/lib/format/format.js +64 -32
  50. package/lib/index.d.ts +6 -6
  51. package/lib/index.js +7 -2
  52. package/lib/js-yaml/index.js +2 -6
  53. package/lib/lint.d.ts +4 -2
  54. package/lib/lint.js +36 -11
  55. package/lib/logger.d.ts +10 -0
  56. package/lib/logger.js +31 -0
  57. package/lib/output.d.ts +3 -0
  58. package/lib/output.js +9 -0
  59. package/lib/redocly/index.js +10 -9
  60. package/lib/redocly/registry-api-types.d.ts +28 -28
  61. package/lib/redocly/registry-api.d.ts +3 -3
  62. package/lib/redocly/registry-api.js +10 -2
  63. package/lib/ref-utils.d.ts +1 -0
  64. package/lib/ref-utils.js +8 -2
  65. package/lib/resolve.d.ts +1 -1
  66. package/lib/resolve.js +33 -3
  67. package/lib/rules/ajv.d.ts +2 -2
  68. package/lib/rules/ajv.js +12 -12
  69. package/lib/rules/common/assertions/asserts.d.ts +29 -4
  70. package/lib/rules/common/assertions/asserts.js +227 -97
  71. package/lib/rules/common/assertions/index.d.ts +27 -2
  72. package/lib/rules/common/assertions/index.js +9 -37
  73. package/lib/rules/common/assertions/utils.d.ts +16 -8
  74. package/lib/rules/common/assertions/utils.js +160 -76
  75. package/lib/rules/common/info-license-url.d.ts +1 -1
  76. package/lib/rules/common/info-license-url.js +5 -10
  77. package/lib/rules/common/info-license.d.ts +2 -0
  78. package/lib/rules/common/info-license.js +17 -0
  79. package/lib/rules/common/no-ambiguous-paths.js +1 -1
  80. package/lib/rules/common/no-enum-type-mismatch.js +1 -3
  81. package/lib/rules/common/no-identical-paths.js +4 -4
  82. package/lib/rules/common/no-invalid-parameter-examples.js +3 -3
  83. package/lib/rules/common/no-invalid-schema-examples.js +3 -3
  84. package/lib/rules/common/operation-2xx-response.js +15 -9
  85. package/lib/rules/common/operation-4xx-response.js +15 -9
  86. package/lib/rules/common/operation-operationId.js +2 -2
  87. package/lib/rules/common/operation-tag-defined.js +1 -1
  88. package/lib/rules/common/path-not-include-query.js +2 -2
  89. package/lib/rules/common/path-params-defined.js +7 -2
  90. package/lib/rules/common/paths-kebab-case.js +4 -1
  91. package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
  92. package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
  93. package/lib/rules/common/response-contains-header.d.ts +2 -0
  94. package/lib/rules/common/response-contains-header.js +29 -0
  95. package/lib/rules/common/scalar-property-missing-example.d.ts +2 -0
  96. package/lib/rules/common/scalar-property-missing-example.js +42 -0
  97. package/lib/rules/common/security-defined.d.ts +2 -0
  98. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  99. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  100. package/lib/rules/common/spec-strict-refs.js +30 -0
  101. package/lib/rules/common/spec.js +41 -18
  102. package/lib/rules/common/tags-alphabetical.js +1 -1
  103. package/lib/rules/oas2/index.d.ts +6 -2
  104. package/lib/rules/oas2/index.js +16 -8
  105. package/lib/rules/oas2/remove-unused-components.js +6 -6
  106. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/request-mime-type.js +1 -1
  108. package/lib/rules/oas2/response-contains-property.d.ts +2 -0
  109. package/lib/rules/oas2/response-contains-property.js +38 -0
  110. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  111. package/lib/rules/oas2/response-mime-type.js +1 -1
  112. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  113. package/lib/rules/oas3/component-name-unique.js +124 -0
  114. package/lib/rules/oas3/index.js +24 -10
  115. package/lib/rules/oas3/no-empty-servers.js +2 -2
  116. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  117. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  118. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  119. package/lib/rules/oas3/no-unused-components.js +2 -2
  120. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  121. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  122. package/lib/rules/oas3/remove-unused-components.js +6 -6
  123. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  124. package/lib/rules/oas3/request-mime-type.js +1 -1
  125. package/lib/rules/oas3/response-contains-property.d.ts +2 -0
  126. package/lib/rules/oas3/response-contains-property.js +40 -0
  127. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  128. package/lib/rules/oas3/response-mime-type.js +1 -1
  129. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  130. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  131. package/lib/rules/other/stats.d.ts +2 -2
  132. package/lib/rules/other/stats.js +45 -16
  133. package/lib/rules/utils.d.ts +5 -2
  134. package/lib/rules/utils.js +54 -6
  135. package/lib/types/config-external-schemas.d.ts +2193 -0
  136. package/lib/types/config-external-schemas.js +805 -0
  137. package/lib/types/index.d.ts +3 -2
  138. package/lib/types/index.js +9 -1
  139. package/lib/types/oas2.js +91 -15
  140. package/lib/types/oas3.js +139 -49
  141. package/lib/types/oas3_1.js +32 -26
  142. package/lib/types/redocly-yaml.js +414 -58
  143. package/lib/typings/openapi.d.ts +3 -2
  144. package/lib/utils.d.ts +15 -3
  145. package/lib/utils.js +73 -7
  146. package/lib/visitors.d.ts +20 -16
  147. package/lib/visitors.js +28 -3
  148. package/lib/walk.d.ts +11 -19
  149. package/lib/walk.js +74 -53
  150. package/package.json +5 -6
  151. package/__tests__/__snapshots__/bundle.test.ts.snap +0 -229
  152. package/__tests__/bundle.test.ts +0 -132
  153. package/__tests__/codeframes.test.ts +0 -531
  154. package/__tests__/fixtures/extension.js +0 -24
  155. package/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/__tests__/fixtures/refs/param-b.yaml +0 -1
  163. package/__tests__/fixtures/refs/param-c.yaml +0 -1
  164. package/__tests__/fixtures/refs/rename.yaml +0 -1
  165. package/__tests__/fixtures/refs/requestBody.yaml +0 -9
  166. package/__tests__/fixtures/refs/schema-a.yaml +0 -1
  167. package/__tests__/fixtures/refs/simple.yaml +0 -1
  168. package/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  169. package/__tests__/fixtures/resolve/External.yaml +0 -10
  170. package/__tests__/fixtures/resolve/External2.yaml +0 -4
  171. package/__tests__/fixtures/resolve/description.md +0 -3
  172. package/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  173. package/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  174. package/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  175. package/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  176. package/__tests__/fixtures/resolve/openapi.yaml +0 -28
  177. package/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  178. package/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  179. package/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  180. package/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  181. package/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  182. package/__tests__/lint.test.ts +0 -17
  183. package/__tests__/login.test.ts +0 -17
  184. package/__tests__/normalizeVisitors.test.ts +0 -151
  185. package/__tests__/ref-utils.test.ts +0 -120
  186. package/__tests__/resolve-http.test.ts +0 -77
  187. package/__tests__/resolve.test.ts +0 -405
  188. package/__tests__/utils.ts +0 -86
  189. package/__tests__/walk.test.ts +0 -1485
  190. package/lib/rules/common/info-description.d.ts +0 -2
  191. package/lib/rules/common/info-description.js +0 -12
  192. package/lib/rules/common/license-url.d.ts +0 -2
  193. package/lib/rules/common/license-url.js +0 -12
  194. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  195. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  196. package/src/__tests__/js-yaml.test.ts +0 -71
  197. package/src/__tests__/lint.test.ts +0 -182
  198. package/src/__tests__/utils.test.ts +0 -74
  199. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  200. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  201. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  202. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  203. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  204. package/src/benchmark/benches/rebilly.yaml +0 -32267
  205. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  206. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  207. package/src/benchmark/benchmark.js +0 -307
  208. package/src/benchmark/colors.js +0 -29
  209. package/src/benchmark/fork.js +0 -83
  210. package/src/benchmark/utils.ts +0 -36
  211. package/src/bundle.ts +0 -371
  212. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  213. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  214. package/src/config/__tests__/config.test.ts +0 -244
  215. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  216. package/src/config/__tests__/fixtures/plugin.js +0 -56
  217. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  218. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  219. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  220. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  221. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  222. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  223. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  224. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  225. package/src/config/__tests__/load.test.ts +0 -83
  226. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  227. package/src/config/all.ts +0 -65
  228. package/src/config/builtIn.ts +0 -37
  229. package/src/config/config-resolvers.ts +0 -359
  230. package/src/config/config.ts +0 -312
  231. package/src/config/index.ts +0 -7
  232. package/src/config/load.ts +0 -84
  233. package/src/config/minimal.ts +0 -58
  234. package/src/config/recommended.ts +0 -58
  235. package/src/config/rules.ts +0 -46
  236. package/src/config/types.ts +0 -168
  237. package/src/config/utils.ts +0 -208
  238. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  239. package/src/decorators/common/info-description-override.ts +0 -24
  240. package/src/decorators/common/operation-description-override.ts +0 -30
  241. package/src/decorators/common/registry-dependencies.ts +0 -25
  242. package/src/decorators/common/remove-x-internal.ts +0 -59
  243. package/src/decorators/common/tag-description-override.ts +0 -25
  244. package/src/decorators/oas2/index.ts +0 -14
  245. package/src/decorators/oas3/index.ts +0 -14
  246. package/src/format/codeframes.ts +0 -210
  247. package/src/format/format.ts +0 -339
  248. package/src/index.ts +0 -68
  249. package/src/js-yaml/index.ts +0 -18
  250. package/src/lint.ts +0 -125
  251. package/src/oas-types.ts +0 -62
  252. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  253. package/src/redocly/index.ts +0 -182
  254. package/src/redocly/redocly-client-types.ts +0 -10
  255. package/src/redocly/registry-api-types.ts +0 -32
  256. package/src/redocly/registry-api.ts +0 -134
  257. package/src/ref-utils.ts +0 -79
  258. package/src/resolve.ts +0 -378
  259. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  260. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  261. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  262. package/src/rules/ajv.ts +0 -103
  263. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  264. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  265. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  266. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  267. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  268. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  269. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  270. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  271. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  272. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  273. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  274. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  275. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  276. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  277. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  278. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  279. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  280. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  281. package/src/rules/common/__tests__/spec.test.ts +0 -62
  282. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  283. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  284. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  285. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  286. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  287. package/src/rules/common/assertions/asserts.ts +0 -137
  288. package/src/rules/common/assertions/index.ts +0 -75
  289. package/src/rules/common/assertions/utils.ts +0 -167
  290. package/src/rules/common/info-contact.ts +0 -15
  291. package/src/rules/common/info-description.ts +0 -10
  292. package/src/rules/common/info-license-url.ts +0 -15
  293. package/src/rules/common/license-url.ts +0 -10
  294. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  295. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  296. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  297. package/src/rules/common/no-identical-paths.ts +0 -24
  298. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  299. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  300. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  301. package/src/rules/common/operation-2xx-response.ts +0 -16
  302. package/src/rules/common/operation-4xx-response.ts +0 -17
  303. package/src/rules/common/operation-description.ts +0 -13
  304. package/src/rules/common/operation-operationId-unique.ts +0 -21
  305. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  306. package/src/rules/common/operation-operationId.ts +0 -17
  307. package/src/rules/common/operation-parameters-unique.ts +0 -48
  308. package/src/rules/common/operation-security-defined.ts +0 -45
  309. package/src/rules/common/operation-singular-tag.ts +0 -17
  310. package/src/rules/common/operation-summary.ts +0 -13
  311. package/src/rules/common/operation-tag-defined.ts +0 -26
  312. package/src/rules/common/parameter-description.ts +0 -22
  313. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  314. package/src/rules/common/path-excludes-patterns.ts +0 -23
  315. package/src/rules/common/path-http-verbs-order.ts +0 -30
  316. package/src/rules/common/path-not-include-query.ts +0 -17
  317. package/src/rules/common/path-params-defined.ts +0 -58
  318. package/src/rules/common/path-segment-plural.ts +0 -31
  319. package/src/rules/common/paths-kebab-case.ts +0 -16
  320. package/src/rules/common/spec.ts +0 -143
  321. package/src/rules/common/tag-description.ts +0 -10
  322. package/src/rules/common/tags-alphabetical.ts +0 -20
  323. package/src/rules/no-unresolved-refs.ts +0 -51
  324. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  325. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  326. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  327. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  328. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  329. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  330. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  331. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  332. package/src/rules/oas2/index.ts +0 -83
  333. package/src/rules/oas2/remove-unused-components.ts +0 -76
  334. package/src/rules/oas2/request-mime-type.ts +0 -17
  335. package/src/rules/oas2/response-mime-type.ts +0 -17
  336. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  337. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  338. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  339. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  340. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  341. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  342. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  343. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  344. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  345. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  346. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  347. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  348. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  349. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  350. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  351. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  352. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  353. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  354. package/src/rules/oas3/index.ts +0 -99
  355. package/src/rules/oas3/no-empty-servers.ts +0 -22
  356. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  357. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  358. package/src/rules/oas3/no-server-example.com.ts +0 -14
  359. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  360. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  361. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  362. package/src/rules/oas3/no-unused-components.ts +0 -75
  363. package/src/rules/oas3/remove-unused-components.ts +0 -84
  364. package/src/rules/oas3/request-mime-type.ts +0 -31
  365. package/src/rules/oas3/response-mime-type.ts +0 -31
  366. package/src/rules/other/stats.ts +0 -44
  367. package/src/rules/utils.ts +0 -123
  368. package/src/types/index.ts +0 -138
  369. package/src/types/oas2.ts +0 -397
  370. package/src/types/oas3.ts +0 -506
  371. package/src/types/oas3_1.ts +0 -251
  372. package/src/types/redocly-yaml.ts +0 -637
  373. package/src/typings/common.ts +0 -9
  374. package/src/typings/openapi.ts +0 -297
  375. package/src/typings/swagger.ts +0 -236
  376. package/src/utils.ts +0 -190
  377. package/src/visitors.ts +0 -448
  378. package/src/walk.ts +0 -416
  379. package/tsconfig.json +0 -8
  380. package/tsconfig.tsbuildinfo +0 -1
@@ -30,8 +30,14 @@ class RegistryApi {
30
30
  return this;
31
31
  }
32
32
  request(path = '', options = {}, region) {
33
+ var _a, _b;
33
34
  return __awaiter(this, void 0, void 0, function* () {
34
- const headers = Object.assign({}, options.headers || {}, { 'x-redocly-cli-version': version });
35
+ const currentCommand = typeof process !== 'undefined' ? ((_a = process.env) === null || _a === void 0 ? void 0 : _a.REDOCLY_CLI_COMMAND) || '' : '';
36
+ const redoclyEnv = typeof process !== 'undefined' ? ((_b = process.env) === null || _b === void 0 ? void 0 : _b.REDOCLY_ENVIRONMENT) || '' : '';
37
+ const headers = Object.assign({}, options.headers || {}, {
38
+ 'x-redocly-cli-version': version,
39
+ 'user-agent': `redocly-cli / ${version} ${currentCommand} ${redoclyEnv}`,
40
+ });
35
41
  if (!headers.hasOwnProperty('authorization')) {
36
42
  throw new Error('Unauthorized');
37
43
  }
@@ -80,7 +86,7 @@ class RegistryApi {
80
86
  throw new Error('Could not prepare file upload');
81
87
  });
82
88
  }
83
- pushApi({ organizationId, name, version, rootFilePath, filePaths, branch, isUpsert, isPublic, }) {
89
+ pushApi({ organizationId, name, version, rootFilePath, filePaths, branch, isUpsert, isPublic, batchId, batchSize, }) {
84
90
  return __awaiter(this, void 0, void 0, function* () {
85
91
  const response = yield this.request(`/${organizationId}/${name}/${version}`, {
86
92
  method: 'PUT',
@@ -94,6 +100,8 @@ class RegistryApi {
94
100
  branch,
95
101
  isUpsert,
96
102
  isPublic,
103
+ batchId,
104
+ batchSize,
97
105
  }),
98
106
  }, this.region);
99
107
  if (response.ok) {
@@ -23,3 +23,4 @@ export declare function pointerBaseName(pointer: string): string;
23
23
  export declare function refBaseName(ref: string): string;
24
24
  export declare function isAbsoluteUrl(ref: string): boolean;
25
25
  export declare function isMappingRef(mapping: string): boolean;
26
+ export declare function isAnchor(ref: string): boolean;
package/lib/ref-utils.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
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;
3
+ exports.isAnchor = 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
+ const utils_1 = require("./utils");
4
5
  function joinPointer(base, key) {
5
6
  if (base === '')
6
7
  base = '#/';
@@ -41,7 +42,7 @@ function parseRef(ref) {
41
42
  const [uri, pointer] = ref.split('#/');
42
43
  return {
43
44
  uri: uri || null,
44
- pointer: pointer ? pointer.split('/').map(unescapePointer).filter(Boolean) : [],
45
+ pointer: pointer ? pointer.split('/').map(unescapePointer).filter(utils_1.isTruthy) : [],
45
46
  };
46
47
  }
47
48
  exports.parseRef = parseRef;
@@ -67,8 +68,13 @@ function isMappingRef(mapping) {
67
68
  // TODO: proper detection of mapping refs
68
69
  return (mapping.startsWith('#') ||
69
70
  mapping.startsWith('https://') ||
71
+ mapping.startsWith('http://') ||
70
72
  mapping.startsWith('./') ||
71
73
  mapping.startsWith('../') ||
72
74
  mapping.indexOf('/') > -1);
73
75
  }
74
76
  exports.isMappingRef = isMappingRef;
77
+ function isAnchor(ref) {
78
+ return /^#[A-Za-z][A-Za-z0-9\-_:.]*$/.test(ref);
79
+ }
80
+ exports.isAnchor = isAnchor;
package/lib/resolve.d.ts CHANGED
@@ -33,7 +33,7 @@ export declare function makeDocumentFromString(sourceString: string, absoluteRef
33
33
  parsed: unknown;
34
34
  };
35
35
  export declare class BaseResolver {
36
- private config;
36
+ protected config: ResolveConfig;
37
37
  cache: Map<string, Promise<Document | ResolveError>>;
38
38
  constructor(config?: ResolveConfig);
39
39
  getFiles(): Set<string>;
package/lib/resolve.js CHANGED
@@ -110,10 +110,16 @@ class BaseResolver {
110
110
  return new Source(absoluteRef, body, mimeType);
111
111
  }
112
112
  else {
113
- return new Source(absoluteRef, yield fs.promises.readFile(absoluteRef, 'utf-8'));
113
+ if (fs.lstatSync(absoluteRef).isDirectory()) {
114
+ throw new Error(`Expected a file but received a folder at ${absoluteRef}`);
115
+ }
116
+ const content = yield fs.promises.readFile(absoluteRef, 'utf-8');
117
+ // In some cases file have \r\n line delimeters like on windows, we should skip it.
118
+ return new Source(absoluteRef, content.replace(/\r\n/g, '\n'));
114
119
  }
115
120
  }
116
121
  catch (error) {
122
+ error.message = error.message.replace(', lstat', '');
117
123
  throw new ResolveError(error);
118
124
  }
119
125
  });
@@ -184,6 +190,7 @@ function resolveDocument(opts) {
184
190
  return resolvedRefMap;
185
191
  function resolveRefsInParallel(rootNode, rootNodeDocument, rootNodePointer, type) {
186
192
  const rootNodeDocAbsoluteRef = rootNodeDocument.source.absoluteRef;
193
+ const anchorRefsMap = new Map();
187
194
  walk(rootNode, type, rootNodeDocAbsoluteRef + rootNodePointer);
188
195
  function walk(node, type, nodeAbsoluteRef) {
189
196
  if (typeof node !== 'object' || node === null) {
@@ -194,10 +201,14 @@ function resolveDocument(opts) {
194
201
  return;
195
202
  }
196
203
  seedNodes.add(nodeId);
204
+ const [_, anchor] = Object.entries(node).find(([key]) => key === '$anchor') || [];
205
+ if (anchor) {
206
+ anchorRefsMap.set(`#${anchor}`, node);
207
+ }
197
208
  if (Array.isArray(node)) {
198
209
  const itemsType = type.items;
199
210
  // we continue resolving unknown types, but stop early on known scalars
200
- if (type !== unknownType && itemsType === undefined) {
211
+ if (itemsType === undefined && type !== unknownType && type !== types_1.SpecExtension) {
201
212
  return;
202
213
  }
203
214
  for (let i = 0; i < node.length; i++) {
@@ -214,6 +225,11 @@ function resolveDocument(opts) {
214
225
  propType = propType(propValue, propName);
215
226
  if (propType === undefined)
216
227
  propType = unknownType;
228
+ if (type.extensionsPrefix &&
229
+ propName.startsWith(type.extensionsPrefix) &&
230
+ propType === unknownType) {
231
+ propType = types_1.SpecExtension;
232
+ }
217
233
  if (!types_1.isNamedType(propType) && (propType === null || propType === void 0 ? void 0 : propType.directResolveAs)) {
218
234
  propType = propType.directResolveAs;
219
235
  propValue = { $ref: propValue };
@@ -243,6 +259,20 @@ function resolveDocument(opts) {
243
259
  if (hasRef(refStack.prev, ref)) {
244
260
  throw new Error('Self-referencing circular pointer');
245
261
  }
262
+ if (ref_utils_1.isAnchor(ref.$ref)) {
263
+ // Wait for all anchors in the document to be collected firstly.
264
+ yield utils_1.nextTick();
265
+ const resolvedRef = {
266
+ resolved: true,
267
+ isRemote: false,
268
+ node: anchorRefsMap.get(ref.$ref),
269
+ document,
270
+ nodePointer: ref.$ref,
271
+ };
272
+ const refId = makeRefId(document.source.absoluteRef, ref.$ref);
273
+ resolvedRefMap.set(refId, resolvedRef);
274
+ return resolvedRef;
275
+ }
246
276
  const { uri, pointer } = ref_utils_1.parseRef(ref.$ref);
247
277
  const isRemote = uri !== null;
248
278
  let targetDoc;
@@ -271,7 +301,7 @@ function resolveDocument(opts) {
271
301
  };
272
302
  let target = targetDoc.parsed;
273
303
  const segments = pointer;
274
- for (let segment of segments) {
304
+ for (const segment of segments) {
275
305
  if (typeof target !== 'object') {
276
306
  target = undefined;
277
307
  break;
@@ -1,8 +1,8 @@
1
- import { ErrorObject } from '@redocly/ajv';
1
+ import { ErrorObject } from '@redocly/ajv/dist/2020';
2
2
  import { Location } from '../ref-utils';
3
3
  import { ResolveFn } from '../walk';
4
4
  export declare function releaseAjvInstance(): void;
5
- export declare function validateJsonSchema(data: any, schema: any, schemaLoc: Location, instancePath: string, resolve: ResolveFn<any>, disallowAdditionalProperties: boolean): {
5
+ export declare function validateJsonSchema(data: any, schema: any, schemaLoc: Location, instancePath: string, resolve: ResolveFn, allowAdditionalProperties: boolean): {
6
6
  valid: boolean;
7
7
  errors: (ErrorObject & {
8
8
  suggest?: string[];
package/lib/rules/ajv.js CHANGED
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateJsonSchema = exports.releaseAjvInstance = void 0;
4
- const ajv_1 = require("@redocly/ajv");
4
+ const _2020_1 = require("@redocly/ajv/dist/2020");
5
5
  const ref_utils_1 = require("../ref-utils");
6
6
  let ajvInstance = null;
7
7
  function releaseAjvInstance() {
8
8
  ajvInstance = null;
9
9
  }
10
10
  exports.releaseAjvInstance = releaseAjvInstance;
11
- function getAjv(resolve, disallowAdditionalProperties) {
11
+ function getAjv(resolve, allowAdditionalProperties) {
12
12
  if (!ajvInstance) {
13
- ajvInstance = new ajv_1.default({
13
+ ajvInstance = new _2020_1.default({
14
14
  schemaId: '$id',
15
15
  meta: true,
16
16
  allErrors: true,
@@ -20,11 +20,11 @@ function getAjv(resolve, disallowAdditionalProperties) {
20
20
  discriminator: true,
21
21
  allowUnionTypes: true,
22
22
  validateFormats: false,
23
- defaultAdditionalProperties: !disallowAdditionalProperties,
23
+ defaultUnevaluatedProperties: allowAdditionalProperties,
24
24
  loadSchemaSync(base, $ref) {
25
25
  const resolvedRef = resolve({ $ref }, base.split('#')[0]);
26
26
  if (!resolvedRef || !resolvedRef.location)
27
- return undefined;
27
+ return false;
28
28
  return Object.assign({ $id: resolvedRef.location.absolutePointer }, resolvedRef.node);
29
29
  },
30
30
  logger: false,
@@ -32,15 +32,15 @@ function getAjv(resolve, disallowAdditionalProperties) {
32
32
  }
33
33
  return ajvInstance;
34
34
  }
35
- function getAjvValidator(schema, loc, resolve, disallowAdditionalProperties) {
36
- const ajv = getAjv(resolve, disallowAdditionalProperties);
35
+ function getAjvValidator(schema, loc, resolve, allowAdditionalProperties) {
36
+ const ajv = getAjv(resolve, allowAdditionalProperties);
37
37
  if (!ajv.getSchema(loc.absolutePointer)) {
38
38
  ajv.addSchema(Object.assign({ $id: loc.absolutePointer }, schema), loc.absolutePointer);
39
39
  }
40
40
  return ajv.getSchema(loc.absolutePointer);
41
41
  }
42
- function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, disallowAdditionalProperties) {
43
- const validate = getAjvValidator(schema, schemaLoc, resolve, disallowAdditionalProperties);
42
+ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, allowAdditionalProperties) {
43
+ const validate = getAjvValidator(schema, schemaLoc, resolve, allowAdditionalProperties);
44
44
  if (!validate)
45
45
  return { valid: true, errors: [] }; // unresolved refs are reported
46
46
  const valid = validate(data, {
@@ -56,7 +56,7 @@ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, disa
56
56
  };
57
57
  function beatifyErrorMessage(error) {
58
58
  let message = error.message;
59
- let suggest = error.keyword === 'enum' ? error.params.allowedValues : undefined;
59
+ const suggest = error.keyword === 'enum' ? error.params.allowedValues : undefined;
60
60
  if (suggest) {
61
61
  message += ` ${suggest.map((e) => `"${e}"`).join(', ')}`;
62
62
  }
@@ -68,8 +68,8 @@ function validateJsonSchema(data, schema, schemaLoc, instancePath, resolve, disa
68
68
  if (propName) {
69
69
  message = `\`${propName}\` property ${message}`;
70
70
  }
71
- if (error.keyword === 'additionalProperties') {
72
- const property = error.params.additionalProperty;
71
+ if (error.keyword === 'additionalProperties' || error.keyword === 'unevaluatedProperties') {
72
+ const property = error.params.additionalProperty || error.params.unevaluatedProperty;
73
73
  message = `${message} \`${property}\``;
74
74
  error.instancePath += '/' + ref_utils_1.escapePointer(property);
75
75
  }
@@ -1,5 +1,30 @@
1
- declare type Asserts = Record<string, (value: any, condition: any) => boolean>;
2
- export declare const runOnKeysSet: Set<string>;
3
- export declare const runOnValuesSet: Set<string>;
1
+ import { AssertionContext, AssertResult, CustomFunction } from 'core/src/config/types';
2
+ import { Location } from '../../../ref-utils';
3
+ export declare type AssertionFnContext = AssertionContext & {
4
+ baseLocation: Location;
5
+ rawValue?: any;
6
+ };
7
+ export declare type AssertionFn = (value: any, condition: any, ctx: AssertionFnContext) => AssertResult[];
8
+ export declare type Asserts = {
9
+ pattern: AssertionFn;
10
+ notPattern: AssertionFn;
11
+ enum: AssertionFn;
12
+ defined: AssertionFn;
13
+ required: AssertionFn;
14
+ disallowed: AssertionFn;
15
+ undefined: AssertionFn;
16
+ nonEmpty: AssertionFn;
17
+ minLength: AssertionFn;
18
+ maxLength: AssertionFn;
19
+ casing: AssertionFn;
20
+ sortOrder: AssertionFn;
21
+ mutuallyExclusive: AssertionFn;
22
+ mutuallyRequired: AssertionFn;
23
+ requireAny: AssertionFn;
24
+ ref: AssertionFn;
25
+ const: AssertionFn;
26
+ };
27
+ export declare const runOnKeysSet: Set<keyof Asserts>;
28
+ export declare const runOnValuesSet: Set<keyof Asserts>;
4
29
  export declare const asserts: Asserts;
5
- export {};
30
+ export declare function buildAssertCustomFunction(fn: CustomFunction): AssertionFn;
@@ -1,21 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asserts = exports.runOnValuesSet = exports.runOnKeysSet = void 0;
4
- const utils_1 = require("./utils");
3
+ exports.buildAssertCustomFunction = exports.asserts = exports.runOnValuesSet = exports.runOnKeysSet = void 0;
4
+ const utils_1 = require("../../../utils");
5
+ const utils_2 = require("./utils");
5
6
  exports.runOnKeysSet = new Set([
6
7
  'mutuallyExclusive',
7
8
  'mutuallyRequired',
8
9
  'enum',
9
10
  'pattern',
11
+ 'notPattern',
10
12
  'minLength',
11
13
  'maxLength',
12
14
  'casing',
13
15
  'sortOrder',
14
16
  'disallowed',
15
17
  'required',
18
+ 'requireAny',
19
+ 'ref',
20
+ 'const',
21
+ 'defined', // In case if `property` for assertions is not added
16
22
  ]);
17
23
  exports.runOnValuesSet = new Set([
18
24
  'pattern',
25
+ 'notPattern',
19
26
  'enum',
20
27
  'defined',
21
28
  'undefined',
@@ -24,120 +31,243 @@ exports.runOnValuesSet = new Set([
24
31
  'maxLength',
25
32
  'casing',
26
33
  'sortOrder',
34
+ 'ref',
35
+ 'const',
27
36
  ]);
28
37
  exports.asserts = {
29
- pattern: (value, condition) => {
30
- if (typeof value === 'undefined')
31
- return true; // property doesn't exist, no need to lint it with this assert
32
- const values = typeof value === 'string' ? [value] : value;
33
- const regexOptions = condition.match(/(\b\/\b)(.+)/g) || ['/'];
34
- condition = condition.slice(1).replace(regexOptions[0], '');
35
- const regx = new RegExp(condition, regexOptions[0].slice(1));
36
- for (let _val of values) {
37
- if (!_val.match(regx)) {
38
- return false;
39
- }
40
- }
41
- return true;
38
+ pattern: (value, condition, { baseLocation }) => {
39
+ if (typeof value === 'undefined' || utils_1.isPlainObject(value))
40
+ return []; // property doesn't exist or is an object, no need to lint it with this assert
41
+ const values = Array.isArray(value) ? value : [value];
42
+ const regex = utils_2.regexFromString(condition);
43
+ return values
44
+ .map((_val) => !(regex === null || regex === void 0 ? void 0 : regex.test(_val)) && {
45
+ message: `"${_val}" should match a regex ${condition}`,
46
+ location: utils_1.isString(value) ? baseLocation : baseLocation.key(),
47
+ })
48
+ .filter(utils_1.isTruthy);
42
49
  },
43
- enum: (value, condition) => {
44
- if (typeof value === 'undefined')
45
- return true; // property doesn't exist, no need to lint it with this assert
46
- const values = typeof value === 'string' ? [value] : value;
47
- for (let _val of values) {
48
- if (!condition.includes(_val)) {
49
- return false;
50
- }
51
- }
52
- return true;
50
+ notPattern: (value, condition, { baseLocation }) => {
51
+ if (typeof value === 'undefined' || utils_1.isPlainObject(value))
52
+ return []; // property doesn't exist or is an object, no need to lint it with this assert
53
+ const values = Array.isArray(value) ? value : [value];
54
+ const regex = utils_2.regexFromString(condition);
55
+ return values
56
+ .map((_val) => (regex === null || regex === void 0 ? void 0 : regex.test(_val)) && {
57
+ message: `"${_val}" should not match a regex ${condition}`,
58
+ location: utils_1.isString(value) ? baseLocation : baseLocation.key(),
59
+ })
60
+ .filter(utils_1.isTruthy);
61
+ },
62
+ enum: (value, condition, { baseLocation }) => {
63
+ if (typeof value === 'undefined' || utils_1.isPlainObject(value))
64
+ return []; // property doesn't exist or is an object, no need to lint it with this assert
65
+ const values = Array.isArray(value) ? value : [value];
66
+ return values
67
+ .map((_val) => !condition.includes(_val) && {
68
+ message: `"${_val}" should be one of the predefined values`,
69
+ location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
70
+ })
71
+ .filter(utils_1.isTruthy);
53
72
  },
54
- defined: (value, condition = true) => {
73
+ defined: (value, condition = true, { baseLocation }) => {
55
74
  const isDefined = typeof value !== 'undefined';
56
- return condition ? isDefined : !isDefined;
75
+ const isValid = condition ? isDefined : !isDefined;
76
+ return isValid
77
+ ? []
78
+ : [
79
+ {
80
+ message: condition ? `Should be defined` : 'Should be not defined',
81
+ location: baseLocation,
82
+ },
83
+ ];
57
84
  },
58
- required: (value, keys) => {
59
- for (const requiredKey of keys) {
60
- if (!value.includes(requiredKey)) {
61
- return false;
62
- }
63
- }
64
- return true;
85
+ required: (value, keys, { baseLocation }) => {
86
+ return keys
87
+ .map((requiredKey) => !value.includes(requiredKey) && {
88
+ message: `${requiredKey} is required`,
89
+ location: baseLocation.key(),
90
+ })
91
+ .filter(utils_1.isTruthy);
92
+ },
93
+ disallowed: (value, condition, { baseLocation }) => {
94
+ if (typeof value === 'undefined' || utils_1.isPlainObject(value))
95
+ return []; // property doesn't exist or is an object, no need to lint it with this assert
96
+ const values = Array.isArray(value) ? value : [value];
97
+ return values
98
+ .map((_val) => condition.includes(_val) && {
99
+ message: `"${_val}" is disallowed`,
100
+ location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
101
+ })
102
+ .filter(utils_1.isTruthy);
65
103
  },
66
- disallowed: (value, condition) => {
104
+ const: (value, condition, { baseLocation }) => {
67
105
  if (typeof value === 'undefined')
68
- return true; // property doesn't exist, no need to lint it with this assert
69
- const values = typeof value === 'string' ? [value] : value;
70
- for (let _val of values) {
71
- if (condition.includes(_val)) {
72
- return false;
73
- }
106
+ return [];
107
+ if (Array.isArray(value)) {
108
+ return value
109
+ .map((_val) => condition !== _val && {
110
+ message: `"${_val}" should be equal ${condition} `,
111
+ location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
112
+ })
113
+ .filter(utils_1.isTruthy);
114
+ }
115
+ else {
116
+ return value !== condition
117
+ ? [
118
+ {
119
+ message: `${value} should be equal ${condition}`,
120
+ location: baseLocation,
121
+ },
122
+ ]
123
+ : [];
74
124
  }
75
- return true;
76
125
  },
77
- undefined: (value, condition = true) => {
126
+ undefined: (value, condition = true, { baseLocation }) => {
78
127
  const isUndefined = typeof value === 'undefined';
79
- return condition ? isUndefined : !isUndefined;
128
+ const isValid = condition ? isUndefined : !isUndefined;
129
+ return isValid
130
+ ? []
131
+ : [
132
+ {
133
+ message: condition ? `Should not be defined` : 'Should be defined',
134
+ location: baseLocation,
135
+ },
136
+ ];
80
137
  },
81
- nonEmpty: (value, condition = true) => {
138
+ nonEmpty: (value, condition = true, { baseLocation }) => {
82
139
  const isEmpty = typeof value === 'undefined' || value === null || value === '';
83
- return condition ? !isEmpty : isEmpty;
140
+ const isValid = condition ? !isEmpty : isEmpty;
141
+ return isValid
142
+ ? []
143
+ : [
144
+ {
145
+ message: condition ? `Should not be empty` : 'Should be empty',
146
+ location: baseLocation,
147
+ },
148
+ ];
84
149
  },
85
- minLength: (value, condition) => {
86
- if (typeof value === 'undefined')
87
- return true; // property doesn't exist, no need to lint it with this assert
88
- return value.length >= condition;
150
+ minLength: (value, condition, { baseLocation }) => {
151
+ if (typeof value === 'undefined' || value.length >= condition)
152
+ return []; // property doesn't exist, no need to lint it with this assert
153
+ return [
154
+ {
155
+ message: `Should have at least ${condition} characters`,
156
+ location: baseLocation,
157
+ },
158
+ ];
89
159
  },
90
- maxLength: (value, condition) => {
91
- if (typeof value === 'undefined')
92
- return true; // property doesn't exist, no need to lint it with this assert
93
- return value.length <= condition;
160
+ maxLength: (value, condition, { baseLocation }) => {
161
+ if (typeof value === 'undefined' || value.length <= condition)
162
+ return []; // property doesn't exist, no need to lint it with this assert
163
+ return [
164
+ {
165
+ message: `Should have at most ${condition} characters`,
166
+ location: baseLocation,
167
+ },
168
+ ];
94
169
  },
95
- casing: (value, condition) => {
96
- if (typeof value === 'undefined')
97
- return true; // property doesn't exist, no need to lint it with this assert
98
- const values = typeof value === 'string' ? [value] : value;
99
- for (let _val of values) {
100
- let matchCase = false;
101
- switch (condition) {
102
- case 'camelCase':
103
- matchCase = !!_val.match(/^[a-z][a-zA-Z0-9]+$/g);
104
- break;
105
- case 'kebab-case':
106
- matchCase = !!_val.match(/^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/g);
107
- break;
108
- case 'snake_case':
109
- matchCase = !!_val.match(/^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/g);
110
- break;
111
- case 'PascalCase':
112
- matchCase = !!_val.match(/^[A-Z][a-zA-Z0-9]+$/g);
113
- break;
114
- case 'MACRO_CASE':
115
- matchCase = !!_val.match(/^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/g);
116
- break;
117
- case 'COBOL-CASE':
118
- matchCase = !!_val.match(/^([A-Z][A-Z0-9]*)(-[A-Z0-9]+)*$/g);
119
- break;
120
- case 'flatcase':
121
- matchCase = !!_val.match(/^[a-z][a-z0-9]+$/g);
122
- break;
123
- }
124
- if (!matchCase) {
125
- return false;
126
- }
127
- }
128
- return true;
170
+ casing: (value, condition, { baseLocation }) => {
171
+ if (typeof value === 'undefined' || utils_1.isPlainObject(value))
172
+ return []; // property doesn't exist or is an object, no need to lint it with this assert
173
+ const values = Array.isArray(value) ? value : [value];
174
+ const casingRegexes = {
175
+ camelCase: /^[a-z][a-zA-Z0-9]+$/g,
176
+ 'kebab-case': /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/g,
177
+ snake_case: /^([a-z][a-z0-9]*)(_[a-z0-9]+)*$/g,
178
+ PascalCase: /^[A-Z][a-zA-Z0-9]+$/g,
179
+ MACRO_CASE: /^([A-Z][A-Z0-9]*)(_[A-Z0-9]+)*$/g,
180
+ 'COBOL-CASE': /^([A-Z][A-Z0-9]*)(-[A-Z0-9]+)*$/g,
181
+ flatcase: /^[a-z][a-z0-9]+$/g,
182
+ };
183
+ return values
184
+ .map((_val) => !_val.match(casingRegexes[condition]) && {
185
+ message: `"${_val}" should use ${condition}`,
186
+ location: utils_1.isString(value) ? baseLocation : baseLocation.child(_val).key(),
187
+ })
188
+ .filter(utils_1.isTruthy);
129
189
  },
130
- sortOrder: (value, condition) => {
131
- if (typeof value === 'undefined')
132
- return true;
133
- return utils_1.isOrdered(value, condition);
190
+ sortOrder: (value, condition, { baseLocation }) => {
191
+ const direction = condition.direction || condition;
192
+ const property = condition.property;
193
+ if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object' && !property) {
194
+ return [
195
+ {
196
+ message: `Please define a property to sort objects by`,
197
+ location: baseLocation,
198
+ },
199
+ ];
200
+ }
201
+ if (typeof value === 'undefined' || utils_2.isOrdered(value, condition))
202
+ return [];
203
+ return [
204
+ {
205
+ message: `Should be sorted in ${direction === 'asc' ? 'an ascending' : 'a descending'} order${property ? ` by property ${property}` : ''}`,
206
+ location: baseLocation,
207
+ },
208
+ ];
134
209
  },
135
- mutuallyExclusive: (value, condition) => {
136
- return utils_1.getIntersectionLength(value, condition) < 2;
210
+ mutuallyExclusive: (value, condition, { baseLocation }) => {
211
+ if (utils_2.getIntersectionLength(value, condition) < 2)
212
+ return [];
213
+ return [
214
+ {
215
+ message: `${condition.join(', ')} keys should be mutually exclusive`,
216
+ location: baseLocation.key(),
217
+ },
218
+ ];
137
219
  },
138
- mutuallyRequired: (value, condition) => {
139
- return utils_1.getIntersectionLength(value, condition) > 0
140
- ? utils_1.getIntersectionLength(value, condition) === condition.length
220
+ mutuallyRequired: (value, condition, { baseLocation }) => {
221
+ const isValid = utils_2.getIntersectionLength(value, condition) > 0
222
+ ? utils_2.getIntersectionLength(value, condition) === condition.length
141
223
  : true;
224
+ return isValid
225
+ ? []
226
+ : [
227
+ {
228
+ message: `Properties ${condition.join(', ')} are mutually required`,
229
+ location: baseLocation.key(),
230
+ },
231
+ ];
232
+ },
233
+ requireAny: (value, condition, { baseLocation }) => {
234
+ return utils_2.getIntersectionLength(value, condition) >= 1
235
+ ? []
236
+ : [
237
+ {
238
+ message: `Should have any of ${condition.join(', ')}`,
239
+ location: baseLocation.key(),
240
+ },
241
+ ];
242
+ },
243
+ ref: (_value, condition, { baseLocation, rawValue }) => {
244
+ if (typeof rawValue === 'undefined')
245
+ return []; // property doesn't exist, no need to lint it with this assert
246
+ const hasRef = rawValue.hasOwnProperty('$ref');
247
+ if (typeof condition === 'boolean') {
248
+ const isValid = condition ? hasRef : !hasRef;
249
+ return isValid
250
+ ? []
251
+ : [
252
+ {
253
+ message: condition ? `should use $ref` : 'should not use $ref',
254
+ location: hasRef ? baseLocation : baseLocation.key(),
255
+ },
256
+ ];
257
+ }
258
+ const regex = utils_2.regexFromString(condition);
259
+ const isValid = hasRef && (regex === null || regex === void 0 ? void 0 : regex.test(rawValue['$ref']));
260
+ return isValid
261
+ ? []
262
+ : [
263
+ {
264
+ message: `$ref value should match ${condition}`,
265
+ location: hasRef ? baseLocation : baseLocation.key(),
266
+ },
267
+ ];
142
268
  },
143
269
  };
270
+ function buildAssertCustomFunction(fn) {
271
+ return (value, options, ctx) => fn.call(null, value, options, ctx);
272
+ }
273
+ exports.buildAssertCustomFunction = buildAssertCustomFunction;