zod icon indicating copy to clipboard operation
zod copied to clipboard

zod parsing bug

Open realtebo opened this issue 4 days ago • 0 comments

This is my complex object zod definition

import { z } from 'zod'
import { FieldDataType } from '../../enums/filed-data-type'
import { FieldDataChromoShow } from '../../enums/field-data-chromo-show'
import { EventCategory } from '../../enums/event-category'

const genericAlarmEventFieldDataPayloadSchema = z.object({
    NtpError: z.coerce.boolean(),
    DeviceNotFound: z.coerce.boolean(),
    MasterNotFound: z.coerce.boolean(),
})

const hammamAlarmEventFieldDataPayloadSchema = z.object({
    BoilerFullTooSoon: z.coerce.boolean(),
    EvLoad: z.coerce.boolean(),
    EvDrain: z.coerce.boolean(),
    VinBus: z.coerce.boolean(),
    Ntc: z.coerce.boolean(),
    Fan: z.coerce.boolean(),
    Slave: z.coerce.boolean(),
    HeaterFail: z.coerce.boolean(),
    Capacitive: z.coerce.boolean(),
    CabTemp: z.coerce.boolean(),
    Door: z.coerce.boolean(),
})

const saunaAlarmEventFieldDataPayloadSchema = z.object({
    StoveTemp: z.coerce.boolean(),
    VinBus: z.coerce.boolean(),
    Ntc: z.coerce.boolean(),
    ThermalProtection: z.coerce.boolean(),
    CabTemp: z.coerce.boolean(),
    Potentiometer: z.coerce.boolean(),
})

const eccIotInfoSchema = z.object({
    Id: z.string(),
    Ts: z.coerce.date(),
    Type: z.nativeEnum(FieldDataType),
    HostId: z.string(),
    Payload: saunaAlarmEventFieldDataPayloadSchema
       .or(genericAlarmEventFieldDataPayloadSchema)
       .or(hammamAlarmEventFieldDataPayloadSchema),
})

export const rawEventFieldDataSchema = z.object({
    App: z.string(),
    Cat: z.nativeEnum(EventCategory),
    EccIOTEvent: eccIotInfoSchema,
})

export type RawEventFieldData = z.infer<typeof rawEventFieldDataSchema>

When I use this definition, in my code, zod parses it wrongly

 const body = { 
                "App": "EccIOT", 
                "Cat": "Event", 
                "EccIOTEvent":  
                    {  
                    "Id": "ecc-D8E39657C", 
                    "Ts": "2020/02/28 10:14:10", 
                    "Type":"HAlarm", 
                    "HostId":"0A229332",
                    "Payload":{ 
                        "BoilerFullTooSoon" : 0, 
                        "EvLoad": 0, 
                        "EvDrain": 0, 
                        "VinBus": 0, 
                        "Ntc": 0, 
                        "Fan": 0, 
                        "Slave": 0, 
                        "HeaterFail": 0, 
                        "Capacitive": 0, 
                        "CabTemp": 0, 
                        "Door": 0 
                    } 
                }  
            }

const rawData: RawEventFieldData = rawEventFieldDataSchema.parse(body)

console.log(rawData);

In the console I found this:

{
  App: 'EccIOT',
  Cat: 'Event',
  EccIOTEvent: {
    Id: 'ecc-D8E39657C',
    Ts: 2020-02-28T10:14:10.000Z,
    Type: 'HAlarm',
    HostId: '0A229332',
    Payload: {
      StoveTemp: false,
      VinBus: false,
      Ntc: false,
      ThermalProtection: false,
      CabTemp: false,
      Potentiometer: false
    }
  }
}

What am I doing wrong ?

Zod version is 3.23.8

Compiler options already includes

"compilerOptions": {
       "strict": true   
   }

realtebo avatar Jul 01 '24 15:07 realtebo