{
  "$id": "@ali/low-code-component-protocol-schema",
  "description": "json schema for low code component protocol",
  "allOf": [
    {
      "$ref": "#/definitions/BasicSection"
    },
    {
      "$ref": "#/definitions/PropsSection"
    },
    {
      "$ref": "#/definitions/ConfigureSection"
    }
  ],
  "definitions": {
    "BasicSection": {
      "type": "object",
      "properties": {
        "componentName": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "docUrl": {
          "type": "string"
        },
        "screenshot": {
          "type": "string"
        },
        "icon": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "devMode": {
          "enum": [
            "proCode",
            "lowCode"
          ]
        },
        "npm": {
          "$ref": "#/definitions/Npm"
        }
      },
      "required": [
        "componentName",
        "title",
        "npm",
        "docUrl",
        "screenshot"
      ]
    },
    "PropsSection": {
      "type": "object",
      "properties": {
        "props": {
          "type": "array",
          "items": {
            "properties": {
              "name": {
                "type": "string"
              },
              "propType": {
                "$ref": "#/definitions/PropType"
              },
              "description": {
                "type": "string"
              },
              "defaultValue": {}
            },
            "required": [
              "name",
              "propType"
            ]
          }
        }
      }
    },
    "ConfigureSection": {
      "type": "object",
      "properties": {
        "configure": {
          "type": "object",
          "properties": {
            "props": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/ConfigureProp"
              }
            },
            "styles": {
              "type": "object",
              "properties": {}
            },
            "events": {
              "type": "object",
              "properties": {}
            },
            "component": {
              "$ref": "#/definitions/ConfigureComponent"
            }
          }
        }
      }
    },
    "Npm": {
      "type": "object",
      "properties": {
        "package": {
          "type": "string"
        },
        "exportName": {
          "type": "string"
        },
        "subName": {
          "type": "string"
        },
        "main": {
          "type": "string"
        },
        "destructuring": {
          "type": "boolean"
        },
        "version": {
          "type": "string"
        }
      },
      "required": [
        "package",
        "exportName",
        "subName",
        "main",
        "destructuring",
        "version"
      ]
    },
    "PropType": {
      "oneOf": [
        {
          "$ref": "#/definitions/BasicType"
        },
        {
          "$ref": "#/definitions/RequiredType"
        },
        {
          "$ref": "#/definitions/ComplexType"
        }
      ]
    },
    "BasicType": {
      "type": "string",
      "enum": [
        "array",
        "bool",
        "func",
        "number",
        "object",
        "string",
        "node",
        "element",
        "any"
      ]
    },
    "RequiredType": {
      "type": "object",
      "properties": {
        "type": {
          "$ref": "#/definitions/BasicType"
        },
        "isRequired": {
          "type": "boolean"
        }
      },
      "additionalProperties": false,
      "required": [
        "type"
      ]
    },
    "ComplexType": {
      "oneOf": [
        {
          "$ref": "#/definitions/OneOf"
        },
        {
          "$ref": "#/definitions/OneOfType"
        },
        {
          "$ref": "#/definitions/ArrayOf"
        },
        {
          "$ref": "#/definitions/ObjectOf"
        },
        {
          "$ref": "#/definitions/Shape"
        },
        {
          "$ref": "#/definitions/Exact"
        }
      ]
    },
    "OneOf": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "oneOf"
          ]
        },
        "value": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "OneOfType": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "oneOfType"
          ]
        },
        "value": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/PropType"
          }
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "ArrayOf": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "arrayOf"
          ]
        },
        "value": {
          "$ref": "#/definitions/PropType"
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "ObjectOf": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "objectOf"
          ]
        },
        "value": {
          "$ref": "#/definitions/PropType"
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "Shape": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "shape"
          ]
        },
        "value": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "propType": {
                "$ref": "#/definitions/PropType"
              }
            },
            "additionalProperties": false
          }
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "ShapeItem": {
      "type": "object",
      "required": [
        "name",
        "propType"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "propType": {
          "$ref": "#/definitions/PropType"
        },
        "isRequired": {
          "type": "boolean"
        }
      },
      "additionalProperties": false
    },
    "Exact": {
      "type": "object",
      "required": [
        "type",
        "value"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "exact"
          ]
        },
        "value": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "propType": {
                "$ref": "#/definitions/PropType"
              }
            },
            "additionalProperties": false
          }
        },
        "isRequired": {
          "type": "boolean"
        }
      }
    },
    "ConfigureProp": {
      "type": "object",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "title": {
              "type": "string"
            },
            "extraProps": {
              "type": "object",
              "properties": {}
            }
          }
        },
        {
          "oneOf": [
            {
              "$ref": "#/definitions/ConfigureFieldProp"
            },
            {
              "$ref": "#/definitions/ConfigureGroupProp"
            }
          ]
        }
      ]
    },
    "ConfigureFieldProp": {
      "type": "object",
      "required": [
        "type"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "field"
          ]
        },
        "name": {
          "type": "string"
        },
        "setter": {
          "$ref": "#/definitions/ConfigureFieldSetter"
        }
      }
    },
    "ConfigureFieldSetter": {
      "type": "object",
      "required": [
        "componentName"
      ],
      "properties": {
        "componentName": {
          "type": "string",
          "enum": [
            "List",
            "Object",
            "Function",
            "Node",
            "Mixin",
            "Expression",
            "Switch",
            "Number",
            "Input",
            "TextArea",
            "Date",
            "DateYear",
            "DateMonth",
            "DateRange",
            "ColorPicker",
            "CodeEditor",
            "Select",
            "RadioGroup"
          ]
        },
        "props": {
          "type": "object",
          "properties": {}
        }
      }
    },
    "ConfigureGroupProp": {
      "type": "object",
      "required": [
        "type",
        "items"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "group"
          ]
        },
        "items": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ConfigureProp"
          }
        }
      }
    },
    "ConfigureComponent": {
      "type": "object",
      "properties": {
        "isContainer": {
          "type": "boolean"
        },
        "isModal": {
          "type": "boolean"
        },
        "descriptor": {
          "type": "string"
        },
        "nestingRule": {
          "type": "object",
          "properties": {
            "childWhitelist": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "parentWhitelist": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "descendantBlacklist": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "ancestorWhitelist": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        },
        "isNullNode": {
          "type": "boolean"
        },
        "isLayout": {
          "type": "boolean"
        }
      }
    }
  }
}