Repository: exadel-inc/esl
Pull request #2625 (2024-08-30 08:53:21)

chore(deps-dev): update ESLint pluggins, migrate lint rules
Closes: #2562 


Patch:
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index 7098aaad5..000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,17 +0,0 @@
-# Common configuration
-jest.config.js
-
-# Common directories
-build
-node_modules
-
-# Generated surces
-/modules
-/polyfills
-
-# Submodule output
-/site/dist
-/eslint/dist
-
-# Site build configuration
-/site/webpack.config.js
diff --git a/.eslintrc.yml b/.eslintrc.yml
deleted file mode 100644
index 0ed717b16..000000000
--- a/.eslintrc.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-# Library's global linting rules
-env:
-  browser: true
-  es6: true
-  es2017: true
-
-# Base rule sets
-extends:
-  # Recommended sets list
-  - 'eslint:recommended'
-  - 'plugin:import/typescript'
-  - 'plugin:@typescript-eslint/recommended'
-  - 'plugin:@exadel/esl/default'
-
-  # Library base set
-  - './linting/codestyle.eslintrc.yml'
-  - './linting/coderules.eslintrc.yml'
-  - './linting/import.eslintrc.yml'
-  - './linting/sonarjs.eslintrc.yml'
-  - './linting/tests.eslintrc.yml'
-  - './linting/eslint.eslintrc.yml'
-  - './linting/site.eslintrc.yml'
-
-# TS configuration
-parser: '@typescript-eslint/parser'
-parserOptions:
-  project:
-    - './tsconfig.json'
-    - './e2e/tsconfig.json'
-    - './site/tsconfig.json'
-    - './eslint/tsconfig.json'
-  sourceType: module
-
-# Lint additional plugins
-plugins:
-  - 'tsdoc'
-  - 'import'
-  - 'sonarjs'
-  - 'editorconfig'
-  - '@typescript-eslint'
-  - '@exadel/esl'
-
-# Overall rules
-rules:
-  # Enable TS Doc syntax check
-  'tsdoc/syntax': warn
-
-  # Enforce charset check
-  'editorconfig/charset': warn
-  # Enforce EOL for all files
-  'editorconfig/eol-last': warn
-  # Require no trailing spaces
-  'editorconfig/no-trailing-spaces': warn
-
-  # Exclude migration rules for 5.0.0-beta.24 revision
-  '@exadel/esl/deprecated-4/media-rule-list-parse': off
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 000000000..ebf7b8060
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,17 @@
+module.exports = [
+  {
+    files: ["**/*.ts", "**/*.tsx"],
+    linterOptions: {
+      reportUnusedDisableDirectives: "warn"
+    }
+  },
+  ...require('./linting/eslint.config.ignore'),
+  ...require('./linting/eslint.config.language'),
+  ...require('./linting/eslint.config.codestyle'),
+  ...require('./linting/eslint.config.coderules'),
+  ...require('./linting/eslint.config.sonarjs'),
+  ...require('./linting/eslint.config.stylistic'),
+  ...require('./linting/eslint.config.editorconfig'),
+  ...require('./linting/eslint.config.import'),
+  ...require('./linting/eslint.config.tsdoc')
+];
diff --git a/eslint/package.json b/eslint/package.json
index 217725170..5402ee6ce 100644
--- a/eslint/package.json
+++ b/eslint/package.json
@@ -15,7 +15,7 @@
   ],
   "scripts": {
     "prepare": "npm run build",
-    "test": "jest",
+    "test": "",
     "clean": "rimraf dist",
     "build": "npm run clean && tsc --project tsconfig.build.json"
   },
