Skip to content

Commit 20abe6b

Browse files
committed
refactor the rule for readability
1 parent c0cb033 commit 20abe6b

2 files changed

Lines changed: 31 additions & 41 deletions

File tree

packages/core/src/rules/common/__tests__/no-required-schema-properties-undefined.test.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ describe('no-required-schema-properties-undefined', () => {
4646
"source": "foobar.yaml",
4747
},
4848
],
49-
"message": "Required property 'test' is undefined.",
49+
"message": "Required property 'test' is not defined.",
5050
"ruleId": "no-required-schema-properties-undefined",
5151
"severity": "error",
5252
"suggest": [],
@@ -59,7 +59,7 @@ describe('no-required-schema-properties-undefined', () => {
5959
"source": "foobar.yaml",
6060
},
6161
],
62-
"message": "Required property 'test2' is undefined.",
62+
"message": "Required property 'test2' is not defined.",
6363
"ruleId": "no-required-schema-properties-undefined",
6464
"severity": "error",
6565
"suggest": [],
@@ -108,7 +108,7 @@ describe('no-required-schema-properties-undefined', () => {
108108
"source": "foobar.yaml",
109109
},
110110
],
111-
"message": "Required property 'test' is undefined.",
111+
"message": "Required property 'test' is not defined.",
112112
"ruleId": "no-required-schema-properties-undefined",
113113
"severity": "error",
114114
"suggest": [],
@@ -231,7 +231,7 @@ describe('no-required-schema-properties-undefined', () => {
231231
"source": "foobar.yaml",
232232
},
233233
],
234-
"message": "Required property 'foo' is undefined.",
234+
"message": "Required property 'foo' is not defined.",
235235
"ruleId": "no-required-schema-properties-undefined",
236236
"severity": "error",
237237
"suggest": [],
@@ -286,7 +286,7 @@ describe('no-required-schema-properties-undefined', () => {
286286
"source": "foobar.yaml",
287287
},
288288
],
289-
"message": "Required property 'surname' is undefined.",
289+
"message": "Required property 'surname' is not defined.",
290290
"ruleId": "no-required-schema-properties-undefined",
291291
"severity": "error",
292292
"suggest": [],
@@ -428,7 +428,7 @@ describe('no-required-schema-properties-undefined', () => {
428428
"source": "foobar.yaml",
429429
},
430430
],
431-
"message": "Required property 'test' is undefined.",
431+
"message": "Required property 'test' is not defined.",
432432
"ruleId": "no-required-schema-properties-undefined",
433433
"severity": "error",
434434
"suggest": [],
@@ -536,12 +536,12 @@ describe('no-required-schema-properties-undefined', () => {
536536
"source": "foobar.yaml",
537537
},
538538
],
539-
"message": "Required property 'name' is undefined.",
539+
"message": "Required property 'name' is not defined.",
540540
"ruleId": "no-required-schema-properties-undefined",
541541
"severity": "error",
542542
"suggest": [],
543543
},
544-
]
544+
]
545545
`);
546546
});
547547

@@ -648,7 +648,7 @@ describe('no-required-schema-properties-undefined', () => {
648648
"source": "foobar.yaml",
649649
},
650650
],
651-
"message": "Required property 'name' is undefined.",
651+
"message": "Required property 'name' is not defined.",
652652
"ruleId": "no-required-schema-properties-undefined",
653653
"severity": "error",
654654
"suggest": [],
@@ -661,7 +661,7 @@ describe('no-required-schema-properties-undefined', () => {
661661
"source": "foobar.yaml",
662662
},
663663
],
664-
"message": "Required property 'huntingSkill' is undefined.",
664+
"message": "Required property 'huntingSkill' is not defined.",
665665
"ruleId": "no-required-schema-properties-undefined",
666666
"severity": "error",
667667
"suggest": [],
@@ -757,7 +757,7 @@ describe('no-required-schema-properties-undefined', () => {
757757
"source": "foobar.yaml",
758758
},
759759
],
760-
"message": "Required property 'missing-required-prop' is undefined.",
760+
"message": "Required property 'missing-required-prop' is not defined.",
761761
"ruleId": "no-required-schema-properties-undefined",
762762
"severity": "error",
763763
"suggest": [],
@@ -802,7 +802,7 @@ describe('no-required-schema-properties-undefined', () => {
802802
"source": "foobar.yaml",
803803
},
804804
],
805-
"message": "Required property 'missingRequired' is undefined.",
805+
"message": "Required property 'missingRequired' is not defined.",
806806
"ruleId": "no-required-schema-properties-undefined",
807807
"severity": "error",
808808
"suggest": [],
@@ -850,7 +850,7 @@ describe('no-required-schema-properties-undefined', () => {
850850
"source": "foobar.yaml",
851851
},
852852
],
853-
"message": "Required property 'missing-required' is undefined.",
853+
"message": "Required property 'missing-required' is not defined.",
854854
"ruleId": "no-required-schema-properties-undefined",
855855
"severity": "error",
856856
"suggest": [],
@@ -890,7 +890,7 @@ describe('no-required-schema-properties-undefined', () => {
890890
"source": "foobar.yaml",
891891
},
892892
],
893-
"message": "Required property 'name' is undefined.",
893+
"message": "Required property 'name' is not defined.",
894894
"ruleId": "no-required-schema-properties-undefined",
895895
"severity": "error",
896896
"suggest": [],

packages/core/src/rules/common/no-required-schema-properties-undefined.ts

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ export const NoRequiredSchemaPropertiesUndefined:
2323
parents.pop();
2424
},
2525
enter(schema: AnySchema, ctx: UserContext) {
26-
const { location, report } = ctx;
2726
parents.push(schema);
2827
if (!schema.required) return;
2928

@@ -38,21 +37,18 @@ export const NoRequiredSchemaPropertiesUndefined:
3837
visited.add(resolved.schema);
3938

4039
if (
41-
(resolved.schema.properties &&
42-
getOwn(resolved.schema.properties, propertyName) !== undefined) ||
43-
resolved.schema.allOf?.some((s) =>
44-
hasProperty(s, propertyName, visited, resolved.location)
45-
) ||
46-
resolved.schema.anyOf?.every((s) =>
47-
hasProperty(s, propertyName, visited, resolved.location)
48-
) ||
49-
resolved.schema.oneOf?.every((s) =>
50-
hasProperty(s, propertyName, visited, resolved.location)
51-
)
40+
resolved.schema.properties &&
41+
getOwn(resolved.schema.properties, propertyName) !== undefined
5242
) {
5343
return true;
5444
}
5545

46+
const check = (s: AnySchema) => hasProperty(s, propertyName, visited, resolved.location);
47+
48+
if (resolved.schema.allOf?.some(check)) return true;
49+
if (resolved.schema.anyOf?.every(check)) return true;
50+
if (resolved.schema.oneOf?.every(check)) return true;
51+
5652
return false;
5753
};
5854

@@ -66,30 +62,24 @@ export const NoRequiredSchemaPropertiesUndefined:
6662
};
6763

6864
const findCompositionRoot = (): AnySchema | undefined => {
69-
let root: AnySchema | undefined;
70-
let child = schema;
71-
for (let i = parents.length - 2; i >= 0; i--) {
65+
const walk = (i: number, child: AnySchema): AnySchema | undefined => {
66+
if (i < 0) return undefined;
7267
const parent = parents[i];
73-
if (isCompositionChild(parent, child)) {
74-
root = parent;
75-
child = parent;
76-
} else {
77-
break;
78-
}
79-
}
80-
return root;
68+
return isCompositionChild(parent, child) ? (walk(i - 1, parent) ?? parent) : undefined;
69+
};
70+
return walk(parents.length - 2, schema);
8171
};
8272

8373
const compositionRoot = findCompositionRoot();
8474

8575
for (const [i, requiredProperty] of schema.required.entries()) {
8676
if (
8777
!hasProperty(schema, requiredProperty, new Set()) &&
88-
!(compositionRoot && hasProperty(compositionRoot, requiredProperty, new Set()))
78+
!hasProperty(compositionRoot, requiredProperty, new Set())
8979
) {
90-
report({
91-
message: `Required property '${requiredProperty}' is undefined.`,
92-
location: location.child(['required', i]),
80+
ctx.report({
81+
message: `Required property '${requiredProperty}' is not defined.`,
82+
location: ctx.location.child(['required', i]),
9383
});
9484
}
9585
}

0 commit comments

Comments
 (0)