From b563b04de3c7237a1c56bb4bed26403007b185c6 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Wed, 15 Apr 2026 20:10:32 +0200 Subject: [PATCH] fix(schema): handle enum and default schema types in idl --- packages/schema/src/tests/utils/idl.spec.ts | 20 ++++++++++++++++++++ packages/schema/src/utils/idl.ts | 21 +++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/schema/src/tests/utils/idl.spec.ts b/packages/schema/src/tests/utils/idl.spec.ts index afdf88e6..3a2e2e2e 100644 --- a/packages/schema/src/tests/utils/idl.spec.ts +++ b/packages/schema/src/tests/utils/idl.spec.ts @@ -222,4 +222,24 @@ describe('idl', () => { }); }); }); + + describe('object with enum field with default', () => { + const Schema = z.object({ + visibility: z + .enum(['public', 'friends_and_followers', 'friends_only']) + .default('friends_only') + }); + + it('converts enum with default to IDL', () => { + expect(schemaToIdl({schema: Schema, value: {visibility: 'friends_and_followers'}})).toEqual({ + visibility: {friends_and_followers: null} + }); + }); + + it('converts enum with default from IDL', () => { + expect( + schemaFromIdl({schema: Schema, value: {visibility: {friends_and_followers: null}}}) + ).toEqual({visibility: 'friends_and_followers'}); + }); + }); }); diff --git a/packages/schema/src/utils/idl.ts b/packages/schema/src/utils/idl.ts index b43bf4ce..ca2b86a9 100644 --- a/packages/schema/src/utils/idl.ts +++ b/packages/schema/src/utils/idl.ts @@ -69,6 +69,14 @@ export const schemaToIdl = ({schema, value}: IdlParams): unknown => { ); } + if (schema instanceof z.ZodDefault) { + return schemaToIdl({schema: schema._zod.def.innerType, value}); + } + + if (schema instanceof z.ZodEnum) { + return {[value as string]: null}; + } + return value; }; @@ -147,5 +155,18 @@ export const schemaFromIdl = ({schema, value}: IdlParams): unknown => { ); } + if (schema instanceof z.ZodDefault) { + return schemaFromIdl({schema: schema._zod.def.innerType, value}); + } + + if (schema instanceof z.ZodEnum) { + const obj = value as Record; + const keys = Object.keys(obj); + if (keys.length === 1) { + return keys[0]; + } + return value; + } + return value; };