{
    "$schema": "http://json-schema.org/draft-04/schema",
    "allOf": [{ "$ref": "https://json.schemastore.org/eslintrc.json" }],
    "properties": {
        "rules": { "$ref": "#/definitions/user-defined-rules" },
        "plugins": {
            "type": "array",
            "items": { "anyOf": [{ "type": "string" }] },
            "uniqueItems": true
        },
        "extends": {
            "oneOf": [
                { "$ref": "#/definitions/preset-configs" },
                {
                    "type": "array",
                    "items": { "$ref": "#/definitions/preset-configs" },
                    "uniqueItems": true
                }
            ]
        },
        "overrides": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "rules": { "$ref": "#/definitions/user-defined-rules" }
                }
            }
        }
    },
    "definitions": {
        "rule": { "type": "string", "enum": ["off", "warn", "error"] },
        "preset-configs": {
            "anyOf": [
                { "type": "string" },
                {
                    "type": "string",
                    "enum": [
                        "plugin:@masknet/all",
                        "plugin:@masknet/base",
                        "plugin:@masknet/fixable",
                        "plugin:@masknet/recommended",
                        "plugin:@masknet/recommended-requires-type-checking"
                    ]
                }
            ]
        },
        "user-defined-rules": {
            "type": "object",
            "properties": {
                "@masknet/array/no-unneeded-flat-map": {
                    "description": "Disallow `Array#flatMap((x) => x)` when simpler alternatives exist\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/array/no-unneeded-flat-map",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/array/prefer-from": {
                    "description": "Prefer `Array.from(...)` over `new Array(...)`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/array/prefer-from",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/browser/no-persistent-storage": {
                    "description": "Disallow use browser persistent storage\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/browser/no-persistent-storage",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/browser/no-set-html": {
                    "description": "Disallow use `Element#{inner,outer}HTML`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/browser/no-set-html",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/browser/prefer-location-assign": {
                    "description": "Prefer `location.assign(...)` over `location.*`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/browser/prefer-location-assign",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/jsx/no-class-component": {
                    "description": "Disallow React Class Component\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/no-class-component",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/jsx/no-logical": {
                    "description": "Limit the complexity of JSX logic expression\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/no-logical",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "oneOf": [
                                        { "type": "integer", "minimum": 0 },
                                        {
                                            "type": "object",
                                            "properties": {
                                                "attribute": { "type": "integer", "minimum": 0 },
                                                "element": { "type": "integer", "minimum": 0 }
                                            },
                                            "additionalProperties": false
                                        }
                                    ]
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/jsx/no-set-html": {
                    "description": "Disallow use `dangerouslySetInnerHTML` jsx attribute\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/no-set-html",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/jsx/no-template-literal": {
                    "description": "Disallow use template-literal in JSX\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/no-template-literal",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/jsx/no-unneeded-nested": {
                    "description": "Reduce unneeded JSXFragment nested\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/no-unneeded-nested",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/jsx/prefer-test-id": {
                    "description": "Enforces `data-test-id` attribute is present on interactive DOM elements to help with UI testing\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/jsx/prefer-test-id",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "properties": {
                                        "id": { "type": "string" },
                                        "elements": {
                                            "type": "array",
                                            "items": { "type": "string" },
                                            "uniqueItems": true
                                        },
                                        "attributes": {
                                            "type": "array",
                                            "items": { "type": "string" },
                                            "uniqueItems": true
                                        },
                                        "ignore-attributes": {
                                            "type": "array",
                                            "items": { "type": "string" },
                                            "uniqueItems": true
                                        }
                                    },
                                    "additionalProperties": false
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/string/no-data-url": {
                    "description": "Disallow use Data URL\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/string/no-data-url",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/string/no-interpolation": {
                    "description": "Disallow simple string interpolation\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/string/no-interpolation",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/string/no-locale-case": {
                    "description": "Disallow use `String#toLocale{Upper,Lower}Case()`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/string/no-locale-case",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/string/no-simple-template-literal": {
                    "description": "Disallow simple template-literal\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/string/no-simple-template-literal",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/string/no-unneeded-to-string": {
                    "description": "Disallow `String#toString()` when simpler alternatives exist\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/string/no-unneeded-to-string",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/no-const-enum": {
                    "description": "Disallow use constants enumerate\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-const-enum",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/no-empty-literal": {
                    "description": "Disallow empty {array,object} literal\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-empty-literal",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "properties": {
                                        "array": { "type": "string" },
                                        "object": { "type": "string" }
                                    },
                                    "additionalProperties": false
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/type/no-force-cast-via-top-type": {
                    "description": "Disallowing cast a type `T` to unrelated or incompatible type `Q` via `T as any as Q`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-force-cast-via-top-type",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/no-instanceof-wrapper": {
                    "description": "Disallow `instanceof` for wrapper objects\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-instanceof-wrapper",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/no-number-constructor": {
                    "description": "Disallow use `Number` constructor\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-number-constructor",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/no-wrapper-type-reference": {
                    "description": "Disallow wrapper type for type reference\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/no-wrapper-type-reference",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/type/prefer-return-type-annotation": {
                    "description": "Enforce Move return type annotation to function return type\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/type/prefer-return-type-annotation",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/unicode/no-bidi": {
                    "description": "Detect and stop Trojan Source attacks\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/unicode/no-bidi",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/unicode/no-invisible": {
                    "description": "Disallow invisible characters\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/unicode/no-invisible",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/unicode/specific-set": {
                    "description": "Limit the range of literal characters\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/unicode/specific-set",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "properties": {
                                        "pattern": { "type": "string" },
                                        "flags": { "type": "string" },
                                        "only": { "type": "string", "enum": ["code", "comment"] }
                                    },
                                    "additionalProperties": false
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/no-builtin-base64": {
                    "description": "Disallow use built-in base64 function\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-builtin-base64",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-default-error": {
                    "description": "Restrict the usage of default (unextended) error\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-default-error",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-for-in": {
                    "description": "Disallow use for-in\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-for-in",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-redundant-variable": {
                    "description": "Disallow redundant variable\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-redundant-variable",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-single-return": {
                    "description": "Disallow single-return\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-single-return",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-then": {
                    "description": "Disallow `Promise#then(...)`\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-then",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-timer": {
                    "description": "Disallow use timer function\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-timer",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/no-top-level": {
                    "description": "Disallow side-effect at module top-level\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-top-level",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "properties": {
                                        "variable": { "type": "boolean" },
                                        "side-effect": { "type": "boolean" }
                                    },
                                    "additionalProperties": false
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/no-unsafe-date": {
                    "description": "Disallow use unsafe Date methods\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/no-unsafe-date",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/prefer-default-export": {
                    "description": "Enforce default export location at top or bottom\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/prefer-default-export",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                { "type": "string", "enum": ["at-top", "at-bottom"] }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/prefer-defer-import": {
                    "description": "Prefer defer import a module. See <https://github.com/tc39/proposal-defer-import-eval> and <https://github.com/webpack/webpack/pull/16567/>.\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/prefer-defer-import",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "oneOf": [
                                        {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "properties": {
                                                "deferPackages": {
                                                    "type": "array",
                                                    "items": { "type": "string" },
                                                    "minItems": 0
                                                },
                                                "syntax": {
                                                    "type": "string",
                                                    "enum": ["webpack-magic-comment"]
                                                }
                                            }
                                        },
                                        {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "properties": {
                                                "eagerPackages": {
                                                    "type": "array",
                                                    "items": { "type": "string" },
                                                    "minItems": 0
                                                },
                                                "syntax": {
                                                    "type": "string",
                                                    "enum": ["webpack-magic-comment"]
                                                }
                                            }
                                        }
                                    ]
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/prefer-early-return": {
                    "description": "Prefer early returns over full-body conditional wrapping in function declarations\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/prefer-early-return",
                    "oneOf": [
                        { "$ref": "#/definitions/rule" },
                        {
                            "type": "array",
                            "items": [
                                { "$ref": "#/definitions/rule" },
                                {
                                    "type": "object",
                                    "properties": {
                                        "maximumStatements": { "type": "integer", "minimum": 0 }
                                    },
                                    "additionalProperties": false
                                }
                            ],
                            "minItems": 2
                        }
                    ]
                },
                "@masknet/prefer-fetch": {
                    "description": "Enforce fetch\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/prefer-fetch",
                    "$ref": "#/definitions/rule"
                },
                "@masknet/prefer-timer-id": {
                    "description": "Enforce best practice with timer function\nhttps://dimensiondev.github.io/eslint-plugin/src/rules/prefer-timer-id",
                    "$ref": "#/definitions/rule"
                }
            }
        }
    }
}
