{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "https://json.schemastore.org/web-types.json",
  "title": "JSON schema for Web-Types",
  "type": "object",
  "properties": {
    "$schema": {
      "type": "string"
    },
    "framework": {
      "description": "Framework, for which the components are provided by the library. If the library is not enabled in a particular context, all symbols from this file will not be available as well. If you want symbols to be always available do not specify framework.",
      "type": "string"
    },
    "context": {
      "$ref": "#/definitions/context"
    },
    "name": {
      "description": "Name of the library.",
      "type": "string"
    },
    "version": {
      "description": "Version of the library, for which Web-Types are provided.",
      "type": "string"
    },
    "js-types-syntax": {
      "$ref": "#/definitions/js-types-syntax"
    },
    "description-markup": {
      "$ref": "#/definitions/description-markup"
    },
    "framework-config": {
      "$ref": "#/definitions/framework-config"
    },
    "contexts-config": {
      "$ref": "#/definitions/contexts-config"
    },
    "default-icon": {
      "$ref": "#/definitions/icon"
    },
    "contributions": {
      "description": "Symbol can be contributed to one of the 3 namespaces - HTML, CSS and JS. Within a particular namespace there can be different kinds of symbols. In each of the namespaces, there are several predefined kinds, which integrate directly with IDE, but providers are free to define their own.",
      "type": "object",
      "properties": {
        "html": {
          "$ref": "#/definitions/html"
        },
        "css": {
          "$ref": "#/definitions/css"
        },
        "js": {
          "$ref": "#/definitions/js-global"
        }
      },
      "additionalProperties": false
    }
  },
  "required": ["name", "version"],
  "additionalProperties": false,
  "definitions": {
    "js-types-syntax": {
      "description": "Language in which JavaScript objects types are specified.",
      "type": "string",
      "enum": ["typescript"]
    },
    "description-markup": {
      "description": "Markup language in which descriptions are formatted.",
      "type": "string",
      "default": "none",
      "enum": ["html", "markdown", "none"]
    },
    "context": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": ["kind", "name"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "anyOf": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/context"
              }
            }
          },
          "required": ["anyOf"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "allOf": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/context"
              }
            }
          },
          "required": ["allOf"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "not": {
              "$ref": "#/definitions/context"
            }
          },
          "required": ["not"],
          "additionalProperties": false
        }
      ]
    },
    "framework-config": {
      "description": "Provide configuration for the specified web framework. This is an advanced feature, which is used to provide support for templating frameworks like Angular, Vue, Svelte, etc.",
      "type": "object",
      "properties": {
        "enable-when": {
          "$ref": "#/definitions/enablement-rules"
        },
        "disable-when": {
          "$ref": "#/definitions/disablement-rules"
        },
        "canonical-names": {
          "description": "In many frameworks symbols can have multiple versions of a name. Specify canonical name conversion rule for names of particular symbol kinds against which comparisons will be made. Format of the 'canonical-names' property names is '{namespace}/{symbol kind}'. By default symbol names in HTML namespace are converted to lower-case, and in CSS and JS namespaces are left as-is. In case of name patterns, rules are applied to each part of the pattern separately, so even if the symbol with pattern is in HTML namespace, references to JS events will be case-sensitive.",
          "$ref": "#/definitions/name-conversion-rules-single"
        },
        "match-names": {
          "description": "Provide an array of name conversions, in which particular symbol kinds should be matched against canonical names of symbols. By default symbol names are converted using canonical-names rule.",
          "$ref": "#/definitions/name-conversion-rules-multiple"
        },
        "name-variants": {
          "description": "Provide an array of name conversions, in which particular symbol kinds should be proposed in auto completion. Format of the 'name-variants' property names is '{namespace}/{symbol kind}'. All symbol kinds are by default provided as-is.",
          "$ref": "#/definitions/name-conversion-rules-multiple"
        }
      },
      "additionalProperties": false
    },
    "contexts-config": {
      "description": "Provide configuration for Web Types contexts. This allows to contribute additional Web Types for example if a particular library is present in the project.",
      "type": "object",
      "additionalProperties": {
        "$ref": "#/definitions/context-config"
      }
    },
    "context-config": {
      "description": "Provide configuration for a specified Web Types context. This allows to contribute additional Web Types for example if a particular library is present in the project.",
      "type": "object",
      "properties": {
        "kind": {
          "description": "Context kind. Only a single context of the particular kind will be enabled. An example of context kind is framework, which has dedicated support in Web Types.",
          "type": "string"
        },
        "enable-when": {
          "$ref": "#/definitions/enablement-rules"
        },
        "disable-when": {
          "$ref": "#/definitions/disablement-rules"
        }
      },
      "required": ["kind"],
      "additionalProperties": false
    },
    "enablement-rules": {
      "description": "Specify rules for enabling web framework support. Only one framework can be enabled in a particular file. If you need your contributions to be enabled in all files, regardless of the context, do not specify the framework.",
      "type": "object",
      "properties": {
        "node-packages": {
          "description": "Node.js package names, which enable framework support within the folder containing the package.json.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "script-url-patterns": {
          "description": "RegExps to match script URLs, which enable framework support within a particular HTML.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/pattern"
          }
        },
        "file-extensions": {
          "description": "Extensions of files, which should have the framework support enabled. Use this to support custom file extensions like '.vue' or '.svelte'. Never specify generic extensions like '.html', '.js' or '.ts'. If you need your contributions to be present in every file don't specify the framework at all",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "file-name-patterns": {
          "description": "RegExp patterns to match file names, which should have the framework support enabled. Use carefully as broken pattern may even freeze IDE.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/pattern"
          }
        },
        "ide-libraries": {
          "description": "Global JavaScript libraries names enabled within the IDE, which enable framework support in the whole project",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "project-tool-executables": {
          "description": "List of tool executables (without extension), which presence should be checked in the project. In case of Node projects, such tools will be searched in node_modules/.bin/",
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "additionalProperties": false
    },
    "disablement-rules": {
      "description": "Specify rules for disabling web framework support. These rules take precedence over enable-when rules. They allow to turn off framework support in case of some conflicts between frameworks priority.",
      "type": "object",
      "properties": {
        "file-extensions": {
          "description": "Extensions of files, which should have the framework support disabled",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "file-name-patterns": {
          "description": "RegExp patterns to match file names, which should have the framework support disabled",
          "type": "array",
          "items": {
            "$ref": "#/definitions/pattern"
          }
        }
      },
      "additionalProperties": false
    },
    "name-conversion-rules-single": {
      "type": "object",
      "patternProperties": {
        "^/[^/\\n\\r]+/[^/\\n\\r]+$": {
          "$ref": "#/definitions/name-converter"
        }
      },
      "additionalProperties": false
    },
    "name-conversion-rules-multiple": {
      "type": "object",
      "patternProperties": {
        "^/[^/\\n\\r]+/[^/\\n\\r]+$": {
          "$ref": "#/definitions/name-converters"
        }
      },
      "additionalProperties": false
    },
    "name-converters": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/name-converter"
      }
    },
    "name-converter": {
      "type": "string",
      "enum": [
        "as-is",
        "PascalCase",
        "camelCase",
        "lowercase",
        "UPPERCASE",
        "kebab-case",
        "snake_case"
      ]
    },
    "icon": {
      "description": "Relative path to the icon representing the symbol or actual SVG of the icon.",
      "type": "string"
    },
    "base-contribution": {
      "type": "object",
      "description": "The base for any contributions.",
      "javaAbstract": true,
      "javaInterfaces": ["GenericContributionsHost"],
      "properties": {
        "name": {
          "$ref": "#/definitions/name"
        },
        "description": {
          "$ref": "#/definitions/description"
        },
        "description-sections": {
          "$ref": "#/definitions/description-sections"
        },
        "doc-url": {
          "$ref": "#/definitions/doc-url"
        },
        "icon": {
          "$ref": "#/definitions/icon"
        },
        "source": {
          "$ref": "#/definitions/source"
        },
        "since": {
          "$ref": "#/definitions/since"
        },
        "deprecated": {
          "$ref": "#/definitions/deprecated"
        },
        "deprecated-since": {
          "$ref": "#/definitions/deprecated-since"
        },
        "obsolete": {
          "$ref": "#/definitions/obsolete"
        },
        "obsolete-since": {
          "$ref": "#/definitions/obsolete-since"
        },
        "experimental": {
          "$ref": "#/definitions/experimental"
        },
        "priority": {
          "$ref": "#/definitions/priority"
        },
        "proximity": {
          "$ref": "#/definitions/proximity"
        },
        "virtual": {
          "$ref": "#/definitions/virtual"
        },
        "abstract": {
          "$ref": "#/definitions/abstract"
        },
        "extension": {
          "$ref": "#/definitions/extension"
        },
        "extends": {
          "$ref": "#/definitions/extends"
        },
        "pattern": {
          "$ref": "#/definitions/name-pattern-root"
        },
        "html": {
          "$ref": "#/definitions/html"
        },
        "css": {
          "$ref": "#/definitions/css"
        },
        "js": {
          "$ref": "#/definitions/js"
        },
        "exclusive-contributions": {
          "$ref": "#/definitions/exclusive-contributions"
        }
      }
    },
    "typed-contribution": {
      "type": "object",
      "description": "The base for any contribution, which can possibly have a JS type.",
      "javaAbstract": true,
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        }
      ],
      "properties": {
        "type": {
          "$ref": "#/definitions/type-list"
        }
      }
    },
    "generic-contribution": {
      "type": "object",
      "description": "A generic contribution. All contributions are of this type, except for HTML attributes and elements, as well as predefined CSS contribution kinds.",
      "javaAbstract": true,
      "allOf": [
        {
          "$ref": "#/definitions/typed-contribution"
        }
      ],
      "properties": {
        "default": {
          "$ref": "#/definitions/default"
        },
        "required": {
          "$ref": "#/definitions/required"
        },
        "attribute-value": {
          "$ref": "#/definitions/html-attribute-value"
        }
      }
    },
    "type-list": {
      "description": "Specify type according to selected language for type syntax. The type can be specified by a string expression, an object with list of imports and an expression, or an array of possible types.",
      "oneOf": [
        {
          "$ref": "#/definitions/type"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/type"
          }
        }
      ]
    },
    "type": {
      "oneOf": [
        {
          "$ref": "#/definitions/type-reference"
        },
        {
          "type": "string"
        }
      ]
    },
    "type-reference": {
      "type": "object",
      "properties": {
        "module": {
          "description": "Name of module, which exports the type. May be omitted, in which case it's assumed to be the name of the library.",
          "type": "string"
        },
        "name": {
          "description": "Name of the symbol to import",
          "type": "string"
        }
      },
      "required": ["name"],
      "additionalProperties": false
    },
    "html-value-type": {
      "oneOf": [
        {
          "type": "string",
          "description": "Provide one of special attribute value types:  \"enum\", \"symbol\", \"of-match\", or a simple JavaScript type according to the specified type format."
        },
        {
          "$ref": "#/definitions/type-reference"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/type"
          }
        }
      ]
    },
    "source": {
      "description": "Allows to specify the source of the entity. For Vue.js component this may be for instance a class.",
      "type": "object",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "file": {
              "description": "Path to the file, relative to the web-types JSON.",
              "type": "string"
            },
            "offset": {
              "description": "Offset in the file under which the source symbol, like class name, is located.",
              "type": "integer"
            }
          },
          "required": ["file", "offset"],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "module": {
              "description": "Name of module, which exports the symbol. May be omitted, in which case it's assumed to be the name of the library.",
              "type": "string"
            },
            "symbol": {
              "description": "Name of the exported symbol.",
              "type": "string"
            }
          },
          "required": ["symbol"],
          "additionalProperties": false
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "description": {
      "description": "Short description to be rendered in documentation popup. It will be rendered according to description-markup setting.",
      "type": "string"
    },
    "description-sections": {
      "description": "Custom sections to be shown below description in the documentation popup.",
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "doc-url": {
      "description": "Link to online documentation.",
      "type": "string"
    },
    "virtual": {
      "description": "Mark contribution as virtual. Virtual contributions can be filtered out if needed in references. A virtual contribution meaning may differ by framework or kind contexts, but usually means something synthetic or something, which gets erased in the runtime by the framework. E.g. Vue or Angular attribute bindings are virtual. ",
      "type": "boolean"
    },
    "abstract": {
      "description": "Mark contribution as abstract. Such contributions serve only as super contributions for other contributions.",
      "type": "boolean"
    },
    "extension": {
      "description": "Mark contribution as an extension. Such contributions do not define a new contribution on their own, but can provide additional properties or contributions to existing contributions.",
      "type": "boolean"
    },
    "priority": {
      "type": "string",
      "enum": ["lowest", "low", "normal", "high", "highest"]
    },
    "proximity": {
      "type": "integer"
    },
    "name-pattern-root": {
      "oneOf": [
        {
          "$ref": "#/definitions/name-pattern"
        },
        {
          "type": "string"
        }
      ]
    },
    "exclusive-contributions": {
      "description": "Specify list of contribution kinds qualified with a namespace, for which during reference resolution this will be the final contribution host. E.g. if a special HTML element does not accept standard attributes, add:\n\"exclusive-contributions\": [\"/html/attributes\"].",
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "/[^/\\n\\r]+/[^/\\n\\r]+"
      }
    },
    "name-pattern": {
      "type": "object",
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/definitions/required"
            },
            "unique": {
              "type": "boolean"
            },
            "repeat": {
              "type": "boolean"
            },
            "template": {
              "$ref": "#/definitions/name-pattern-template"
            },
            "or": {
              "$ref": "#/definitions/name-pattern-template"
            },
            "delegate": {
              "$ref": "#/definitions/reference"
            },
            "deprecated": {
              "$ref": "#/definitions/deprecated"
            },
            "priority": {
              "$ref": "#/definitions/priority"
            },
            "proximity": {
              "$ref": "#/definitions/proximity"
            },
            "items": {
              "$ref": "#/definitions/list-reference"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "regex": {
              "type": "string"
            },
            "case-sensitive": {
              "type": "boolean",
              "default": true
            }
          },
          "required": ["regex"],
          "additionalProperties": false
        }
      ]
    },
    "name-pattern-template": {
      "type": "array",
      "minItems": 1,
      "items": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "$ref": "#/definitions/name-pattern-template"
          },
          {
            "$ref": "#/definitions/name-pattern"
          }
        ]
      }
    },
    "list-reference": {
      "description": "A reference to an element in Web-Types model.",
      "oneOf": [
        {
          "$ref": "#/definitions/reference"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/reference"
          }
        }
      ]
    },
    "reference": {
      "description": "A reference to an element in Web-Types model.",
      "oneOf": [
        {
          "$ref": "#/definitions/reference-with-props"
        },
        {
          "type": "string"
        }
      ]
    },
    "reference-with-props": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string"
        },
        "includeVirtual": {
          "type": "boolean",
          "default": true
        },
        "includeAbstract": {
          "type": "boolean"
        },
        "filter": {
          "type": "string"
        },
        "name-conversion": {
          "description": "Override global name conversion rules for matching symbols under the path.",
          "$ref": "#/definitions/reference-name-conversion"
        }
      },
      "required": ["path"]
    },
    "reference-name-conversion": {
      "description": "Override global name conversion rules for matching symbols under the path.",
      "type": "object",
      "properties": {
        "canonical-names": {
          "description": "Override global canonical name conversion rule against which comparisons are made for the referenced symbols. When only rule name is specified, it applies to the symbols of the same kind as the last segment of the referenced path. Otherwise format of the property names is '{namespace}/{symbol kind}'. Supported by JetBrains IDEs since 2022.1.",
          "oneOf": [
            {
              "$ref": "#/definitions/name-converter"
            },
            {
              "$ref": "#/definitions/name-conversion-rules-single"
            }
          ]
        },
        "match-names": {
          "description": "Override global rules, by which referenced symbols should be matched against their canonical names. When only rule names are specified, they applies to the symbols of the same kind as the last segment of the referenced path. Otherwise format of the property names is '{namespace}/{symbol kind}'. Supported by JetBrains IDEs since 2022.1.",
          "oneOf": [
            {
              "$ref": "#/definitions/name-converters"
            },
            {
              "$ref": "#/definitions/name-conversion-rules-multiple"
            }
          ]
        },
        "name-variants": {
          "description": "Override global rules, by which referenced symbol names should be proposed in auto completion. When only rule names are specified, they applies to the symbols of the same kind as the last segment of the referenced path. Otherwise format of the property names is '{namespace}/{symbol kind}'. Supported by JetBrains IDEs since 2022.1.",
          "oneOf": [
            {
              "$ref": "#/definitions/name-converters"
            },
            {
              "$ref": "#/definitions/name-conversion-rules-multiple"
            }
          ]
        }
      }
    },
    "extends": {
      "$ref": "#/definitions/reference"
    },
    "default": {
      "type": "string"
    },
    "required": {
      "type": "boolean"
    },
    "since": {
      "description": "Version since this symbol is available.",
      "type": "string"
    },
    "deprecated": {
      "description": "Specifies whether the symbol is deprecated. Deprecated symbol usage is discouraged, but still supported. Value can be a boolean or a string message with explanation and migration information.",
      "type": ["boolean", "string"],
      "default": false
    },
    "deprecated-since": {
      "description": "Version in which this symbol was first deprecated.",
      "type": "string"
    },
    "obsolete": {
      "description": "Specifies whether the symbol is obsolete. Obsolete symbols are no longer supported. Value can be a boolean or a string message with explanation and migration information.",
      "type": ["boolean", "string"],
      "default": false
    },
    "obsolete-since": {
      "description": "Version in which this symbol was first made obsolete.",
      "type": "string"
    },
    "experimental": {
      "description": "Specifies whether the symbol is experimental. Value can be a boolean or a string message with explanation. Experimental symbols should be used with caution as the API might change.",
      "type": ["boolean", "string"],
      "default": false
    },
    "pattern": {
      "description": "A RegEx pattern to match whole content. Syntax should work with at least ECMA, Java and Python implementations.",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "properties": {
            "regex": {
              "type": "string"
            },
            "case-sensitive": {
              "type": "boolean",
              "default": true
            }
          }
        }
      ]
    },
    "html-contributions-host": {
      "type": "object",
      "javaInterfaces": ["GenericContributionsHost"],
      "javaInterface": true,
      "properties": {
        "elements": {
          "description": "HTML elements.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/html-element"
          }
        },
        "attributes": {
          "description": "HTML attributes.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/html-attribute"
          }
        },
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-html-contribution"
          },
          "description": "DOM events are deprecated in HTML namespace. Contribute events to JS namespace: /js/events",
          "deprecationMessage": "Contribute events to JS namespace: /js/events"
        }
      },
      "patternProperties": {
        "^(?!pattern$).*$": {
          "$ref": "#/definitions/generic-html-contributions"
        }
      }
    },
    "generic-html-contributions": {
      "javaLenientDeserialize": true,
      "oneOf": [
        {
          "$ref": "#/definitions/generic-html-contribution-or-property"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-html-contribution-or-property"
          }
        }
      ]
    },
    "generic-html-contribution-or-property": {
      "javaInterfaces": ["GenericContributionOrProperty"],
      "oneOf": [
        {
          "$ref": "#/definitions/generic-html-contribution"
        },
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        }
      ]
    },
    "generic-html-contribution": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/generic-contribution"
        },
        {
          "$ref": "#/definitions/html-contributions-host"
        }
      ]
    },
    "html": {
      "type": "object",
      "description": "Contains contributions to HTML namespace. It's property names represent symbol kinds, its property values contain list of contributions of particular kind. There are 2 predefined kinds, which integrate directly with IDE - HTML elements and HTML attributes. There are also 2 deprecated kinds: tags (which is equivalent to 'elements') and 'events' (which was moved to JS namespace)",
      "allOf": [
        {
          "$ref": "#/definitions/html-contributions-host"
        }
      ],
      "properties": {
        "types-syntax": {
          "$ref": "#/definitions/deprecated-types-syntax"
        },
        "description-markup": {
          "$ref": "#/definitions/deprecated-description-markup"
        },
        "tags": {
          "type": "array",
          "description": "Deprecated, use `elements` property.",
          "deprecationMessage": "Use `elements` property.",
          "items": {
            "$ref": "#/definitions/html-element"
          }
        }
      }
    },
    "html-element": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/html-contributions-host"
        }
      ]
    },
    "html-attribute": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/html-contributions-host"
        }
      ],
      "properties": {
        "value": {
          "$ref": "#/definitions/html-attribute-value"
        },
        "default": {
          "type": "string"
        },
        "required": {
          "$ref": "#/definitions/required"
        },
        "vue-argument": {
          "$ref": "#/definitions/deprecated-html-attribute-vue-argument"
        },
        "vue-modifiers": {
          "description": "Deprecated vue-specific property - contribute Vue directives to /contributions/html/vue-directives",
          "deprecationMessage": "Contribute Vue directives to /contributions/html/vue-directives",
          "type": "array",
          "items": {
            "$ref": "#/definitions/deprecated-html-attribute-vue-modifier"
          }
        }
      }
    },
    "html-attribute-value": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "enum": ["no-value", "plain", "expression"]
        },
        "type": {
          "$ref": "#/definitions/html-value-type"
        },
        "required": {
          "type": "boolean"
        },
        "default": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "css-contributions-host": {
      "type": "object",
      "javaInterfaces": ["GenericContributionsHost"],
      "javaInterface": true,
      "properties": {
        "properties": {
          "type": "array",
          "description": "CSS properties",
          "items": {
            "$ref": "#/definitions/css-property"
          }
        },
        "pseudo-elements": {
          "description": "CSS pseudo-elements",
          "type": "array",
          "items": {
            "$ref": "#/definitions/css-pseudo-element"
          }
        },
        "pseudo-classes": {
          "description": "CSS pseudo-classes",
          "type": "array",
          "items": {
            "$ref": "#/definitions/css-pseudo-class"
          }
        },
        "functions": {
          "description": "CSS functions",
          "type": "array",
          "items": {
            "$ref": "#/definitions/css-generic-item"
          }
        },
        "classes": {
          "description": "CSS classes",
          "type": "array",
          "items": {
            "$ref": "#/definitions/css-generic-item"
          }
        },
        "parts": {
          "description": "CSS parts",
          "type": "array",
          "items": {
            "$ref": "#/definitions/css-generic-item"
          }
        }
      },
      "patternProperties": {
        "^(?!pattern$).*$": {
          "$ref": "#/definitions/generic-css-contributions"
        }
      }
    },
    "generic-css-contributions": {
      "javaLenientDeserialize": true,
      "oneOf": [
        {
          "$ref": "#/definitions/generic-css-contribution-or-property"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-css-contribution-or-property"
          }
        }
      ]
    },
    "generic-css-contribution-or-property": {
      "javaInterfaces": ["GenericContributionOrProperty"],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/generic-css-contribution"
        }
      ]
    },
    "generic-css-contribution": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/generic-contribution"
        },
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ]
    },
    "css": {
      "type": "object",
      "description": "Contains contributions to CSS namespace. It's property names represent symbol kinds, its property values contain list of contributions of particular kind. There are6 predefined kinds, which integrate directly with IDE - properties, classes, functions, pseudo-elements, pseudo-classes and parts.",
      "allOf": [
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ]
    },
    "css-property": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ],
      "properties": {
        "values": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "css-generic-item": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ]
    },
    "css-pseudo-element": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ],
      "properties": {
        "arguments": {
          "type": "boolean",
          "description": "Specify whether the pseudo-element requires arguments."
        }
      }
    },
    "css-pseudo-class": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/css-contributions-host"
        }
      ],
      "properties": {
        "arguments": {
          "type": "boolean",
          "description": "Specify whether the pseudo-class requires arguments."
        }
      }
    },
    "js-contributions-host": {
      "type": "object",
      "javaInterfaces": ["GenericContributionsHost"],
      "javaInterface": true,
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-js-contribution"
          },
          "description": "DOM events"
        },
        "properties": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/js-property"
          },
          "description": "JavaScript properties of an object, HTML tag, framework component, etc."
        },
        "symbols": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/js-symbol"
          },
          "description": "Symbols available for JavaScript resolve. TypeScript resolve is not supported."
        }
      },
      "patternProperties": {
        "^(?!pattern$).*$": {
          "$ref": "#/definitions/generic-js-contributions"
        }
      }
    },
    "generic-js-contributions": {
      "javaLenientDeserialize": true,
      "oneOf": [
        {
          "$ref": "#/definitions/generic-js-contribution-or-property"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-js-contribution-or-property"
          }
        }
      ]
    },
    "generic-js-contribution-or-property": {
      "javaInterfaces": ["GenericContributionOrProperty"],
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        },
        {
          "$ref": "#/definitions/generic-js-contribution"
        }
      ]
    },
    "generic-js-contribution": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/generic-contribution"
        },
        {
          "$ref": "#/definitions/js-contributions-host"
        }
      ]
    },
    "js-global": {
      "type": "object",
      "description": "Contains contributions to JS namespace. It's property names represent symbol kinds, its property values contain list of contributions of particular kind. There are 2 predefined kinds, which integrate directly with IDE - properties and events, but only events can be contributed globally.",
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/generic-js-contribution"
          },
          "description": "DOM events"
        },
        "symbols": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/js-symbol"
          },
          "description": "Globally available symbols for JavaScript resolve. TypeScript resolve is not supported. Please note that these symbols will override any normally available global JavaScript symbols."
        }
      },
      "patternProperties": {
        "^(?!pattern$).*$": {
          "$ref": "#/definitions/generic-js-contributions"
        }
      }
    },
    "js": {
      "type": "object",
      "description": "Contains contributions to JS namespace. It's property names represent symbol kinds, its property values contain list of contributions of particular kind. There are 2 predefined kinds, which integrate directly with IDE - properties and events.",
      "allOf": [
        {
          "$ref": "#/definitions/js-contributions-host"
        }
      ]
    },
    "js-property": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/js-contributions-host"
        }
      ],
      "properties": {
        "read-only": {
          "description": "Specifies whether the property is read only.",
          "type": "boolean"
        }
      }
    },
    "js-symbol": {
      "type": "object",
      "allOf": [
        {
          "$ref": "#/definitions/base-contribution"
        },
        {
          "$ref": "#/definitions/js-contributions-host"
        }
      ],
      "properties": {
        "kind": {
          "description": "Kind of the symbol. Default is variable.",
          "type": "string",
          "enum": [
            "Variable",
            "Function",
            "Namespace",
            "Class",
            "Interface",
            "Enum",
            "Alias",
            "Module"
          ]
        }
      }
    },
    "deprecated-types-syntax": {
      "oneOf": [
        {
          "$ref": "#/definitions/js-types-syntax"
        }
      ],
      "description": "Deprecated, use top-level js-types-syntax property.",
      "deprecationMessage": "Use top-level js-types-syntax property."
    },
    "deprecated-description-markup": {
      "description": "Deprecated, use top-level property.",
      "deprecationMessage": "Use top-level property.",
      "oneOf": [
        {
          "$ref": "#/definitions/description-markup"
        }
      ]
    },
    "deprecated-html-attribute-vue-argument": {
      "type": "object",
      "description": "Deprecated vue-specific property - contribute Vue directives to /contributions/html/vue-directives",
      "deprecationMessage": "Contribute Vue directives to /contributions/html/vue-directives",
      "properties": {
        "pattern": {
          "$ref": "#/definitions/name-pattern-root"
        },
        "description": {
          "$ref": "#/definitions/description"
        },
        "doc-url": {
          "$ref": "#/definitions/doc-url"
        },
        "required": {
          "description": "Whether directive requires an argument",
          "type": "boolean",
          "default": false
        }
      },
      "additionalProperties": false
    },
    "deprecated-html-attribute-vue-modifier": {
      "type": "object",
      "properties": {
        "name": {
          "$ref": "#/definitions/name"
        },
        "pattern": {
          "$ref": "#/definitions/name-pattern-root"
        },
        "description": {
          "$ref": "#/definitions/description"
        },
        "doc-url": {
          "$ref": "#/definitions/doc-url"
        }
      },
      "required": ["name"],
      "additionalProperties": false
    }
  }
}
