Skip to content

Commit ca43431

Browse files
authored
enhance SchemaObject type (#697)
- Composition types: allOf, anyOf, oneOf and not are valid SchemaObjects
1 parent d415425 commit ca43431

File tree

3 files changed

+19
-14
lines changed

3 files changed

+19
-14
lines changed

Diff for: src/framework/types.ts

+16-11
Original file line numberDiff line numberDiff line change
@@ -262,19 +262,29 @@ export namespace OpenAPIV3 {
262262
| 'string'
263263
| 'integer';
264264
export type ArraySchemaObjectType = 'array';
265-
export type SchemaObject = ArraySchemaObject | NonArraySchemaObject;
266265

267-
export interface ArraySchemaObject extends BaseSchemaObject {
268-
type: ArraySchemaObjectType;
266+
export type SchemaObject = ArraySchemaObject | NonArraySchemaObject | CompositionSchemaObject;
267+
268+
export interface ArraySchemaObject extends BaseSchemaObject<ArraySchemaObjectType> {
269269
items: ReferenceObject | SchemaObject;
270270
}
271271

272-
export interface NonArraySchemaObject extends BaseSchemaObject {
273-
type: NonArraySchemaObjectType;
272+
export interface NonArraySchemaObject extends BaseSchemaObject<NonArraySchemaObjectType> {
274273
}
275274

276-
interface BaseSchemaObject {
275+
export interface CompositionSchemaObject extends BaseSchemaObject<undefined> {
277276
// JSON schema allowed properties, adjusted for OpenAPI
277+
allOf?: Array<ReferenceObject | SchemaObject>;
278+
oneOf?: Array<ReferenceObject | SchemaObject>;
279+
anyOf?: Array<ReferenceObject | SchemaObject>;
280+
not?: ReferenceObject | SchemaObject;
281+
// OpenAPI-specific properties
282+
discriminator?: DiscriminatorObject;
283+
}
284+
285+
interface BaseSchemaObject<T> {
286+
// JSON schema allowed properties, adjusted for OpenAPI
287+
type?: T;
278288
title?: string;
279289
description?: string;
280290
format?: string;
@@ -298,14 +308,9 @@ export namespace OpenAPIV3 {
298308
properties?: {
299309
[name: string]: ReferenceObject | SchemaObject;
300310
};
301-
allOf?: Array<ReferenceObject | SchemaObject>;
302-
oneOf?: Array<ReferenceObject | SchemaObject>;
303-
anyOf?: Array<ReferenceObject | SchemaObject>;
304-
not?: ReferenceObject | SchemaObject;
305311

306312
// OpenAPI-specific properties
307313
nullable?: boolean;
308-
discriminator?: DiscriminatorObject;
309314
readOnly?: boolean;
310315
writeOnly?: boolean;
311316
xml?: XMLObject;

Diff for: src/middlewares/parsers/req.parameter.mutator.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export class RequestParameterMutator {
183183
): void {
184184
// fetch the keys used for this kind of explode
185185
const type = schema.type;
186-
const hasXOf = schema.allOf || schema.oneOf || schema.anyOf;
186+
const hasXOf = schema['allOf'] || schema['oneOf'] || schema['anyOf'];
187187
const properties = hasXOf
188188
? xOfProperties(schema)
189189
: type === 'object'

Diff for: src/middlewares/parsers/schema.preprocessor.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,10 @@ export class SchemaPreprocessor {
263263

264264
private processDiscriminator(parent: Schema, schema: Schema, opts: any = {}) {
265265
const o = opts.discriminator;
266-
const schemaObj = <SchemaObject>schema;
266+
const schemaObj = <OpenAPIV3.CompositionSchemaObject>schema;
267267
const xOf = schemaObj.oneOf ? 'oneOf' : schemaObj.anyOf ? 'anyOf' : null;
268268

269-
if (xOf && schemaObj?.discriminator?.propertyName && !o.discriminator) {
269+
if (xOf && schemaObj.discriminator?.propertyName && !o.discriminator) {
270270
const options = schemaObj[xOf].flatMap((refObject) => {
271271
if (refObject['$ref'] === undefined) {
272272
return [];

0 commit comments

Comments
 (0)