Skip to content

Commit 810ff31

Browse files
sakurai-ryoryo_sakurai
andauthored
fix: avoid crashing in the no-required-schema-properties-undefined rule when encountering unresolved $ref (#2413)
Co-authored-by: ryo_sakurai <ryo_sakurai@mates-system.com>
1 parent 8dcc1d4 commit 810ff31

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

.changeset/rotten-llamas-knock.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@redocly/openapi-core": patch
3+
"@redocly/cli": patch
4+
---
5+
6+
Fixed an issue where the `no-required-schema-properties-undefined` caused a crash when encountering unresolved `$ref`s.

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,4 +944,44 @@ describe('no-required-schema-properties-undefined', () => {
944944
]
945945
`);
946946
});
947+
948+
it('should not crash on unresolved $ref', async () => {
949+
const document = parseYamlToDocument(
950+
outdent`
951+
openapi: 3.0.0
952+
components:
953+
schemas:
954+
Object:
955+
allOf:
956+
- $ref: '#/components/schemas/NotExists'
957+
required:
958+
- name
959+
`,
960+
'foobar.yaml'
961+
);
962+
963+
const results = await lintDocument({
964+
externalRefResolver: new BaseResolver(),
965+
document,
966+
config: await createConfig({ rules: { 'no-required-schema-properties-undefined': 'error' } }),
967+
});
968+
969+
expect(replaceSourceWithRef(results)).toMatchInlineSnapshot(`
970+
[
971+
{
972+
"location": [
973+
{
974+
"pointer": "#/components/schemas/Object/required/0",
975+
"reportOnKey": false,
976+
"source": "foobar.yaml",
977+
},
978+
],
979+
"message": "Required property 'name' is undefined.",
980+
"ruleId": "no-required-schema-properties-undefined",
981+
"severity": "error",
982+
"suggest": [],
983+
},
984+
]
985+
`);
986+
});
947987
});

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ export const NoRequiredSchemaPropertiesUndefined:
3838

3939
if (isRef(schema)) {
4040
const resolved = resolve<AnySchema>(schema, from);
41-
return elevateProperties(
42-
resolved.node as AnySchema,
43-
resolved.location?.source.absoluteRef
44-
);
41+
if (!resolved.node) {
42+
return {};
43+
}
44+
return elevateProperties(resolved.node, resolved.location?.source.absoluteRef);
4545
}
4646

4747
return Object.assign(

0 commit comments

Comments
 (0)