diff --git a/packages/zod-openapi/src/lib/zod-openapi.spec.ts b/packages/zod-openapi/src/lib/zod-openapi.spec.ts index 24ebfa4..a12c84f 100644 --- a/packages/zod-openapi/src/lib/zod-openapi.spec.ts +++ b/packages/zod-openapi/src/lib/zod-openapi.spec.ts @@ -1027,6 +1027,14 @@ describe('zodOpenapi', () => { "type": "object", } `); + }); + it('should not mutate the original schema', () => { + const s1 = extendApi(z.string(), { description: 's1' }); + const s2 = extendApi(s1, { description: 's2' }); + const apiSchema1 = generateSchema(s1); + const apiSchema2 = generateSchema(s2); + expect(apiSchema1.description).toEqual('s1'); + expect(apiSchema2.description).toEqual('s2'); }); }); diff --git a/packages/zod-openapi/src/lib/zod-openapi.ts b/packages/zod-openapi/src/lib/zod-openapi.ts index 16231af..d17cefb 100644 --- a/packages/zod-openapi/src/lib/zod-openapi.ts +++ b/packages/zod-openapi/src/lib/zod-openapi.ts @@ -23,8 +23,14 @@ export function extendApi( schema: T, schemaObject: AnatineSchemaObject = {} ): T { - schema.metaOpenApi = Object.assign(schema.metaOpenApi || {}, schemaObject); - return schema; + const This = (schema as any).constructor; + const newSchema = new This(schema._def); + newSchema.metaOpenApi = Object.assign( + {}, + schema.metaOpenApi || {}, + schemaObject + ); + return newSchema; } function iterateZodObject({