diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 45bf22d..0000000 --- a/.eslintrc +++ /dev/null @@ -1,355 +0,0 @@ -{ - "root": true, - "env": { - "es6": true, - "browser": true, - "node": false - }, - "extends": [ - "eslint:recommended", - "plugin:react/recommended", - "plugin:react-hooks/recommended", - "plugin:require-useeffect-dependency-array/recommended", - "airbnb", - "plugin:eslint-comments/recommended", - "plugin:import/errors", - "prettier" - ], - "plugins": [ - "react-refresh", - "react", - "eslint-comments", - "unused-imports", - "new-with-error" - ], - "parserOptions": { - "ecmaVersion": "latest", - "generators": true, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - } - }, - "settings": { - "import/internal-regex": "^(~|src)", - "react": { - "version": "detect" - } - }, - "reportUnusedDisableDirectives": true, - "ignorePatterns": ["package-lock.json", "/dist/", "/coverage/", "/extra/"], - "rules": { - "no-void": "off", - "no-undefined": "off", - "linebreak-style": ["error", "unix"], - "no-console": "error", - "no-func-assign": "error", - "no-class-assign": "error", - "no-await-in-loop": "off", - "max-classes-per-file": "off", - "no-return-await": "off", - "no-restricted-syntax": [ - "error", - { - "selector": "ForInStatement", - "message": "for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array." - }, - { - "selector": "LabeledStatement", - "message": "Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand." - }, - { - "selector": "WithStatement", - "message": "`with` is disallowed in strict mode because it makes code impossible to predict and optimize." - } - ], - "no-param-reassign": "off", - "lines-between-class-members": "off", - "new-with-error/new-with-error": "error", - "unused-imports/no-unused-imports": "error", - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": ["../*"], - "message": "Usage of relative parent imports is not allowed." - } - ] - } - ], - "import/prefer-default-export": "off", - "import/no-duplicates": ["error", { "prefer-inline": true }], - "import/extensions": [ - "error", - "always", - { - "ignorePackages": true, - "pattern": { - "js": "never", - "jsx": "never" - } - } - ], - "import/order": [ - "error", - { - "groups": [ - "builtin", - ["external"], - "internal", - ["sibling", "parent", "index"], - "unknown", - "object" - ], - "newlines-between": "always", - "pathGroups": [ - { - "pattern": "~/**", - "group": "internal" - }, - { - "pattern": "src/**", - "group": "internal" - }, - { - "pattern": "**/*.+(css|scss)", - "patternOptions": { "dot": true, "nocomment": true }, - "group": "unknown", - "position": "after" - }, - { - "pattern": "{.,..}/**/*.+(css|scss)", - "patternOptions": { "dot": true, "nocomment": true }, - "group": "unknown", - "position": "after" - } - ], - "warnOnUnassignedImports": true, - "pathGroupsExcludedImportTypes": ["builtin", "external"], - "alphabetize": { - "order": "asc", - "orderImportKind": "asc" - } - } - ], - "import/no-default-export": "error", - "import/no-deprecated": "error", - "import/no-commonjs": "error", - "import/no-empty-named-blocks": "error", - "import/no-named-as-default-member": "error", - "import/no-nodejs-modules": "error", - "import/no-unresolved": "error", - "sort-imports": ["error", { "ignoreDeclarationSort": true }], - "import/no-restricted-paths": [ - "error", - { - "zones": [ - { - "target": "./", - "from": "./src/**/+(*.)+(spec|test).+(ts|js)?(x)", - "message": "Importing test files in non-test files is not allowed." - }, - { - "target": "./", - "from": "./src/testing", - "message": "Importing testing utilities in non-test files is not allowed." - } - ] - } - ], - "react-hooks/exhaustive-deps": "error", - "react/require-default-props": "off", - "react/jsx-props-no-spreading": "off", - "react-refresh/only-export-components": "warn", - "react/react-in-jsx-scope": "off", - "react/function-component-definition": "off", - "react/no-array-index-key": "off" - }, - "overrides": [ - { - // All TypeScript files - "files": ["**/*.+(ts|tsx)"], - "plugins": ["@typescript-eslint", "deprecation"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module", - "ecmaFeatures": { - "jsx": true - }, - "project": ["tsconfig.json"] - }, - "settings": { - "import/resolver": { - "typescript": true - } - }, - "extends": [ - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - "plugin:@typescript-eslint/strict", - "plugin:import/typescript", - "prettier" - ], - "rules": { - "deprecation/deprecation": "error", - "@typescript-eslint/consistent-type-imports": [ - "error", - { - "prefer": "type-imports", - "fixStyle": "inline-type-imports" - } - ], - "@typescript-eslint/no-import-type-side-effects": "error", - "@typescript-eslint/consistent-type-exports": [ - "error", - { - "fixMixedExportsWithInlineTypeSpecifier": true - } - ], - "@typescript-eslint/no-unused-vars": [ - "error", - { - "argsIgnorePattern": "^_", - "varsIgnorePattern": "^_", - "caughtErrorsIgnorePattern": "^_" - } - ], - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "variable", - "format": ["camelCase", "PascalCase", "UPPER_CASE"], - "leadingUnderscore": "allow" - } - ], - "@typescript-eslint/no-misused-promises": [ - "error", - { - "checksVoidReturn": false - } - ], - "@typescript-eslint/return-await": ["error", "in-try-catch"], - "@typescript-eslint/prefer-ts-expect-error": "off", - "@typescript-eslint/no-use-before-define": [ - "error", - { - "classes": true, - "functions": true, - "variables": true - } - ], - "@typescript-eslint/no-unused-expressions": [ - "error", - { - "allowShortCircuit": false, - "allowTaggedTemplates": false, - "allowTernary": false, - "enforceForJSX": false - } - ], - "@typescript-eslint/no-redeclare": "error", - "@typescript-eslint/no-shadow": "error", - "@typescript-eslint/no-magic-numbers": "off", - "@typescript-eslint/no-loop-func": "error", - "@typescript-eslint/no-dupe-class-members": "error", - "@typescript-eslint/default-param-last": "error", - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/prefer-nullish-coalescing": "off", - "import/no-empty-named-blocks": "error", - "import/no-named-as-default-member": "error", - "import/no-unresolved": "error", - "import/extensions": [ - "error", - "always", - { - "ignorePackages": true, - "pattern": { - "js": "never", - "jsx": "never", - "ts": "never", - "tsx": "never" - } - } - ], - "linebreak-style": ["error", "unix"], - "no-func-assign": "error", - "constructor-super": "error", - "getter-return": ["error", { "allowImplicit": true }], - "import/named": "error", - "no-const-assign": "error", - "no-dupe-args": "error", - "no-dupe-keys": "error", - "no-import-assign": "error", - "no-new-func": "error", - "no-new-symbol": "error", - "no-obj-calls": "error", - "no-this-before-super": "error", - "no-undef": "error", - "no-unreachable": "error", - "valid-typeof": ["error", { "requireStringLiterals": true }], - "react/jsx-filename-extension": [ - "error", - { - "extensions": [".jsx", ".tsx"] - } - ] - } - }, - { - // Type definition files. - "files": ["./**/*.d.ts"], - "rules": { - "import/no-default-export": "off" - } - }, - { - // Test files and test related infrastructure - "files": ["**/+(*.)+(spec|test).+(ts|js)?(x)", "./src/testing/**"], - "plugins": ["vitest"], - "extends": ["plugin:vitest/recommended", "plugin:testing-library/react"], - "rules": { - "testing-library/no-manual-cleanup": "off", - "testing-library/no-wait-for-multiple-assertions": "off", - "vitest/expect-expect": "off", - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": true, - "optionalDependencies": false, - "peerDependencies": false - } - ], - "import/no-restricted-paths": ["off", { "zones": [] }] - } - }, - { - // Root level .js/.ts configuration files - "files": ["./*.js", "./*.ts", "./__mocks__/**/*.[j|t]s?(x)"], - "env": { - "node": true - }, - "rules": { - "import/no-default-export": "off", - "import/no-commonjs": "off", - "import/no-nodejs-modules": "off", - "import/no-extraneous-dependencies": [ - "error", - { - "devDependencies": true, - "optionalDependencies": false, - "peerDependencies": false - } - ] - } - }, - { - // Root level .ts configuration files - "files": ["./*.ts"], - "parserOptions": { - "project": ["tsconfig.node.json"] - } - } - ] -} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..db5b77f --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,424 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +import noDestructuringArraysAsObjects from '@arabasta/eslint-plugin-no-destructuring-arrays-as-objects'; +import noTestingLibraryWithoutCleanup from '@arabasta/eslint-plugin-no-testing-library-without-cleanup'; +import reduxUseAppFunctions from '@arabasta/eslint-plugin-redux-use-app-functions'; +import reportCaughtError from '@arabasta/eslint-plugin-report-caught-error'; +import requireUseeffectDependencyArray from '@arabasta/eslint-plugin-require-useeffect-dependency-array'; +import { FlatCompat } from '@eslint/eslintrc'; +import eslint from '@eslint/js'; +import eslintComments from '@eslint-community/eslint-plugin-eslint-comments/configs'; +import prettier from 'eslint-config-prettier'; +import deprecation from 'eslint-plugin-deprecation'; +import es from 'eslint-plugin-es'; +import newWithError from 'eslint-plugin-new-with-error'; +import reactLint from 'eslint-plugin-react'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import unusedImports from 'eslint-plugin-unused-imports'; +import vitest from 'eslint-plugin-vitest'; +import globals from 'globals'; +// eslint-disable-next-line import/no-unresolved +import tseslint from 'typescript-eslint'; + +const compat = new FlatCompat({ + baseDirectory: path.dirname(fileURLToPath(import.meta.url)), +}); + +// The tseslint.config function is a variadic identity function which is a fancy way of saying +// that it's a function with a spread argument that accepts any number flat config objects +// and returns the objects unchanged. It exists as a way to quickly and easily provide +// types for your flat config file without the need for JSDoc type comments. +export default tseslint.config( + eslint.configs.recommended, + requireUseeffectDependencyArray.configs.recommended, + reportCaughtError.configs.recommended, + reduxUseAppFunctions.configs.recommended, + noTestingLibraryWithoutCleanup.configs.recommended, + ...compat.extends('plugin:react/recommended'), + ...compat.extends('plugin:react-hooks/recommended'), + ...compat.extends('airbnb'), + eslintComments.recommended, + ...compat.extends('plugin:import/errors'), + prettier, + { + // This configuration object matches all files that other configuration objects + // match, because config objects that don’t specify files or ignores apply to + // all files that have been matched by any other configuration object. + // https://eslint.org/docs/latest/use/configure/configuration-files#:~:text=You%20can%20use,default.%20For%20example%3A + name: 'All files', + settings: { + 'import/internal-regex': '^(~|src)', + react: { + version: 'detect', + }, + }, + languageOptions: { + globals: { + ...globals.es2015, + ...globals.browser, + }, + ecmaVersion: 'latest', + sourceType: 'module', + parserOptions: { + generators: true, + ecmaFeatures: { + jsx: true, + }, + }, + }, + linterOptions: { + reportUnusedDisableDirectives: true, + }, + plugins: { + 'react-refresh': reactRefresh, + react: reactLint, + 'unused-imports': unusedImports, + 'new-with-error': newWithError, + es, + }, + rules: { + 'no-void': 'off', + 'no-undefined': 'off', + 'linebreak-style': ['error', 'unix'], + 'no-console': 'error', + 'no-func-assign': 'error', + 'no-class-assign': 'error', + 'no-await-in-loop': 'off', + 'max-classes-per-file': 'off', + 'no-return-await': 'off', + 'no-restricted-syntax': [ + 'error', + { + selector: 'ForInStatement', + message: + 'for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array.', + }, + { + selector: 'LabeledStatement', + message: + 'Labels are a form of GOTO; using them makes code confusing and hard to maintain and understand.', + }, + { + selector: 'WithStatement', + message: + '`with` is disallowed in strict mode because it makes code impossible to predict and optimize.', + }, + ], + 'no-param-reassign': 'off', + 'lines-between-class-members': 'off', + 'new-with-error/new-with-error': 'error', + 'unused-imports/no-unused-imports': 'error', + 'no-restricted-imports': [ + 'error', + { + patterns: [ + { + group: ['../*'], + message: 'Usage of relative parent imports is not allowed.', + }, + ], + }, + ], + 'import/prefer-default-export': 'off', + 'import/no-duplicates': ['error', { 'prefer-inline': true }], + 'import/extensions': [ + 'error', + 'always', + { + ignorePackages: true, + pattern: { + js: 'never', + jsx: 'never', + }, + }, + ], + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + ['external'], + 'internal', + ['sibling', 'parent', 'index'], + 'unknown', + 'object', + ], + 'newlines-between': 'always', + pathGroups: [ + { + pattern: '~/**', + group: 'internal', + }, + { + pattern: 'src/**', + group: 'internal', + }, + { + pattern: '**/*.+(css|scss)', + patternOptions: { dot: true, nocomment: true }, + group: 'unknown', + position: 'after', + }, + { + pattern: '{.,..}/**/*.+(css|scss)', + patternOptions: { dot: true, nocomment: true }, + group: 'unknown', + position: 'after', + }, + ], + warnOnUnassignedImports: true, + pathGroupsExcludedImportTypes: ['builtin', 'external'], + alphabetize: { + order: 'asc', + orderImportKind: 'asc', + }, + }, + ], + 'import/no-default-export': 'error', + 'import/no-deprecated': 'error', + 'import/no-commonjs': 'error', + 'import/no-empty-named-blocks': 'error', + 'import/no-named-as-default-member': 'error', + 'import/no-nodejs-modules': 'error', + 'import/no-unresolved': 'error', + 'sort-imports': ['error', { ignoreDeclarationSort: true }], + 'import/no-restricted-paths': [ + 'error', + { + zones: [ + { + target: './', + from: './src/**/+(*.)+(spec|test).+(ts|js)?(x)', + message: 'Importing test files in non-test files is not allowed.', + }, + { + target: './', + from: './src/testing', + message: + 'Importing testing utilities in non-test files is not allowed.', + }, + ], + }, + ], + 'react-hooks/exhaustive-deps': 'error', + 'react/require-default-props': 'off', + 'react/jsx-props-no-spreading': 'off', + 'react-refresh/only-export-components': 'warn', + 'react/react-in-jsx-scope': 'off', + 'react/function-component-definition': 'off', + 'react/no-array-index-key': 'off', + '@arabasta/report-caught-error/report-caught-error': [ + 'error', + 'reportUnknownError', + ], + 'es/no-optional-catch-binding': 'error', + // This rule can be used just fine with Prettier as long as + // you don’t use the "multi-line" or "multi-or-nest" option. + // https://github.com/prettier/eslint-config-prettier/?tab=readme-ov-file#curly + curly: ['error', 'all'], + }, + }, + { + name: 'All TypeScript files', + files: ['**/*.+(ts|tsx)'], + // This syntactic sugar comes from typescript-eslint's Flat config helper, + // it allows you to more easily extend shared configs for specific file + // patterns whilst also overriding rules/options provided by those configs. + // IT HAS NOTHING TO DO WITH .ESLINTRC's EXTENDS KEY! + // https://typescript-eslint.io/packages/typescript-eslint#flat-config-extends + extends: [ + noDestructuringArraysAsObjects.configs.recommended, + ...tseslint.configs.strictTypeChecked, + ...compat.extends('plugin:import/typescript'), + prettier, + ], + plugins: { '@typescript-eslint': tseslint.plugin, deprecation }, + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: tseslint.parser, + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + project: ['tsconfig.json'], + }, + }, + settings: { + 'import/resolver': { + typescript: true, + }, + }, + rules: { + 'deprecation/deprecation': 'error', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + fixStyle: 'inline-type-imports', + disallowTypeAnnotations: false, + }, + ], + '@typescript-eslint/no-import-type-side-effects': 'error', + '@typescript-eslint/consistent-type-exports': [ + 'error', + { + fixMixedExportsWithInlineTypeSpecifier: true, + }, + ], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'variable', + format: ['camelCase', 'PascalCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + }, + ], + '@typescript-eslint/no-misused-promises': [ + 'error', + { + checksVoidReturn: false, + }, + ], + '@typescript-eslint/return-await': ['error', 'in-try-catch'], + '@typescript-eslint/prefer-ts-expect-error': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { + classes: true, + functions: true, + variables: true, + }, + ], + '@typescript-eslint/no-unused-expressions': [ + 'error', + { + allowShortCircuit: false, + allowTaggedTemplates: false, + allowTernary: false, + enforceForJSX: false, + }, + ], + '@typescript-eslint/no-redeclare': 'error', + '@typescript-eslint/no-shadow': 'error', + '@typescript-eslint/no-magic-numbers': 'off', + '@typescript-eslint/no-loop-func': 'error', + '@typescript-eslint/no-dupe-class-members': 'error', + '@typescript-eslint/default-param-last': 'error', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/prefer-nullish-coalescing': 'off', + 'import/no-empty-named-blocks': 'error', + 'import/no-named-as-default-member': 'error', + 'import/no-unresolved': 'error', + 'import/extensions': [ + 'error', + 'always', + { + ignorePackages: true, + pattern: { + js: 'never', + jsx: 'never', + ts: 'never', + tsx: 'never', + }, + }, + ], + 'linebreak-style': ['error', 'unix'], + 'no-func-assign': 'error', + 'constructor-super': 'error', + 'getter-return': ['error', { allowImplicit: true }], + 'import/named': 'error', + 'no-const-assign': 'error', + 'no-dupe-args': 'error', + 'no-dupe-keys': 'error', + 'no-import-assign': 'error', + 'no-new-func': 'error', + 'no-new-symbol': 'error', + 'no-obj-calls': 'error', + 'no-this-before-super': 'error', + 'no-undef': 'error', + 'no-unreachable': 'error', + 'valid-typeof': ['error', { requireStringLiterals: true }], + 'react/jsx-filename-extension': [ + 'error', + { + extensions: ['.jsx', '.tsx'], + }, + ], + curly: ['error', 'all'], + }, + }, + { + name: 'Test files and test related infrastructure', + files: ['**/+(*.)+(spec|test).+(ts|js)?(x)', 'src/testing/**'], + extends: [...compat.extends('plugin:testing-library/react')], + plugins: { + vitest, + }, + rules: { + ...vitest.configs.recommended.rules, + 'testing-library/no-manual-cleanup': 'off', + 'testing-library/no-wait-for-multiple-assertions': 'off', + 'vitest/expect-expect': 'off', + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: true, + optionalDependencies: false, + peerDependencies: false, + }, + ], + 'import/no-restricted-paths': ['off', { zones: [] }], + }, + }, + { + name: 'Root level .js/.ts configuration files', + files: ['*.js', '*.ts', '__mocks__/**/*.[j|t]s?(x)'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + rules: { + 'import/no-default-export': 'off', + 'import/no-commonjs': 'off', + 'import/no-nodejs-modules': 'off', + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: true, + optionalDependencies: false, + peerDependencies: false, + }, + ], + }, + }, + { + name: 'Root level .ts configuration files', + files: ['*.ts'], + languageOptions: { + parserOptions: { + project: ['tsconfig.node.json'], + }, + }, + }, + { + name: 'Type definition files', + files: ['**/*.d.ts'], + rules: { + 'import/no-default-export': 'off', + }, + }, + { + ignores: ['package-lock.json', 'dist', 'coverage', 'extra'], + } +); diff --git a/package-lock.json b/package-lock.json index b9e24cb..8f1010b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,14 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "@arabasta/eslint-plugin-no-destructuring-arrays-as-objects": "^1.0.4", + "@arabasta/eslint-plugin-no-testing-library-without-cleanup": "^1.0.4", + "@arabasta/eslint-plugin-redux-use-app-functions": "^1.0.4", + "@arabasta/eslint-plugin-report-caught-error": "^1.0.5", + "@arabasta/eslint-plugin-require-useeffect-dependency-array": "^1.0.8", + "@eslint-community/eslint-plugin-eslint-comments": "^4.3.0", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "^9.2.0", "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.2", @@ -20,8 +28,6 @@ "@total-typescript/ts-reset": "^0.5.1", "@types/react": "^18.2.73", "@types/react-dom": "^18.2.23", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.5.0", "eslint": "^8.57.0", @@ -30,17 +36,17 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-es": "^4.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-new-with-error": "^5.0.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "eslint-plugin-require-useeffect-dependency-array": "^1.0.6", "eslint-plugin-testing-library": "^6.2.0", - "eslint-plugin-unused-imports": "^3.1.0", - "eslint-plugin-vitest": "^0.4.0", + "eslint-plugin-unused-imports": "^3.2.0", + "eslint-plugin-vitest": "^0.5.4", + "globals": "^15.1.0", "jsdom": "^24.0.0", "msw": "^2.2.13", "prettier": "^3.2.5", @@ -49,6 +55,7 @@ "source-map-explorer": "^2.5.3", "tailwindcss": "^3.4.3", "typescript": "^5.4.3", + "typescript-eslint": "^7.8.0", "vite": "^5.2.7", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.5.0" @@ -94,6 +101,56 @@ "node": ">=6.0.0" } }, + "node_modules/@arabasta/eslint-plugin-no-destructuring-arrays-as-objects": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@arabasta/eslint-plugin-no-destructuring-arrays-as-objects/-/eslint-plugin-no-destructuring-arrays-as-objects-1.0.4.tgz", + "integrity": "sha512-SSugncapzNvELg53qiZbOWW/nDZx6UESCuXinQFiWhHmzPCXJu9rqme/6rj/5eaG6E/B3yalzcCPUFLHAclyEw==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^7.5.0", + "@typescript-eslint/utils": "^7.5.0", + "ts-api-utils": "^1.3.0" + }, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/@arabasta/eslint-plugin-no-testing-library-without-cleanup": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@arabasta/eslint-plugin-no-testing-library-without-cleanup/-/eslint-plugin-no-testing-library-without-cleanup-1.0.4.tgz", + "integrity": "sha512-anEDCNWINh4xQ/BGcb0kKlFID+5LeGeQ5RkRocvRnGdJwj0VXr00lqBn36aB4YwuBtkt15fWDXaNp8kVK/uU/w==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/@arabasta/eslint-plugin-redux-use-app-functions": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@arabasta/eslint-plugin-redux-use-app-functions/-/eslint-plugin-redux-use-app-functions-1.0.4.tgz", + "integrity": "sha512-ZURM4e9Cf6E9cIkQskdsPUCknRS7bh5p+2pt9ofSXKixYn5Acv0ZUpmllJcnBe+cclFaC/grnfHnAFKWJy/9DA==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/@arabasta/eslint-plugin-report-caught-error": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@arabasta/eslint-plugin-report-caught-error/-/eslint-plugin-report-caught-error-1.0.5.tgz", + "integrity": "sha512-LMDWiCqpF6PFzVIokma1R55MEoWjInwmW68EOcpQ3bmwDIe79AbS1rXnNEuOLN4EX0xykpf2AYYfk6/Y7aOsbw==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, + "node_modules/@arabasta/eslint-plugin-require-useeffect-dependency-array": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@arabasta/eslint-plugin-require-useeffect-dependency-array/-/eslint-plugin-require-useeffect-dependency-array-1.0.8.tgz", + "integrity": "sha512-m71qQKj/F9ZVWHx4LCQ7lRsTikUUZsloP5hzvEaCwH6keOhdQcZpISQ1VAOFKVe7aQzIBFa5VIIRyUhhsPfySQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=8.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -509,6 +566,15 @@ "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", @@ -915,6 +981,22 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.3.0.tgz", + "integrity": "sha512-6e93KtgsndNkvwCCa07LOQJSwzzLLxwrFll3+huyFoiiQXWG0KBcmo0Q1bVgYQQDLfWOOZl2VPBsXqZL6vHIBQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -940,15 +1022,15 @@ } }, "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.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", "dev": true, "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", @@ -956,7 +1038,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" @@ -972,16 +1054,42 @@ "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@eslint/eslintrc/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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "acorn": "^8.11.3", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -999,25 +1107,13 @@ "node": "*" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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.2.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", + "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanwhocodes/config-array": { @@ -1810,22 +1906,22 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", - "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/type-utils": "7.4.0", - "@typescript-eslint/utils": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1845,15 +1941,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", - "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4" }, "engines": { @@ -1873,13 +1969,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", - "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1890,15 +1986,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", - "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1917,9 +2013,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", - "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1930,19 +2026,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", - "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1957,19 +2053,34 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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/utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", - "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1983,13 +2094,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", - "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3883,17 +3994,17 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "engines": { - "node": ">=6.5.0" + "node": ">=8.10.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -3902,15 +4013,6 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", @@ -4177,15 +4279,6 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-require-useeffect-dependency-array": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-require-useeffect-dependency-array/-/eslint-plugin-require-useeffect-dependency-array-1.0.6.tgz", - "integrity": "sha512-PerRoSy6j3+QX4l1wPvU6U2tZ1m94nFyrSFRsGSc2f23dXUqlyGC/7XZ6kAihFhQNYWEwTiC/LhrgGmn6PGT8g==", - "dev": true, - "peerDependencies": { - "eslint": ">=8" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.0.tgz", @@ -4325,9 +4418,9 @@ } }, "node_modules/eslint-plugin-unused-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", - "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.2.0.tgz", + "integrity": "sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==", "dev": true, "dependencies": { "eslint-rule-composer": "^0.3.0" @@ -4346,18 +4439,18 @@ } }, "node_modules/eslint-plugin-vitest": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.4.0.tgz", - "integrity": "sha512-3oWgZIwdWVBQ5plvkmOBjreIGLQRdYb7x54OP8uIRHeZyRVJIdOn9o/qWVb9292fDMC8jn7H7d9TSFBZqhrykQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz", + "integrity": "sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "^7.2.0" + "@typescript-eslint/utils": "^7.7.1" }, "engines": { "node": "^18.0.0 || >= 20.0.0" }, "peerDependencies": { - "eslint": ">=8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "vitest": "*" }, "peerDependenciesMeta": { @@ -4394,6 +4487,30 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", @@ -4406,6 +4523,38 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/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, + "dependencies": { + "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/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, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4980,12 +5129,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.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.1.0.tgz", + "integrity": "sha512-926gJqg+4mkxwYKiFvoomM4J0kWESfk3qfTvRL2/oc/tK/eTDBbrfcKnSa2KtfdxB5onoL7D3A3qIHQFpd4+UA==", "dev": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -7231,6 +7383,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8544,6 +8708,32 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.8.0.tgz", + "integrity": "sha512-sheFG+/D8N/L7gC3WT0Q8sB97Nm573Yfr+vZFzl/4nBdYcmviBPtwGSX9TJ7wpVg28ocerKVOt+k2eGmHzcgVA==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "7.8.0", + "@typescript-eslint/parser": "7.8.0", + "@typescript-eslint/utils": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ufo": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", diff --git a/package.json b/package.json index 90f5380..0c1bc71 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,14 @@ "react-dom": "^18.2.0" }, "devDependencies": { + "@arabasta/eslint-plugin-no-destructuring-arrays-as-objects": "^1.0.4", + "@arabasta/eslint-plugin-no-testing-library-without-cleanup": "^1.0.4", + "@arabasta/eslint-plugin-redux-use-app-functions": "^1.0.4", + "@arabasta/eslint-plugin-report-caught-error": "^1.0.5", + "@arabasta/eslint-plugin-require-useeffect-dependency-array": "^1.0.8", + "@eslint-community/eslint-plugin-eslint-comments": "^4.3.0", + "@eslint/eslintrc": "^3.0.2", + "@eslint/js": "^9.2.0", "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.2", @@ -29,8 +37,6 @@ "@total-typescript/ts-reset": "^0.5.1", "@types/react": "^18.2.73", "@types/react-dom": "^18.2.23", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.5.0", "eslint": "^8.57.0", @@ -39,17 +45,17 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-deprecation": "^2.0.0", - "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-es": "^4.1.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-new-with-error": "^5.0.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "eslint-plugin-require-useeffect-dependency-array": "^1.0.6", "eslint-plugin-testing-library": "^6.2.0", - "eslint-plugin-unused-imports": "^3.1.0", - "eslint-plugin-vitest": "^0.4.0", + "eslint-plugin-unused-imports": "^3.2.0", + "eslint-plugin-vitest": "^0.5.4", + "globals": "^15.1.0", "jsdom": "^24.0.0", "msw": "^2.2.13", "prettier": "^3.2.5", @@ -58,6 +64,7 @@ "source-map-explorer": "^2.5.3", "tailwindcss": "^3.4.3", "typescript": "^5.4.3", + "typescript-eslint": "^7.8.0", "vite": "^5.2.7", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.5.0" diff --git a/setupTests.ts b/setupTests.ts index bb02c60..ef4c688 100644 --- a/setupTests.ts +++ b/setupTests.ts @@ -1 +1,2 @@ +// eslint-disable-next-line @arabasta/no-testing-library-without-cleanup/no-testing-library-without-cleanup import '@testing-library/jest-dom/vitest'; diff --git a/src/App.tsx b/src/App.tsx index 2ec6314..15c6a0f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,7 @@ export const App = (): JSX.Element => { fetch('http://localhost:3001/') .then((res) => res.text()) .then(setMessage) - // eslint-disable-next-line no-console + // eslint-disable-next-line no-console, @typescript-eslint/use-unknown-in-catch-callback-variable .catch(console.error); }, []);