{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "@stoplight/spectral-core/meta/ruleset.schema",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "documentationUrl": {
            "type": "string",
            "format": "url",
            "errorMessage": "must be a valid URL"
        },
        "description": {
            "type": "string"
        },
        "rules": {
            "type": "object",
            "additionalProperties": {
                "$ref": "rule.schema#"
            }
        },
        "functions": {
            "$ref": "extensions#functions"
        },
        "functionsDir": {
            "$ref": "extensions#functionsDir"
        },
        "formats": {
            "$ref": "shared#formats"
        },
        "extends": {
            "$ref": "extensions#extends"
        },
        "parserOptions": {
            "type": "object",
            "properties": {
                "duplicateKeys": {
                    "$ref": "shared#severity"
                },
                "incompatibleValues": {
                    "$ref": "shared#severity"
                }
            },
            "additionalProperties": false
        },
        "overrides": {
            "type": "array",
            "minItems": 1,
            "items": {
                "if": {
                    "type": "object",
                    "properties": {
                        "files": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                                "type": "string",
                                "minLength": 1,
                                "pattern": "^[^#]+#"
                            },
                            "errorMessage": "must be an non-empty array of glob patterns"
                        }
                    },
                    "required": ["files"]
                },
                "then": {
                    "type": "object",
                    "properties": {
                        "files": true,
                        "rules": {
                            "type": "object",
                            "additionalProperties": {
                                "$ref": "shared#severity"
                            },
                            "errorMessage": {
                                "enum": "must be a valid severity level"
                            }
                        }
                    },
                    "required": ["rules"],
                    "additionalProperties": false,
                    "errorMessage": {
                        "required": "must contain rules when JSON Pointers are defined",
                        "additionalProperties": "must not override any other property than rules when JSON Pointers are defined"
                    }
                },
                "else": {
                    "allOf": [
                        {
                            "type": "object",
                            "properties": {
                                "files": {
                                    "type": "array",
                                    "minItems": 1,
                                    "items": {
                                        "type": "string",
                                        "pattern": "[^#]",
                                        "minLength": 1
                                    },
                                    "errorMessage": "must be an non-empty array of glob patterns"
                                }
                            },
                            "required": ["files"],
                            "errorMessage": {
                                "type": "must be an override, i.e. { \"files\": [\"v2/**/*.json\"], \"rules\": {} }"
                            }
                        },
                        {
                            "type": "object",
                            "properties": {
                                "formats": {
                                    "$ref": "shared#formats"
                                },
                                "extends": {
                                    "$ref": "#/properties/extends"
                                },
                                "rules": {
                                    "$ref": "#/properties/rules"
                                },
                                "parserOptions": {
                                    "$ref": "#/properties/parserOptions"
                                },
                                "aliases": {
                                    "$ref": "#/properties/aliases"
                                }
                            },
                            "anyOf": [
                                {
                                    "required": ["extends"]
                                },
                                {
                                    "required": ["rules"]
                                }
                            ]
                        }
                    ]
                }
            },
            "errorMessage": {
                "minItems": "must not be empty"
            }
        },
        "aliases": {
            "type": "object",
            "propertyNames": {
                "pattern": "^[A-Za-z][A-Za-z0-9_-]*$",
                "errorMessage": {
                    "pattern": "to avoid confusion the name must match /^[A-Za-z][A-Za-z0-9_-]*$/ regular expression",
                    "minLength": "the name of an alias must not be empty"
                }
            },
            "additionalProperties": {
                "if": {
                    "type": "object"
                },
                "then": {
                    "type": "object",
                    "properties": {
                        "description": {
                            "type": "string"
                        },
                        "targets": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                                "type": "object",
                                "properties": {
                                    "formats": {
                                        "$ref": "shared#formats"
                                    },
                                    "given": {
                                        "$ref": "shared#arrayish-given"
                                    }
                                },
                                "required": ["formats", "given"],
                                "errorMessage": "a valid target must contain given and non-empty formats"
                            },
                            "errorMessage": {
                                "minItems": "targets must have at least a single alias definition"
                            }
                        }
                    },
                    "required": ["targets"],
                    "errorMessage": {
                        "required": "targets must be present and have at least a single alias definition"
                    }
                },
                "else": {
                    "$ref": "shared#arrayish-given"
                }
            }
        }
    },
    "patternProperties": {
        "^x-": true
    },
    "anyOf": [
        {
            "required": ["extends"]
        },
        {
            "required": ["rules"]
        },
        {
            "required": ["overrides"]
        }
    ]
}
