{
    "type": "object",
    "properties": {
        "name": { "type": "string", "pattern": "^[\\w]+\\.[\\w]+\\.[\\w]+\\.[\\w]+$" },
        "label": { "type": "string" },
        "author": { "type": "string" },
        "private": { "type": "boolean" },
        "trigger": { "type": "boolean" },
        "inPorts": { "$ref": "#/definitions/inPorts" },
        "outPorts": { "$ref": "#/definitions/ports" },
        "firePatterns": { "$ref": "#/definitions/firePatterns" },
        "auth": { "$ref": "#/definitions/auth" },
        "authConfig": { "$ref": "#/definitions/authConfig" },
        "config": { "type":  "string" },
        "tick": { "type": "boolean" },
        "webhook": { "type": "boolean" },
        "continuityScope": { "type": "boolean" },
        "icon": { "type": "string" },
        "marker": { "type": "string" },
        "description": { "type": "string" },
        "shape": { "type": "string" },
        "state": { "$ref": "#/definitions/state" },
        "quota": {
            "type": "object",
            "properties": {
                "manager": { "type": "string" },
                "maxWait": { "type": "integer" },
                "concurrency": { "type": "integer" },
                "resources": {
                    "oneOf": [
                        { "type": "array", "items": { "type": "string" } },
                        { "type": "string" }
                    ]
                },
                "scope": { "type": "object" }
            }
        },
        "properties": {
            "type": "object",
            "properties": {
                "schema": { "$ref": "#/definitions/jsonSchema" },
                "inspector": { "$ref": "#/definitions/inspector" }
            }
        },
        "localization": { "type": "object" },
        "version": { "type": "string" },
        "dependencies": { "type": "object" }
    },
    "additionalProperties": false,
    "required": [ "name" ],
    "definitions": {
        "jsonSchema": { "type": "object" },
        "auth": {
            "type": "object",
            "properties": {
                "service": {
                    "type": "string"
                },
                "scope": {
                    "type": "array"
                }
            },
            "required": [
                "service"
            ]
        },
        "authConfig": {
            "type": "object",
            "properties": {
                "service": {
                    "type": "string"
                }
            }
        },
        "firePattern": {
            "enum": [ "0", "1", 0, 1, "*", "M", "A" ]
        },
        "firePatterns": {
            "type": "array",
            "minItems": 1,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/firePattern" },
                    {
                        "type": "array",
                        "items": { "$ref": "#/definitions/firePattern" }
                    }
                ]
            }
        },
        "source": {
            "type": "object",
            "properties": {
                "url": {
                    "type": "string"
                },
                "data": {
                    "type": "object",
                    "properties": {
                        "messages": { },
                        "properties": { "type": "object" }
                    }
                },
                "transform": { "type": "string" }
            },
            "required": [ "url" ]
        },
        "port": {
            "type": "object",
            "properties": {
                "name": { "type": "string" },
                "maxConnections": { "type": "integer" },
                "schema": { "$ref": "#/definitions/jsonSchema" },
                "source": { "$ref": "#/definitions/source" },
                "options": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "content": { "type": "string" },
                            "label": { "type": "string" },
                            "value": { "type": "string" }
                        },
                        "required": [ "value" ]
                    }
                }
            },
            "required": [ "name" ]
        },
        "state": {
            "type": "object",
            "properties": {
                "persistent": {
                    "type": "boolean"
                }
            }
        },
        "options": {
            "type": "array",
            "minItems": 0,
            "items": {
                "oneOf": [
                    { "type": "object" },
                    { "type": "string" }
                ]
            },
            "uniqueItems": true
        },
        "inspectorInput": {
            "oneOf": [
                {
                    "type": "object",
                    "properties": {
                        "type": { "type": "string" },
                        "tooltip": { "type": "string" },
                        "index": { "type": "number" },
                        "placeholder": { "type": "string" },
                        "options": { "$ref": "#/definitions/options" },
                        "source": { "$ref": "#/definitions/source" }
                    },
                    "additionalProperties": true,
                    "required": [ "type", "index" ]
                },
                {
                    "type": "object",
                    "properties": {
                        "source": { "$ref": "#/definitions/source" }
                    },
                    "additionalProperties": false,
                    "required": [ "source" ]
                }
            ]
        },
        "inspector": {
            "oneOf": [
                {
                    "type": "object",
                    "properties": {
                        "inputs": {
                            "patternProperties": {
                                "^.*$": { "$ref": "#/definitions/inspectorInput" }
                            }
                        }
                    },
                    "required": [ "inputs" ]
                },
                {
                    "type": "object",
                    "properties": {
                        "source": { "$ref": "#/definitions/source" }
                    },
                    "required": [ "source" ]
                }
            ]
        },
        "inPort": {
            "allOf": [
                { "$ref": "#/definitions/port" },
                {
                    "type": "object",
                    "properties": {
                        "inspector": { "$ref": "#/definitions/inspector" }
                    }
                }
            ]
        },
        "inPorts": {
            "type": "array",
            "minItems": 0,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/inPort" },
                    { "type": "string" }
                ]
            },
            "uniqueItems": true
        },
        "ports": {
            "type": "array",
            "minItems": 0,
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/port" },
                    { "type": "string" }
                ]
            },
            "uniqueItems": true
        }
    }
}