diff --git a/linting/coderules.eslintrc.yml b/linting/coderules.eslintrc.yml
deleted file mode 100644
index bbe29e4ba..000000000
--- a/linting/coderules.eslintrc.yml
+++ /dev/null
@@ -1,271 +0,0 @@
-rules:
-  # === Compulsory practices ===
-
-  # Verify calls of super() in constructors
-  'constructor-super': warn
-
-  # Requires === and !== usage
-  'eqeqeq': warn
-
-  # Require Guarding for-in to exclude prototype keys
-  'guard-for-in': warn
-
-  # There is no blacklisted identifiers
-  'id-blacklist': off
-
-  # Bitwise operators are not recommended
-  'no-bitwise': warn
-
-  # Disallow use of caller/callee
-  'no-caller': error
-
-  # Warn about assignment operators in conditional statements
-  'no-cond-assign': warn
-
-  # Console API is formally allowed
-  'no-console': off
-
-  # Debugger operator is not allowed
-  'no-debugger': error
-
-  # Allows case statement to fallthrough
-  'no-fallthrough': off
-
-  # Warn about using redundant primitive wrapper instances usage
-  'no-new-wrappers': warn
-
-  # Warn about redundant initializing to undefined
-  'no-undef-init': warn
-
-  # Disallow control flow statements in finally blocks
-  'no-unsafe-finally': error
-
-  # Labels are not allowed
-  'no-labels': error
-
-  # Require implicit radix parameter for parseInt
-  'radix': error
-
-  # Require calls to isNaN() when checking for NaN
-  'use-isnan': error
-
-  # Enforce comparing typeof expressions against valid strings
-  'valid-typeof': error
-
-
-  # Enforces consistent usage of type imports
-  '@typescript-eslint/consistent-type-imports':
-    - error
-    - prefer: type-imports
-
-  # Disallow the use of custom TypeScript modules and namespaces
-  '@typescript-eslint/no-namespace': error
-
-  # Disallows using a non-null assertion after an optional chain expression
-  '@typescript-eslint/no-non-null-asserted-optional-chain': error
-
-  # Disallows invocation of require()
-  '@typescript-eslint/no-require-imports': error
-
-  # Disallow aliasing this
-  '@typescript-eslint/no-this-alias': error
-
-  # Flags unnecessary equality comparisons against boolean literals
-  '@typescript-eslint/no-unnecessary-boolean-literal-compare': error
-
-  # Disallows the use of require statements except in import statements
-  '@typescript-eslint/no-var-requires': error
-
-  # Prefer usage of as const over literal type
-  '@typescript-eslint/prefer-as-const': error
-
-  # Disallow iterating over an array with a for-in loop
-  '@typescript-eslint/no-for-in-array': error
-
-  # Disallow extra non-null assertion
-  '@typescript-eslint/no-extra-non-null-assertion': error
-
-  # Enforce default parameters to be last
-  'default-param-last': off
-  '@typescript-eslint/default-param-last': error
-
-  # Prefers member overloads to be consecutive
-  '@typescript-eslint/adjacent-overload-signatures': warn
-
-  # Prefers using either T[] or Array<T> for arrays
-  '@typescript-eslint/array-type': warn
-
-  # Warn about awaiting of a value that is not a Thenable
-  '@typescript-eslint/await-thenable': warn
-
-  # Bans @ts-<directive> comments from being used or requires descriptions after directive
-  '@typescript-eslint/ban-ts-comment': warn
-
-  # Bans specific types from being used
-  '@typescript-eslint/ban-types': warn
-
-  # Warn about invalid definition of new and constructor
-  '@typescript-eslint/no-misused-new': warn
-
-  # Warns when a namespace qualifier is unnecessary
-  '@typescript-eslint/no-unnecessary-qualifier': warn
-
-  # Prefers function types instead of interfaces with call signatures
-  '@typescript-eslint/prefer-function-type': warn
-
-  # Sets preference level for triple slash directives versus ES6-style import declarations
-  '@typescript-eslint/triple-slash-reference': warn
-
-  # Warns if a type assertion does not change the type of an expression
-  '@typescript-eslint/no-unnecessary-type-assertion': warn
-
-  # It's recommended to pass a compareFn to the Array.sort method
-  '@typescript-eslint/require-array-sort-compare': warn
-
-  # Warns if missed return type on functions or class methods
-  '@typescript-eslint/explicit-function-return-type': warn
-
-  # Ignores if two overloads could be unified into one by using a union or an optional/rest parameter
-  # Because of the possibility to separate TSDocs between different function/method overloads
-  '@typescript-eslint/unified-signatures': off
-
-  # Allows the delete operator with computed key expressions
-  '@typescript-eslint/no-dynamic-delete': off
-
-  # Allows the use of parameter properties in class constructors
-  '@typescript-eslint/no-parameter-properties': off
-
-  # Allows the use of type aliases
-  '@typescript-eslint/no-type-alias': off
-
-  # There is no prefer of ‘for-of’ loop over a standard ‘for’ loop if the index is only used to access the array being iterated
-  '@typescript-eslint/prefer-for-of': off
-
-  # There is no restriction when adding two variables, operands must both be of type number or of type string
-  '@typescript-eslint/restrict-plus-operands': off
-
-  # Do not restricts the types allowed in boolean expressions
-  '@typescript-eslint/strict-boolean-expressions': off
-
-  # Allows the declaration of empty interfaces
-  '@typescript-eslint/no-empty-interface': off
-
-  # Allows empty functions
-  'no-empty-function': off
-  '@typescript-eslint/no-empty-function': off
-
-  # Allows usage of the any type
-  '@typescript-eslint/no-explicit-any': off
-
-  # Allows non-null assertions using the ! postfix operator
-  '@typescript-eslint/no-non-null-assertion': off
-
-  # Do not ensures that literals on classes are exposed in a consistent style
-  '@typescript-eslint/class-literal-property-style': off
-
-  # Allows the use of the record type
-  '@typescript-eslint/consistent-indexed-object-style': off
-
-  # There is no preferences for interfaces or types
-  '@typescript-eslint/consistent-type-definitions': off
-
-  # Do not require explicit accessibility modifiers on class properties and methods
-  '@typescript-eslint/explicit-member-accessibility': off
-
-  # Do not require a consistent member declaration order
-  # TODO: discuss for the future
-  'member-ordering': off
-  '@typescript-eslint/member-ordering': off
-
-  # There is no preferences of a particular method signature syntax
-  '@typescript-eslint/method-signature-style': off
-
-  # Ensure .toString() is only called on objects which provide useful information when stringified
-  '@typescript-eslint/no-base-to-string': warn
-
-  # Warn about non-null assertion in locations that may be confusing
-  '@typescript-eslint/no-confusing-non-null-assertion': warn
-
-  # Do not requires expressions of type void to appear in statement position
-  '@typescript-eslint/no-confusing-void-expression': off
-
-  # Do not forbids the use of classes as namespaces
-  '@typescript-eslint/no-extraneous-class': off
-
-  # Do not require Promise-like values to be handled appropriately
-  # TODO: enable
-  '@typescript-eslint/no-floating-promises': off
-
-  # Allows usage of the implicit any type in catch clauses
-  '@typescript-eslint/no-implicit-any-catch': off
-
-  # Allows explicit type declarations for variables or parameters initialized to a number, string, or boolean
-  '@typescript-eslint/no-inferrable-types': off
-
-  # Allows usage of void type outside of generic or return types
-  '@typescript-eslint/no-invalid-void-type': off
-
-  # There is no requirement of using promises in places not designed to handle them
-  '@typescript-eslint/no-misused-promises': off
-
-  # Check that type arguments will not be used if not required
-  '@typescript-eslint/no-unnecessary-type-arguments': warn
-
-  # Warn about unnecessary constraints on generic types
-  '@typescript-eslint/no-unnecessary-type-constraint': warn
-
-  # Allows calling a function with an any type value
-  '@typescript-eslint/no-unsafe-argument': off
-
-  # Allows assigning any to variables and properties
-  '@typescript-eslint/no-unsafe-assignment': off
-
-  # Prefers a non-null assertion over explicit type cast when possible
-  '@typescript-eslint/non-nullable-type-assertion-style': warn
-
-  # Prefer initializing each enums member value
-  '@typescript-eslint/prefer-enum-initializers': error
-
-  # Require that all enum members be literal values to prevent unintended enum member name shadow issues
-  '@typescript-eslint/prefer-literal-enum-member': error
-
-  # There is no enforce of the usage of the nullish coalescing operator instead of logical chaining
-  '@typescript-eslint/prefer-nullish-coalescing': off
-
-  # There is no prefer of using concise optional chain expressions instead of chained logical ands
-  '@typescript-eslint/prefer-optional-chain': off
-
-  # Do not requires any function or method that returns a Promise to be marked async
-  '@typescript-eslint/promise-function-async': off
-
-  # Allows unbound methods to be called outside their expected scope
-  '@typescript-eslint/unbound-method': off
-
-  # Do not require explicit return and argument types on exported functions' and classes' public class methods
-  '@typescript-eslint/explicit-module-boundary-types': off
-
-  # Disable check of conditionals where the type is always truthy or always falsy
-  '@typescript-eslint/no-unnecessary-condition': off
-
-  # Allows generic Array constructors
-  'no-array-constructor': off
-  '@typescript-eslint/no-array-constructor': off
-
-  # Allows the use of variables before they are defined
-  'no-use-before-define': off
-  '@typescript-eslint/no-use-before-define': off
-
-# Specific lint overrides
-overrides:
-  # Allow the use of custom TypeScript modules and namespaces for JSX shapes
-  - files:
-    - '*.shape.ts'
-    rules:
-      '@typescript-eslint/no-namespace': off
-      # Temporary of as false positive
-      '@typescript-eslint/no-unnecessary-type-arguments': off
-
-  - files:
-    - '**/polyfills/**/*.ts'
-    rules:
-      'no-new-wrappers': off
diff --git a/linting/codestyle.eslintrc.yml b/linting/codestyle.eslintrc.yml
deleted file mode 100644
index a6fb47850..000000000
--- a/linting/codestyle.eslintrc.yml
+++ /dev/null
@@ -1,258 +0,0 @@
-rules:
-  # ==== Naming Convention ====
-  # Enforces naming conventions for everything across a codebase
-  # TODO: configure
-  # '@typescript-eslint/naming-convention':
-  #  - warn
-  #  - selector: variable
-  #    format: [ camelCase, PascalCase, UPPER_CASE ]
-  #    leadingUnderscore: allow
-
-  # ==== Spacing | Code style ====
-
-  # Warn about multiple empty lines
-  'no-multiple-empty-lines':
-    - warn
-    - max: 2
-      maxEOF: 1
-      maxBOF: 1
-
-  # Warn about spaces inside of parentheses
-  'space-in-parens':
-    - warn
-    - never
-
-  # Warn about missing space before blocks
-  'space-before-blocks':
-    - warn
-    - always
-
-  # Limit Cyclomatic Complexity
-  'complexity': warn
-
-  # Require following curly brace conventions
-  'curly':
-    - warn
-    - multi-line
-
-  'arrow-parens':
-    - warn
-    - always
-
-  # Max 3 classes per file (ideally 1 per file)
-  'max-classes-per-file':
-    - warn
-    - 3
-
-  # Warn about a maximum line length to be 160
-  'max-len':
-    - warn
-    - code: 160
-
-  # Require parentheses when invoking a constructor with no arguments
-  'new-parens': error
-
-  # Warn about empty block statements
-  'no-empty': warn
-
-  # Disallow mixed spaces and tabs for indentation
-  'no-mixed-spaces-and-tabs': error
-
-  # Warn about trailing whitespace at the end of lines
-  'no-trailing-spaces': warn
-
-  # Underscores allowed due to 'private-member' notation
-  'no-underscore-dangle': off
-
-  # 'var' declaration operator is not allowed
-  'no-var': error
-
-  # Warn to prefer shorthand object keys
-  'object-shorthand': warn
-
-  # Disallow multiple declaration per one line or declaration operator
-  'one-var':
-    - error
-    - never
-
-  # Using of arrow functions is optional
-  'prefer-arrow-callback': off
-
-  # Prefer const declaration operator
-  'prefer-const': error
-
-  # Enforce location of semicolons
-  'semi-style':
-    - error
-    - last
-
-  # Requires a whitespace at the beginning of a comment
-  'spaced-comment': warn
-
-  # Limit max lines count per file to 400
-  'max-lines':
-    - warn
-    # TODO: make smaller
-    - 450
-
-  # Prefer consistent brace style for blocks
-  'brace-style': off
-  '@typescript-eslint/brace-style': warn
-
-  # Prefer consistent spacing before and after commas
-  'comma-dangle': off
-  '@typescript-eslint/comma-spacing': warn
-
-  # Allows trailing comma
-  'comma-spacing': off
-  '@typescript-eslint/comma-dangle': off
-
-  # Do not enforce dot notation whenever possible
-  'dot-notation': off
-  '@typescript-eslint/dot-notation': off
-
-  # Require consistent spacing around type annotations
-  '@typescript-eslint/type-annotation-spacing': warn
-
-  # Prefers consistent usage of type assertions
-  '@typescript-eslint/consistent-type-assertions': warn
-
-  # Require a semicolon member delimiter style for interfaces and type literals
-  '@typescript-eslint/member-delimiter-style':
-    - warn
-    - multiline:
-        delimiter: 'semi'
-        requireLast: true
-      singleline:
-        delimiter: 'comma'
-        requireLast: false
-
-  # Require the use of the namespace keyword instead of the module keyword to declare custom TypeScript modules
-  '@typescript-eslint/prefer-namespace-keyword': warn
-
-  # Require spacing between function identifiers and their invocations
-  'func-call-spacing': off
-  '@typescript-eslint/func-call-spacing':
-    - warn
-    - never
-
-  # Warn for consistent indentations
-  'indent': off
-  '@typescript-eslint/indent':
-    - warn
-    - 2
-    - ignoredNodes: [FunctionExpression, FunctionDeclaration]
-      SwitchCase: 1
-      ObjectExpression: 1
-      ImportDeclaration: 1
-      flatTernaryExpressions: false
-
-  # Allows initialization in variable declarations
-  'init-declarations': off
-  '@typescript-eslint/init-declarations': off
-
-  # Require consistent spacing before and after keywords
-  'keyword-spacing': off
-  '@typescript-eslint/keyword-spacing':
-    - warn
-    - after: true
-      before: true
-
-  # Allows an empty line between class members
-  'lines-between-class-members': off
-  '@typescript-eslint/lines-between-class-members': off
-
-  # Warn about duplicate class members
-  'no-dupe-class-members': off
-  '@typescript-eslint/no-dupe-class-members': warn
-
-  # Allow unnecessary parentheses
-  'no-extra-parens': off
-  '@typescript-eslint/no-extra-parens': off
-
-  # Warn about unnecessary semicolons
-  'no-extra-semi': off
-  '@typescript-eslint/no-extra-semi': warn
-
-  # The use of eval()-like methods is not recommended
-  'no-eval': off
-  'no-implied-eval': off
-  '@typescript-eslint/no-implied-eval': warn
-
-  # Allows this keywords outside of classes or class-like objects
-  'no-invalid-this': off
-  '@typescript-eslint/no-invalid-this': off
-
-  # Warn about function declarations that contain unsafe references inside loop statements
-  'no-loop-func': off
-  '@typescript-eslint/no-loop-func': warn
-
-  # Warn about literal numbers that lose precision
-  'no-loss-of-precision': off
-  '@typescript-eslint/no-loss-of-precision': warn
-
-  # Disallow variable redeclaration
-  'no-redeclare': off
-  '@typescript-eslint/no-redeclare': error
-
-  # Warn about variable declarations that are shadowing variables declared in the outer scope
-  'no-shadow': off
-  '@typescript-eslint/no-shadow': warn
-
-  # Warn about throwing literals as exceptions
-  'no-throw-literal': off
-  '@typescript-eslint/no-throw-literal': warn
-
-  # Allows unused expressions
-  'no-unused-expressions': off
-  '@typescript-eslint/no-unused-expressions': off
-
-  # Warn about unused variables
-  'no-unused-vars': off
-  '@typescript-eslint/no-unused-vars':
-    - warn
-    - vars: all
-      args: none
-
-  # Warn about unnecessary constructors
-  'no-useless-constructor': off
-  '@typescript-eslint/no-useless-constructor': warn
-
-  # Enforce the consistent use of single quotes
-  'quotes': off
-  '@typescript-eslint/quotes':
-    - error
-    - single
-
-  # Do not warn if an async function has no await expression
-  'require-await': off
-  '@typescript-eslint/require-await': off
-
-  # Prefers consistent returning of awaited values
-  'return-await': off
-  '@typescript-eslint/return-await': warn
-
-  # Require semicolons instead of ASI
-  'semi': off
-  '@typescript-eslint/semi': error
-
-  # Prefer consistent spacing before function parenthesis
-  'space-before-function-paren': off
-  '@typescript-eslint/space-before-function-paren':
-    - warn
-    - anonymous: always
-      named: never
-      asyncArrow: always
-
-  # This rule is aimed at ensuring there are spaces around infix operators.
-  'space-infix-ops': off
-  '@typescript-eslint/space-infix-ops': warn
-
-  # Prefer consistent spacing inside braces
-  'object-curly-spacing': off
-  '@typescript-eslint/object-curly-spacing':
-    - warn
-    - never
-
-  # no spread preferences in bounds of the library
-  'prefer-spread': off
diff --git a/linting/eslint.config.coderules.js b/linting/eslint.config.coderules.js
new file mode 100644
index 000000000..72fb5917d
--- /dev/null
+++ b/linting/eslint.config.coderules.js
@@ -0,0 +1,295 @@
+module.exports = [
+  {
+    rules: {
+      // Verify calls of super() in constructors
+      'constructor-super': 'warn',
+
+      // Requires === and !== usage
+      'eqeqeq': 'warn',
+
+      // Require Guarding for-in to exclude prototype keys
+      'guard-for-in': 'warn',
+
+      // There is no blacklisted identifiers
+      'id-blacklist': 'off',
+
+      // Bitwise operators are not recommended
+      'no-bitwise': 'warn',
+
+      // Disallow use of caller/callee
+      'no-caller': 'error',
+
+      // Warn about assignment operators in conditional statements
+      'no-cond-assign': 'warn',
+
+      // Console API is formally allowed
+      'no-console': 'off',
+
+      // Debugger operator is not allowed
+      'no-debugger': 'error',
+
+      // Allows case statement to fallthrough
+      'no-fallthrough': 'off',
+
+      // Warn about using redundant primitive wrapper instances usage
+      'no-new-wrappers': 'warn',
+
+      // Warn about redundant initializing to undefined
+      'no-undef-init': 'warn',
+
+      // Disallow control flow statements in finally blocks
+      'no-unsafe-finally': 'error',
+
+      // Labels are not allowed
+      'no-labels': 'error',
+
+      // Require implicit radix parameter for parseInt
+        'radix': 'error',
+
+      // Require calls to isNaN() when checking for NaN
+        'use-isnan': 'error',
+
+      // Enforce comparing typeof expressions against valid strings
+      'valid-typeof': 'error',
+
+      // Enforces consistent usage of type imports
+      '@typescript-eslint/consistent-type-imports': [
+        'error', {
+          prefer: 'type-imports'
+        }
+      ],
+
+      // Disallow the use of custom TypeScript modules and namespaces
+      '@typescript-eslint/no-namespace': 'error',
+
+      // Disallows using a non-null assertion after an optional chain expression
+      '@typescript-eslint/no-non-null-asserted-optional-chain': 'error',
+
+      // Disallows invocation of require()
+      '@typescript-eslint/no-require-imports': 'error',
+
+      // Disallow aliasing this
+      '@typescript-eslint/no-this-alias': 'error',
+
+      // Flags unnecessary equality comparisons against boolean literals
+      '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',
+
+      // Disallows the use of require statements except in import statements
+      '@typescript-eslint/no-var-requires': 'error',
+
+      // Prefer usage of as const over literal type
+      '@typescript-eslint/prefer-as-const': 'error',
+
+      // Disallow iterating over an array with a for-in loop
+        '@typescript-eslint/no-for-in-array': 'error',
+
+      // Disallow extra non-null assertion
+      '@typescript-eslint/no-extra-non-null-assertion': 'error',
+
+      // Enforce default parameters to be last
+      'default-param-last': 'off',
+      '@typescript-eslint/default-param-last': 'error',
+
+      // Prefers member overloads to be consecutive
+      '@typescript-eslint/adjacent-overload-signatures': 'warn',
+
+      // Prefers using either T[] or Array<T> for arrays
+        '@typescript-eslint/array-type': 'warn',
+
+      // Warn about awaiting of a value that is not a Thenable
+      '@typescript-eslint/await-thenable': 'warn',
+
+      // Bans @ts-<directive> comments from being used or requires descriptions after directive
+      '@typescript-eslint/ban-ts-comment': 'warn',
+
+      // Bans Function types from being used
+      '@typescript-eslint/no-unsafe-function-type': 'warn',
+
+      // Bans usage of the {} type
+      '@typescript-eslint/no-empty-object-type': [
+        'warn', {
+          allowInterfaces: 'always'
+        }
+      ],
+
+      // Warn about invalid definition of new and constructor
+      '@typescript-eslint/no-misused-new': 'warn',
+
+      // Warns when a namespace qualifier is unnecessary
+      '@typescript-eslint/no-unnecessary-qualifier': 'warn',
+
+      // Prefers function types instead of interfaces with call signatures
+      '@typescript-eslint/prefer-function-type': 'warn',
+
+      // Sets preference level for triple slash directives versus ES6-style import declarations
+      '@typescript-eslint/triple-slash-reference': 'warn',
+
+      // Warns if a type assertion does not change the type of an expression
+      '@typescript-eslint/no-unnecessary-type-assertion': 'warn',
+
+      // It's recommended to pass a compareFn to the Array.sort method
+      '@typescript-eslint/require-array-sort-compare': 'warn',
+
+      // Warns if missed return type on functions or class methods
+      '@typescript-eslint/explicit-function-return-type': 'warn',
+
+      /** Ignores if two overloads could be unified into one by using a union or an optional/rest parameter
+       * Because of the possibility to separate TSDocs between different function/method overloads
+       */
+      '@typescript-eslint/unified-signatures': 'off',
+
+      // Allows the delete operator with computed key expressions
+      '@typescript-eslint/no-dynamic-delete': 'off',
+
+      // Allows the use of parameter properties in class constructors
+      '@typescript-eslint/no-parameter-properties': 'off',
+
+      // Allows the use of type aliases
+      '@typescript-eslint/no-type-alias': 'off',
+
+      // There is no prefer of ‘for-of’ loop over a standard ‘for’ loop if the index is only used to access the array being iterated
+      '@typescript-eslint/prefer-for-of': 'off',
+
+      // There is no restriction when adding two variables, operands must both be of type number or of type string
+      '@typescript-eslint/restrict-plus-operands': 'off',
+
+      // Do not restricts the types allowed in boolean expressions
+      '@typescript-eslint/strict-boolean-expressions': 'off',
+
+      // Allows the declaration of empty interfaces
+      '@typescript-eslint/no-empty-interface': 'off',
+
+      // Allows empty functions
+      'no-empty-function': 'off',
+      '@typescript-eslint/no-empty-function': 'off',
+
+      // Allows usage of the any type
+      '@typescript-eslint/no-explicit-any': 'off',
+
+      // Allows non-null assertions using the ! postfix operator
+      '@typescript-eslint/no-non-null-assertion': 'off',
+
+      // Do not ensures that literals on classes are exposed in a consistent style
+      '@typescript-eslint/class-literal-property-style': 'off',
+
+      // Allows the use of the record type
+      '@typescript-eslint/consistent-indexed-object-style': 'off',
+
+      // There is no preferences for interfaces or types
+      '@typescript-eslint/consistent-type-definitions': 'off',
+
+      // Do not require explicit accessibility modifiers on class properties and methods
+      '@typescript-eslint/explicit-member-accessibility': 'off',
+
+      /** Do not require a consistent member declaration order
+      * TODO: discuss for the future
+       */
+      'member-ordering': 'off',
+      '@typescript-eslint/member-ordering': 'off',
+
+      // There is no preferences of a particular method signature syntax
+      '@typescript-eslint/method-signature-style': 'off',
+
+      // Ensure .toString() is only called on objects which provide useful information when stringified
+      '@typescript-eslint/no-base-to-string': 'warn',
+
+      // Warn about non-null assertion in locations that may be confusing
+      '@typescript-eslint/no-confusing-non-null-assertion': 'warn',
+
+      // Do not requires expressions of type void to appear in statement position
+      '@typescript-eslint/no-confusing-void-expression': 'off',
+
+      // Do not forbids the use of classes as namespaces
+      '@typescript-eslint/no-extraneous-class': 'off',
+
+      /** Do not require Promise-like values to be handled appropriately
+      * TODO: enable
+       */
+      '@typescript-eslint/no-floating-promises': 'off',
+
+      // Allows usage of the implicit any type in catch clauses
+      '@typescript-eslint/no-implicit-any-catch': 'off',
+
+      // Allows explicit type declarations for variables or parameters initialized to a number, string, or boolean
+      '@typescript-eslint/no-inferrable-types': 'off',
+
+      // Allows usage of void type outside of generic or return types
+      '@typescript-eslint/no-invalid-void-type': 'off',
+
+      // There is no requirement of using promises in places not designed to handle them
+      '@typescript-eslint/no-misused-promises': 'off',
+
+      // Check that type arguments will not be used if not required
+      '@typescript-eslint/no-unnecessary-type-arguments': 'warn',
+
+      // Warn about unnecessary constraints on generic types
+      '@typescript-eslint/no-unnecessary-type-constraint': 'warn',
+
+      // Allows calling a function with an any type value
+      '@typescript-eslint/no-unsafe-argument': 'off',
+
+      // Allows assigning any to variables and properties
+      '@typescript-eslint/no-unsafe-assignment': 'off',
+
+      // Prefers a non-null assertion over explicit type cast when possible
+      '@typescript-eslint/non-nullable-type-assertion-style': 'warn',
+
+      // Prefer initializing each enums member value
+      '@typescript-eslint/prefer-enum-initializers': 'error',
+
+      // Require that all enum members be literal values to prevent unintended enum member name shadow issues
+      '@typescript-eslint/prefer-literal-enum-member': 'error',
+
+      // There is no enforce of the usage of the nullish coalescing operator instead of logical chaining
+      '@typescript-eslint/prefer-nullish-coalescing': 'off',
+
+      // There is no prefer of using concise optional chain expressions instead of chained logical ands
+      '@typescript-eslint/prefer-optional-chain': 'off',
+
+      // Do not requires any function or method that returns a Promise to be marked async
+      '@typescript-eslint/promise-function-async': 'off',
+
+      // Allows unbound methods to be called outside their expected scope
+      '@typescript-eslint/unbound-method': 'off',
+
+      // Do not require explicit return and argument types on exported functions' and classes' public class methods
+      '@typescript-eslint/explicit-module-boundary-types': 'off',
+
+      // Disable check of conditionals where the type is always truthy or always falsy
+      '@typescript-eslint/no-unnecessary-condition': 'off',
+
+      // Allows generic Array constructors
+      'no-array-constructor': 'off',
+      '@typescript-eslint/no-array-constructor': 'off',
+
+      // Allows the use of variables before they are defined
+      'no-use-before-define': 'off',
+      '@typescript-eslint/no-use-before-define': 'off'
+    }
+  },
+  {
+    files: ["**/*.shape.ts"],
+    rules: {
+      '@typescript-eslint/no-namespace': "off",
+      // Temporary of as false positive
+      '@typescript-eslint/no-unnecessary-type-arguments': "off"
+    }
+  },
+  {
+    files: ["**/polyfills/**/*.ts"],
+    rules: {
+      'no-new-wrappers': "off"
+    }
+  },
+  {
+    files: ["**/*.test.ts", "**/*.spec.ts"],
+    rules: {
+      // ts-ignore is off to test clean es cases
+      '@typescript-eslint/ban-ts-comment': "off",
+      // there is no need to evaluate tests strictly
+      '@typescript-eslint/non-nullable-type-assertion-style': "off",
+      // return type on functions or class methods is not required in tests
+      '@typescript-eslint/explicit-function-return-type': "off"
+    }
+  }
+]
diff --git a/linting/eslint.config.codestyle.js b/linting/eslint.config.codestyle.js
new file mode 100644
index 000000000..f42088ea9
--- /dev/null
+++ b/linting/eslint.config.codestyle.js
@@ -0,0 +1,139 @@
+const eslint = require('@eslint/js');
+const tseslint = require('typescript-eslint');
+
+module.exports = [
+  eslint.configs.recommended,
+  ...tseslint.configs.recommended,
+  {
+    plugins: {
+      eslint,
+      '@typescript-eslint': tseslint.plugin,
+    },
+    rules: {
+      // Enforces naming conventions for everything across a codebase
+      // TODO: configure
+      // '@typescript-eslint/naming-convention': [
+      //    warn, {
+      //      selector: variable,
+      //      format: [ camelCase, PascalCase, UPPER_CASE ],
+      //      leadingUnderscore: allow
+      //    }
+      //  ]
+
+      // Limit Cyclomatic Complexity
+      'complexity': 'warn',
+
+      // Require following curly brace conventions
+      'curly': ['warn', 'multi-line'],
+
+      // Max 3 classes per file (ideally 1 per file)
+      'max-classes-per-file': ['warn', 3],
+
+      // Warn about empty block statements
+      'no-empty': 'warn',
+
+      // Underscores allowed due to 'private-member' notation
+      'no-underscore-dangle': 'off',
+
+      // 'var' declaration operator is not allowed
+      'no-var': 'error',
+
+      // Warn to prefer shorthand object keys
+      'object-shorthand': 'warn',
+
+      // Disallow multiple declaration per one line or declaration operator
+      'one-var': ['error', 'never'],
+
+      // Using of arrow functions is optional
+      'prefer-arrow-callback': 'off',
+
+      // Prefer const declaration operator
+      'prefer-const': 'error',
+
+      // Limit max lines count per file to 400
+      'max-lines': ['warn', 450],
+
+      // Do not enforce dot notation whenever possible
+      'dot-notation': 'off',
+      '@typescript-eslint/dot-notation': 'off',
+
+      // Prefers consistent usage of type assertions
+      '@typescript-eslint/consistent-type-assertions': 'warn',
+
+      // Require the use of the namespace keyword instead of the module keyword to declare custom TypeScript modules
+      '@typescript-eslint/prefer-namespace-keyword': 'warn',
+
+      // Allows initialization in variable declarations
+      'init-declarations': 'off',
+      '@typescript-eslint/init-declarations': 'off',
+
+      // Warn about duplicate class members
+      'no-dupe-class-members': 'off',
+      '@typescript-eslint/no-dupe-class-members': 'warn',
+
+      // The use of eval()-like methods is not recommended
+      'no-eval': 'off',
+      'no-implied-eval': 'off',
+      '@typescript-eslint/no-implied-eval': 'warn',
+
+      // Allows this keywords outside of classes or class-like objects
+      'no-invalid-this': 'off',
+      '@typescript-eslint/no-invalid-this': 'off',
+
+      // Warn about function declarations that contain unsafe references inside loop statements
+      'no-loop-func': 'off',
+      '@typescript-eslint/no-loop-func': 'warn',
+
+      // Warn about literal numbers that lose precision
+      'no-loss-of-precision': 'off',
+      '@typescript-eslint/no-loss-of-precision': 'warn',
+
+      // Disallow variable redeclaration
+      'no-redeclare': 'off',
+      '@typescript-eslint/no-redeclare': 'error',
+
+      // Warn about variable declarations that are shadowing variables declared in the outer scope
+      'no-shadow': 'off',
+      '@typescript-eslint/no-shadow': 'warn',
+
+      // Warn about throwing literals as exceptions
+      'only-throw-error': 'off',
+      '@typescript-eslint/only-throw-error': 'warn',
+
+      // Allows unused expressions
+      'no-unused-expressions': 'off',
+      '@typescript-eslint/no-unused-expressions': 'off',
+
+      // Warn about unused variables
+      'no-unused-vars': 'off',
+      '@typescript-eslint/no-unused-vars': [
+        'warn',
+        {
+          vars: 'all', caughtErrors: 'none', args: 'none'
+        }
+      ],
+
+      // Warn about unnecessary constructors
+      'no-useless-constructor': 'off',
+      '@typescript-eslint/no-useless-constructor': 'warn',
+
+      // Do not warn if an async function has no await expression
+      'require-await': 'off',
+      '@typescript-eslint/require-await': 'off',
+
+      // Prefers consistent returning of awaited values
+      'return-await': 'off',
+      '@typescript-eslint/return-await': 'warn',
+
+      // No spread preferences in bounds of the library
+      'prefer-spread': 'off'
+    }
+  },
+  {
+    files: ["**/*.test.ts", "**/*.spec.ts"],
+    rules: {
+      // no class count limit for tests
+      'max-classes-per-file': "off"
+    }
+  }
+]
diff --git a/linting/eslint.config.editorconfig.js b/linting/eslint.config.editorconfig.js
new file mode 100644
index 000000000..f1cb017a4
--- /dev/null
+++ b/linting/eslint.config.editorconfig.js
@@ -0,0 +1,17 @@
+const editorconfig = require('eslint-plugin-editorconfig');
+
+module.exports = [
+  {
+    plugins: {
+      editorconfig
+    },
+    rules: {
+      // Enforce charset check
+      'editorconfig/charset': "warn",
+      // Enforce EOL for all files
+      'editorconfig/eol-last': "warn",
+      // Require no trailing spaces
+      'editorconfig/no-trailing-spaces': "warn"
+    }
+  }
+];
diff --git a/linting/eslint.config.ignore.js b/linting/eslint.config.ignore.js
new file mode 100644
index 000000000..410c4af8d
--- /dev/null
+++ b/linting/eslint.config.ignore.js
@@ -0,0 +1,25 @@
+module.exports = [
+  {
+    ignores: [
+      // Common configuration
+      '**/jest.config.js',
+      '**/jest*.config.js',
+      'eslint.config.js',
+      'site/webpack.config.js',
+      // Lint configuration
+      'linting/eslint.config.*.js',
+      // Common directories
+      'build/**',
+      'node_modules/**',
+      // Generated sources
+      '/modules/**',
+      '/polyfills/**',
+      // Submodule output
+      '/site/dist/**',
+      '/eslint/dist/**',
+      // E2E tests commons
+      'e2e/reporters/**',
+      'e2e/transformer/**',
+    ]
+  }
+]
diff --git a/linting/eslint.config.import.js b/linting/eslint.config.import.js
new file mode 100644
index 000000000..7fd21b4df
--- /dev/null
+++ b/linting/eslint.config.import.js
@@ -0,0 +1,48 @@
+const importPlugin = require('eslint-plugin-import-x');
+
+module.exports = [
+  {
+    plugins: {
+      'import': importPlugin
+    },
+    files: ["eslint/src/**/*.ts"],
+    rules: {
+      // Enforce a convention in module import order
+      'import/order': [
+        'warn', {
+          'groups': ['builtin', 'external', 'parent', 'sibling', 'index', 'object', 'type']
+        }
+      ],
+
+      // Reports funny business with exports, like repeated exports of names or defaults.
+      'import/export': 'warn',
+
+      // Warn about duplicate imports
+      'no-duplicate-imports': 'off',
+      'import/no-duplicates': 'warn',
+
+      // Verifies that all named imports are part of the set of named exports in the referenced module.
+      'import/named': 'error',
+
+      // Prohibit default exports
+      'import/no-default-export': 'warn',
+
+      // Forbid a module from importing itself
+      'import/no-self-import': 'error',
+
+      // Deprecate cyclic dependencies
+      'import/no-cycle': 'error'
+    }
+  },
+  {
+    files: ["site/**/*.ts"],
+    rules: {
+      'no-restricted-imports': ["error", {
+        "patterns": [{
+          "group": ["../../**/modules/**", "../../**/polyfills/**"],
+          'message': "Do not import from src/modules directly. Use the `@exadel/esl` package resolved by NPM workspaces instead."
+        }]
+      }]
+    }
+  }
+]
diff --git a/linting/eslint.config.language.js b/linting/eslint.config.language.js
new file mode 100644
index 000000000..3bbbf4906
--- /dev/null
+++ b/linting/eslint.config.language.js
@@ -0,0 +1,14 @@
+const tseslint = require('typescript-eslint');
+module.exports = [
+  {
+    languageOptions: {
+      ecmaVersion: 2017,
+      sourceType: "module",
+      parser: tseslint.parser,
+      parserOptions: {
+        projectService: true,
+        tsconfigRootDir: __dirname,
+      }
+    }
+  }
+]
diff --git a/linting/eslint.config.sonarjs.js b/linting/eslint.config.sonarjs.js
new file mode 100644
index 000000000..1bb48d677
--- /dev/null
+++ b/linting/eslint.config.sonarjs.js
@@ -0,0 +1,72 @@
+const sonarjs = require('eslint-plugin-sonarjs');
+
+module.exports = [
+  {
+    plugins: {
+      sonarjs
+    },
+    rules: {
+      /** Cognitive Complexity is a measure of how hard the control flow of a function is to understand.
+       *  Functions with high Cognitive Complexity will be difficult to maintain.
+       */
+      'sonarjs/cognitive-complexity': 'error',
+
+      // Limits maximum of switch cases before suggest a map
+      'sonarjs/max-switch-cases': ['error', 6],
+
+      // Merging collapsible if statements increases the code's readability.
+      'sonarjs/no-collapsible-if': 'error',
+
+      // Having all branches in a switch or if chain with the same implementation is an error.
+      'sonarjs/no-duplicated-branches': 'error',
+
+      /** If a boolean expression doesn’t change the evaluation of the condition,
+       *  then it is entirely unnecessary, and can be removed.
+       */
+      'sonarjs/no-gratuitous-expressions': 'warn',
+
+      // Disallows identical functions
+      'sonarjs/no-identical-functions': 'warn',
+
+      /** It is needlessly complex to invert the result of a boolean comparison.
+       *  The opposite comparison should be made instead.
+       */
+      'sonarjs/no-inverted-boolean-check': 'warn',
+
+      // Disallows nested switch structures as they are difficult to understand
+      'sonarjs/no-nested-switch': 'error',
+
+      // Redundant Boolean literals should be removed from expressions to improve readability.
+      'sonarjs/no-redundant-boolean': 'error',
+
+      // Disallows redundant jump statements, such as return, break and continue
+      'sonarjs/no-redundant-jump': 'error',
+
+      // Code is clearest when each statement has its own line.
+      'sonarjs/no-same-line-conditional': 'error',
+
+      // For just one or two cases however, the code will be more readable with if statements.
+      'sonarjs/no-small-switch': 'warn',
+
+      // This rule raises an issue when no methods are called on a collection other than those that add or remove values.
+      'sonarjs/no-unused-collection': 'error',
+
+      // Disallows empty catch statements
+      'sonarjs/no-useless-catch': 'error',
+
+      // Return of boolean literal statements wrapped into if-then-else ones should be simplified.
+      'sonarjs/prefer-single-boolean-return': 'error',
+
+      /** When only the condition expression is defined in a for loop, and the initialization and
+       * increment expressions are missing, a while loop should be used instead to increase readability.
+       */
+      'sonarjs/prefer-while': 'error',
+
+      // Prefer creating a literal instead of fill the object "key by key"
+      'sonarjs/prefer-object-literal': 'warn',
+
+      // Declaring a variable only to immediately return or throw it is a bad practice.
+      'sonarjs/prefer-immediate-return': 'warn'
+    }
+  }
+]
diff --git a/linting/eslint.config.stylistic.js b/linting/eslint.config.stylistic.js
new file mode 100644
index 000000000..4f46f9d73
--- /dev/null
+++ b/linting/eslint.config.stylistic.js
@@ -0,0 +1,135 @@
+const stylistic = require('@stylistic/eslint-plugin');
+
+module.exports = [
+  {
+    plugins: {
+      '@stylistic': stylistic
+    },
+    rules: {
+      '@stylistic/arrow-parens': ['warn', 'always'],
+
+      // Prefer consistent brace style for blocks
+      '@stylistic/brace-style': 'warn',
+
+      // Prefer consistent spacing before and after commas
+      '@stylistic/comma-spacing': 'warn',
+
+      // Allows trailing comma
+      '@stylistic/comma-dangle': 'off',
+
+      // Require spacing between function identifiers and their invocations
+      '@stylistic/function-call-spacing': ['warn', 'never'],
+
+      // Warn for consistent indentations
+      '@stylistic/indent': [
+        'warn',
+        2, {
+          ignoredNodes: ['FunctionExpression', 'FunctionDeclaration'],
+          SwitchCase: 1,
+          ObjectExpression: 1,
+          ImportDeclaration: 1,
+          flatTernaryExpressions: false
+        }
+      ],
+
+      // Require consistent spacing before and after keywords
+      '@stylistic/keyword-spacing': [
+        'warn', {
+          after: true,
+          before: true
+        }
+      ],
+
+      // Allows an empty line between class members
+      '@stylistic/lines-between-class-members': 'off',
+
+      // Warn about a maximum line length to be 160
+      '@stylistic/max-len': [
+        'warn', {
+          code: 160
+        }
+      ],
+
+      // Require a semicolon member delimiter style for interfaces and type literals
+      '@stylistic/member-delimiter-style': [
+        'warn', {
+          multiline: {
+            delimiter: 'semi',
+            requireLast: true
+          },
+          singleline: {
+            delimiter: 'comma',
+            requireLast: false
+          }
+        }
+      ],
+
+      // Require parentheses when invoking a constructor with no arguments
+      '@stylistic/new-parens': 'error',
+
+      // Allow unnecessary parentheses
+      '@stylistic/no-extra-parens': 'off',
+
+      // Warn about unnecessary semicolons
+      '@stylistic/no-extra-semi': 'warn',
+
+      // Disallow mixed spaces and tabs for indentation
+      '@stylistic/no-mixed-spaces-and-tabs': 'error',
+
+      // Warn about multiple empty lines
+      '@stylistic/no-multiple-empty-lines': [
+        'warn', {
+          max: 2,
+          maxEOF: 1,
+          maxBOF: 1
+        }
+      ],
+
+      // Warn about trailing whitespace at the end of lines
+      '@stylistic/no-trailing-spaces': 'warn',
+
+      // Prefer consistent spacing inside braces
+      '@stylistic/object-curly-spacing': ['warn', 'never'],
+
+      // Enforce the consistent use of single quotes
+      '@stylistic/quotes': ['error', 'single'],
+
+      // Require semicolons instead of ASI
+      '@stylistic/semi': 'error',
+
+      // Enforce location of semicolons
+      '@stylistic/semi-style': ['error', 'last'],
+
+      // Warn about missing space before blocks
+      '@stylistic/space-before-blocks': ['warn', 'always'],
+
+      // Prefer consistent spacing before function parenthesis
+      '@stylistic/space-before-function-paren': [
+        'warn', {
+          anonymous: 'always',
+          named: 'never',
+          asyncArrow: 'always'
+        }
+      ],
+
+      // Warn about spaces inside of parentheses
+      '@stylistic/space-in-parens': ['warn', 'never'],
+
+      // This rule is aimed at ensuring there are spaces around infix operators.
+      '@stylistic/space-infix-ops': 'warn',
+
+      // Requires a whitespace at the beginning of a comment
+      '@stylistic/spaced-comment': 'warn',
+
+      // Require consistent spacing around type annotations
+      '@stylistic/type-annotation-spacing': 'warn',
+    }
+  },
+  {
+    files: ["**/*.test.ts", "**/*.spec.ts"],
+    rules: {
+      // It's ok to write braces single line in tests
+      '@stylistic/brace-style': "off",
+    }
+  },
+]
diff --git a/linting/eslint.config.tsdoc.js b/linting/eslint.config.tsdoc.js
new file mode 100644
index 000000000..731b8d929
--- /dev/null
+++ b/linting/eslint.config.tsdoc.js
@@ -0,0 +1,13 @@
+const tsdoc = require('eslint-plugin-tsdoc');
+
+module.exports = [
+  {
+    plugins: {
+      tsdoc
+    },
+    rules: {
+      // Enable TS Doc syntax check
+      'tsdoc/syntax': "warn"
+    }
+  }
+];
diff --git a/linting/eslint.eslintrc.yml b/linting/eslint.eslintrc.yml
deleted file mode 100644
index c9c62deca..000000000
--- a/linting/eslint.eslintrc.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-# Specific lint overrides
-overrides:
-  - files:
-      - 'eslint/src/**/*.ts'
-    rules:
-      'import/no-default-export': off
diff --git a/linting/import.eslintrc.yml b/linting/import.eslintrc.yml
deleted file mode 100644
index 7e674885c..000000000
--- a/linting/import.eslintrc.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-rules:
-  # Enforce a convention in module import order
-  'import/order':
-    - warn
-    - groups:
-      - builtin
-      - external
-      - parent
-      - sibling
-      - index
-      - object
-      - type
-
-  # Reports funny business with exports, like repeated exports of names or defaults.
-  'import/export': warn
-
-  # Warn about duplicate imports
-  'no-duplicate-imports': off
-  'import/no-duplicates': warn
-
-  # Verifies that all named imports are part of the set of named exports in the referenced module.
-  'import/named': error
-
-  # Prohibit default exports
-  'import/no-default-export': warn
-
-  # Forbid a module from importing itself
-  'import/no-self-import': error
-
-  # Deprecate cyclic dependencies
-  'import/no-cycle': error
diff --git a/linting/site.eslintrc.yml b/linting/site.eslintrc.yml
deleted file mode 100644
index bf333bb37..000000000
--- a/linting/site.eslintrc.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-# Specific lint overrides
-overrides:
-  # Allow the use of custom TypeScript modules and namespaces for JSX shapes
-  - files:
-      - './site/**/*.ts'
-    rules:
-      no-restricted-imports:
-        - error
-        - patterns:
-            - group:
-                - ../../**/modules/**
-                - ../../**/polyfills/**
-              message: "Do not import from src/modules directly. Use the `@exadel/esl` package resolved by NPM workspaces instead."
diff --git a/linting/sonarjs.eslintrc.yml b/linting/sonarjs.eslintrc.yml
deleted file mode 100644
index e45516819..000000000
--- a/linting/sonarjs.eslintrc.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-rules:
-  # Cognitive Complexity is a measure of how hard the control flow of a function is to understand.
-  # Functions with high Cognitive Complexity will be difficult to maintain.
-  'sonarjs/cognitive-complexity': error
-
-  # Limits maximum of switch cases before suggest a map
-  'sonarjs/max-switch-cases':
-    - error
-    - 6
-
-  # Merging collapsible if statements increases the code's readability.
-  'sonarjs/no-collapsible-if': error
-
-  # Having all branches in a switch or if chain with the same implementation is an error.
-  'sonarjs/no-duplicated-branches': error
-
-  # If a boolean expression doesn’t change the evaluation of the condition,
-  # then it is entirely unnecessary, and can be removed.
-  'sonarjs/no-gratuitous-expressions': warn
-
-  # Disallows identical functions
-  'sonarjs/no-identical-functions': warn
-
-  # It is needlessly complex to invert the result of a boolean comparison.
-  # The opposite comparison should be made instead.
-  'sonarjs/no-inverted-boolean-check': warn
-
-  # Disallows nested switch structures as they are difficult to understand
-  'sonarjs/no-nested-switch': error
-
-  # Redundant Boolean literals should be removed from expressions to improve readability.
-  'sonarjs/no-redundant-boolean': error
-
-  # Disallows redundant jump statements, such as return, break and continue
-  'sonarjs/no-redundant-jump': error
-
-  # Code is clearest when each statement has its own line.
-  'sonarjs/no-same-line-conditional': error
-
-  # For just one or two cases however, the code will be more readable with if statements.
-  'sonarjs/no-small-switch': warn
-
-  # This rule raises an issue when no methods are called on a collection other than those that add or remove values.
-  'sonarjs/no-unused-collection': error
-
-  # Disallows empty catch statements
-  'sonarjs/no-useless-catch': error
-
-  # Return of boolean literal statements wrapped into if-then-else ones should be simplified.
-  'sonarjs/prefer-single-boolean-return': error
-
-  # When only the condition expression is defined in a for loop, and the initialization and
-  # increment expressions are missing, a while loop should be used instead to increase readability.
-  'sonarjs/prefer-while': error
-
-  # Prefer creating a literal instead of fill the object "key by key"
-  'sonarjs/prefer-object-literal': warn
-
-  # Declaring a variable only to immediately return or throw it is a bad practice.
-  'sonarjs/prefer-immediate-return': warn
diff --git a/package-lock.json b/package-lock.json
index deb6e4ae8..f2b2b90ce 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
       "devDependencies": {
         "@commitlint/cli": "^19.4.1",
         "@commitlint/config-conventional": "^19.4.1",
+        "@eslint/js": "^9.9.1",
         "@exadel/eslint-plugin-esl": "file:eslint",
         "@semantic-release/changelog": "^6.0.3",
         "@semantic-release/commit-analyzer": "^13.0.0",
@@ -27,16 +28,17 @@
         "@semantic-release/github": "^10.1.7",
         "@semantic-release/npm": "^12.0.1",
         "@semantic-release/release-notes-generator": "^14.0.1",
+        "@stylistic/eslint-plugin": "^2.6.4",
         "@types/jest": "^29.5.12",
-        "@typescript-eslint/eslint-plugin": "^7.18.0",
-        "@typescript-eslint/parser": "^7.18.0",
+        "@typescript-eslint/eslint-plugin": "^8.3.0",
+        "@typescript-eslint/parser": "^8.3.0",
         "chokidar-cli": "^3.0.0",
         "concurrently": "^8.2.2",
         "copyfiles": "^2.4.1",
         "cross-env": "^7.0.3",
-        "eslint": "^8.57.0",
+        "eslint": "^9.9.1",
         "eslint-plugin-editorconfig": "^4.0.3",
-        "eslint-plugin-import": "^2.29.1",
+        "eslint-plugin-import-x": "^4.1.0",
         "eslint-plugin-sonarjs": "^1.0.4",
         "eslint-plugin-tsdoc": "^0.3.0",
         "foreach-cli": "^1.8.1",
@@ -55,7 +57,8 @@
         "stylelint": "^16.9.0",
         "stylelint-prettier": "^5.0.2",
         "ts-jest": "^29.2.5",
-        "typescript": "5.5.4"
+        "typescript": "5.5.4",
+        "typescript-eslint": "^8.3.0"
       }
     },
     "e2e": {
@@ -1343,22 +1346,60 @@
       }
     },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
-      "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+      "version": "4.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
+      "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
+      "license": "MIT",
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
+    "node_modules/@eslint/config-array": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
+      "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@eslint/object-schema": "^2.1.4",
+        "debug": "^4.3.1",
+        "minimatch": "^3.1.2"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/@eslint/config-array/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
-      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
+      "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+      "license": "MIT",
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.6.0",
-        "globals": "^13.19.0",
+        "espree": "^10.0.1",
+        "globals": "^14.0.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -1366,7 +1407,7 @@
         "strip-json-comments": "^3.1.1"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
@@ -1376,6 +1417,7 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -1391,6 +1433,7 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -1399,12 +1442,14 @@
     "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "license": "MIT"
     },
     "node_modules/@eslint/eslintrc/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -1413,11 +1458,21 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
-      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+      "version": "9.9.1",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz",
+      "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==",
+      "license": "MIT",
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
+    "node_modules/@eslint/object-schema": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
+      "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
     "node_modules/@exadel/esl": {
@@ -1469,6 +1524,9 @@
       "version": "0.11.14",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
       "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+      "deprecated": "Use @eslint/config-array instead",
+      "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "@humanwhocodes/object-schema": "^2.0.2",
         "debug": "^4.3.1",
@@ -1482,6 +1540,8 @@
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -1491,6 +1551,8 @@
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -1513,7 +1575,23 @@
     "node_modules/@humanwhocodes/object-schema": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
-      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
+      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+      "deprecated": "Use @eslint/object-schema instead",
+      "dev": true,
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@humanwhocodes/retry": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz",
+      "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
     },
     "node_modules/@iarna/toml": {
       "version": "2.2.5",
@@ -3384,6 +3462,53 @@
         "@sinonjs/commons": "^3.0.0"
       }
     },
+    "node_modules/@stylistic/eslint-plugin": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.7.1.tgz",
+      "integrity": "sha512-JqnHom8CP14oOgPhwTPbn0QgsBJwgNySQSe00V9GQQDlY1tEqZUlK4jM2DIOJ5nE+oXoy51vZWHnHkfZ6rEruw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/eslint": "^9.6.1",
+        "@typescript-eslint/utils": "^8.3.0",
+        "eslint-visitor-keys": "^4.0.0",
+        "espree": "^10.1.0",
+        "estraverse": "^5.3.0",
+        "picomatch": "^4.0.2"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "peerDependencies": {
+        "eslint": ">=8.40.0"
+      }
+    },
+    "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+      "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
     "node_modules/@tootallnate/once": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
@@ -3449,23 +3574,16 @@
       }
     },
     "node_modules/@types/eslint": {
-      "version": "8.56.10",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
-      "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
       }
     },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
-      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@@ -3779,12 +3897,6 @@
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
     },
-    "node_modules/@types/json5": {
-      "version": "0.0.29",
-      "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
-      "dev": true
-    },
     "node_modules/@types/minimatch": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
@@ -3878,34 +3990,36 @@
     "node_modules/@types/youtube": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/@types/youtube/-/youtube-0.1.0.tgz",
-      "integrity": "sha512-Pg33m3X2mFgdmhtvzOlAfUfgOa3341N3/2JCrVY/mXVxb4hagcqqEG6w4vGCfB64StQNWHSj/T8Eotb1Rko/FQ=="
+      "integrity": "sha512-Pg33m3X2mFgdmhtvzOlAfUfgOa3341N3/2JCrVY/mXVxb4hagcqqEG6w4vGCfB64StQNWHSj/T8Eotb1Rko/FQ==",
+      "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
-      "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.3.0.tgz",
+      "integrity": "sha512-FLAIn63G5KH+adZosDYiutqkOkYEx0nvcwNNfJAf+c7Ae/H35qWwTYvPZUKFj5AS+WfHG/WJJfWnDnyNUlp8UA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "7.18.0",
-        "@typescript-eslint/type-utils": "7.18.0",
-        "@typescript-eslint/utils": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0",
+        "@typescript-eslint/scope-manager": "8.3.0",
+        "@typescript-eslint/type-utils": "8.3.0",
+        "@typescript-eslint/utils": "8.3.0",
+        "@typescript-eslint/visitor-keys": "8.3.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
         "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "@typescript-eslint/parser": "^7.0.0",
-        "eslint": "^8.56.0"
+        "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+        "eslint": "^8.57.0 || ^9.0.0"
       },
       "peerDependenciesMeta": {
         "typescript": {
@@ -3914,26 +4028,27 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz",
-      "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.3.0.tgz",
+      "integrity": "sha512-h53RhVyLu6AtpUzVCYLPhZGL5jzTD9fZL+SYf/+hYOx2bDkyQXztXSc4tbvKYHzfMXExMLiL9CWqJmVz6+78IQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "7.18.0",
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/typescript-estree": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0",
+        "@typescript-eslint/scope-manager": "8.3.0",
+        "@typescript-eslint/types": "8.3.0",
+        "@typescript-eslint/typescript-estree": "8.3.0",
+        "@typescript-eslint/visitor-keys": "8.3.0",
         "debug": "^4.3.4"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "eslint": "^8.56.0"
+        "eslint": "^8.57.0 || ^9.0.0"
       },
       "peerDependenciesMeta": {
         "typescript": {
@@ -3942,16 +4057,17 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
-      "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.3.0.tgz",
+      "integrity": "sha512-mz2X8WcN2nVu5Hodku+IR8GgCOl4C0G/Z1ruaWN4dgec64kDBabuXyPAr+/RgJtumv8EEkqIzf3X2U5DUKB2eg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0"
+        "@typescript-eslint/types": "8.3.0",
+        "@typescript-eslint/visitor-keys": "8.3.0"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
@@ -3959,26 +4075,24 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
-      "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.3.0.tgz",
+      "integrity": "sha512-wrV6qh//nLbfXZQoj32EXKmwHf4b7L+xXLrP3FZ0GOUU72gSvLjeWUl5J5Ue5IwRxIV1TfF73j/eaBapxx99Lg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "7.18.0",
-        "@typescript-eslint/utils": "7.18.0",
+        "@typescript-eslint/typescript-estree": "8.3.0",
+        "@typescript-eslint/utils": "8.3.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
-      "peerDependencies": {
-        "eslint": "^8.56.0"
-      },
       "peerDependenciesMeta": {
         "typescript": {
           "optional": true
@@ -3986,12 +4100,13 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz",
-      "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.3.0.tgz",
+      "integrity": "sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
@@ -3999,22 +4114,23 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
-      "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.3.0.tgz",
+      "integrity": "sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/visitor-keys": "7.18.0",
+        "@typescript-eslint/types": "8.3.0",
+        "@typescript-eslint/visitor-keys": "8.3.0",
         "debug": "^4.3.4",
-        "globby": "^11.1.0",
+        "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
         "minimatch": "^9.0.4",
         "semver": "^7.6.0",
         "ts-api-utils": "^1.3.0"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
@@ -4026,68 +4142,41 @@
         }
       }
     },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-      "dev": true,
-      "dependencies": {
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.2.9",
-        "ignore": "^5.2.0",
-        "merge2": "^1.4.1",
-        "slash": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/@typescript-eslint/utils": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz",
-      "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.3.0.tgz",
+      "integrity": "sha512-F77WwqxIi/qGkIGOGXNBLV7nykwfjLsdauRB/DOFPdv6LTF3BHHkBpq81/b5iMPSF055oO2BiivDJV4ChvNtXA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "7.18.0",
-        "@typescript-eslint/types": "7.18.0",
-        "@typescript-eslint/typescript-estree": "7.18.0"
+        "@typescript-eslint/scope-manager": "8.3.0",
+        "@typescript-eslint/types": "8.3.0",
+        "@typescript-eslint/typescript-estree": "8.3.0"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "eslint": "^8.56.0"
+        "eslint": "^8.57.0 || ^9.0.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.18.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
-      "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.3.0.tgz",
+      "integrity": "sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "7.18.0",
+        "@typescript-eslint/types": "8.3.0",
         "eslint-visitor-keys": "^3.4.3"
       },
       "engines": {
-        "node": "^18.18.0 || >=20.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "type": "opencollective",
@@ -4097,7 +4186,9 @@
     "node_modules/@ungap/structured-clone": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
-      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
+      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.12.1",
@@ -4294,9 +4385,10 @@
       "dev": true
     },
     "node_modules/acorn": {
-      "version": "8.11.3",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
-      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -4326,6 +4418,7 @@
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
       "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "license": "MIT",
       "peerDependencies": {
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
@@ -4481,26 +4574,6 @@
       "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==",
       "dev": true
     },
-    "node_modules/array-includes": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
-      "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2",
-        "es-object-atoms": "^1.0.0",
-        "get-intrinsic": "^1.2.4",
-        "is-string": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/array-union": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -4517,62 +4590,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/array.prototype.findlastindex": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
-      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
-        "es-shim-unscopables": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array.prototype.flat": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
-      "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array.prototype.flatmap": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
-      "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "es-shim-unscopables": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/arraybuffer.prototype.slice": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
@@ -6959,6 +6976,8 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
       "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "esutils": "^2.0.2"
       },
@@ -7182,9 +7201,9 @@
       }
     },
     "node_modules/enhanced-resolve": {
-      "version": "5.17.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
-      "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+      "version": "5.17.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+      "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -7374,15 +7393,6 @@
         "node": ">= 0.4"
       }
     },
-    "node_modules/es-shim-unscopables": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
-      "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
-      "dev": true,
-      "dependencies": {
-        "hasown": "^2.0.0"
-      }
-    },
     "node_modules/es-to-primitive": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -7453,40 +7463,37 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
-      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "version": "9.9.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz",
+      "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==",
+      "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.57.0",
-        "@humanwhocodes/config-array": "^0.11.14",
+        "@eslint-community/regexpp": "^4.11.0",
+        "@eslint/config-array": "^0.18.0",
+        "@eslint/eslintrc": "^3.1.0",
+        "@eslint/js": "9.9.1",
         "@humanwhocodes/module-importer": "^1.0.1",
+        "@humanwhocodes/retry": "^0.3.0",
         "@nodelib/fs.walk": "^1.2.8",
-        "@ungap/structured-clone": "^1.2.0",
         "ajv": "^6.12.4",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.2.2",
-        "eslint-visitor-keys": "^3.4.3",
-        "espree": "^9.6.1",
-        "esquery": "^1.4.2",
+        "eslint-scope": "^8.0.2",
+        "eslint-visitor-keys": "^4.0.0",
+        "espree": "^10.1.0",
+        "esquery": "^1.5.0",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
+        "file-entry-cache": "^8.0.0",
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "graphemer": "^1.4.0",
         "ignore": "^5.2.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
         "is-path-inside": "^3.0.3",
-        "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
@@ -7500,10 +7507,18 @@
         "eslint": "bin/eslint.js"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
-        "url": "https://opencollective.com/eslint"
+        "url": "https://eslint.org/donate"
+      },
+      "peerDependencies": {
+        "jiti": "*"
+      },
+      "peerDependenciesMeta": {
+        "jiti": {
+          "optional": true
+        }
       }
     },
     "node_modules/eslint-import-resolver-node": {
@@ -7526,128 +7541,417 @@
         "ms": "^2.1.1"
       }
     },
-    "node_modules/eslint-module-utils": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz",
-      "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==",
+    "node_modules/eslint-plugin-editorconfig": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-editorconfig/-/eslint-plugin-editorconfig-4.0.3.tgz",
+      "integrity": "sha512-5YeDxm6mlv75DrTbRBK9Jw2ogqhjiz8ZCvv9bkuz/MXq0603q9FpQvQlamtas4bX1Gji4YcksY7dq7stPeGaLQ==",
       "dev": true,
       "dependencies": {
-        "debug": "^3.2.7"
+        "editorconfig": "^1.0.2",
+        "eslint": "^8.40.0",
+        "klona": "^2.0.4"
       },
       "engines": {
-        "node": ">=4"
-      },
-      "peerDependenciesMeta": {
-        "eslint": {
-          "optional": true
-        }
-      }
+        "node": ">=14",
+        "npm": ">=8"
+      }
     },
-    "node_modules/eslint-module-utils/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "ms": "^2.1.1"
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint-plugin-editorconfig": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-editorconfig/-/eslint-plugin-editorconfig-4.0.3.tgz",
-      "integrity": "sha512-5YeDxm6mlv75DrTbRBK9Jw2ogqhjiz8ZCvv9bkuz/MXq0603q9FpQvQlamtas4bX1Gji4YcksY7dq7stPeGaLQ==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/@eslint/js": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
       "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "editorconfig": "^1.0.2",
-        "eslint": "^8.40.0",
-        "klona": "^2.0.4"
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/eslint": {
+      "version": "8.57.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.57.0",
+        "@humanwhocodes/config-array": "^0.11.14",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint-plugin-editorconfig/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": ">=14",
-        "npm": ">=8"
+        "node": "*"
       }
     },
-    "node_modules/eslint-plugin-import": {
-      "version": "2.29.1",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
-      "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "array-includes": "^3.1.7",
-        "array.prototype.findlastindex": "^1.2.3",
-        "array.prototype.flat": "^1.3.2",
-        "array.prototype.flatmap": "^1.3.2",
-        "debug": "^3.2.7",
-        "doctrine": "^2.1.0",
-        "eslint-import-resolver-node": "^0.3.9",
-        "eslint-module-utils": "^2.8.0",
-        "hasown": "^2.0.0",
-        "is-core-module": "^2.13.1",
-        "is-glob": "^4.0.3",
-        "minimatch": "^3.1.2",
-        "object.fromentries": "^2.0.7",
-        "object.groupby": "^1.0.1",
-        "object.values": "^1.1.7",
-        "semver": "^6.3.1",
-        "tsconfig-paths": "^3.15.0"
+        "p-limit": "^3.0.2"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">=10"
       },
-      "peerDependencies": {
-        "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
       }
     },
-    "node_modules/eslint-plugin-import/node_modules/debug": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
-        "ms": "^2.1.1"
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/eslint-plugin-import/node_modules/doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+    "node_modules/eslint-plugin-editorconfig/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "esutils": "^2.0.2"
+        "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=8"
       }
     },
-    "node_modules/eslint-plugin-import/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+    "node_modules/eslint-plugin-import-x": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.1.1.tgz",
+      "integrity": "sha512-dBEM8fACIFNt4H7GoOaRmnH6evJW6JSTJTYYgmRd3vI4geBTjgDM/JyUDKUwIw0HDSyI+u7Vs3vFRXUo/BOAtA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "@typescript-eslint/typescript-estree": "^8.1.0",
+        "@typescript-eslint/utils": "^8.1.0",
+        "debug": "^4.3.4",
+        "doctrine": "^3.0.0",
+        "eslint-import-resolver-node": "^0.3.9",
+        "get-tsconfig": "^4.7.3",
+        "is-glob": "^4.0.3",
+        "minimatch": "^9.0.3",
+        "semver": "^7.6.3",
+        "stable-hash": "^0.0.4",
+        "tslib": "^2.6.3"
       },
       "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/eslint-plugin-import/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "peerDependencies": {
+        "eslint": "^8.57.0 || ^9.0.0"
       }
     },
     "node_modules/eslint-plugin-sonarjs": {
@@ -7673,15 +7977,16 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
-      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz",
+      "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^5.2.0"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
@@ -7767,6 +8072,18 @@
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
+    "node_modules/eslint/node_modules/eslint-visitor-keys": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+      "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
     "node_modules/eslint/node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -7857,16 +8174,29 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
-      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz",
+      "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==",
+      "license": "BSD-2-Clause",
       "dependencies": {
-        "acorn": "^8.9.0",
+        "acorn": "^8.12.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.1"
+        "eslint-visitor-keys": "^4.0.0"
       },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree/node_modules/eslint-visitor-keys": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
+      "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       },
       "funding": {
         "url": "https://opencollective.com/eslint"
@@ -8172,14 +8502,15 @@
       }
     },
     "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+      "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+      "license": "MIT",
       "dependencies": {
-        "flat-cache": "^3.0.4"
+        "flat-cache": "^4.0.0"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=16.0.0"
       }
     },
     "node_modules/filelist": {
@@ -8396,30 +8727,16 @@
       }
     },
     "node_modules/flat-cache": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
-      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+      "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+      "license": "MIT",
       "dependencies": {
         "flatted": "^3.2.9",
-        "keyv": "^4.5.3",
-        "rimraf": "^3.0.2"
+        "keyv": "^4.5.4"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/flat-cache/node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
+        "node": ">=16"
       }
     },
     "node_modules/flatted": {
@@ -8734,19 +9051,6 @@
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
     "node_modules/function-bind": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -8884,6 +9188,19 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/get-tsconfig": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz",
+      "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "resolve-pkg-maps": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+      }
+    },
     "node_modules/get-uri": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz",
@@ -9053,14 +9370,12 @@
       }
     },
     "node_modules/globals": {
-      "version": "13.24.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
-      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+      "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+      "license": "MIT",
       "engines": {
-        "node": ">=8"
+        "node": ">=18"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -9143,7 +9458,8 @@
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
-      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true
     },
     "node_modules/gray-matter": {
       "version": "4.0.3",
@@ -12273,7 +12589,7 @@
       "version": "1.21.6",
       "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
       "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
-      "dev": true,
+      "devOptional": true,
       "bin": {
         "jiti": "bin/jiti.js"
       }
@@ -13590,10 +13906,11 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "9.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
-      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -16614,55 +16931,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/object.fromentries": {
-      "version": "2.0.8",
-      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
-      "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object.groupby": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
-      "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.values": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
-      "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
-      "dev": true,
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -18331,6 +18599,16 @@
         "node": ">=8"
       }
     },
+    "node_modules/resolve-pkg-maps": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+      }
+    },
     "node_modules/resolve.exports": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
@@ -19337,6 +19615,13 @@
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
+    "node_modules/stable-hash": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
+      "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/stack-utils": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -20412,6 +20697,7 @@
       "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
       "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=16"
       },
@@ -20424,6 +20710,7 @@
       "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz",
       "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bs-logger": "^0.2.6",
         "ejs": "^3.1.10",
@@ -20550,43 +20837,11 @@
         "node": ">=8"
       }
     },
-    "node_modules/tsconfig-paths": {
-      "version": "3.15.0",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
-      "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
-      "dev": true,
-      "dependencies": {
-        "@types/json5": "^0.0.29",
-        "json5": "^1.0.2",
-        "minimist": "^1.2.6",
-        "strip-bom": "^3.0.0"
-      }
-    },
-    "node_modules/tsconfig-paths/node_modules/json5": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
-      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
-      "dev": true,
-      "dependencies": {
-        "minimist": "^1.2.0"
-      },
-      "bin": {
-        "json5": "lib/cli.js"
-      }
-    },
-    "node_modules/tsconfig-paths/node_modules/strip-bom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/tslib": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+      "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
+      "license": "0BSD"
     },
     "node_modules/type-check": {
       "version": "0.4.0",
@@ -20611,6 +20866,8 @@
       "version": "0.20.2",
       "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
       "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "license": "(MIT OR CC0-1.0)",
       "engines": {
         "node": ">=10"
       },
@@ -20719,6 +20976,30 @@
         "node": ">=14.17"
       }
     },
+    "node_modules/typescript-eslint": {
+      "version": "8.3.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.3.0.tgz",
+      "integrity": "sha512-EvWjwWLwwKDIJuBjk2I6UkV8KEQcwZ0VM10nR1rIunRDIP67QJTZAHBXTX0HW/oI1H10YESF8yWie8fRQxjvFA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@typescript-eslint/eslint-plugin": "8.3.0",
+        "@typescript-eslint/parser": "8.3.0",
+        "@typescript-eslint/utils": "8.3.0"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/typescript-eslint"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/uc.micro": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
@@ -20991,11 +21272,10 @@
       }
     },
     "node_modules/webpack": {
-      "version": "5.93.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
-      "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
+      "version": "5.94.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
+      "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
       "dependencies": {
-        "@types/eslint-scope": "^3.7.3",
         "@types/estree": "^1.0.5",
         "@webassemblyjs/ast": "^1.12.1",
         "@webassemblyjs/wasm-edit": "^1.12.1",
@@ -21004,7 +21284,7 @@
         "acorn-import-attributes": "^1.9.5",
         "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.0",
+        "enhanced-resolve": "^5.17.1",
         "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
diff --git a/package.json b/package.json
index 61aecbb3a..b5ea72718 100644
--- a/package.json
+++ b/package.json
@@ -96,6 +96,7 @@
   "devDependencies": {
     "@commitlint/cli": "^19.4.1",
     "@commitlint/config-conventional": "^19.4.1",
+    "@eslint/js": "^9.9.1",
     "@exadel/eslint-plugin-esl": "file:eslint",
     "@semantic-release/changelog": "^6.0.3",
     "@semantic-release/commit-analyzer": "^13.0.0",
@@ -103,16 +104,17 @@
     "@semantic-release/github": "^10.1.7",
     "@semantic-release/npm": "^12.0.1",
     "@semantic-release/release-notes-generator": "^14.0.1",
+    "@stylistic/eslint-plugin": "^2.6.4",
     "@types/jest": "^29.5.12",
-    "@typescript-eslint/eslint-plugin": "^7.18.0",
-    "@typescript-eslint/parser": "^7.18.0",
+    "@typescript-eslint/eslint-plugin": "^8.3.0",
+    "@typescript-eslint/parser": "^8.3.0",
     "chokidar-cli": "^3.0.0",
     "concurrently": "^8.2.2",
     "copyfiles": "^2.4.1",
     "cross-env": "^7.0.3",
-    "eslint": "^8.57.0",
+    "eslint": "^9.9.1",
     "eslint-plugin-editorconfig": "^4.0.3",
-    "eslint-plugin-import": "^2.29.1",
+    "eslint-plugin-import-x": "^4.1.0",
     "eslint-plugin-sonarjs": "^1.0.4",
     "eslint-plugin-tsdoc": "^0.3.0",
     "foreach-cli": "^1.8.1",
@@ -131,7 +133,8 @@
     "stylelint": "^16.9.0",
     "stylelint-prettier": "^5.0.2",
     "ts-jest": "^29.2.5",
-    "typescript": "5.5.4"
+    "typescript": "5.5.4",
+    "typescript-eslint": "^8.3.0"
   },
   "browserslist": [
     "last 3 versions",
diff --git a/src/modules/esl-carousel/renderers/esl-carousel.default.renderer.ts b/src/modules/esl-carousel/renderers/esl-carousel.default.renderer.ts
index c695665d2..00919ecd5 100644
--- a/src/modules/esl-carousel/renderers/esl-carousel.default.renderer.ts
+++ b/src/modules/esl-carousel/renderers/esl-carousel.default.renderer.ts
@@ -151,7 +151,6 @@ export class ESLDefaultCarouselRenderer extends ESLCarouselRenderer {
   }
 
   /** Ends current transition and make permanent all changes performed in the transition. */
