diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 23f0a25578..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -coverage -dist -.idea -.vscode diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 21ae7e28e4..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,325 +0,0 @@ -const restrictedGlobals = require('confusing-browser-globals'); - -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - plugins: [ - '@stylistic', - '@typescript-eslint', - 'react', - 'import', - 'sonarjs' - ], - env: { - node: true, - es6: true, - es2017: true, - es2020: true - }, - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:import/errors', - 'plugin:@eslint-community/eslint-comments/recommended', - 'plugin:compat/recommended', - 'plugin:sonarjs/recommended' - ], - rules: { - 'array-callback-return': ['error', { 'checkForEach': true }], - 'curly': ['error', 'multi-line', 'consistent'], - 'default-case-last': ['error'], - 'max-params': ['error', 7], - 'new-cap': [ - 'error', - { - 'capIsNewExceptions': ['jQuery.Deferred'], - 'newIsCapExceptionPattern': '\\.default$' - } - ], - 'no-duplicate-imports': ['error'], - 'no-empty-function': ['error'], - 'no-extend-native': ['error'], - 'no-lonely-if': ['error'], - 'no-nested-ternary': ['error'], - 'no-redeclare': ['off'], - '@typescript-eslint/no-redeclare': ['error', { builtinGlobals: false }], - 'no-restricted-globals': ['error'].concat(restrictedGlobals), - 'no-return-assign': ['error'], - 'no-return-await': ['error'], - 'no-sequences': ['error', { 'allowInParentheses': false }], - 'no-shadow': ['off'], - '@typescript-eslint/no-shadow': ['error'], - 'no-throw-literal': ['error'], - 'no-undef-init': ['error'], - 'no-unneeded-ternary': ['error'], - 'no-unused-expressions': ['off'], - '@typescript-eslint/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], - 'no-unused-private-class-members': ['error'], - 'no-useless-rename': ['error'], - 'no-useless-constructor': ['off'], - '@typescript-eslint/no-useless-constructor': ['error'], - 'no-var': ['error'], - 'no-void': ['error', { 'allowAsStatement': true }], - 'no-warning-comments': ['warn', { 'terms': ['fixme', 'hack', 'xxx'] }], - 'one-var': ['error', 'never'], - 'prefer-const': ['error', { 'destructuring': 'all' }], - 'prefer-promise-reject-errors': ['warn', { 'allowEmptyReject': true }], - '@typescript-eslint/prefer-for-of': ['error'], - 'radix': ['error'], - 'yoda': 'error', - - 'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }], - 'react/jsx-no-bind': ['error'], - 'react/jsx-no-useless-fragment': ['error'], - 'react/jsx-no-constructed-context-values': ['error'], - 'react/no-array-index-key': ['error'], - - 'sonarjs/no-inverted-boolean-check': ['error'], - // TODO: Enable the following rules and fix issues - 'sonarjs/cognitive-complexity': ['off'], - 'sonarjs/no-duplicate-string': ['off'], - - '@stylistic/block-spacing': ['error'], - '@stylistic/brace-style': ['error', '1tbs', { 'allowSingleLine': true }], - '@stylistic/comma-dangle': ['error', 'never'], - '@stylistic/comma-spacing': ['error'], - '@stylistic/eol-last': ['error'], - '@stylistic/indent': ['error', 4, { 'SwitchCase': 1 }], - '@stylistic/jsx-quotes': ['error', 'prefer-single'], - '@stylistic/keyword-spacing': ['error'], - '@stylistic/max-statements-per-line': ['error'], - '@stylistic/no-floating-decimal': ['error'], - '@stylistic/no-multi-spaces': ['error'], - '@stylistic/no-multiple-empty-lines': ['error', { 'max': 1 }], - '@stylistic/no-trailing-spaces': ['error'], - '@stylistic/object-curly-spacing': ['error', 'always'], - '@stylistic/operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }], - '@stylistic/padded-blocks': ['error', 'never'], - '@stylistic/quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], - '@stylistic/semi': ['error'], - '@stylistic/space-before-blocks': ['error'], - '@stylistic/space-infix-ops': ['error'] - }, - settings: { - react: { - version: 'detect' - }, - 'import/parsers': { - '@typescript-eslint/parser': [ '.ts', '.tsx' ] - }, - 'import/resolver': { - node: { - extensions: [ - '.js', - '.ts', - '.jsx', - '.tsx' - ], - moduleDirectory: [ - 'node_modules', - 'src' - ] - } - }, - polyfills: [ - // Native Promises Only - 'Promise', - // whatwg-fetch - 'fetch', - // document-register-element - 'document.registerElement', - // resize-observer-polyfill - 'ResizeObserver', - // fast-text-encoding - 'TextEncoder', - // intersection-observer - 'IntersectionObserver', - // Core-js - 'Object.assign', - 'Object.is', - 'Object.setPrototypeOf', - 'Object.toString', - 'Object.freeze', - 'Object.seal', - 'Object.preventExtensions', - 'Object.isFrozen', - 'Object.isSealed', - 'Object.isExtensible', - 'Object.getOwnPropertyDescriptor', - 'Object.getPrototypeOf', - 'Object.keys', - 'Object.entries', - 'Object.getOwnPropertyNames', - 'Function.name', - 'Function.hasInstance', - 'Array.from', - 'Array.arrayOf', - 'Array.copyWithin', - 'Array.fill', - 'Array.find', - 'Array.findIndex', - 'Array.iterator', - 'String.fromCodePoint', - 'String.raw', - 'String.iterator', - 'String.codePointAt', - 'String.endsWith', - 'String.includes', - 'String.repeat', - 'String.startsWith', - 'String.trim', - 'String.anchor', - 'String.big', - 'String.blink', - 'String.bold', - 'String.fixed', - 'String.fontcolor', - 'String.fontsize', - 'String.italics', - 'String.link', - 'String.small', - 'String.strike', - 'String.sub', - 'String.sup', - 'RegExp', - 'Number', - 'Math', - 'Date', - 'async', - 'Symbol', - 'Map', - 'Set', - 'WeakMap', - 'WeakSet', - 'ArrayBuffer', - 'DataView', - 'Int8Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'Int16Array', - 'Uint16Array', - 'Int32Array', - 'Uint32Array', - 'Float32Array', - 'Float64Array', - 'Reflect', - // Temporary while eslint-compat-plugin is buggy - 'document.querySelector' - ] - }, - overrides: [ - // Config files and development scripts - { - files: [ - './babel.config.js', - './.eslintrc.js', - './postcss.config.js', - './webpack.*.js', - './scripts/**/*.js' - ] - }, - // JavaScript source files - { - files: [ - './src/**/*.{js,jsx,ts,tsx}' - ], - parserOptions: { - project: ['./tsconfig.json'] - }, - env: { - node: false, - browser: true, - es6: true, - es2017: true, - es2020: true - }, - globals: { - // Tizen globals - 'tizen': 'readonly', - 'webapis': 'readonly', - // WebOS globals - 'webOS': 'readonly', - // Dependency globals - '$': 'readonly', - 'jQuery': 'readonly', - // Jellyfin globals - 'ApiClient': 'writable', - 'Events': 'writable', - 'chrome': 'writable', - 'Emby': 'readonly', - 'Hls': 'writable', - 'LibraryMenu': 'writable', - 'Windows': 'readonly', - // Build time definitions - __COMMIT_SHA__: 'readonly', - __JF_BUILD_VERSION__: 'readonly', - __PACKAGE_JSON_NAME__: 'readonly', - __PACKAGE_JSON_VERSION__: 'readonly', - __USE_SYSTEM_FONTS__: 'readonly', - __WEBPACK_SERVE__: 'readonly' - }, - rules: { - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'default', - format: [ 'camelCase', 'PascalCase' ], - leadingUnderscore: 'allow' - }, - { - selector: 'variable', - format: [ 'camelCase', 'PascalCase', 'UPPER_CASE' ], - leadingUnderscore: 'allowSingleOrDouble', - trailingUnderscore: 'allowSingleOrDouble' - }, - { - selector: 'typeLike', - format: [ 'PascalCase' ] - }, - { - selector: 'enumMember', - format: [ 'PascalCase', 'UPPER_CASE' ] - }, - { - selector: [ 'objectLiteralProperty', 'typeProperty' ], - format: [ 'camelCase', 'PascalCase' ], - leadingUnderscore: 'allowSingleOrDouble', - trailingUnderscore: 'allowSingleOrDouble' - }, - // Ignore numbers, locale strings (en-us), aria/data attributes, CSS selectors, - // and api_key parameter - { - selector: [ 'objectLiteralProperty', 'typeProperty' ], - format: null, - filter: { - regex: '[ &\\-]|^([0-9]+)$|^api_key$', - match: true - } - } - ], - '@typescript-eslint/prefer-string-starts-ends-with': ['error'] - } - }, - // TypeScript source files - { - files: [ - './src/**/*.{ts,tsx}' - ], - extends: [ - 'eslint:recommended', - 'plugin:import/typescript', - 'plugin:@typescript-eslint/recommended', - 'plugin:@eslint-community/eslint-comments/recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended' - ], - rules: { - '@typescript-eslint/no-floating-promises': ['error'], - '@typescript-eslint/no-unused-vars': ['error'], - - 'sonarjs/cognitive-complexity': ['error'] - } - } - ] -}; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..5ddd5a00c5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,385 @@ +// @ts-check + +import eslint from '@eslint/js'; +import comments from '@eslint-community/eslint-plugin-eslint-comments/configs'; +import compat from 'eslint-plugin-compat'; +import globals from 'globals'; +// @ts-expect-error Missing type definition +import importPlugin from 'eslint-plugin-import'; +import jsxA11y from 'eslint-plugin-jsx-a11y'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import restrictedGlobals from 'confusing-browser-globals'; +import sonarjs from 'eslint-plugin-sonarjs'; +import stylistic from '@stylistic/eslint-plugin'; +// eslint-disable-next-line import/no-unresolved +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + eslint.configs.recommended, + tseslint.configs.recommended, + // @ts-expect-error Harmless type mismatch in dependency + comments.recommended, + compat.configs['flat/recommended'], + importPlugin.flatConfigs.errors, + sonarjs.configs.recommended, + + reactPlugin.configs.flat.recommended, + { + settings: { + react: { + version: 'detect' + } + } + }, + jsxA11y.flatConfigs.recommended, + + // Global ignores + { + ignores: [ + 'node_modules', + 'coverage', + 'dist', + '.idea', + '.vscode' + ] + }, + + // Global style rules + { + plugins: { + '@stylistic': stylistic + }, + extends: [ importPlugin.flatConfigs.typescript ], + rules: { + 'array-callback-return': ['error', { 'checkForEach': true }], + 'curly': ['error', 'multi-line', 'consistent'], + 'default-case-last': 'error', + 'max-params': ['error', 7], + 'new-cap': [ + 'error', + { + 'capIsNewExceptions': ['jQuery.Deferred'], + 'newIsCapExceptionPattern': '\\.default$' + } + ], + 'no-duplicate-imports': 'error', + 'no-empty-function': 'error', + 'no-extend-native': 'error', + 'no-lonely-if': 'error', + 'no-nested-ternary': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': ['error', { builtinGlobals: false }], + 'no-restricted-globals': ['error'].concat(restrictedGlobals), + 'no-return-assign': 'error', + 'no-return-await': 'error', + 'no-sequences': ['error', { 'allowInParentheses': false }], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + 'no-throw-literal': 'error', + 'no-undef-init': 'error', + 'no-unneeded-ternary': 'error', + 'no-unused-expressions': 'off', + '@typescript-eslint/no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + 'no-unused-private-class-members': 'error', + '@typescript-eslint/no-unused-vars': 'error', + 'no-useless-rename': 'error', + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 'error', + 'no-var': 'error', + 'no-void': ['error', { 'allowAsStatement': true }], + 'no-warning-comments': ['warn', { 'terms': ['hack', 'xxx'] }], + 'one-var': ['error', 'never'], + 'prefer-const': ['error', { 'destructuring': 'all' }], + 'prefer-promise-reject-errors': ['warn', { 'allowEmptyReject': true }], + '@typescript-eslint/prefer-for-of': 'error', + 'radix': 'error', + 'yoda': 'error', + + 'sonarjs/fixme-tag': 'warn', + 'sonarjs/todo-tag': 'off', + 'sonarjs/deprecation': 'warn', + 'sonarjs/no-alphabetical-sort': 'warn', + 'sonarjs/no-inverted-boolean-check': 'error', + 'sonarjs/no-selector-parameter': 'off', + 'sonarjs/pseudo-random': 'warn', + // TODO: Enable the following sonarjs rules and fix issues + 'sonarjs/no-duplicate-string': 'off', + 'sonarjs/no-nested-functions': 'warn', + + // TODO: Replace with stylistic.configs.customize() + '@stylistic/block-spacing': 'error', + '@stylistic/brace-style': ['error', '1tbs', { 'allowSingleLine': true }], + '@stylistic/comma-dangle': ['error', 'never'], + '@stylistic/comma-spacing': 'error', + '@stylistic/eol-last': 'error', + '@stylistic/indent': ['error', 4, { 'SwitchCase': 1 }], + '@stylistic/jsx-quotes': ['error', 'prefer-single'], + '@stylistic/keyword-spacing': 'error', + '@stylistic/max-statements-per-line': 'error', + '@stylistic/no-floating-decimal': 'error', + '@stylistic/no-mixed-spaces-and-tabs': 'error', + '@stylistic/no-multi-spaces': 'error', + '@stylistic/no-multiple-empty-lines': ['error', { 'max': 1 }], + '@stylistic/no-trailing-spaces': 'error', + '@stylistic/object-curly-spacing': ['error', 'always'], + '@stylistic/operator-linebreak': ['error', 'before', { overrides: { '?': 'after', ':': 'after', '=': 'after' } }], + '@stylistic/padded-blocks': ['error', 'never'], + '@stylistic/quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], + '@stylistic/semi': 'error', + '@stylistic/space-before-blocks': 'error', + '@stylistic/space-infix-ops': 'error' + } + }, + + // Config files use node globals + { + ignores: [ 'src' ], + languageOptions: { + globals: { + ...globals.node + } + } + }, + + // Config files are commonjs by default + { + files: [ '**/*.{cjs,js}' ], + ignores: [ 'src' ], + languageOptions: { + sourceType: 'commonjs' + }, + rules: { + '@typescript-eslint/no-require-imports': 'off' + } + }, + + // App files + { + files: [ + 'src/**/*.{js,jsx,ts,tsx}' + ], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname + }, + globals: { + ...globals.browser, + // Tizen globals + 'tizen': false, + 'webapis': false, + // WebOS globals + 'webOS': false, + // Dependency globals + '$': false, + 'jQuery': false, + // Jellyfin globals + 'ApiClient': true, + 'Events': true, + 'chrome': true, + 'Emby': false, + 'Hls': true, + 'LibraryMenu': true, + 'Windows': false, + // Build time definitions + __COMMIT_SHA__: false, + __JF_BUILD_VERSION__: false, + __PACKAGE_JSON_NAME__: false, + __PACKAGE_JSON_VERSION__: false, + __USE_SYSTEM_FONTS__: false, + __WEBPACK_SERVE__: false + } + }, + settings: { + 'import/resolver': { + node: { + extensions: [ + '.js', + '.ts', + '.jsx', + '.tsx' + ], + moduleDirectory: [ + 'node_modules', + 'src' + ] + } + }, + polyfills: [ + 'Promise', + // whatwg-fetch + 'fetch', + // document-register-element + 'document.registerElement', + // resize-observer-polyfill + 'ResizeObserver', + // fast-text-encoding + 'TextEncoder', + // intersection-observer + 'IntersectionObserver', + // Core-js + 'Object.assign', + 'Object.is', + 'Object.setPrototypeOf', + 'Object.toString', + 'Object.freeze', + 'Object.seal', + 'Object.preventExtensions', + 'Object.isFrozen', + 'Object.isSealed', + 'Object.isExtensible', + 'Object.getOwnPropertyDescriptor', + 'Object.getPrototypeOf', + 'Object.keys', + 'Object.entries', + 'Object.getOwnPropertyNames', + 'Function.name', + 'Function.hasInstance', + 'Array.from', + 'Array.arrayOf', + 'Array.copyWithin', + 'Array.fill', + 'Array.find', + 'Array.findIndex', + 'Array.iterator', + 'String.fromCodePoint', + 'String.raw', + 'String.iterator', + 'String.codePointAt', + 'String.endsWith', + 'String.includes', + 'String.repeat', + 'String.startsWith', + 'String.trim', + 'String.anchor', + 'String.big', + 'String.blink', + 'String.bold', + 'String.fixed', + 'String.fontcolor', + 'String.fontsize', + 'String.italics', + 'String.link', + 'String.small', + 'String.strike', + 'String.sub', + 'String.sup', + 'RegExp', + 'Number', + 'Math', + 'Date', + 'async', + 'Symbol', + 'Map', + 'Set', + 'WeakMap', + 'WeakSet', + 'ArrayBuffer', + 'DataView', + 'Int8Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'Int16Array', + 'Uint16Array', + 'Int32Array', + 'Uint32Array', + 'Float32Array', + 'Float64Array', + 'Reflect' + ] + }, + rules: { + // TODO: Add typescript recommended typed rules + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: [ 'camelCase', 'PascalCase' ], + leadingUnderscore: 'allow' + }, + { + selector: 'variable', + format: [ 'camelCase', 'PascalCase', 'UPPER_CASE' ], + leadingUnderscore: 'allowSingleOrDouble', + trailingUnderscore: 'allowSingleOrDouble' + }, + { + selector: 'typeLike', + format: [ 'PascalCase' ] + }, + { + selector: 'enumMember', + format: [ 'PascalCase', 'UPPER_CASE' ] + }, + { + selector: [ 'objectLiteralProperty', 'typeProperty' ], + format: [ 'camelCase', 'PascalCase' ], + leadingUnderscore: 'allowSingleOrDouble', + trailingUnderscore: 'allowSingleOrDouble' + }, + // Ignore numbers, locale strings (en-us), aria/data attributes, CSS selectors, + // and api_key parameter + { + selector: [ 'objectLiteralProperty', 'typeProperty' ], + format: null, + filter: { + regex: '[ &\\-]|^([0-9]+)$|^api_key$', + match: true + } + } + ], + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/prefer-string-starts-ends-with': 'error' + } + }, + + // React files + { + files: [ 'src/**/*.{jsx,tsx}' ], + plugins: { + 'react-hooks': reactHooks + }, + rules: { + 'react/jsx-filename-extension': ['error', { 'extensions': ['.jsx', '.tsx'] }], + 'react/jsx-no-bind': 'error', + 'react/jsx-no-useless-fragment': 'error', + 'react/no-array-index-key': 'error', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn' + } + }, + + // Service worker + { + files: [ 'src/serviceworker.js' ], + languageOptions: { + globals: { + ...globals.serviceworker + } + } + }, + + // Legacy JS (less strict) + { + files: [ 'src/**/*.{js,jsx}' ], + rules: { + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-this-alias': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + + 'sonarjs/public-static-readonly': 'off', + + // TODO: Enable the following rules and fix issues + 'sonarjs/cognitive-complexity': 'off', + 'sonarjs/constructor-for-side-effects': 'off', + 'sonarjs/function-return-type': 'off', + 'sonarjs/no-async-constructor': 'off', + 'sonarjs/no-duplicate-string': 'off', + 'sonarjs/no-ignored-exceptions': 'off', + 'sonarjs/no-invariant-returns': 'warn', + 'sonarjs/no-nested-functions': 'off', + 'sonarjs/void-use': 'off' + } + } +); diff --git a/package-lock.json b/package-lock.json index eca2dee79e..0278d89196 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,6 +70,7 @@ "@babel/preset-env": "7.25.8", "@babel/preset-react": "7.25.7", "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", + "@eslint/js": "9.20.0", "@stylistic/eslint-plugin": "3.1.0", "@stylistic/stylelint-plugin": "3.1.1", "@types/dompurify": "3.0.5", @@ -81,8 +82,7 @@ "@types/react-dom": "18.3.1", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/eslint-plugin": "8.21.0", - "@typescript-eslint/parser": "8.21.0", + "@typescript-eslint/parser": "8.24.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.0.4", "autoprefixer": "10.4.20", @@ -103,6 +103,7 @@ "eslint-plugin-sonarjs": "3.0.2", "expose-loader": "5.0.0", "fork-ts-checker-webpack-plugin": "9.0.2", + "globals": "15.15.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", "jsdom": "25.0.1", @@ -123,6 +124,7 @@ "stylelint-scss": "6.10.1", "ts-loader": "9.5.2", "typescript": "5.7.3", + "typescript-eslint": "8.24.1", "vitest": "3.0.4", "webpack": "5.97.1", "webpack-bundle-analyzer": "4.10.2", @@ -874,6 +876,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", @@ -1788,6 +1799,14 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", @@ -3829,7 +3848,6 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -5914,47 +5932,16 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", - "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/type-utils": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", - "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", + "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" }, "engines": { @@ -5969,6 +5956,127 @@ "typescript": ">=4.8.4 <5.8.0" } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz", @@ -5987,30 +6095,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", - "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", @@ -10129,19 +10213,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-compat/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-compat/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10208,7 +10279,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, - "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -10302,7 +10372,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -12244,11 +12313,15 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -24135,11 +24208,10 @@ } }, "node_modules/ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.12" }, @@ -24429,6 +24501,224 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", + "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", + "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", + "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", + "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript-eslint/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -26626,6 +26916,14 @@ "@babel/helper-replace-supers": "^7.25.7", "@babel/traverse": "^7.25.7", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/plugin-transform-computed-properties": { @@ -27196,6 +27494,13 @@ "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } }, "@babel/types": { @@ -29408,34 +29713,91 @@ "@types/node": "*" } }, - "@typescript-eslint/eslint-plugin": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz", - "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/type-utils": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.0" - } - }, "@typescript-eslint/parser": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz", - "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==", + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", + "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.21.0", - "@typescript-eslint/types": "8.21.0", - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/visitor-keys": "8.21.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" + } + }, + "@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true + } } }, "@typescript-eslint/scope-manager": { @@ -29448,18 +29810,6 @@ "@typescript-eslint/visitor-keys": "8.21.0" } }, - "@typescript-eslint/type-utils": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz", - "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "8.21.0", - "@typescript-eslint/utils": "8.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.0" - } - }, "@typescript-eslint/types": { "version": "8.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz", @@ -32541,12 +32891,6 @@ "path-exists": "^4.0.0" } }, - "globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -33888,9 +34232,10 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true }, "globalthis": { "version": "1.0.4", @@ -42138,9 +42483,9 @@ "dev": true }, "ts-api-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", - "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, "requires": {} }, @@ -42341,6 +42686,132 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true }, + "typescript-eslint": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", + "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "8.24.1", + "@typescript-eslint/parser": "8.24.1", + "@typescript-eslint/utils": "8.24.1" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", + "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/type-utils": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", + "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", + "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "8.24.1", + "@typescript-eslint/utils": "8.24.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/types": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", + "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", + "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/visitor-keys": "8.24.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", + "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.24.1", + "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/typescript-estree": "8.24.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "8.24.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", + "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "8.24.1", + "eslint-visitor-keys": "^4.2.0" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true + } + } + }, "uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", diff --git a/package.json b/package.json index d719f7da69..cc4f0632d6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@babel/preset-env": "7.25.8", "@babel/preset-react": "7.25.7", "@eslint-community/eslint-plugin-eslint-comments": "4.4.1", + "@eslint/js": "9.20.0", "@stylistic/eslint-plugin": "3.1.0", "@stylistic/stylelint-plugin": "3.1.1", "@types/dompurify": "3.0.5", @@ -21,8 +22,7 @@ "@types/react-dom": "18.3.1", "@types/react-lazy-load-image-component": "1.6.4", "@types/sortablejs": "1.15.8", - "@typescript-eslint/eslint-plugin": "8.21.0", - "@typescript-eslint/parser": "8.21.0", + "@typescript-eslint/parser": "8.24.1", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.0.4", "autoprefixer": "10.4.20", @@ -43,6 +43,7 @@ "eslint-plugin-sonarjs": "3.0.2", "expose-loader": "5.0.0", "fork-ts-checker-webpack-plugin": "9.0.2", + "globals": "15.15.0", "html-loader": "5.1.0", "html-webpack-plugin": "5.6.3", "jsdom": "25.0.1", @@ -63,6 +64,7 @@ "stylelint-scss": "6.10.1", "ts-loader": "9.5.2", "typescript": "5.7.3", + "typescript-eslint": "8.24.1", "vitest": "3.0.4", "webpack": "5.97.1", "webpack-bundle-analyzer": "4.10.2",