module.exports = {
    'root': true,
    'extends': [
        'eslint:recommended',
        'plugin:@typescript-eslint/eslint-recommended' ,
        'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
    ],
    'parserOptions': {
        'ecmaVersion': 2018,
        'sourceType': 'module', // Allows for the use of imports
    },
    'plugins': [
        'html',
    ],
    'settings': {
        'html/indent': 4,
    },
    'env': {
        'es6': true,
        'node': true,
    },
    'rules': {
        'array-bracket-spacing': 'error',
        'comma-style': 'error',
        'space-before-blocks': 'error',
        'space-before-function-paren': 'error',
        'space-in-parens': 'error',
        'space-infix-ops': 'error',
        'space-unary-ops': 'error',
        'spaced-comment': 'error',
        'no-spaced-func': 'error',
        'no-multi-spaces': 'error',
        'no-regex-spaces': 'error',
        'no-trailing-spaces': ['warn', { 'skipBlankLines': true }],
        'no-mixed-spaces-and-tabs': 'error',
        'no-irregular-whitespace': 'error',
        'no-whitespace-before-property': 'error',
        'default-case': 'error',
        'require-jsdoc': 'warn',
        'camelcase': 'error',
        'comma-dangle': ['error', 'always-multiline'],
        'indent': ['error', 4],
        'quotes': ['error', 'single'],
        // 'linebreak-style': ['error', 'unix'],
        'no-loss-of-precision': 'error',
    },
    'overrides': [
        {
            'files': ['**/*.ts', '**/*.tsx'],
            'parser': '@typescript-eslint/parser', // Specifies the ESLint parser
            'parserOptions': {
                'ecmaVersion': 2021, // Allows for the parsing of modern ECMAScript features
                'sourceType': 'module', // Allows for the use of imports
                'project': ['./tsconfig.json', './examples/tsconfig.json',
                    './plugins/**/tsconfig.json',
                ],
                'tsconfigRootDir': './',
            },
            'extends': [
                'eslint:recommended',
                'plugin:@typescript-eslint/eslint-recommended' ,
                'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
            ],
            'env': {
                'browser': true,
                'es6': true,
            },
            'plugins': [
                'html',
                '@typescript-eslint',
                'import',
                'deprecation',
            ],
            'settings': {
                'html/indent': 4,
                'import/resolver': {
                    'typescript': {},
                },
            },
            'rules': {
                // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
                // e.g. "@typescript-eslint/explicit-function-return-type": "off",
                '@typescript-eslint/no-explicit-any': 'off',
                'camelcase': 'off',
                '@typescript-eslint/naming-convention': [ // https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/naming-convention.md
                    'error',
                    {
                        'selector': 'default',
                        'format': ['camelCase', 'snake_case', 'PascalCase'],
                    },
                    {
                        'selector': 'variable',
                        'format': ['camelCase', 'UPPER_CASE'],
                    },
                    {
                        'selector': 'parameter',
                        'format': ['camelCase'],
                        'leadingUnderscore': 'allow',
                    },
                    {
                        'selector': 'memberLike',
                        'modifiers': ['private'],
                        'format': ['camelCase'],
                        'leadingUnderscore': 'require',
                    },
                    {
                        'selector': 'memberLike',
                        'modifiers': ['protected'],
                        'format': ['camelCase'],
                        'leadingUnderscore': 'require',
                    },
                    {
                        'selector': ['typeLike'],
                        'format': ['PascalCase'],
                    },
                    {
                        'selector': ['enumMember'],
                        'format': ['PascalCase', 'UPPER_CASE'],
                    },
                    {
                        'selector': 'memberLike',
                        'modifiers': ['static'],
                        'format': ['PascalCase', 'UPPER_CASE'],
                    },
                    {
                        'selector': 'objectLiteralProperty',
                        'format': ['camelCase', 'snake_case', 'PascalCase'],
                        'leadingUnderscore': 'allowSingleOrDouble',
                    },
                    {
                        'selector': 'typeProperty',
                        'format': ['camelCase', 'snake_case', 'PascalCase', 'UPPER_CASE'],
                        'leadingUnderscore': 'allowSingleOrDouble',
                    },
                ],
                'semi': 'off',
                '@typescript-eslint/semi': ['error','never', { 'beforeStatementContinuationChars': 'always' }],
                'no-extra-semi': 'off',
                '@typescript-eslint/no-extra-semi': ['error'],
                '@typescript-eslint/adjacent-overload-signatures': 'error',
                'comma-spacing': 'off',
                '@typescript-eslint/comma-spacing': ['error'],
                'no-extra-parens': 'off',
                '@typescript-eslint/no-extra-parens': ['error'],
                'brace-style': 'off',
                '@typescript-eslint/brace-style': ['warn', '1tbs', { 'allowSingleLine': true }],
                '@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
                'default-param-last': 'off',
                '@typescript-eslint/default-param-last': ['error'],
                'func-call-spacing': 'off',
                '@typescript-eslint/func-call-spacing': ['error'],
                'keyword-spacing': 'off',
                'object-curly-spacing': 'off',
                '@typescript-eslint/object-curly-spacing': ['error'],
                '@typescript-eslint/keyword-spacing': ['error'],
                'space-before-function-paren': 'off',
                '@typescript-eslint/space-before-function-paren': ['error','never'],
                'no-shadow': 'off',
                'no-magic-numbers': 'off',
                // '@typescript-eslint/no-magic-numbers': [
                //     'warn', {
                //         'ignoreEnums': true,
                //         'ignoreNumericLiteralTypes': true,
                //         'ignoreReadonlyClassProperties': true,
                //     },
                // ],
                '@typescript-eslint/promise-function-async': [
                    'error',
                    {
                        'allowedPromiseNames': ['Thenable'],
                        'checkArrowFunctions': true,
                        'checkFunctionDeclarations': true,
                        'checkFunctionExpressions': true,
                        'checkMethodDeclarations': true,
                    },
                ],
                'dot-notation': 'off', // https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/dot-notation.md
                '@typescript-eslint/dot-notation': ['error'],
                '@typescript-eslint/prefer-string-starts-ends-with': 'error',
                '@typescript-eslint/prefer-includes': 'error',
                '@typescript-eslint/prefer-for-of': 'error',
                '@typescript-eslint/prefer-as-const': 'error',
                '@typescript-eslint/prefer-function-type': 'error',
                '@typescript-eslint/no-unsafe-call': 'warn',
                '@typescript-eslint/no-misused-new': 'error',
                '@typescript-eslint/no-namespace': 'error',
                '@typescript-eslint/non-nullable-type-assertion-style': 'error',
                'no-invalid-this': 'off',
                '@typescript-eslint/no-invalid-this': ['error'],
                '@typescript-eslint/prefer-ts-expect-error': ['error'],
                'no-loop-func': 'off',
                '@typescript-eslint/no-loop-func': ['error'],
                'no-loss-of-precision': 'off',
                '@typescript-eslint/no-loss-of-precision': ['error'],
                '@typescript-eslint/no-shadow': ['error'],
                'no-duplicate-imports': 'off',
                '@typescript-eslint/no-duplicate-imports': ['error', { 'includeExports': false }],
                // "@typescript-eslint/prefer-nullish-coalescing": ["error", {ignoreConditionalTests: false, ignoreMixedLogicalExpressions: false}],
                'comma-dangle': 'off',
                '@typescript-eslint/comma-dangle': ['error', {
                    'arrays': 'always-multiline',
                    'objects': 'always-multiline',
                    'imports': 'always-multiline',
                    'exports': 'always-multiline',
                    'functions': 'only-multiline',
                }],
                'deprecation/deprecation': 'warn',

            },

            'globals': { 'Atomics': 'readonly', 'SharedArrayBuffer': 'readonly' },
        },
    ],
}
