Skip to content

Commit

Permalink
force one of flag
Browse files Browse the repository at this point in the history
  • Loading branch information
fmmoret committed Oct 21, 2023
1 parent 81d16d5 commit 7999958
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
12 changes: 12 additions & 0 deletions src/openapi-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -960,6 +960,14 @@ export class OpenAPIGenerator {
return this.generateSchemaWithRef(optionToGenerate);
});

const internalOptions = this.getOptions(zodSchema);
if (internalOptions.forceOneOf) {
return {
oneOf: this.mapNullableOfArray(schemas, isNullable),
default: defaultValue,
};
}

return {
anyOf: this.mapNullableOfArray(schemas, isNullable),
default: defaultValue,
Expand Down Expand Up @@ -1294,6 +1302,10 @@ export class OpenAPIGenerator {
return this.getInternalMetadata(zodSchema)?.refId;
}

private getOptions<T extends any>(zodSchema: ZodType<T>) {
return this.getInternalMetadata(zodSchema)?.options;
}

private applySchemaMetadata(
initialData: SchemaObject | ParameterObject | ReferenceObject,
metadata: Partial<ZodOpenAPIMetadata>
Expand Down
20 changes: 18 additions & 2 deletions src/zod-extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,18 @@ export type ZodOpenAPIMetadata<T = any, E = ExampleValue<T>> = Omit<
export interface ZodOpenAPIInternalMetadata {
refId?: string;
extendedFrom?: { refId: string; schema: ZodObject<ZodRawShape> };
options?: ZodToOpenAPIOptions;
}

export interface ZodOpenApiFullMetadata<T = any> {
_internal?: ZodOpenAPIInternalMetadata;
metadata?: ZodOpenAPIMetadata<T>;
}

export interface ZodToOpenAPIOptions {
forceOneOf?: boolean;
}

declare module 'zod' {
interface ZodTypeDef {
openapi?: ZodOpenApiFullMetadata;
Expand All @@ -54,6 +59,13 @@ declare module 'zod' {
refId: string,
metadata?: Partial<ZodOpenAPIMetadata<z.infer<T>>>
): T;

openapi<T extends ZodTypeAny>(
this: T,
refId: string,
metadata?: Partial<ZodOpenAPIMetadata<z.infer<T>>>,
options?: ZodToOpenAPIOptions,
): T;
}
}

Expand Down Expand Up @@ -83,9 +95,12 @@ export function extendZodWithOpenApi(zod: typeof z) {

zod.ZodType.prototype.openapi = function (
refOrOpenapi: string | Partial<ZodOpenAPIMetadata<any>>,
metadata?: Partial<ZodOpenAPIMetadata<any>>
metadataOrOptions?: Partial<ZodOpenAPIMetadata<any>> | ZodToOpenAPIOptions,
options?: ZodToOpenAPIOptions,
) {
const openapi = typeof refOrOpenapi === 'string' ? metadata : refOrOpenapi;
const usingRef = typeof refOrOpenapi === 'string';
const openapi = (usingRef ? metadataOrOptions : refOrOpenapi) as Partial<ZodOpenAPIMetadata<any>> | undefined;
const resolvedOptions = (usingRef ? options : metadataOrOptions) as ZodToOpenAPIOptions | undefined;

const { param, ...restOfOpenApi } = openapi ?? {};

Expand All @@ -94,6 +109,7 @@ export function extendZodWithOpenApi(zod: typeof z) {
...(typeof refOrOpenapi === 'string'
? { refId: refOrOpenapi }
: undefined),
...({ options: resolvedOptions } ?? {}),
};

const resultMetadata = {
Expand Down

0 comments on commit 7999958

Please sign in to comment.