From 8d7760df6d5287829fcdf911eaa971b84647ca63 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Mon, 6 Jul 2026 19:57:41 +0000 Subject: [PATCH] chore: Update eslint config to include react hooks rules --- eslint.config.js | 89 ++++++++++++++++++++++++++++++++--------------- package-lock.json | 76 +++++++++++++++++++++++++++++++++++++--- package.json | 4 ++- 3 files changed, 136 insertions(+), 33 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 777a0106..128a56b4 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,39 +1,72 @@ // For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format import storybook from "eslint-plugin-storybook"; +import { defineConfig, globalIgnores } from "eslint/config"; + // @ts-check -import eslint from '@eslint/js'; +import js from '@eslint/js'; +import globals from 'globals'; import tsEslint from 'typescript-eslint'; import arrow from 'eslint-plugin-prefer-arrow-functions'; +import hooks from 'eslint-plugin-react-hooks'; -export default tsEslint.config({ - files: ['src/backend/**/*.ts'], - plugins: { - "prefer-arrow-functions": arrow - }, - ignores: [ - 'eslint.config.js', - 'src/backend/tests/**/*.ts' +const defaultRules = { + 'no-useless-catch': 'off', + '@typescript-eslint/no-unused-vars': 'warn', + 'no-unused-vars': 'warn', + "prefer-arrow-functions/prefer-arrow-functions": [ + "warn", + { + "allowNamedFunctions": false, + "classPropertiesAllowed": false, + "disallowPrototype": false, + "returnStyle": "unchanged", + "singleReturnOnly": false + } ], - extends: [ - eslint.configs.recommended, - ...tsEslint.configs.recommended, - ], - rules: { - 'no-useless-catch': 'off', - '@typescript-eslint/no-unused-vars': 'off', - "prefer-arrow-functions/prefer-arrow-functions": [ - "warn", - { - "allowNamedFunctions": false, - "classPropertiesAllowed": false, - "disallowPrototype": false, - "returnStyle": "unchanged", - "singleReturnOnly": false - } + "arrow-body-style": ["warn", "as-needed"], + "@typescript-eslint/no-explicit-any": "warn" +}; + +export default defineConfig([ + globalIgnores([ + 'docsite/build', + 'docsite/.docusaurus', + 'public/mockServiceWorker.js' + ]), + { + plugins: { + "prefer-arrow-functions": arrow, + js + }, + rules: defaultRules, + extends: [ + tsEslint.configs.recommended, + "js/recommended" ], - "arrow-body-style": ["warn", "as-needed"], - "@typescript-eslint/no-explicit-any": "warn" + languageOptions: { + globals: { + ...globals.node, + } + }, + files: ['src/**/*.ts','src/**/*.tsx'] + }, + { + extends: [ + storybook.configs["flat/recommended"], + ], + files: ['src/client/stories/**/*.tsx'], + }, + { + extends: [ + hooks.configs.flat.recommended, + ], + languageOptions: { + globals: { + ...globals.browser, + } + }, + files: ['src/client/**/*.tsx'], } -}, storybook.configs["flat/recommended"]); +]); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b1283209..9a45bb4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -170,10 +170,12 @@ "chai-as-promised": "^8.0.2", "clsx": "^2.1.1", "drizzle-kit": "^1.0.0-rc.2-c5a84d1", - "eslint": "^10.3.0", + "eslint": "^10.6.0", "eslint-plugin-prefer-arrow-functions": "^3.2.4", + "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-storybook": "^10.3.6", "git-cliff": "^2.12.0", + "globals": "^17.7.0", "ky": "^2.0.2", "mocha": "^10.3.0", "mockdate": "^3.0.5", @@ -10353,11 +10355,14 @@ } }, "node_modules/eslint": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.4.1.tgz", - "integrity": "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==", + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.6.0.tgz", + "integrity": "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg==", "dev": true, "license": "MIT", + "workspaces": [ + "packages/*" + ], "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -10579,6 +10584,39 @@ "typescript": ">=4.8.4" } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react-hooks/node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/eslint-plugin-storybook": { "version": "10.4.2", "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.4.2.tgz", @@ -11901,6 +11939,19 @@ "node": ">=10.13.0" } }, + "node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -12162,6 +12213,23 @@ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", "license": "MIT" }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", diff --git a/package.json b/package.json index d9091784..48d66542 100644 --- a/package.json +++ b/package.json @@ -209,10 +209,12 @@ "chai-as-promised": "^8.0.2", "clsx": "^2.1.1", "drizzle-kit": "^1.0.0-rc.2-c5a84d1", - "eslint": "^10.3.0", + "eslint": "^10.6.0", "eslint-plugin-prefer-arrow-functions": "^3.2.4", + "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-storybook": "^10.3.6", "git-cliff": "^2.12.0", + "globals": "^17.7.0", "ky": "^2.0.2", "mocha": "^10.3.0", "mockdate": "^3.0.5",