{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "vscode-html-customdata",
  "version": 1.1,
  "title": "VS Code HTML Custom Data format",
  "description": "Format for loading Custom Data in VS Code's HTML support",
  "type": "object",
  "required": ["version"],
  "definitions": {
    "references": {
      "type": "object",
      "required": ["name", "url"],
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the reference."
        },
        "url": {
          "type": "string",
          "description": "The URL of the reference.",
          "pattern": "https?:\/\/",
          "patternErrorMessage": "URL should start with http:// or https://"
        }
      }
    },
    "markupDescription": {
      "type": "object",
      "required": ["kind", "value"],
      "properties": {
        "kind": {
          "type": "string",
          "description": "Whether `description.value` should be rendered as plaintext or markdown",
          "enum": [
            "plaintext",
            "markdown"
          ]
        },
        "value": {
          "type": "string",
          "description": "Description shown in completion and hover"
        }
      }
    }
  },
  "properties": {
    "version": {
      "const": 1.1,
      "description": "The custom data version",
      "type": "number"
    },
    "tags": {
      "description": "Custom HTML tags",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": "$1",
              "description": "",
              "attributes": []
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of tag"
          },
          "description": {
            "description": "Description of tag shown in completion and hover",
            "anyOf": [
              {
                "type": "string"
              },
              { "$ref": "#/definitions/markupDescription" }
            ]
          },
          "attributes": {
            "type": "array",
            "description": "A list of possible attributes for the tag",
            "items": {
              "type": "object",
              "required": ["name"],
              "defaultSnippets": [
                {
                  "body": {
                    "name": "$1",
                    "description": "",
                    "values": []
                  }
                }
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of attribute"
                },
                "description": {
                  "description": "Description of attribute shown in completion and hover",
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    { "$ref": "#/definitions/markupDescription" }
                  ]
                },
                "valueSet": {
                  "type": "string",
                  "description": "Name of the matching attribute value set"
                },
                "values": {
                  "type": "array",
                  "description": "A list of possible values for the attribute",
                  "items": {
                    "type": "object",
                    "required": ["name"],
                    "defaultSnippets": [
                      {
                        "body": {
                          "name": "$1",
                          "description": ""
                        }
                      }
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Name of attribute value"
                      },
                      "description": {
                        "description": "Description of attribute value shown in completion and hover",
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          { "$ref": "#/definitions/markupDescription" }
                        ]
                      },
                      "references": {
                        "type": "array",
                        "description": "A list of references for the attribute value shown in completion and hover",
                        "items": {
                          "$ref": "#/definitions/references"
                        }
                      }
                    }
                  }
                },
                "references": {
                  "type": "array",
                  "description": "A list of references for the attribute shown in completion and hover",
                  "items": {
                    "$ref": "#/definitions/references"
                  }
                }
              }
            }
          },
          "references": {
            "type": "array",
            "description": "A list of references for the tag shown in completion and hover",
            "items": {
              "$ref": "#/definitions/references"
            }
          }
        }
      }
    },
    "globalAttributes": {
      "description": "Custom HTML global attributes",
      "type": "array",
      "items": {
        "$ref": "#/properties/tags/items/properties/attributes/items"
      }
    },
    "valueSets": {
      "description": "A set of attribute value. When an attribute refers to an attribute set, its value completion will use value from that set",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": "$1",
              "description": "",
              "values": []
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of attribute value in value set"
          },
          "values": {
            "$ref": "#/properties/tags/items/properties/attributes/items/properties/values"
          }
        }
      }
    }
  }
}
