@@ -3,6 +3,8 @@ import { describe, expect, expectTypeOf, it } from 'vitest';
33import { createSchemaFactory } from '../src/index' ;
44import { schema } from './schema/schema' ;
55import z from 'zod' ;
6+ import type { User as ModelUser } from './schema/models' ;
7+ import type { JsonValue } from '@zenstackhq/orm' ;
68
79const factory = createSchemaFactory ( schema ) ;
810
@@ -69,9 +71,7 @@ describe('SchemaFactory - makeModelSchema', () => {
6971
7072 // optional Json
7173 expectTypeOf < User > ( ) . toHaveProperty ( 'metadata' ) ;
72- expectTypeOf < User [ 'metadata' ] > ( ) . toEqualTypeOf <
73- string | number | boolean | null | Record < string , unknown > | unknown [ ] | undefined
74- > ( ) ;
74+ expectTypeOf < User [ 'metadata' ] > ( ) . toEqualTypeOf < JsonValue | null | undefined > ( ) ;
7575
7676 // required enum
7777 expectTypeOf < User [ 'status' ] > ( ) . toEqualTypeOf < 'ACTIVE' | 'INACTIVE' | 'PENDING' > ( ) ;
@@ -194,6 +194,22 @@ describe('SchemaFactory - makeModelSchema', () => {
194194 expect ( userSchema . safeParse ( { ...validUser , metadata : { key : 'value' } } ) . success ) . toBe ( true ) ;
195195 expect ( userSchema . safeParse ( { ...validUser , metadata : [ 1 , 2 , 3 ] } ) . success ) . toBe ( true ) ;
196196 expect ( userSchema . safeParse ( { ...validUser , metadata : 42 } ) . success ) . toBe ( true ) ;
197+ expect ( userSchema . safeParse ( { ...validUser , metadata : null } ) . success ) . toBe ( true ) ;
198+ } ) ;
199+
200+ it ( 'infers zod type compatible with ORM model type (except optionality)' , ( ) => {
201+ // ORM model results use `T | null` for optional fields; the Zod schema
202+ // uses `T | null | undefined` to also accept missing fields in input
203+ // objects. The useful property is that any ORM model value is valid
204+ // input for the Zod schema.
205+ const userSchema = factory . makeModelSchema ( 'User' ) ;
206+ type ZodUser = z . infer < typeof userSchema > ;
207+ expectTypeOf < ModelUser > ( ) . toExtend < ZodUser > ( ) ;
208+
209+ // or with required
210+ const _userSchemaRequired = userSchema . required ( ) ;
211+ type ZodUserRequired = z . infer < typeof _userSchemaRequired > ;
212+ expectTypeOf < ZodUserRequired > ( ) . toMatchTypeOf < ModelUser > ( ) ;
197213 } ) ;
198214
199215 it ( 'rejects invalid Json values' , ( ) => {
0 commit comments