-  // eslint-disable-next-line sonarjs/cognitive-complexity
   public async commit(offset: number, from: number, params: ESLCarouselActionParams): Promise<void> {
     const slideSize = this.slideSize + this.gap;
 
diff --git a/src/modules/esl-media/providers/youtube-provider.ts b/src/modules/esl-media/providers/youtube-provider.ts
index 8bd1f5f88..91afb3a40 100644
--- a/src/modules/esl-media/providers/youtube-provider.ts
+++ b/src/modules/esl-media/providers/youtube-provider.ts
@@ -38,7 +38,7 @@ export class YouTubeProvider extends BaseProvider {
         window.onYouTubeIframeAPIReady = (): void => {
           try {
             (typeof cbOrigin === 'function') && cbOrigin.apply(window);
-          } catch (err) { // eslint-disable-line
+          } catch (err) {
             // Do Nothing
           }
           return resolve(window.YT);
@@ -54,7 +54,7 @@ export class YouTubeProvider extends BaseProvider {
       origin: location.origin,
       rel: 0,
       showinfo: 0,
-      iv_load_policy: 3, // eslint-disable-line
+      iv_load_policy: 3,
       autoplay: Number(cfg.autoplay),
       controls: Number(cfg.controls),
       playsinline: Number(cfg.playsinline),
diff --git a/src/modules/esl-share/buttons/blogger.ts b/src/modules/esl-share/buttons/blogger.ts
index cde7e4459..ee446c870 100644
--- a/src/modules/esl-share/buttons/blogger.ts
+++ b/src/modules/esl-share/buttons/blogger.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/copy.ts b/src/modules/esl-share/buttons/copy.ts
index 1d6f6e28b..f0fb3d9d6 100644
--- a/src/modules/esl-share/buttons/copy.ts
+++ b/src/modules/esl-share/buttons/copy.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/copy-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/facebook.ts b/src/modules/esl-share/buttons/facebook.ts
index e25dcebd6..a2d84a85c 100644
--- a/src/modules/esl-share/buttons/facebook.ts
+++ b/src/modules/esl-share/buttons/facebook.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/hatena.ts b/src/modules/esl-share/buttons/hatena.ts
index 19ec1d0a1..da7952451 100644
--- a/src/modules/esl-share/buttons/hatena.ts
+++ b/src/modules/esl-share/buttons/hatena.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/kakao.ts b/src/modules/esl-share/buttons/kakao.ts
index 92c0a745d..fac20ba5b 100644
--- a/src/modules/esl-share/buttons/kakao.ts
+++ b/src/modules/esl-share/buttons/kakao.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/line.ts b/src/modules/esl-share/buttons/line.ts
index a43544d1c..5bbc545ff 100644
--- a/src/modules/esl-share/buttons/line.ts
+++ b/src/modules/esl-share/buttons/line.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/linkedin.ts b/src/modules/esl-share/buttons/linkedin.ts
index 9582c2c4e..397799bff 100644
--- a/src/modules/esl-share/buttons/linkedin.ts
+++ b/src/modules/esl-share/buttons/linkedin.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/mail.ts b/src/modules/esl-share/buttons/mail.ts
index 9f83f3875..5a79a3a9f 100644
--- a/src/modules/esl-share/buttons/mail.ts
+++ b/src/modules/esl-share/buttons/mail.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/external-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/mix.ts b/src/modules/esl-share/buttons/mix.ts
index 17c6ae85e..bd0b6c8a6 100644
--- a/src/modules/esl-share/buttons/mix.ts
+++ b/src/modules/esl-share/buttons/mix.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/mixi.ts b/src/modules/esl-share/buttons/mixi.ts
index dfcfd583c..8c88e9b1d 100644
--- a/src/modules/esl-share/buttons/mixi.ts
+++ b/src/modules/esl-share/buttons/mixi.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/myspace.ts b/src/modules/esl-share/buttons/myspace.ts
index ecbb03d4c..b3f6dce8f 100644
--- a/src/modules/esl-share/buttons/myspace.ts
+++ b/src/modules/esl-share/buttons/myspace.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/native-share.ts b/src/modules/esl-share/buttons/native-share.ts
index 9fd1fbb29..30b8b85d2 100644
--- a/src/modules/esl-share/buttons/native-share.ts
+++ b/src/modules/esl-share/buttons/native-share.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/native-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/pinterest.ts b/src/modules/esl-share/buttons/pinterest.ts
index 54eec1890..a05fc44e2 100644
--- a/src/modules/esl-share/buttons/pinterest.ts
+++ b/src/modules/esl-share/buttons/pinterest.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/print.ts b/src/modules/esl-share/buttons/print.ts
index 5724ce17a..6aadc65cc 100644
--- a/src/modules/esl-share/buttons/print.ts
+++ b/src/modules/esl-share/buttons/print.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/print-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/pusha.ts b/src/modules/esl-share/buttons/pusha.ts
index 9fa2c9df3..68fe24c42 100644
--- a/src/modules/esl-share/buttons/pusha.ts
+++ b/src/modules/esl-share/buttons/pusha.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/reddit.ts b/src/modules/esl-share/buttons/reddit.ts
index 806b4f2d7..13f9933ce 100644
--- a/src/modules/esl-share/buttons/reddit.ts
+++ b/src/modules/esl-share/buttons/reddit.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/sina-weibo.ts b/src/modules/esl-share/buttons/sina-weibo.ts
index 789220240..7cb32785f 100644
--- a/src/modules/esl-share/buttons/sina-weibo.ts
+++ b/src/modules/esl-share/buttons/sina-weibo.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/skype.ts b/src/modules/esl-share/buttons/skype.ts
index 18aed4b33..18a9753ec 100644
--- a/src/modules/esl-share/buttons/skype.ts
+++ b/src/modules/esl-share/buttons/skype.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/telegram.ts b/src/modules/esl-share/buttons/telegram.ts
index bbc00323c..d13b0ae43 100644
--- a/src/modules/esl-share/buttons/telegram.ts
+++ b/src/modules/esl-share/buttons/telegram.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/tumblr.ts b/src/modules/esl-share/buttons/tumblr.ts
index ea451cbfd..06dbece4c 100644
--- a/src/modules/esl-share/buttons/tumblr.ts
+++ b/src/modules/esl-share/buttons/tumblr.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/twitter.ts b/src/modules/esl-share/buttons/twitter.ts
index ffc43b6a7..79402f087 100644
--- a/src/modules/esl-share/buttons/twitter.ts
+++ b/src/modules/esl-share/buttons/twitter.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/viber.ts b/src/modules/esl-share/buttons/viber.ts
index 93b66fbe2..909f862df 100644
--- a/src/modules/esl-share/buttons/viber.ts
+++ b/src/modules/esl-share/buttons/viber.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/external-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/whatsapp.ts b/src/modules/esl-share/buttons/whatsapp.ts
index 9cfe47743..cbf3727e7 100644
--- a/src/modules/esl-share/buttons/whatsapp.ts
+++ b/src/modules/esl-share/buttons/whatsapp.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-share/buttons/wykop.ts b/src/modules/esl-share/buttons/wykop.ts
index e960e1069..e4bb86adf 100644
--- a/src/modules/esl-share/buttons/wykop.ts
+++ b/src/modules/esl-share/buttons/wykop.ts
@@ -1,4 +1,4 @@
-/* eslint-disable max-len */
+/* eslint-disable @stylistic/max-len */
 import '../actions/media-action';
 import {ESLShareConfig} from '../core/esl-share-config';
 
diff --git a/src/modules/esl-utils/async/debounce.ts b/src/modules/esl-utils/async/debounce.ts
index ee52e3c54..90b621d9c 100644
--- a/src/modules/esl-utils/async/debounce.ts
+++ b/src/modules/esl-utils/async/debounce.ts
@@ -22,7 +22,6 @@ export interface Debounced<F extends AnyToAnyFnSignature> {
  * @param wait - time to debounce
  * @param thisArg - optional context to call original function, use debounced method call context if not defined
  */
-// eslint-disable-next-line @typescript-eslint/ban-types
 export function debounce<F extends AnyToAnyFnSignature>(fn: F, wait = 10, thisArg?: object): Debounced<F> {
   let timeout: number | null = null;
   let deferred: Deferred<ReturnType<F>> | null = null;
diff --git a/src/modules/esl-utils/async/throttle.ts b/src/modules/esl-utils/async/throttle.ts
index 4ba225ee5..dcae342db 100644
--- a/src/modules/esl-utils/async/throttle.ts
+++ b/src/modules/esl-utils/async/throttle.ts
@@ -18,7 +18,6 @@ export interface Throttled<F extends AnyToAnyFnSignature> {
  * @param threshold - indicates how often function could be called
  * @param thisArg - optional context to call original function, use debounced method call context if not defined
  */
-// eslint-disable-next-line @typescript-eslint/ban-types
 export function throttle<F extends AnyToAnyFnSignature>(fn: F, threshold = 250, thisArg?: object): Throttled<F> {
   let last: number;
   let timeout: number | null = null;
diff --git a/src/modules/esl-utils/decorators/bind.ts b/src/modules/esl-utils/decorators/bind.ts
index 9f27badbf..fa46067f6 100644
--- a/src/modules/esl-utils/decorators/bind.ts
+++ b/src/modules/esl-utils/decorators/bind.ts
@@ -1,7 +1,7 @@
 import {getPropertyDescriptor} from '../misc/object/utils';
 
 /** Decorator "bind" allows to bind prototype method context to class instance */
-// eslint-disable-next-line @typescript-eslint/ban-types
+// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
 export function bind<Fn extends Function>(target: object,
                                           propertyKey: string,
                                           descriptor: TypedPropertyDescriptor<Fn>): TypedPropertyDescriptor<Fn> {
diff --git a/src/modules/esl-utils/environment/export-ns.ts b/src/modules/esl-utils/environment/export-ns.ts
index cfb05892a..a96c1af6f 100644
--- a/src/modules/esl-utils/environment/export-ns.ts
+++ b/src/modules/esl-utils/environment/export-ns.ts
@@ -35,7 +35,7 @@ export const exportNs = (name: string, module: any): void => {
  * ```
  * NOTE: in case declaration contains components-packages, their origins will be mixed with declaration in a Runtime
  */
-// eslint-disable-next-line @typescript-eslint/ban-types
+// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
 export function ExportNs<T extends Function>(name?: string) {
   return (module: T): void => exportNs(name || module.name, module);
 }


Test patch:
diff --git a/e2e/.eslintignore b/e2e/.eslintignore
deleted file mode 100644
index c1723a238..000000000
--- a/e2e/.eslintignore
+++ /dev/null
@@ -1,6 +0,0 @@
-# Common configuration
-jest.config.js
-
-# Common directories
-transformer
-reporters
diff --git a/e2e/jest-puppeteer.config.js b/e2e/jest-puppeteer.config.js
index f4e87cf3f..c01a8b4ee 100644
--- a/e2e/jest-puppeteer.config.js
+++ b/e2e/jest-puppeteer.config.js
@@ -1,5 +1,3 @@
-/* eslint-disable no-undef */
-
 if (!process.argv.includes('--no-autorun') && !process.env.PORT) {
   process.env.PORT = '3007';
 }
diff --git a/e2e/package.json b/e2e/package.json
index 40957d595..0e834c291 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -11,7 +11,7 @@
     "run:update:only": "jest -u --no-autorun",
     "run:tests:only": "jest --no-autorun",
     "run:server": "cd .. && cross-env-shell PORT=3007 npm run start:test --workspace=site",
-    "test": "eslint"
+    "test": "eslint \"**/*.ts\""
   },
   "dependencies": {
     "@types/jest-environment-puppeteer": "^5.0.6",
diff --git a/eslint/test/deprecated-alias.invalid.test.ts b/eslint/test/deprecated-alias.invalid.test.ts
index b46b86643..6a257ca43 100644
--- a/eslint/test/deprecated-alias.invalid.test.ts
+++ b/eslint/test/deprecated-alias.invalid.test.ts
@@ -184,6 +184,7 @@ describe('ESL Migration Rules: Deprecated Alias: invalid', () => {
   });
 
   const ruleTester = new RuleTester({
+    // @ts-ignore
     parser: require.resolve('@typescript-eslint/parser')
   });
 
diff --git a/eslint/test/deprecated-alias.valid.test.ts b/eslint/test/deprecated-alias.valid.test.ts
index 3d8d3b05c..d635734c7 100644
--- a/eslint/test/deprecated-alias.valid.test.ts
+++ b/eslint/test/deprecated-alias.valid.test.ts
@@ -70,6 +70,7 @@ describe('ESL Migration Rules: Deprecated Alias: valid', () => {
   });
 
   const ruleTester = new RuleTester({
+    // @ts-ignore
     parser: require.resolve('@typescript-eslint/parser')
   });
 
diff --git a/eslint/test/deprecated-class-method.test.ts b/eslint/test/deprecated-class-method.test.ts
index 2ac17b6fb..1260df8c0 100644
--- a/eslint/test/deprecated-class-method.test.ts
+++ b/eslint/test/deprecated-class-method.test.ts
@@ -180,6 +180,7 @@ describe('ESL Migration Rules: Deprecated Static Method: valid', () => {
   });
 
   const ruleTester = new RuleTester({
+    // @ts-ignore
     parser: require.resolve('@typescript-eslint/parser')
   });
 
diff --git a/linting/tests.eslintrc.yml b/linting/tests.eslintrc.yml
deleted file mode 100644
index 612208273..000000000
--- a/linting/tests.eslintrc.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-# Specific lint overrides
-overrides:
-  # Allow the use of custom TypeScript modules and namespaces for JSX shapes
-  - files:
-      - '**/*.test.ts'
-      - '**/*.spec.ts'
-    rules:
-      # no class count limit for tests
-      'max-classes-per-file': off
-      # it's ok to write braces single line in tests
-      '@typescript-eslint/brace-style': off
-      # ts-ignore is off to test clean es cases
-      '@typescript-eslint/ban-ts-comment': off
-      # there is no need to evaluate tests strictly
-      '@typescript-eslint/non-nullable-type-assertion-style': off
-      # return type on functions or class methods is not required in tests
-      '@typescript-eslint/explicit-function-return-type': off
diff --git a/src/modules/esl-image/test/esl-image.test.ts b/src/modules/esl-image/test/esl-image.test.ts
index 048bce208..cb649de01 100644
--- a/src/modules/esl-image/test/esl-image.test.ts
+++ b/src/modules/esl-image/test/esl-image.test.ts
@@ -25,7 +25,7 @@ describe('ESLImageElement', () => {
     const SVG = '<svg><circle cx="5" cy="5" r="5"></circle></svg>';
     const DANGER_ATTRS = '<svg onload="alert(document.cookie)"><circle cx="5" cy="5" r="5"></circle></svg>';
     const DANGER_CONTENT_SCRIPT = '<svg><circle cx="5" cy="5" r="5"></circle><script>alert(\'xss\')</script></svg>';
-    // eslint-disable-next-line max-len
+    // eslint-disable-next-line @stylistic/max-len
     const DANGER_CONTENT_DATA_URI = '<svg><a xlink:href="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"><circle cx="5" cy="5" r="5"></circle></a></svg>';
     const DANGER_CONTENT_LINK_HREF = '<svg><a href="javascript:alert(document.cookie)"><circle cx="5" cy="5" r="5"></circle></a></svg>';