{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/xstate-machine/latest.json",
  "x-lintel": {
    "source": "https://raw.githubusercontent.com/statelyai/xstate/main/packages/core/src/machine.schema.json",
    "sourceSha256": "04be481e85e8852bf0f943caedcd2491516c8d06c20c22faa43d1440643b13d0"
  },
  "type": "object",
  "properties": {
    "id": {
      "title": "ID",
      "type": "string"
    },
    "initial": {
      "$ref": "#/$defs/initialTransitionObject"
    },
    "key": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "compound",
        "parallel"
      ]
    },
    "context": {
      "type": "object"
    },
    "states": {
      "$ref": "#/$defs/statesObject"
    },
    "on": {
      "$ref": "#/$defs/transitionsObject"
    },
    "transitions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/transitionObject"
      }
    },
    "entry": {
      "type": "array"
    },
    "exit": {
      "type": "array"
    },
    "order": {
      "$ref": "#/$defs/order"
    },
    "invoke": {
      "$ref": "#/$defs/invokeArray"
    },
    "version": {
      "type": "string"
    }
  },
  "$defs": {
    "actionObject": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "description": "The action type"
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": true
    },
    "baseStateNode": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "key": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": [
            "atomic",
            "compound",
            "parallel",
            "final",
            "history"
          ]
        },
        "order": {
          "$ref": "#/$defs/order"
        },
        "description": {
          "type": "string",
          "description": "The description of the state node, in Markdown"
        }
      },
      "required": [
        "id",
        "key",
        "type"
      ]
    },
    "compoundStateNode": {
      "allOf": [
        {
          "$ref": "#/$defs/baseStateNode"
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "pattern": "compound"
            },
            "entry": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "exit": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "initial": {
              "$ref": "#/$defs/initialTransitionObject"
            },
            "invoke": {
              "$ref": "#/$defs/invokeArray"
            },
            "on": {
              "$ref": "#/$defs/transitionsObject"
            },
            "states": {
              "$ref": "#/$defs/statesObject"
            }
          },
          "required": [
            "states"
          ]
        }
      ]
    },
    "parallelStateNode": {
      "allOf": [
        {
          "$ref": "#/$defs/baseStateNode"
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "pattern": "parallel"
            },
            "entry": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "exit": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "invoke": {
              "$ref": "#/$defs/invokeArray"
            },
            "on": {
              "$ref": "#/$defs/transitionsObject"
            },
            "states": {
              "$ref": "#/$defs/statesObject"
            }
          },
          "required": [
            "states"
          ]
        }
      ]
    },
    "atomicStateNode": {
      "allOf": [
        {
          "$ref": "#/$defs/baseStateNode"
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "pattern": "atomic"
            },
            "entry": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "exit": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/actionObject"
              }
            },
            "invoke": {
              "$ref": "#/$defs/invokeArray"
            },
            "on": {
              "$ref": "#/$defs/transitionsObject"
            }
          },
          "required": [
            "on"
          ]
        }
      ]
    },
    "historyStateNode": {
      "allOf": [
        {
          "$ref": "#/$defs/baseStateNode"
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "pattern": "history"
            },
            "history": {
              "type": "string",
              "enum": [
                "shallow",
                "deep"
              ]
            }
          },
          "required": [
            "history"
          ]
        }
      ]
    },
    "finalStateNode": {
      "allOf": [
        {
          "$ref": "#/$defs/baseStateNode"
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "pattern": "final"
            },
            "data": {
              "type": "object"
            }
          }
        }
      ]
    },
    "statesObject": {
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "oneOf": [
            {
              "$ref": "#/$defs/atomicStateNode"
            },
            {
              "$ref": "#/$defs/compoundStateNode"
            },
            {
              "$ref": "#/$defs/parallelStateNode"
            },
            {
              "$ref": "#/$defs/historyStateNode"
            },
            {
              "$ref": "#/$defs/finalStateNode"
            }
          ]
        }
      }
    },
    "initialTransitionObject": {
      "type": "object",
      "properties": {
        "actions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/actionObject"
          }
        },
        "source": {
          "type": "string"
        },
        "target": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1
        }
      },
      "required": [
        "actions",
        "source",
        "target"
      ]
    },
    "transitionsObject": {
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/transitionObject"
          }
        }
      }
    },
    "transitionObject": {
      "type": "object",
      "properties": {
        "actions": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/actionObject"
          }
        },
        "cond": {
          "type": "object"
        },
        "eventType": {
          "type": "string"
        },
        "source": {
          "type": "string"
        },
        "target": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "actions",
        "eventType",
        "source",
        "target"
      ]
    },
    "invokeObject": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "id": {
          "type": "string"
        },
        "src": {
          "type": "string"
        }
      },
      "required": [
        "type",
        "id",
        "src"
      ],
      "additionalProperties": false
    },
    "invokeArray": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/invokeObject"
      }
    },
    "functionObject": {
      "type": "object",
      "properties": {
        "$function": {
          "type": "string"
        }
      }
    },
    "order": {
      "type": "integer"
    }
  },
  "required": [
    "id",
    "key",
    "type",
    "states"
  ]
}
