{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://api-evangelist.github.io/vuejs/json-schema/vuejs-component-schema.json",
  "title": "Vue.js Component Options",
  "description": "Schema for a Vue.js Single File Component (SFC) options object as used with the Options API or defineComponent()",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Component display name used in DevTools and error messages"
    },
    "components": {
      "type": "object",
      "description": "Locally registered child components available in this component's template",
      "additionalProperties": true
    },
    "directives": {
      "type": "object",
      "description": "Locally registered custom directives",
      "additionalProperties": true
    },
    "props": {
      "oneOf": [
        {
          "type": "array",
          "items": { "type": "string" },
          "description": "Array form: list of prop names"
        },
        {
          "type": "object",
          "description": "Object form: prop names to type definitions or validators",
          "additionalProperties": {
            "oneOf": [
              { "type": "string" },
              {
                "type": "object",
                "properties": {
                  "type": {},
                  "required": { "type": "boolean" },
                  "default": {},
                  "validator": { "type": "string" }
                }
              }
            ]
          }
        }
      ],
      "description": "Component props declaration"
    },
    "emits": {
      "oneOf": [
        {
          "type": "array",
          "items": { "type": "string" },
          "description": "Array form: list of emitted event names"
        },
        {
          "type": "object",
          "description": "Object form: event names to validator functions"
        }
      ],
      "description": "Declares custom events emitted by the component"
    },
    "data": {
      "description": "Function returning the initial reactive data object for the component instance"
    },
    "computed": {
      "type": "object",
      "description": "Computed property declarations; each value is a getter function or get/set object",
      "additionalProperties": true
    },
    "watch": {
      "type": "object",
      "description": "Data watchers; each key is a watched property or expression",
      "additionalProperties": true
    },
    "methods": {
      "type": "object",
      "description": "Component methods callable from template or other options",
      "additionalProperties": true
    },
    "setup": {
      "description": "Composition API setup function called before component creation"
    },
    "template": {
      "type": "string",
      "description": "Inline component template string"
    },
    "render": {
      "description": "Programmatic render function"
    },
    "provide": {
      "description": "Values to inject into descendant components via provide/inject"
    },
    "inject": {
      "oneOf": [
        {
          "type": "array",
          "items": { "type": "string" }
        },
        {
          "type": "object"
        }
      ],
      "description": "Keys to inject from ancestor components"
    },
    "expose": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Public properties exposed when using template refs on this component"
    },
    "beforeCreate": { "description": "Lifecycle hook: called before component instance is fully initialized" },
    "created": { "description": "Lifecycle hook: called after the component instance is created" },
    "beforeMount": { "description": "Lifecycle hook: called before the component is mounted" },
    "mounted": { "description": "Lifecycle hook: called after the component has been mounted to the DOM" },
    "beforeUpdate": { "description": "Lifecycle hook: called before the component re-renders due to reactive state change" },
    "updated": { "description": "Lifecycle hook: called after the component has re-rendered" },
    "beforeUnmount": { "description": "Lifecycle hook: called before the component is unmounted" },
    "unmounted": { "description": "Lifecycle hook: called after the component has been unmounted" }
  }
}
