{
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/eslint-recommended",
        "plugin:@typescript-eslint/recommended",
        "plugin:@typescript-eslint/recommended-requiring-type-checking"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "project": "./tsconfig.json"
    },
    "plugins": [
        "brackets",
        "highcharts",
        "@typescript-eslint"
    ],
    "rules": {
        "brackets/array-bracket-newline": 2,
        "brackets/call-parens-newline": 2,
        "brackets/conditional-parens-newline": 2,
        "brackets/func-parens-newline": 2,
        "brackets/object-curly-newline": 2,
        "camelcase": [
            2,
            {
                "properties": "always"
            }
        ],
        "capitalized-comments": [
            "error",
            "always", {
                "ignoreConsecutiveComments": true
            }
        ],
        "class-methods-use-this": 0,
        "comma-dangle": [
            2,
            "never"
        ],
        "consistent-return": 0,
        "default-case": 0,
        "default-param-last": 0,
        "dot-notation": 0,
        "function-paren-newline": 0,
        "func-style": 0,
        "indent": 0,
        "max-len": [
            "error",
            {
                "code": 80,
                "comments": 80,
                "ignoreUrls": true,
                "ignorePattern": "`|eslint-disable-line|headerFormat|pointFormat|static defaultOptions| (extends|implements) |@\\w|\\w<|\\.\\/| highcharts\\/|\\]\\(#"
            }
        ],
        "no-dupe-class-members": 0,
        "no-inner-declarations": 0, // deprecated with ES6
        "no-invalid-this": 0, // covered by TypeScript
        "no-shadow": 0, // @todo
        "no-sequences": 0,
        "no-undef": 0,
        "no-underscore-dangle": 0, // @todo
        "no-unused-expressions": 0,
        "no-use-before-define": 0,
        "no-useless-constructor": 0,
        "no-useless-escape": 0, // @todo
        "no-useless-return": 0,
        "object-curly-spacing": [2, "always"],
        "object-shorthand": 0,
        "prefer-const": [2, {
            "destructuring": "all"
        }], // @todo
        "prefer-spread": 0, // @todo
        "prefer-rest-params": 0, // @todo
        "require-unicode-regexp": 0, // incompatible with ES2017- targets
        "quote-props": [2, "as-needed", { "keywords": true, "unnecessary": false }],
        "semi": 0,
        "spaced-comment": ["error", "always", { "markers": ["/"] }],
        "valid-jsdoc": 0,
        "@typescript-eslint/array-type": 0,
        "@typescript-eslint/ban-types": 0, // @todo
        "@typescript-eslint/explicit-function-return-type": [
            "error",
            {
                "allowExpressions": false,
                "allowTypedFunctionExpressions": false
            }
        ],
        "@typescript-eslint/indent": [
            "error",
            4,
            {
                "FunctionExpression": { "parameters": 1 },
                "SwitchCase": 1
            }
        ],
        "@typescript-eslint/no-empty-function": 0, // @todo
        "@typescript-eslint/no-empty-interface": 0,
        "@typescript-eslint/no-explicit-any": 0,
        "@typescript-eslint/no-floating-promises": 1, // @todo
        "@typescript-eslint/no-inferrable-types": 0, // @todo ?
        "@typescript-eslint/no-namespace": 0,
        "@typescript-eslint/no-object-literal-type-assertion": 0,
        "@typescript-eslint/no-this-alias": 0, // @todo
        "@typescript-eslint/no-unnecessary-type-assertion": 0, // @todo
        "@typescript-eslint/no-unsafe-argument": 0, // @todo
        "@typescript-eslint/no-unsafe-assignment": 0, // @todo
        "@typescript-eslint/no-unsafe-call": 0, // @todo
        "@typescript-eslint/no-unsafe-member-access": 0, // @todo
        "@typescript-eslint/no-unsafe-return": 0, // @todo
        "@typescript-eslint/no-unused-vars": ["error", { "vars": "all", "args": "after-used" }],
        "@typescript-eslint/no-use-before-define": 0,
        "@typescript-eslint/no-useless-constructor": 2,
        "@typescript-eslint/prefer-as-const": 1, // @todo
        "@typescript-eslint/prefer-includes": 0, // @todo
        "@typescript-eslint/prefer-regexp-exec": 0, // @todo
        "@typescript-eslint/prefer-string-starts-ends-with": 0, // @todo
        "@typescript-eslint/restrict-plus-operands": 0,
        "@typescript-eslint/restrict-template-expressions": 1, // @todo
        "@typescript-eslint/semi": 2,
        "@typescript-eslint/unbound-method": 0, // @todo
        "highcharts/doclet-apioption-last": 2,
        "highcharts/no-highcharts-namespace": 1, // @todo
        "highcharts/no-highcharts-object": 2,
        "highcharts/no-mixin": 1, // @todo
        "highcharts/no-private-constructor-doclet": 0,
        "highcharts/no-wrap": 1, // @todo
        "highcharts/quote-members": 2,
        "jsdoc/check-alignment": 0,
        "jsdoc/check-param-names": 1,
        "jsdoc/check-tag-names": [
            "error",
            {
                "definedTags": [
                    "apioption",
                    "context",
                    "declare",
                    "exclude",
                    "excluding",
                    "ignore-declaration",
                    "ignore-option",
                    "internal",
                    "optionparent",
                    "product",
                    "productdesc",
                    "sample",
                    "validvalue"
                ]
            }
        ],
        "jsdoc/check-types": 0,
        "jsdoc/require-description": 1,
        "jsdoc/require-jsdoc": 1, // @todo
        "jsdoc/require-param": 0, // @todo
        "jsdoc/require-param-description": 1, // @todo
        "jsdoc/require-param-type": 1, // @todo
        "node/no-missing-import": 0, // @todo
        "node/no-unsupported-features/es-builtins": 0, // @todo
        "node/no-unsupported-features/es-syntax": 0 // @todo
    },
    "settings": {
        "jsdoc": {
            "mode": "typescript"
        }
    }
}
