Skip to content

Commit ed8babc

Browse files
committed
refactor(openapi): improve separateObjectSchema util
1 parent 90a7c1e commit ed8babc

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

packages/openapi/src/schema-utils.test.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ describe('separateObjectSchema', () => {
4444
{ a: 'a' },
4545
'INVALID',
4646
],
47+
anyOf: undefined, // allowed any key with undefined value
48+
enum: undefined, // allowed any key with undefined value
4749
}
4850

4951
const [matched, rest] = separateObjectSchema(schema, ['a'])
@@ -90,13 +92,15 @@ describe('separateObjectSchema', () => {
9092
additionalProperties: true,
9193
}
9294

93-
const [matched, rest] = separateObjectSchema(schema, ['a'])
95+
const [matched, rest] = separateObjectSchema(schema, ['a', 'd', 'e'])
9496

9597
expect(matched).toEqual({
9698
type: 'object',
9799
description: 'description',
98100
properties: {
99101
a: { type: 'string' },
102+
d: true,
103+
e: true,
100104
},
101105
required: ['a'],
102106
additionalProperties: true,
@@ -138,7 +142,10 @@ describe('separateObjectSchema', () => {
138142

139143
const [matched, rest] = separateObjectSchema(schema, ['a'])
140144

141-
expect(matched).toEqual(schema)
145+
expect(matched).toEqual({
146+
...schema,
147+
properties: {},
148+
})
142149
expect(rest).toEqual(schema)
143150
})
144151
})

packages/openapi/src/schema-utils.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,27 @@ export function isAnySchema(schema: JSONSchema): boolean {
3535
* @internal
3636
*/
3737
export function separateObjectSchema(schema: ObjectSchema, separatedProperties: string[]): [matched: ObjectSchema, rest: ObjectSchema] {
38-
if (Object.keys(schema).some(k => k !== 'type' && k !== 'properties' && k !== 'required' && k !== 'additionalProperties' && LOGIC_KEYWORDS.includes(k))) {
38+
if (Object.keys(schema).some(
39+
k => !['type', 'properties', 'required', 'additionalProperties'].includes(k)
40+
&& LOGIC_KEYWORDS.includes(k)
41+
&& (schema as any)[k] !== undefined,
42+
)) {
3943
return [{ type: 'object' }, schema]
4044
}
4145

4246
const matched: ObjectSchema = { ...schema }
4347
const rest: ObjectSchema = { ...schema }
4448

45-
matched.properties = schema.properties && Object.entries(schema.properties)
46-
.filter(([key]) => separatedProperties.includes(key))
47-
.reduce((acc, [key, value]) => {
48-
acc[key] = value
49+
matched.properties = separatedProperties
50+
.reduce((acc: Record<string, JSONSchema>, key) => {
51+
const keySchema = schema.properties?.[key] ?? schema.additionalProperties
52+
53+
if (keySchema !== undefined) {
54+
acc[key] = keySchema
55+
}
56+
4957
return acc
50-
}, {} as Record<string, JSONSchema>)
58+
}, {})
5159

5260
matched.required = schema.required?.filter(key => separatedProperties.includes(key))
5361

0 commit comments

Comments
 (0)