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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +6 -6
  2. package/lib/benchmark/benches/lint-with-top-level-rule-report.bench.js +0 -1
  3. package/lib/benchmark/benches/recommended-oas3.bench.js +1 -1
  4. package/lib/benchmark/benches/resolve-with-no-external.bench.js +1 -1
  5. package/lib/benchmark/utils.d.ts +2 -2
  6. package/lib/benchmark/utils.js +2 -2
  7. package/lib/bundle.d.ts +10 -15
  8. package/lib/bundle.js +32 -12
  9. package/lib/config/all.d.ts +2 -2
  10. package/lib/config/all.js +16 -6
  11. package/lib/config/builtIn.d.ts +2 -2
  12. package/lib/config/builtIn.js +2 -2
  13. package/lib/config/config-resolvers.d.ts +5 -5
  14. package/lib/config/config-resolvers.js +121 -66
  15. package/lib/config/config.d.ts +12 -18
  16. package/lib/config/config.js +42 -26
  17. package/lib/config/load.d.ts +16 -3
  18. package/lib/config/load.js +36 -14
  19. package/lib/config/minimal.d.ts +2 -2
  20. package/lib/config/minimal.js +10 -6
  21. package/lib/config/recommended.d.ts +2 -2
  22. package/lib/config/recommended.js +10 -6
  23. package/lib/config/rules.d.ts +7 -4
  24. package/lib/config/rules.js +5 -4
  25. package/lib/config/types.d.ts +72 -23
  26. package/lib/config/types.js +13 -0
  27. package/lib/config/utils.d.ts +6 -5
  28. package/lib/config/utils.js +110 -32
  29. package/lib/decorators/common/filters/filter-helper.d.ts +3 -0
  30. package/lib/decorators/common/filters/filter-helper.js +67 -0
  31. package/lib/decorators/common/filters/filter-in.d.ts +2 -0
  32. package/lib/decorators/common/filters/filter-in.js +17 -0
  33. package/lib/decorators/common/filters/filter-out.d.ts +2 -0
  34. package/lib/decorators/common/filters/filter-out.js +17 -0
  35. package/lib/decorators/common/info-override.d.ts +2 -0
  36. package/lib/decorators/common/info-override.js +28 -0
  37. package/lib/decorators/common/media-type-examples-override.d.ts +2 -0
  38. package/lib/decorators/common/media-type-examples-override.js +53 -0
  39. package/lib/decorators/common/registry-dependencies.js +2 -2
  40. package/lib/decorators/common/remove-x-internal.js +2 -2
  41. package/lib/decorators/oas2/index.d.ts +3 -0
  42. package/lib/decorators/oas2/index.js +7 -1
  43. package/lib/decorators/oas3/index.d.ts +4 -0
  44. package/lib/decorators/oas3/index.js +9 -1
  45. package/lib/env.d.ts +3 -0
  46. package/lib/env.js +8 -0
  47. package/lib/format/codeframes.js +16 -10
  48. package/lib/format/format.d.ts +1 -1
  49. package/lib/format/format.js +64 -32
  50. package/lib/index.d.ts +6 -6
  51. package/lib/index.js +7 -2
  52. package/lib/js-yaml/index.js +2 -6
  53. package/lib/lint.d.ts +4 -2
  54. package/lib/lint.js +36 -11
  55. package/lib/logger.d.ts +10 -0
  56. package/lib/logger.js +31 -0
  57. package/lib/output.d.ts +3 -0
  58. package/lib/output.js +9 -0
  59. package/lib/redocly/index.js +10 -9
  60. package/lib/redocly/registry-api-types.d.ts +28 -28
  61. package/lib/redocly/registry-api.d.ts +3 -3
  62. package/lib/redocly/registry-api.js +10 -2
  63. package/lib/ref-utils.d.ts +1 -0
  64. package/lib/ref-utils.js +7 -2
  65. package/lib/resolve.d.ts +1 -1
  66. package/lib/resolve.js +33 -3
  67. package/lib/rules/ajv.d.ts +2 -2
  68. package/lib/rules/ajv.js +12 -12
  69. package/lib/rules/common/assertions/asserts.d.ts +29 -4
  70. package/lib/rules/common/assertions/asserts.js +227 -97
  71. package/lib/rules/common/assertions/index.d.ts +27 -2
  72. package/lib/rules/common/assertions/index.js +9 -37
  73. package/lib/rules/common/assertions/utils.d.ts +16 -8
  74. package/lib/rules/common/assertions/utils.js +160 -76
  75. package/lib/rules/common/info-license-url.d.ts +1 -1
  76. package/lib/rules/common/info-license-url.js +5 -10
  77. package/lib/rules/common/info-license.d.ts +2 -0
  78. package/lib/rules/common/info-license.js +17 -0
  79. package/lib/rules/common/no-ambiguous-paths.js +1 -1
  80. package/lib/rules/common/no-enum-type-mismatch.js +1 -3
  81. package/lib/rules/common/no-identical-paths.js +4 -4
  82. package/lib/rules/common/no-invalid-parameter-examples.js +3 -3
  83. package/lib/rules/common/no-invalid-schema-examples.js +3 -3
  84. package/lib/rules/common/operation-2xx-response.js +15 -9
  85. package/lib/rules/common/operation-4xx-response.js +15 -9
  86. package/lib/rules/common/operation-operationId.js +2 -2
  87. package/lib/rules/common/operation-tag-defined.js +1 -1
  88. package/lib/rules/common/path-not-include-query.js +2 -2
  89. package/lib/rules/common/path-params-defined.js +7 -2
  90. package/lib/rules/common/paths-kebab-case.js +4 -1
  91. package/lib/rules/common/required-string-property-missing-min-length.d.ts +2 -0
  92. package/lib/rules/common/required-string-property-missing-min-length.js +37 -0
  93. package/lib/rules/common/response-contains-header.js +2 -2
  94. package/lib/rules/common/scalar-property-missing-example.js +2 -1
  95. package/lib/rules/common/security-defined.d.ts +2 -0
  96. package/lib/rules/common/{operation-security-defined.js → security-defined.js} +25 -6
  97. package/lib/rules/common/spec-strict-refs.d.ts +2 -0
  98. package/lib/rules/common/spec-strict-refs.js +30 -0
  99. package/lib/rules/common/spec.js +41 -18
  100. package/lib/rules/common/tags-alphabetical.js +1 -1
  101. package/lib/rules/oas2/index.d.ts +3 -2
  102. package/lib/rules/oas2/index.js +10 -8
  103. package/lib/rules/oas2/remove-unused-components.js +6 -6
  104. package/lib/rules/oas2/request-mime-type.d.ts +1 -1
  105. package/lib/rules/oas2/request-mime-type.js +1 -1
  106. package/lib/rules/oas2/response-mime-type.d.ts +1 -1
  107. package/lib/rules/oas2/response-mime-type.js +1 -1
  108. package/lib/rules/oas3/component-name-unique.d.ts +2 -0
  109. package/lib/rules/oas3/component-name-unique.js +124 -0
  110. package/lib/rules/oas3/index.js +18 -10
  111. package/lib/rules/oas3/no-empty-servers.js +2 -2
  112. package/lib/rules/oas3/no-invalid-media-type-examples.js +2 -2
  113. package/lib/rules/oas3/no-server-variables-empty-enum.d.ts +2 -0
  114. package/lib/rules/oas3/{no-servers-empty-enum.js → no-server-variables-empty-enum.js} +5 -5
  115. package/lib/rules/oas3/no-unused-components.js +2 -2
  116. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.d.ts +5 -0
  117. package/lib/rules/oas3/operation-4xx-problem-details-rfc7807.js +36 -0
  118. package/lib/rules/oas3/remove-unused-components.js +6 -6
  119. package/lib/rules/oas3/request-mime-type.d.ts +1 -1
  120. package/lib/rules/oas3/request-mime-type.js +1 -1
  121. package/lib/rules/oas3/response-mime-type.d.ts +1 -1
  122. package/lib/rules/oas3/response-mime-type.js +1 -1
  123. package/lib/rules/oas3/spec-components-invalid-map-name.d.ts +2 -0
  124. package/lib/rules/oas3/spec-components-invalid-map-name.js +62 -0
  125. package/lib/rules/other/stats.d.ts +2 -2
  126. package/lib/rules/other/stats.js +45 -16
  127. package/lib/rules/utils.d.ts +5 -2
  128. package/lib/rules/utils.js +54 -6
  129. package/lib/types/config-external-schemas.d.ts +2193 -0
  130. package/lib/types/config-external-schemas.js +805 -0
  131. package/lib/types/index.d.ts +3 -2
  132. package/lib/types/index.js +9 -1
  133. package/lib/types/oas2.js +91 -15
  134. package/lib/types/oas3.js +125 -46
  135. package/lib/types/oas3_1.js +23 -19
  136. package/lib/types/redocly-yaml.js +406 -60
  137. package/lib/utils.d.ts +15 -4
  138. package/lib/utils.js +72 -8
  139. package/lib/visitors.d.ts +20 -16
  140. package/lib/visitors.js +28 -3
  141. package/lib/walk.d.ts +11 -19
  142. package/lib/walk.js +74 -53
  143. package/package.json +5 -6
  144. package/__tests__/utils.ts +0 -86
  145. package/lib/rules/common/info-description.d.ts +0 -2
  146. package/lib/rules/common/info-description.js +0 -12
  147. package/lib/rules/common/license-url.d.ts +0 -2
  148. package/lib/rules/common/license-url.js +0 -12
  149. package/lib/rules/common/operation-security-defined.d.ts +0 -2
  150. package/lib/rules/oas3/no-servers-empty-enum.d.ts +0 -2
  151. package/src/__tests__/__snapshots__/bundle.test.ts.snap +0 -255
  152. package/src/__tests__/bundle.test.ts +0 -156
  153. package/src/__tests__/codeframes.test.ts +0 -531
  154. package/src/__tests__/fixtures/extension.js +0 -24
  155. package/src/__tests__/fixtures/refs/definitions.yaml +0 -3
  156. package/src/__tests__/fixtures/refs/examples.yaml +0 -8
  157. package/src/__tests__/fixtures/refs/external-request-body.yaml +0 -13
  158. package/src/__tests__/fixtures/refs/externalref.yaml +0 -35
  159. package/src/__tests__/fixtures/refs/hosted.yaml +0 -35
  160. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +0 -21
  161. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +0 -33
  162. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +0 -18
  163. package/src/__tests__/fixtures/refs/param-b.yaml +0 -1
  164. package/src/__tests__/fixtures/refs/param-c.yaml +0 -1
  165. package/src/__tests__/fixtures/refs/rename.yaml +0 -1
  166. package/src/__tests__/fixtures/refs/requestBody.yaml +0 -9
  167. package/src/__tests__/fixtures/refs/schema-a.yaml +0 -1
  168. package/src/__tests__/fixtures/refs/simple.yaml +0 -1
  169. package/src/__tests__/fixtures/refs/vendor.schema.yaml +0 -20
  170. package/src/__tests__/fixtures/resolve/External.yaml +0 -10
  171. package/src/__tests__/fixtures/resolve/External2.yaml +0 -4
  172. package/src/__tests__/fixtures/resolve/description.md +0 -3
  173. package/src/__tests__/fixtures/resolve/externalInfo.yaml +0 -4
  174. package/src/__tests__/fixtures/resolve/externalLicense.yaml +0 -1
  175. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +0 -13
  176. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +0 -5
  177. package/src/__tests__/fixtures/resolve/openapi.yaml +0 -28
  178. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +0 -10
  179. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +0 -6
  180. package/src/__tests__/fixtures/resolve/transitive/a.yaml +0 -1
  181. package/src/__tests__/fixtures/resolve/transitive/components.yaml +0 -5
  182. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +0 -3
  183. package/src/__tests__/js-yaml.test.ts +0 -71
  184. package/src/__tests__/lint.test.ts +0 -195
  185. package/src/__tests__/login.test.ts +0 -17
  186. package/src/__tests__/normalizeVisitors.test.ts +0 -151
  187. package/src/__tests__/ref-utils.test.ts +0 -120
  188. package/src/__tests__/resolve-http.test.ts +0 -77
  189. package/src/__tests__/resolve.test.ts +0 -405
  190. package/src/__tests__/utils.test.ts +0 -85
  191. package/src/__tests__/walk.test.ts +0 -1485
  192. package/src/benchmark/benches/lint-with-many-rules.bench.ts +0 -35
  193. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +0 -39
  194. package/src/benchmark/benches/lint-with-no-rules.bench.ts +0 -20
  195. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +0 -36
  196. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +0 -32
  197. package/src/benchmark/benches/rebilly.yaml +0 -32267
  198. package/src/benchmark/benches/recommended-oas3.bench.ts +0 -22
  199. package/src/benchmark/benches/resolve-with-no-external.bench.ts +0 -23
  200. package/src/benchmark/benchmark.js +0 -307
  201. package/src/benchmark/colors.js +0 -29
  202. package/src/benchmark/fork.js +0 -83
  203. package/src/benchmark/utils.ts +0 -36
  204. package/src/bundle.ts +0 -386
  205. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +0 -157
  206. package/src/config/__tests__/config-resolvers.test.ts +0 -429
  207. package/src/config/__tests__/config.test.ts +0 -244
  208. package/src/config/__tests__/fixtures/plugin-config.yaml +0 -3
  209. package/src/config/__tests__/fixtures/plugin.js +0 -56
  210. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +0 -12
  211. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +0 -67
  212. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +0 -8
  213. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +0 -19
  214. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +0 -10
  215. package/src/config/__tests__/fixtures/resolve-config/plugin.js +0 -66
  216. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +0 -4
  217. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +0 -5
  218. package/src/config/__tests__/load.test.ts +0 -83
  219. package/src/config/__tests__/resolve-plugins.test.ts +0 -27
  220. package/src/config/all.ts +0 -66
  221. package/src/config/builtIn.ts +0 -37
  222. package/src/config/config-resolvers.ts +0 -359
  223. package/src/config/config.ts +0 -312
  224. package/src/config/index.ts +0 -7
  225. package/src/config/load.ts +0 -84
  226. package/src/config/minimal.ts +0 -58
  227. package/src/config/recommended.ts +0 -58
  228. package/src/config/rules.ts +0 -46
  229. package/src/config/types.ts +0 -168
  230. package/src/config/utils.ts +0 -208
  231. package/src/decorators/__tests__/remove-x-internal.test.ts +0 -316
  232. package/src/decorators/common/info-description-override.ts +0 -24
  233. package/src/decorators/common/operation-description-override.ts +0 -30
  234. package/src/decorators/common/registry-dependencies.ts +0 -25
  235. package/src/decorators/common/remove-x-internal.ts +0 -59
  236. package/src/decorators/common/tag-description-override.ts +0 -25
  237. package/src/decorators/oas2/index.ts +0 -14
  238. package/src/decorators/oas3/index.ts +0 -14
  239. package/src/format/codeframes.ts +0 -210
  240. package/src/format/format.ts +0 -339
  241. package/src/index.ts +0 -68
  242. package/src/js-yaml/index.ts +0 -18
  243. package/src/lint.ts +0 -125
  244. package/src/oas-types.ts +0 -62
  245. package/src/redocly/__tests__/redocly-client.test.ts +0 -140
  246. package/src/redocly/index.ts +0 -182
  247. package/src/redocly/redocly-client-types.ts +0 -10
  248. package/src/redocly/registry-api-types.ts +0 -32
  249. package/src/redocly/registry-api.ts +0 -134
  250. package/src/ref-utils.ts +0 -80
  251. package/src/resolve.ts +0 -378
  252. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +0 -1
  253. package/src/rules/__tests__/fixtures/ref.yaml +0 -1
  254. package/src/rules/__tests__/no-unresolved-refs.test.ts +0 -168
  255. package/src/rules/ajv.ts +0 -103
  256. package/src/rules/common/__tests__/info-description.test.ts +0 -102
  257. package/src/rules/common/__tests__/info-license.test.ts +0 -62
  258. package/src/rules/common/__tests__/license-url.test.ts +0 -63
  259. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +0 -96
  260. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +0 -209
  261. package/src/rules/common/__tests__/no-identical-paths.test.ts +0 -58
  262. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +0 -85
  263. package/src/rules/common/__tests__/operation-2xx-response.test.ts +0 -91
  264. package/src/rules/common/__tests__/operation-4xx-response.test.ts +0 -107
  265. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +0 -76
  266. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +0 -45
  267. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +0 -167
  268. package/src/rules/common/__tests__/operation-security-defined.test.ts +0 -69
  269. package/src/rules/common/__tests__/operation-singular-tag.test.ts +0 -72
  270. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +0 -95
  271. package/src/rules/common/__tests__/path-not-include-query.test.ts +0 -64
  272. package/src/rules/common/__tests__/path-params-defined.test.ts +0 -133
  273. package/src/rules/common/__tests__/paths-kebab-case.test.ts +0 -108
  274. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +0 -207
  275. package/src/rules/common/__tests__/spec.test.ts +0 -62
  276. package/src/rules/common/__tests__/tag-description.test.ts +0 -65
  277. package/src/rules/common/__tests__/tags-alphabetical.test.ts +0 -64
  278. package/src/rules/common/assertions/__tests__/asserts.test.ts +0 -231
  279. package/src/rules/common/assertions/__tests__/index.test.ts +0 -65
  280. package/src/rules/common/assertions/__tests__/utils.test.ts +0 -89
  281. package/src/rules/common/assertions/asserts.ts +0 -137
  282. package/src/rules/common/assertions/index.ts +0 -75
  283. package/src/rules/common/assertions/utils.ts +0 -167
  284. package/src/rules/common/info-contact.ts +0 -15
  285. package/src/rules/common/info-description.ts +0 -10
  286. package/src/rules/common/info-license-url.ts +0 -15
  287. package/src/rules/common/license-url.ts +0 -10
  288. package/src/rules/common/no-ambiguous-paths.ts +0 -50
  289. package/src/rules/common/no-enum-type-mismatch.ts +0 -49
  290. package/src/rules/common/no-http-verbs-in-paths.ts +0 -36
  291. package/src/rules/common/no-identical-paths.ts +0 -24
  292. package/src/rules/common/no-invalid-parameter-examples.ts +0 -36
  293. package/src/rules/common/no-invalid-schema-examples.ts +0 -27
  294. package/src/rules/common/no-path-trailing-slash.ts +0 -15
  295. package/src/rules/common/operation-2xx-response.ts +0 -16
  296. package/src/rules/common/operation-4xx-response.ts +0 -17
  297. package/src/rules/common/operation-description.ts +0 -13
  298. package/src/rules/common/operation-operationId-unique.ts +0 -21
  299. package/src/rules/common/operation-operationId-url-safe.ts +0 -19
  300. package/src/rules/common/operation-operationId.ts +0 -17
  301. package/src/rules/common/operation-parameters-unique.ts +0 -48
  302. package/src/rules/common/operation-security-defined.ts +0 -45
  303. package/src/rules/common/operation-singular-tag.ts +0 -17
  304. package/src/rules/common/operation-summary.ts +0 -13
  305. package/src/rules/common/operation-tag-defined.ts +0 -26
  306. package/src/rules/common/parameter-description.ts +0 -22
  307. package/src/rules/common/path-declaration-must-exist.ts +0 -15
  308. package/src/rules/common/path-excludes-patterns.ts +0 -23
  309. package/src/rules/common/path-http-verbs-order.ts +0 -30
  310. package/src/rules/common/path-not-include-query.ts +0 -17
  311. package/src/rules/common/path-params-defined.ts +0 -58
  312. package/src/rules/common/path-segment-plural.ts +0 -31
  313. package/src/rules/common/paths-kebab-case.ts +0 -16
  314. package/src/rules/common/response-contains-header.ts +0 -30
  315. package/src/rules/common/scalar-property-missing-example.ts +0 -55
  316. package/src/rules/common/spec.ts +0 -143
  317. package/src/rules/common/tag-description.ts +0 -10
  318. package/src/rules/common/tags-alphabetical.ts +0 -20
  319. package/src/rules/no-unresolved-refs.ts +0 -51
  320. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +0 -110
  321. package/src/rules/oas2/__tests__/response-contains-header.test.ts +0 -174
  322. package/src/rules/oas2/__tests__/response-contains-property.test.ts +0 -155
  323. package/src/rules/oas2/__tests__/spec/fixtures/description.md +0 -1
  324. package/src/rules/oas2/__tests__/spec/info.test.ts +0 -355
  325. package/src/rules/oas2/__tests__/spec/operation.test.ts +0 -123
  326. package/src/rules/oas2/__tests__/spec/paths.test.ts +0 -245
  327. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +0 -31
  328. package/src/rules/oas2/__tests__/spec/utils.ts +0 -32
  329. package/src/rules/oas2/boolean-parameter-prefixes.ts +0 -26
  330. package/src/rules/oas2/index.ts +0 -89
  331. package/src/rules/oas2/remove-unused-components.ts +0 -76
  332. package/src/rules/oas2/request-mime-type.ts +0 -17
  333. package/src/rules/oas2/response-contains-property.ts +0 -36
  334. package/src/rules/oas2/response-mime-type.ts +0 -17
  335. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +0 -111
  336. package/src/rules/oas3/__tests__/fixtures/common.yaml +0 -11
  337. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +0 -205
  338. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +0 -65
  339. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +0 -392
  340. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +0 -60
  341. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +0 -79
  342. package/src/rules/oas3/__tests__/no-unused-components.test.ts +0 -131
  343. package/src/rules/oas3/__tests__/response-contains-header.test.ts +0 -273
  344. package/src/rules/oas3/__tests__/response-contains-property.test.ts +0 -403
  345. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +0 -41
  346. package/src/rules/oas3/__tests__/spec/fixtures/description.md +0 -1
  347. package/src/rules/oas3/__tests__/spec/info.test.ts +0 -391
  348. package/src/rules/oas3/__tests__/spec/operation.test.ts +0 -253
  349. package/src/rules/oas3/__tests__/spec/paths.test.ts +0 -284
  350. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +0 -77
  351. package/src/rules/oas3/__tests__/spec/servers.test.ts +0 -499
  352. package/src/rules/oas3/__tests__/spec/spec.test.ts +0 -288
  353. package/src/rules/oas3/__tests__/spec/utils.ts +0 -32
  354. package/src/rules/oas3/boolean-parameter-prefixes.ts +0 -28
  355. package/src/rules/oas3/index.ts +0 -105
  356. package/src/rules/oas3/no-empty-servers.ts +0 -22
  357. package/src/rules/oas3/no-example-value-and-externalValue.ts +0 -14
  358. package/src/rules/oas3/no-invalid-media-type-examples.ts +0 -41
  359. package/src/rules/oas3/no-server-example.com.ts +0 -14
  360. package/src/rules/oas3/no-server-trailing-slash.ts +0 -15
  361. package/src/rules/oas3/no-servers-empty-enum.ts +0 -67
  362. package/src/rules/oas3/no-undefined-server-variable.ts +0 -30
  363. package/src/rules/oas3/no-unused-components.ts +0 -75
  364. package/src/rules/oas3/remove-unused-components.ts +0 -84
  365. package/src/rules/oas3/request-mime-type.ts +0 -31
  366. package/src/rules/oas3/response-contains-property.ts +0 -38
  367. package/src/rules/oas3/response-mime-type.ts +0 -31
  368. package/src/rules/other/stats.ts +0 -44
  369. package/src/rules/utils.ts +0 -123
  370. package/src/types/index.ts +0 -138
  371. package/src/types/oas2.ts +0 -397
  372. package/src/types/oas3.ts +0 -515
  373. package/src/types/oas3_1.ts +0 -253
  374. package/src/types/redocly-yaml.ts +0 -647
  375. package/src/typings/common.ts +0 -9
  376. package/src/typings/openapi.ts +0 -298
  377. package/src/typings/swagger.ts +0 -236
  378. package/src/utils.ts +0 -193
  379. package/src/visitors.ts +0 -448
  380. package/src/walk.ts +0 -416
  381. package/tsconfig.json +0 -8
  382. package/tsconfig.tsbuildinfo +0 -1
@@ -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;
@@ -73,3 +74,7 @@ function isMappingRef(mapping) {
73
74
  mapping.indexOf('/') > -1);
74
75
  }
75
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;