vazco / uniforms

A React library for building forms from any schema.
https://uniforms.tools
MIT License
1.93k stars 239 forks source link

When I use discriminator, I am getting an error where it can't find the specific field #1358

Open davidli108 opened 3 weeks ago

davidli108 commented 3 weeks ago

Versions: uniforms: ^3.10.1 uniforms-mui: ^3.10.1

type A1 = {
  id_type: 'a1';
  id: string;
};
type A2 = {
  id_type: 'a2';
  id: string;
};
type C = {
  name: string;
  address: string;
}

type A1c = A1 & C
type A2c = A2 & C

/**
 * @discriminator id_type
 */
export type A = A1c | A2c

When i generate the json schema from this typescript, the json is

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$ref": "#/definitions/A",
  "definitions": {
    "A": {
      "type": "object",
      "discriminator": {
        "propertyName": "id_type"
      },
      "required": [
        "id_type"
      ],
      "oneOf": [
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string"
            },
            "address": {
              "type": "string"
            },
            "id_type": {
              "type": "string",
              "const": "a1"
            },
            "id": {
              "type": "string"
            }
          },
          "required": [
            "address",
            "id",
            "id_type",
            "name"
          ]
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "name": {
              "type": "string"
            },
            "address": {
              "type": "string"
            },
            "id_type": {
              "type": "string",
              "const": "a2"
            },
            "id": {
              "type": "string"
            }
          },
          "required": [
            "address",
            "id",
            "id_type",
            "name"
          ]
        }
      ]
    }
  }
}

In this case, I am getting an error and it says it cannot find the "name" or "address" field in A As you can see, A has "type": "object" inside of it and oneOf property also has "type": "object" in each property. When i deleted the first "type": "object", I didn't see the error.

Can you please check?

zendranm commented 3 weeks ago

Hi @davidli108 Seem that the problem is related specifically to the uniforms-bridge-json-schema. Out of curiosity what did you use to generate this schema from types? In general, the handling of allOf/anyOf/oneOf is not complete as mentioned here.

I've tried to reproduce this error using the schema you shared but I've encountered a different error: Error: strict mode: unknown keyword: "discriminator". Perhaps a complete reproduction of your issue could shed some more light on it.

It's possible that the type: "object" at the top level of the schema conflicts with the oneOf keyword, as the validator might be expecting an additional level of nesting in the structure.