13af6ab5fSopenharmony_ci{
23af6ab5fSopenharmony_ci  "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
33af6ab5fSopenharmony_ci  "parser": "@typescript-eslint/parser",
43af6ab5fSopenharmony_ci  "parserOptions": {
53af6ab5fSopenharmony_ci    "ecmaVersion": "latest",
63af6ab5fSopenharmony_ci    "sourceType": "module",
73af6ab5fSopenharmony_ci    "project": true
83af6ab5fSopenharmony_ci  },
93af6ab5fSopenharmony_ci  "plugins": ["@typescript-eslint", "@stylistic", "import", "n"],
103af6ab5fSopenharmony_ci  "rules": {
113af6ab5fSopenharmony_ci    // suggestions
123af6ab5fSopenharmony_ci    "accessor-pairs": "error",
133af6ab5fSopenharmony_ci    "arrow-body-style": ["error", "always"],
143af6ab5fSopenharmony_ci    "camelcase": "off", // we use naming-convention rule to enforce naming scheme
153af6ab5fSopenharmony_ci    "class-methods-use-this": ["error", { "exceptMethods": [], "enforceForClassFields": true }],
163af6ab5fSopenharmony_ci    "complexity": ["error", { "max": 15 }],
173af6ab5fSopenharmony_ci    "consistent-return": ["error", { "treatUndefinedAsUnspecified": false }],
183af6ab5fSopenharmony_ci    "curly": ["error", "all"],
193af6ab5fSopenharmony_ci    "default-case": "error",
203af6ab5fSopenharmony_ci    "default-param-last": "warn",
213af6ab5fSopenharmony_ci    "dot-notation": "error",
223af6ab5fSopenharmony_ci    "eqeqeq": ["error", "smart"],
233af6ab5fSopenharmony_ci    "func-style": ["error", "declaration", {"allowArrowFunctions": true}],
243af6ab5fSopenharmony_ci    "max-depth": ["error", { "max": 4 }],
253af6ab5fSopenharmony_ci    "max-lines-per-function": ["error", { "max": 50 }],
263af6ab5fSopenharmony_ci    "max-params": ["error", 5],
273af6ab5fSopenharmony_ci    "multiline-comment-style": ["error", "starred-block"],
283af6ab5fSopenharmony_ci    "no-else-return": ["error", { "allowElseIf": true }],
293af6ab5fSopenharmony_ci    "no-eval": ["error", {"allowIndirect": false} ],
303af6ab5fSopenharmony_ci    "no-extra-bind": "error",
313af6ab5fSopenharmony_ci    "no-implied-eval": "error",
323af6ab5fSopenharmony_ci    "no-lonely-if": "error",
333af6ab5fSopenharmony_ci    "no-nested-ternary": "warn",
343af6ab5fSopenharmony_ci    "no-param-reassign": "warn",
353af6ab5fSopenharmony_ci    "no-prototype-builtins": "error",
363af6ab5fSopenharmony_ci    "no-regex-spaces": "error",
373af6ab5fSopenharmony_ci    "no-return-await": "error",
383af6ab5fSopenharmony_ci    "no-throw-literal": "error",
393af6ab5fSopenharmony_ci    "no-undef-init": "error",
403af6ab5fSopenharmony_ci    "no-unneeded-ternary": "error",
413af6ab5fSopenharmony_ci    "no-useless-return": "error",
423af6ab5fSopenharmony_ci    "no-var": "error",
433af6ab5fSopenharmony_ci    "one-var": ["error", "never"],
443af6ab5fSopenharmony_ci    "one-var-declaration-per-line": "error",
453af6ab5fSopenharmony_ci    "prefer-const": "error",
463af6ab5fSopenharmony_ci    "prefer-named-capture-group": "warn",
473af6ab5fSopenharmony_ci    "prefer-rest-params": "error",
483af6ab5fSopenharmony_ci    "strict": "error",
493af6ab5fSopenharmony_ci    "spaced-comment": ["error", "always"],
503af6ab5fSopenharmony_ci    "vars-on-top": "error",
513af6ab5fSopenharmony_ci
523af6ab5fSopenharmony_ci     // imports
533af6ab5fSopenharmony_ci    "import/no-absolute-path": "error",
543af6ab5fSopenharmony_ci    "n/file-extension-in-import": ["error", "never"],
553af6ab5fSopenharmony_ci
563af6ab5fSopenharmony_ci    // style
573af6ab5fSopenharmony_ci    "@stylistic/array-bracket-newline": ["error", "consistent"],
583af6ab5fSopenharmony_ci    "@stylistic/array-bracket-spacing": ["error", "never"],
593af6ab5fSopenharmony_ci    "@stylistic/array-element-newline": ["error", "consistent"],
603af6ab5fSopenharmony_ci    "@stylistic/arrow-parens": ["error", "always"],
613af6ab5fSopenharmony_ci    "@stylistic/arrow-spacing": ["error", { "before": true, "after": true }],
623af6ab5fSopenharmony_ci    "@stylistic/block-spacing": ["error", "always"],
633af6ab5fSopenharmony_ci    "@stylistic/brace-style": ["error", "1tbs", { "allowSingleLine": true }],
643af6ab5fSopenharmony_ci    "@stylistic/comma-dangle": [
653af6ab5fSopenharmony_ci      "error",
663af6ab5fSopenharmony_ci      {
673af6ab5fSopenharmony_ci        "arrays": "never",
683af6ab5fSopenharmony_ci        "objects": "never",
693af6ab5fSopenharmony_ci        "imports": "never",
703af6ab5fSopenharmony_ci        "exports": "never",
713af6ab5fSopenharmony_ci        "functions": "never"
723af6ab5fSopenharmony_ci      }
733af6ab5fSopenharmony_ci    ],
743af6ab5fSopenharmony_ci    "@stylistic/comma-spacing": ["error", { "before": false, "after": true }],
753af6ab5fSopenharmony_ci    "@stylistic/comma-style": ["error", "last"],
763af6ab5fSopenharmony_ci    "@stylistic/computed-property-spacing": ["error", "never", { "enforceForClassMembers": true }],
773af6ab5fSopenharmony_ci    "@stylistic/dot-location": ["error", "object"],
783af6ab5fSopenharmony_ci    "@stylistic/eol-last": ["error", "always"],
793af6ab5fSopenharmony_ci    "@stylistic/no-confusing-arrow": "error",
803af6ab5fSopenharmony_ci    "@stylistic/no-floating-decimal": "error",
813af6ab5fSopenharmony_ci    "@stylistic/func-call-spacing": ["error", "never"],
823af6ab5fSopenharmony_ci    "@stylistic/function-call-argument-newline": ["error", "consistent"],
833af6ab5fSopenharmony_ci    "@stylistic/function-paren-newline": ["error", "consistent"],
843af6ab5fSopenharmony_ci    "@stylistic/generator-star-spacing": ["error", { "before": true, "after": false }],
853af6ab5fSopenharmony_ci    "@stylistic/implicit-arrow-linebreak": ["error", "beside"],
863af6ab5fSopenharmony_ci    "@stylistic/indent": [
873af6ab5fSopenharmony_ci      "error",
883af6ab5fSopenharmony_ci      2,
893af6ab5fSopenharmony_ci      {
903af6ab5fSopenharmony_ci        "ignoredNodes": [],
913af6ab5fSopenharmony_ci        "SwitchCase": 1,
923af6ab5fSopenharmony_ci        "VariableDeclarator": 1,
933af6ab5fSopenharmony_ci        "outerIIFEBody": 1,
943af6ab5fSopenharmony_ci        "MemberExpression": 1,
953af6ab5fSopenharmony_ci        "FunctionDeclaration": {
963af6ab5fSopenharmony_ci          "parameters": 1,
973af6ab5fSopenharmony_ci          "body": 1
983af6ab5fSopenharmony_ci        },
993af6ab5fSopenharmony_ci        "FunctionExpression": {
1003af6ab5fSopenharmony_ci          "parameters": 1,
1013af6ab5fSopenharmony_ci          "body": 1
1023af6ab5fSopenharmony_ci        },
1033af6ab5fSopenharmony_ci        "CallExpression": {
1043af6ab5fSopenharmony_ci          "arguments": 1
1053af6ab5fSopenharmony_ci        },
1063af6ab5fSopenharmony_ci        "ArrayExpression": 1,
1073af6ab5fSopenharmony_ci        "ObjectExpression": 1,
1083af6ab5fSopenharmony_ci        "ImportDeclaration": 1,
1093af6ab5fSopenharmony_ci        "flatTernaryExpressions": true,
1103af6ab5fSopenharmony_ci        "offsetTernaryExpressions": false,
1113af6ab5fSopenharmony_ci        "ignoreComments": false
1123af6ab5fSopenharmony_ci      }
1133af6ab5fSopenharmony_ci    ],
1143af6ab5fSopenharmony_ci    "@stylistic/jsx-quotes": ["error", "prefer-double"],
1153af6ab5fSopenharmony_ci    "@stylistic/keyword-spacing": ["error", { "before": true, "after": true }],
1163af6ab5fSopenharmony_ci    "line-comment-position": ["error", { "position": "above" }],
1173af6ab5fSopenharmony_ci    "@stylistic/linebreak-style": ["error", "unix"],
1183af6ab5fSopenharmony_ci    "@stylistic/lines-around-comment": ["error", { "beforeBlockComment": true }],
1193af6ab5fSopenharmony_ci    "@stylistic/lines-between-class-members": [
1203af6ab5fSopenharmony_ci      "error",
1213af6ab5fSopenharmony_ci      {
1223af6ab5fSopenharmony_ci        "enforce": [
1233af6ab5fSopenharmony_ci          { "blankLine": "always", "prev": "*", "next": "method" },
1243af6ab5fSopenharmony_ci          { "blankLine": "always", "prev": "method", "next": "*" }
1253af6ab5fSopenharmony_ci        ]
1263af6ab5fSopenharmony_ci      }
1273af6ab5fSopenharmony_ci    ],
1283af6ab5fSopenharmony_ci    "@stylistic/max-len": ["error", { "code": 120, "tabWidth": 2, "ignoreComments": true, "ignoreStrings": true }],
1293af6ab5fSopenharmony_ci    "@stylistic/max-statements-per-line": ["error", { "max": 1 }],
1303af6ab5fSopenharmony_ci    "@stylistic/multiline-ternary": ["error", "always-multiline"],
1313af6ab5fSopenharmony_ci    "@stylistic/new-parens": ["error", "always"],
1323af6ab5fSopenharmony_ci    "@stylistic/newline-per-chained-call": ["error", { "ignoreChainWithDepth": 2 }],
1333af6ab5fSopenharmony_ci    "@stylistic/no-extra-parens": ["error", "all"],
1343af6ab5fSopenharmony_ci    "@stylistic/no-mixed-spaces-and-tabs": "error",
1353af6ab5fSopenharmony_ci    "@stylistic/no-multi-spaces": "error",
1363af6ab5fSopenharmony_ci    "@stylistic/no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1 }],
1373af6ab5fSopenharmony_ci    "@stylistic/no-tabs": "error",
1383af6ab5fSopenharmony_ci    "@stylistic/no-trailing-spaces": ["error", { "skipBlankLines": false, "ignoreComments": false }],
1393af6ab5fSopenharmony_ci    "@stylistic/no-whitespace-before-property": "error",
1403af6ab5fSopenharmony_ci    "@stylistic/nonblock-statement-body-position": ["error", "beside"],
1413af6ab5fSopenharmony_ci    "@stylistic/object-curly-newline": ["error", { "consistent": true }],
1423af6ab5fSopenharmony_ci    "@stylistic/object-curly-spacing": ["error", "always"],
1433af6ab5fSopenharmony_ci    "@stylistic/operator-linebreak": ["error", "after"],
1443af6ab5fSopenharmony_ci    // disable due to conflict with required rule 'lines-around-comment'
1453af6ab5fSopenharmony_ci    "@stylistic/padded-blocks": "off",
1463af6ab5fSopenharmony_ci    "@stylistic/quotes": ["error", "single"],
1473af6ab5fSopenharmony_ci    "@stylistic/rest-spread-spacing": ["error", "never"],
1483af6ab5fSopenharmony_ci    "@stylistic/semi": ["error", "always"],
1493af6ab5fSopenharmony_ci    "@stylistic/semi-spacing": ["error", { "before": false, "after": true }],
1503af6ab5fSopenharmony_ci    "@stylistic/semi-style": ["error", "last"],
1513af6ab5fSopenharmony_ci    "@stylistic/space-before-blocks": ["error", "always"],
1523af6ab5fSopenharmony_ci    "@stylistic/space-before-function-paren": ["error", "never"],
1533af6ab5fSopenharmony_ci    "@stylistic/space-in-parens": ["error", "never"],
1543af6ab5fSopenharmony_ci    "@stylistic/space-infix-ops": ["error"],
1553af6ab5fSopenharmony_ci    "@stylistic/space-unary-ops": ["error", { "words": true, "nonwords": false, "overrides": {} }],
1563af6ab5fSopenharmony_ci    "@stylistic/switch-colon-spacing": ["error", { "after": true, "before": false }],
1573af6ab5fSopenharmony_ci    "@stylistic/template-curly-spacing": ["error", "never"],
1583af6ab5fSopenharmony_ci    "@stylistic/template-tag-spacing": ["error", "never"],
1593af6ab5fSopenharmony_ci    "unicode-bom": ["error", "never"],
1603af6ab5fSopenharmony_ci    "@stylistic/wrap-iife": ["error", "outside"],
1613af6ab5fSopenharmony_ci    "@stylistic/wrap-regex": "error",
1623af6ab5fSopenharmony_ci    "@stylistic/yield-star-spacing": ["error", { "before": true, "after": false }],
1633af6ab5fSopenharmony_ci
1643af6ab5fSopenharmony_ci    // typescript
1653af6ab5fSopenharmony_ci    "@typescript-eslint/explicit-function-return-type": "error",
1663af6ab5fSopenharmony_ci    "@typescript-eslint/adjacent-overload-signatures": "error",
1673af6ab5fSopenharmony_ci    "@typescript-eslint/consistent-type-exports": "error",
1683af6ab5fSopenharmony_ci    "@typescript-eslint/await-thenable": "error",
1693af6ab5fSopenharmony_ci    "@typescript-eslint/no-dynamic-delete": "error",
1703af6ab5fSopenharmony_ci    "@typescript-eslint/no-this-alias": "error",
1713af6ab5fSopenharmony_ci    "@typescript-eslint/explicit-member-accessibility": [
1723af6ab5fSopenharmony_ci      "error",
1733af6ab5fSopenharmony_ci      {
1743af6ab5fSopenharmony_ci        "accessibility": "no-public"
1753af6ab5fSopenharmony_ci      }
1763af6ab5fSopenharmony_ci    ],
1773af6ab5fSopenharmony_ci    "@typescript-eslint/method-signature-style": "error",
1783af6ab5fSopenharmony_ci    "@typescript-eslint/no-confusing-non-null-assertion": "error",
1793af6ab5fSopenharmony_ci    "@typescript-eslint/no-confusing-void-expression": "error",
1803af6ab5fSopenharmony_ci    // FIXME(knazarov)
1813af6ab5fSopenharmony_ci    // need to do something about this
1823af6ab5fSopenharmony_ci    "@typescript-eslint/no-explicit-any": "warn",
1833af6ab5fSopenharmony_ci    // Produce too many warning caused by 'any' usage
1843af6ab5fSopenharmony_ci//    "@typescript-eslint/no-unsafe-member-access": "warn",
1853af6ab5fSopenharmony_ci//    "@typescript-eslint/no-unsafe-assignment": "warn",
1863af6ab5fSopenharmony_ci    "@typescript-eslint/no-unsafe-call": "warn",
1873af6ab5fSopenharmony_ci    "@typescript-eslint/no-unsafe-argument": "warn",
1883af6ab5fSopenharmony_ci    "@typescript-eslint/no-unsafe-return": "warn",
1893af6ab5fSopenharmony_ci    "no-unsafe-finally": "error",
1903af6ab5fSopenharmony_ci    "@typescript-eslint/no-extra-non-null-assertion": "error",
1913af6ab5fSopenharmony_ci    "@typescript-eslint/no-meaningless-void-operator": "error",
1923af6ab5fSopenharmony_ci    "@typescript-eslint/no-unnecessary-boolean-literal-compare": "error",
1933af6ab5fSopenharmony_ci    // FIXME(knazarov)
1943af6ab5fSopenharmony_ci    // disabled due to many cases, where typescript deduces non-undefined value, but we can recieve one from the api
1953af6ab5fSopenharmony_ci    "@typescript-eslint/no-unnecessary-condition": "off",
1963af6ab5fSopenharmony_ci    "@typescript-eslint/no-unnecessary-type-assertion": "error",
1973af6ab5fSopenharmony_ci    "@typescript-eslint/prefer-as-const": "error",
1983af6ab5fSopenharmony_ci    "@typescript-eslint/prefer-optional-chain": "error",
1993af6ab5fSopenharmony_ci    "@typescript-eslint/prefer-readonly": "error",
2003af6ab5fSopenharmony_ci    "@typescript-eslint/consistent-type-imports": "error",
2013af6ab5fSopenharmony_ci    // FIXME(knazarov)
2023af6ab5fSopenharmony_ci    // need to change metadata in cookbook accordingle. so do it later
2033af6ab5fSopenharmony_ci    "@typescript-eslint/naming-convention": [
2043af6ab5fSopenharmony_ci      "off",
2053af6ab5fSopenharmony_ci      {
2063af6ab5fSopenharmony_ci        "selector": "default",
2073af6ab5fSopenharmony_ci        "format": ["camelCase"]
2083af6ab5fSopenharmony_ci      },
2093af6ab5fSopenharmony_ci      {
2103af6ab5fSopenharmony_ci        "selector": "enumMember",
2113af6ab5fSopenharmony_ci        "format": ["UPPER_CASE"]
2123af6ab5fSopenharmony_ci      },
2133af6ab5fSopenharmony_ci      {
2143af6ab5fSopenharmony_ci        "selector": "variable",
2153af6ab5fSopenharmony_ci        "format": ["camelCase", "UPPER_CASE"]
2163af6ab5fSopenharmony_ci      },
2173af6ab5fSopenharmony_ci      {
2183af6ab5fSopenharmony_ci        "selector": "typeLike",
2193af6ab5fSopenharmony_ci        "format": ["PascalCase"]
2203af6ab5fSopenharmony_ci      },
2213af6ab5fSopenharmony_ci      {
2223af6ab5fSopenharmony_ci        "selector": "memberLike",
2233af6ab5fSopenharmony_ci        "format": ["camelCase"]
2243af6ab5fSopenharmony_ci      }
2253af6ab5fSopenharmony_ci    ]
2263af6ab5fSopenharmony_ci  }
2273af6ab5fSopenharmony_ci}
228