glideapps/quicktype

converting a recursive json schema into a zod type breaks

Open

#2508 opened on Feb 16, 2024

View on GitHub
 (1 comment) (0 reactions) (0 assignees)TypeScript (10,867 stars) (968 forks)batch import
TS Zodbuggood first issueinput:JSON Schema

Description

example self referential schema:

{
  "id": "http://json-schema.org/geo",
  "$schema": "http://json-schema.org/draft-06/schema#",
  "description": "A geographical coordinate",
  "type": "object",
  "definitions":{
    "Mydef1":{
        "type":"object",
        "properties":{
            "test":{
                "$ref":"#/definitions/Mydef1"
            }
            
        }
    }
  },
  "properties": {
    "latitude": {
       "$ref":"#/definitions/Mydef1"
    }
  }
}

produces:

export const Mydef1Schema = z.object({
    "test": z.union([Mydef1Schema, z.null()]).optional(),
});
export type Mydef1 = z.infer<typeof Mydef1Schema>;

export const CoordinateSchema = z.object({
    "latitude": z.union([Mydef1Schema, z.null()]).optional(),
});
export type Coordinate = z.infer<typeof CoordinateSchema>;

but it should be https://github.com/colinhacks/zod#recursive-types

=> z.lazy(() => Mydef1Schema)

export const Mydef1Schema = z.object({
    "test": z.union([z.lazy(() =>Mydef1Schema), z.null()]).optional(),
});
export type Mydef1 = z.infer<typeof Mydef1Schema>;

export const CoordinateSchema = z.object({
    "latitude": z.union([Mydef1Schema, z.null()]).optional(),
});
export type Coordinate = z.infer<typeof CoordinateSchema>;

Contributor guide