From c4759f9787125db02459db8a63f05931d961458e Mon Sep 17 00:00:00 2001 From: kazeemamudalat3-collab Date: Thu, 22 Oct 2026 12:44:46 +0100 Subject: [PATCH 1/3] chore: upgrade eslint and fix the current ruleset Raises eslint to ^9.39.5 (the line eslint-config-next 16 is tested against; 10.x is blocked upstream by next's vendored parser), stops the base no-unused-vars from double-reporting on TypeScript, allows console.warn/error and prunes ignores eslint already applies. Closes #999 --- eslint.config.mjs | 38 ++++++++++++-- package.json | 2 +- pnpm-lock.yaml | 129 +++++++++++++++++++++++----------------------- 3 files changed, 101 insertions(+), 68 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index edf922e1..59d39636 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,15 +1,47 @@ import coreWebVitals from 'eslint-config-next/core-web-vitals'; +// eslint-config-next already ignores `.next`, `out`, `build`, `next-env.d.ts` +// (and ESLint ignores `node_modules`/`.git`), so only what it misses is listed. +const generatedOutput = ['coverage/**', '**/*.tsbuildinfo']; + const config = [ + { ignores: generatedOutput }, ...coreWebVitals, { rules: { - 'no-console': 'warn', - 'no-unused-vars': ['warn', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], + 'no-console': ['warn', { allow: ['warn', 'error'] }], }, }, { - ignores: ['.next/**', 'node_modules/**', 'tsconfig.tsbuildinfo'], + // The base rule misreports on TypeScript (types, enums and implements + // clauses); eslint-config-next already enables the TS-aware variant. + files: ['**/*.{ts,tsx,mts,cts}'], + rules: { + 'no-unused-vars': 'off', + '@typescript-eslint/no-unused-vars': [ + 'warn', + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, + { + files: ['**/*.{js,cjs,mjs,jsx}'], + rules: { + 'no-unused-vars': [ + 'warn', + { + varsIgnorePattern: '^_', + argsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }, + ], + }, }, ]; diff --git a/package.json b/package.json index 7c7ba41a..800355a2 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "autoprefixer": "^10.0.1", - "eslint": "^9.0.0", + "eslint": "^9.39.5", "eslint-config-next": "16.1.6", "jest": "^30.3.0", "jest-environment-jsdom": "^30.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5843e07..7614fae5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -154,11 +154,11 @@ importers: specifier: ^10.0.1 version: 10.5.0(postcss@8.5.15) eslint: - specifier: ^9.0.0 - version: 9.39.4(jiti@2.7.0) + specifier: ^9.39.5 + version: 9.39.5(jiti@2.7.0) eslint-config-next: specifier: 16.1.6 - version: 16.1.6(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + version: 16.1.6(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) jest: specifier: ^30.3.0 version: 30.4.2(@types/node@20.19.41)(ts-node@10.9.2(@types/node@20.19.41)(typescript@5.9.3)) @@ -447,12 +447,12 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} + '@eslint/eslintrc@3.3.7': + resolution: {integrity: sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -2312,9 +2312,10 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -2964,8 +2965,8 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true jsdom@26.1.0: @@ -4512,9 +4513,9 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4535,7 +4536,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/eslintrc@3.3.7': dependencies: ajv: 6.15.0 debug: 4.4.3 @@ -4543,13 +4544,13 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.3.2 minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.4': {} + '@eslint/js@9.39.5': {} '@eslint/object-schema@2.1.7': {} @@ -5561,15 +5562,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.60.0 - '@typescript-eslint/type-utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.60.0 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -5577,14 +5578,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.60.0 '@typescript-eslint/types': 8.60.0 '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.60.0 debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5607,13 +5608,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.60.0 '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5636,13 +5637,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': + '@typescript-eslint/utils@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.60.0 '@typescript-eslint/types': 8.60.0 '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6345,18 +6346,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.1.6(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): + eslint-config-next@16.1.6(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.1.6 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-react-hooks: 7.1.1(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.7.0)) + eslint-plugin-react-hooks: 7.1.1(eslint@9.39.5(jiti@2.7.0)) globals: 16.4.0 - typescript-eslint: 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + typescript-eslint: 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -6373,33 +6374,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) get-tsconfig: 4.14.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.16 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): + eslint-module-utils@2.13.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/parser': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.5(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -6408,9 +6409,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) + eslint-module-utils: 2.13.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.7.0)))(eslint@9.39.5(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -6422,13 +6423,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.7.0)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -6438,7 +6439,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) hasown: 2.0.4 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -6447,18 +6448,18 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.5(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) hermes-parser: 0.25.1 zod: 3.25.76 zod-validation-error: 4.0.2(zod@3.25.76) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -6466,7 +6467,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.2 - eslint: 9.39.4(jiti@2.7.0) + eslint: 9.39.5(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -6491,15 +6492,15 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.7.0): + eslint@9.39.5(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 + '@eslint/eslintrc': 3.3.7 + '@eslint/js': 9.39.5 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 @@ -7371,7 +7372,7 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -8455,13 +8456,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): + typescript-eslint@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - '@typescript-eslint/parser': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.60.0(@typescript-eslint/parser@8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.60.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.60.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.7.0) + '@typescript-eslint/utils': 8.60.0(eslint@9.39.5(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.5(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color From 6e308168fb25a0749da6915ed9685e5ec491fbfa Mon Sep 17 00:00:00 2001 From: kazeemamudalat3-collab Date: Thu, 22 Oct 2026 12:47:32 +0100 Subject: [PATCH 2/3] test: cover the eslint ruleset changes --- __tests__/eslintConfig.test.ts | 78 ++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 __tests__/eslintConfig.test.ts diff --git a/__tests__/eslintConfig.test.ts b/__tests__/eslintConfig.test.ts new file mode 100644 index 00000000..9471cd8d --- /dev/null +++ b/__tests__/eslintConfig.test.ts @@ -0,0 +1,78 @@ +import { execFileSync } from 'child_process'; +import path from 'path'; + +const repoRoot = path.resolve(__dirname, '..'); +const eslintBin = path.join(repoRoot, 'node_modules', 'eslint', 'bin', 'eslint.js'); + +type LintMessage = { + ruleId: string | null; + message: string; + severity: number; +}; + +jest.setTimeout(180000); + +function lint(code: string, filename: string): LintMessage[] { + const stdout = execFileSync( + process.execPath, + [eslintBin, '--stdin', '--stdin-filename', filename, '--format', 'json'], + { cwd: repoRoot, input: code, encoding: 'utf8' } + ); + const [result] = JSON.parse(stdout) as { messages: LintMessage[] }[]; + return result ? result.messages : []; +} + +const ruleIds = (messages: LintMessage[]) => messages.map((message) => message.ruleId); + +describe('ESLint ruleset', () => { + it('flags console.log while allowing console.error and console.warn', () => { + expect(ruleIds(lint('export function f() {\n console.log("noise");\n}\n', 'lib/sample.ts'))).toContain( + 'no-console' + ); + + for (const method of ['error', 'warn']) { + const messages = lint(`export function f() {\n console.${method}("diagnostic");\n}\n`, 'lib/sample.ts'); + expect(messages.filter((message) => message.ruleId === 'no-console')).toEqual([]); + } + }); + + it('reports unused TypeScript bindings once, through the TS-aware rule', () => { + const messages = lint('export function f() {\n const unusedValue = 1;\n return 2;\n}\n', 'lib/sample.ts'); + + expect(ruleIds(messages)).toEqual(['@typescript-eslint/no-unused-vars']); + expect(ruleIds(messages)).not.toContain('no-unused-vars'); + }); + + it('accepts underscore-prefixed placeholders for arguments, catches and destructuring', () => { + const code = [ + 'export function read({ a, b: _b }: { a: number; b: number }, _label: string) {', + ' const [, ...rest] = [1, 2, 3];', + ' try {', + ' return a + rest.length;', + ' } catch (_error) {', + ' return 0;', + ' }', + '}', + ].join('\n'); + + expect(lint(code, 'lib/sample.ts').filter((message) => message.severity === 2)).toEqual([]); + }); + + it('keeps checked-in and generated build output out of the lint run', () => { + expect( + lint('const stale = 1;\n', '.next/dev/stale.ts').some( + (message) => message.ruleId === null && /ignored/i.test(message.message) + ) + ).toBe(true); + + expect( + lint('const stale = 1;\n', 'coverage/report.ts').some((message) => + /ignored/i.test(message.message) + ) + ).toBe(true); + + expect( + lint('export const live = 1;\n', 'lib/live.ts').some((message) => /ignored/i.test(message.message)) + ).toBe(false); + }); +}); From 74f54e9746b617b1dde684fee3694eec3d5c4a61 Mon Sep 17 00:00:00 2001 From: kazeemamudalat3-collab Date: Thu, 22 Oct 2026 13:03:44 +0100 Subject: [PATCH 3/3] chore: drop eslint-disable comments the ruleset makes redundant --- services/deliverySocketService.ts | 2 -- services/driverTrackingService.ts | 6 ------ 2 files changed, 8 deletions(-) diff --git a/services/deliverySocketService.ts b/services/deliverySocketService.ts index 2e56db51..30ba6f1c 100644 --- a/services/deliverySocketService.ts +++ b/services/deliverySocketService.ts @@ -50,13 +50,11 @@ class DeliverySocketService { callbacks.onStatusUpdate(data.status as DeliveryStatus); } } catch (error) { - // eslint-disable-next-line no-console console.error('[DeliverySocketService] Failed to parse message:', error); } }; this.socket.onerror = (error: Event) => { - // eslint-disable-next-line no-console console.error('[DeliverySocketService] WebSocket error:', error); callbacks.onError?.(error); }; diff --git a/services/driverTrackingService.ts b/services/driverTrackingService.ts index a166227f..8832199b 100644 --- a/services/driverTrackingService.ts +++ b/services/driverTrackingService.ts @@ -105,7 +105,6 @@ class DriverTrackingService { }; this.socket.onerror = (event: Event) => { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] WebSocket error:', event); this.notifySubscribers('error', 'WebSocket connection error'); }; @@ -121,7 +120,6 @@ class DriverTrackingService { } }; } catch (error) { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] Failed to create WebSocket:', error); this.notifySubscribers('error', 'Failed to create WebSocket connection'); this.scheduleReconnect(); @@ -133,7 +131,6 @@ class DriverTrackingService { */ private scheduleReconnect(): void { if (this.reconnectCount >= this.reconnectConfig.maxRetries) { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] Max reconnection attempts reached'); this.notifySubscribers('error', 'Max reconnection attempts reached'); return; @@ -176,7 +173,6 @@ class DriverTrackingService { } } } catch (error) { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] Failed to parse message:', error); this.notifySubscribers('error', 'Failed to parse incoming message'); } @@ -206,7 +202,6 @@ class DriverTrackingService { try { subscriber.onLocationUpdate(update); } catch (error) { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] Subscriber error:', error); } } @@ -236,7 +231,6 @@ class DriverTrackingService { break; } } catch (error) { - // eslint-disable-next-line no-console console.error('[DriverTrackingService] Subscriber callback error:', error); } }