{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "async": {
            "type": "boolean",
            "description": "When true, plugin will not block compilation to finish issues checking"
        },
        "typescript": {
            "$ref": "#/definitions/TypeScriptReporterOptions"
        },
        "eslint": {
            "$ref": "#/definitions/EsLintReporterOptions"
        },
        "formatter": {
            "$ref": "#/definitions/FormatterOptions"
        },
        "issue": {
            "$ref": "#/definitions/IssueOptions"
        },
        "logger": {
            "$ref": "#/definitions/LoggerOptions"
        }
    },
    "additionalProperties": false,
    "definitions": {
        "Formatter": {
            "instanceof": "Function"
        },
        "ComplexFormatterPreferences": {
            "type": "object",
            "properties": {
                "type": {
                    "$ref": "#/definitions/FormatterType"
                },
                "options": {
                    "type": "object",
                    "additionalProperties": true
                }
            },
            "required": ["type"]
        },
        "FormatterType": {
            "type": "string",
            "enum": ["basic", "codeframe"]
        },
        "IssueMatch": {
            "type": "object",
            "properties": {
                "origin": {
                    "type": "string",
                    "enum": ["typescript", "eslint"]
                },
                "severity": {
                    "type": "string",
                    "enum": ["error", "warning"]
                },
                "code": {
                    "type": "string"
                },
                "file": {
                    "type": "string"
                }
            }
        },
        "IssuePredicate": {
            "instanceof": "Function"
        },
        "IssuePredicateOption": {
            "oneOf": [
                {
                    "$ref": "#/definitions/IssuePredicate"
                },
                {
                    "$ref": "#/definitions/IssueMatch"
                },
                {
                    "type": "array",
                    "items": {
                        "oneOf": [
                            {
                                "$ref": "#/definitions/IssuePredicate"
                            },
                            {
                                "$ref": "#/definitions/IssueMatch"
                            }
                        ]
                    }
                }
            ]
        },
        "LoggerType": {
            "type": "string",
            "enum": ["console", "webpack-infrastructure", "silent"]
        },
        "Logger": {
            "type": "object",
            "properties": {
                "error": {
                    "instanceof": "Function"
                },
                "info": {
                    "instanceof": "Function"
                },
                "log": {
                    "instanceof": "Function"
                }
            }
        },
        "TypeScriptReporterOptions": {
            "oneOf": [
                {
                    "type": "boolean",
                    "description": "Enable TypeScript reporter."
                },
                {
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "type": "boolean",
                            "description": "Enable TypeScript reporter."
                        },
                        "memoryLimit": {
                            "type": "number",
                            "description": "Memory limit for TypeScript reporter process."
                        },
                        "configFile": {
                            "type": "string",
                            "description": "Path to tsconfig.json. By default plugin uses context or process.cwd() to localize tsconfig.json file."
                        },
                        "context": {
                            "type": "string",
                            "description": "The base path for finding files specified in the tsconfig.json. Same as context option from the ts-loader."
                        },
                        "build": {
                            "type": "boolean",
                            "description": "The equivalent of the `--build` flag from the `tsc`."
                        },
                        "mode": {
                            "type": "string",
                            "enum": ["readonly", "write-tsbuildinfo", "write-dts", "write-references"],
                            "description": "`readonly` keeps all emitted files in memory, `write-tsbuildinfo` which writes only .tsbuildinfo files, `write-dts` writes .tsbuildinfo and type definition files, and `write-references` which writes both .tsbuildinfo and referenced projects output"
                        },
                        "compilerOptions": {
                            "type": "object",
                            "description": "Custom compilerOptions to be passed to the TypeScript compiler.",
                            "additionalProperties": true
                        },
                        "diagnosticOptions": {
                            "type": "object",
                            "description": "Types of diagnostics to be reported.",
                            "properties": {
                                "syntactic": {
                                    "type": "boolean"
                                },
                                "semantic": {
                                    "type": "boolean"
                                },
                                "declaration": {
                                    "type": "boolean"
                                },
                                "global": {
                                    "type": "boolean"
                                }
                            }
                        },
                        "extensions": {
                            "type": "object",
                            "properties": {
                                "vue": {
                                    "$ref": "#/definitions/TypeScriptVueExtensionOptions"
                                }
                            }
                        },
                        "profile": {
                            "type": "boolean",
                            "description": "Measures and prints timings related to the TypeScript performance."
                        },
                        "typescriptPath": {
                            "type": "string",
                            "description": "If supplied this is a custom path where TypeScript can be found."
                        }
                    }
                }
            ]
        },
        "TypeScriptVueExtensionOptions": {
            "oneOf": [
                {
                    "type": "boolean",
                    "description": "Enable TypeScript Vue extension."
                },
                {
                    "type": "object",
                    "properties": {
                        "enabled": {
                            "type": "boolean",
                            "description": "Enable TypeScript Vue extension."
                        },
                        "compiler": {
                            "type": "string",
                            "description": "Custom vue-template-compiler package"
                        }
                    }
                }
            ]
        },
        "EsLintReporterOptions": {
            "type": "object",
            "properties": {
                "files": {
                    "oneOf": [
                        {
                            "type": "array",
                            "items": {
                                "type": "string"
                            },
                            "minItems": 1,
                            "uniqueItems": true
                        },
                        {
                            "type": "string"
                        }
                    ],
                    "description": "List of glob patterns or files to be linted."
                },
                "enabled": {
                    "type": "boolean",
                    "description": "Enable EsLint reporter."
                },
                "memoryLimit": {
                    "type": "number",
                    "description": "Memory limit for EsLint reporter process."
                },
                "options": {
                    "type": "object",
                    "description": "Custom options to be passed to the EsLint engine.",
                    "additionalProperties": true
                }
            },
            "required": ["files"]
        },
        "FormatterOptions": {
            "oneOf": [
                {
                    "$ref": "#/definitions/FormatterType"
                },
                {
                    "$ref": "#/definitions/ComplexFormatterPreferences"
                },
                {
                    "$ref": "#/definitions/Formatter"
                }
            ]
        },
        "IssueOptions": {
            "type": "object",
            "properties": {
                "include": {
                    "$ref": "#/definitions/IssuePredicateOption"
                },
                "exclude": {
                    "$ref": "#/definitions/IssuePredicateOption"
                }
            }
        },
        "LoggerOptions": {
            "type": "object",
            "properties": {
                "infrastructure": {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/LoggerType"
                        },
                        {
                            "$ref": "#/definitions/Logger"
                        }
                    ]
                },
                "issues": {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/LoggerType"
                        },
                        {
                            "$ref": "#/definitions/Logger"
                        }
                    ]
                },
                "devServer": {
                    "type": "boolean",
                    "description": "Enable reporting to Webpack Dev Server."
                }
            }
        }
    }
}
