Skip to content

Commit 5f2ae83

Browse files
authored
fix: Required properties warning now checked in child refs (#187)
1 parent e547026 commit 5f2ae83

File tree

4 files changed

+333
-17
lines changed

4 files changed

+333
-17
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ The supported rules are described below:
269269
| property_case_collision | Flag any property with a `name` that is identical to another property's `name` except for the naming convention | shared |
270270
| enum_case_convention | Flag any enum with a `value` that does not follow a given case convention. snake_case_only must be 'off' to use. | shared |
271271
| json_or_param_binary_string | Flag parameters or application/json request/response bodies with schema type: string, format: binary. | oas3 |
272+
| undefined_required_properties| Flag any schema with undefined required properties | shared |
272273

273274
##### security_definitions
274275
| Rule | Description | Spec |
@@ -383,6 +384,7 @@ The default values for each rule are described below.
383384
| Rule | Default |
384385
| --------------------------- | ------- |
385386
| json_or_param_binary_string | warning |
387+
| undefined_required_properties | warning |
386388

387389
##### shared
388390

src/.defaultsForValidator.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ const defaults = {
6868
'inconsistent_property_type': 'warning',
6969
'property_case_convention': [ 'error', 'lower_snake_case'],
7070
'property_case_collision': 'error',
71-
'enum_case_convention': [ 'warning', 'lower_snake_case']
71+
'enum_case_convention': [ 'warning', 'lower_snake_case'],
72+
'undefined_required_properties': 'warning'
7273
},
7374
'walker': {
7475
'no_empty_descriptions': 'error',

src/plugins/validation/2and3/semantic-validators/items-required-for-array-objects.js

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,43 @@
1010

1111
const { walk } = require('../../../utils');
1212
const MessageCarrier = require('../../../utils/messageCarrier');
13+
const at = require('lodash/at');
1314

14-
module.exports.validate = function({ jsSpec }) {
15+
const reduceObj = function(jsSpec, obj) {
16+
if (obj['$ref']) {
17+
const objPath = obj['$ref'].split('/');
18+
objPath.shift();
19+
return reduceObj(jsSpec, at(jsSpec, [objPath])[0]);
20+
}
21+
return obj;
22+
};
23+
24+
const checkReqProp = function(jsSpec, obj, requiredProp) {
25+
obj = reduceObj(jsSpec, obj);
26+
if (obj.properties && obj.properties[requiredProp]) {
27+
return true;
28+
} else if (Array.isArray(obj.anyOf) || Array.isArray(obj.oneOf)) {
29+
const childList = obj.anyOf || obj.oneOf;
30+
let reqPropDefined = true;
31+
childList.forEach((childObj) => {
32+
if (!checkReqProp(jsSpec, childObj, requiredProp)) {
33+
reqPropDefined = false;
34+
}
35+
});
36+
return reqPropDefined;
37+
} else if (Array.isArray(obj.allOf)) {
38+
let reqPropDefined = false;
39+
obj.allOf.forEach((childObj) => {
40+
if (checkReqProp(jsSpec, childObj, requiredProp)) {
41+
reqPropDefined = true;
42+
}
43+
});
44+
return reqPropDefined;
45+
}
46+
return false;
47+
}
48+
49+
module.exports.validate = function({ jsSpec }, config) {
1550
const messages = new MessageCarrier();
1651

1752
walk(jsSpec, [], function(obj, path) {
@@ -36,13 +71,14 @@ module.exports.validate = function({ jsSpec }) {
3671
}
3772

3873
// Assertation 2
74+
const undefinedRequiredProperties = config.schemas.undefined_required_properties;
3975
if (Array.isArray(obj.required)) {
4076
obj.required.forEach((requiredProp, i) => {
41-
if (!obj.properties || !obj.properties[requiredProp]) {
77+
if (!checkReqProp(jsSpec, obj, requiredProp)) {
4278
messages.addMessage(
4379
path.concat([`required[${i}]`]).join('.'),
44-
"Schema properties specified as 'required' must be defined",
45-
'error'
80+
"Schema properties specified as 'required' should be defined",
81+
undefinedRequiredProperties
4682
);
4783
}
4884
});

0 commit comments

Comments
 (0)