From 2a9d4b3eeb22d4471f890b77e6334ee09e8663bc Mon Sep 17 00:00:00 2001 From: Ben Snyder Date: Sun, 29 Mar 2026 21:00:05 -0400 Subject: [PATCH 1/3] feat: integrate oxlint for enhanced linting support and add oxlint configuration - Added `eslint-plugin-oxlint` and `jiti` as dependencies. - Created `oxlint.config.ts` for custom linting rules and configurations. - Updated `eslint.config.js` to include oxlint settings and disable overlapping ESLint rules. - Modified package scripts to include a new `test:oxlint` command for running oxlint checks. - Adjusted test files to comply with new linting rules. --- eslint.config.js | 17 ++ oxlint.config.ts | 124 ++++++++++ package.json | 9 +- .../src/__tests__/useQuery.promise.test.tsx | 1 + .../src/__tests__/useMutation.test.ts | 8 +- pnpm-lock.yaml | 225 +++++++++++++++++- 6 files changed, 377 insertions(+), 7 deletions(-) create mode 100644 oxlint.config.ts diff --git a/eslint.config.js b/eslint.config.js index d9a08b85eee..be1d0f37635 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -4,6 +4,13 @@ import { tanstackConfig } from '@tanstack/eslint-config' import pluginCspell from '@cspell/eslint-plugin' import vitest from '@vitest/eslint-plugin' +import oxlint from 'eslint-plugin-oxlint' +import { createJiti } from 'jiti' + +const jiti = createJiti(import.meta.url) +const oxlintConfig = /** @type {*} */ ( + await jiti.import('./oxlint.config.ts') +).default export default [ ...tanstackConfig, @@ -47,6 +54,14 @@ export default [ 'prefer-const': 'off', }, }, + { + name: 'tanstack/linter-options', + linterOptions: { + // eslint-disable comments are shared with oxlint — don't warn + // about directives ESLint considers unused + reportUnusedDisableDirectives: 'off', + }, + }, { files: ['**/*.spec.ts*', '**/*.test.ts*', '**/*.test-d.ts*'], plugins: { vitest }, @@ -61,4 +76,6 @@ export default [ }, settings: { vitest: { typecheck: true } }, }, + // Must be last — disables ESLint rules that oxlint already covers + ...oxlint.buildFromOxlintConfig(oxlintConfig), ] diff --git a/oxlint.config.ts b/oxlint.config.ts new file mode 100644 index 00000000000..485103b7e56 --- /dev/null +++ b/oxlint.config.ts @@ -0,0 +1,124 @@ +import { defineConfig } from 'oxlint' + +export default defineConfig({ + plugins: ['typescript', 'vitest', 'import', 'react'], + categories: { + correctness: 'warn', + }, + env: { + builtin: true, + browser: true, + node: true, + es2024: true, + }, + rules: { + // Suppress tsconfig resolution noise in monorepo + 'typescript/tsconfig-error': 'allow', + }, + ignorePatterns: [ + '**/dist', + '**/build', + '**/node_modules', + '**/coverage', + '**/examples', + '**/integrations', + ], + overrides: [ + { + files: [ + '**/*.ts', + '**/*.tsx', + '**/*.js', + '**/*.jsx', + '**/*.cjs', + '**/*.mjs', + ], + rules: { + // ── JavaScript rules (from @tanstack/eslint-config) ── + 'for-direction': 'error', + 'no-async-promise-executor': 'error', + 'no-compare-neg-zero': 'error', + 'no-cond-assign': 'error', + 'no-constant-binary-expression': 'error', + 'no-constant-condition': 'error', + 'no-control-regex': 'error', + 'no-debugger': 'error', + 'no-delete-var': 'error', + 'no-dupe-else-if': 'error', + 'no-duplicate-case': 'error', + 'no-empty-character-class': 'error', + 'no-empty-pattern': 'error', + 'no-empty-static-block': 'error', + 'no-ex-assign': 'error', + 'no-extra-boolean-cast': 'error', + 'no-fallthrough': 'error', + 'no-global-assign': 'error', + 'no-invalid-regexp': 'error', + 'no-irregular-whitespace': 'error', + 'no-loss-of-precision': 'error', + 'no-misleading-character-class': 'error', + 'no-nonoctal-decimal-escape': 'error', + 'no-regex-spaces': 'error', + 'no-self-assign': 'error', + 'no-shadow': 'warn', + 'no-shadow-restricted-names': 'error', + 'no-sparse-arrays': 'error', + 'no-unsafe-finally': 'error', + 'no-unsafe-optional-chaining': 'error', + 'no-unused-labels': 'error', + 'no-unused-private-class-members': 'error', + 'no-useless-backreference': 'error', + 'no-useless-catch': 'error', + 'no-useless-escape': 'error', + 'no-var': 'error', + 'require-yield': 'error', + 'use-isnan': 'error', + 'valid-typeof': 'error', + + // Overridden to 'off' in eslint.config.js + 'no-case-declarations': 'allow', + 'prefer-const': 'allow', + + // ── TypeScript rules (from @tanstack/eslint-config) ── + // ban-ts-comment: warn because oxlint doesn't support the granular + // options that allow @ts-expect-error without description — ESLint + // still enforces the exact policy at error level + '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-duplicate-enum-values': 'error', + '@typescript-eslint/no-extra-non-null-assertion': 'error', + // no-inferrable-types: warn because oxlint doesn't support + // ignoreParameters option — ESLint handles the precise config + '@typescript-eslint/no-inferrable-types': 'warn', + '@typescript-eslint/no-misused-new': 'error', + '@typescript-eslint/no-namespace': 'error', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'error', + '@typescript-eslint/prefer-as-const': 'error', + '@typescript-eslint/no-wrapper-object-types': 'error', + '@typescript-eslint/triple-slash-reference': 'error', + + // Overridden to 'off' in eslint.config.js + '@typescript-eslint/no-empty-function': 'allow', + '@typescript-eslint/no-unsafe-function-type': 'allow', + }, + }, + { + files: ['**/*.spec.ts*', '**/*.test.ts*', '**/*.test-d.ts*'], + rules: { + // ── Vitest rules (from @vitest/eslint-plugin recommended) ── + // expect-expect & no-standalone-expect: warn because oxlint doesn't + // support additionalTestBlockFunctions — ESLint handles the full config + 'vitest/expect-expect': 'warn', + 'vitest/no-conditional-expect': 'error', + 'vitest/no-focused-tests': 'error', + 'vitest/no-identical-title': 'error', + 'vitest/no-import-node-test': 'error', + 'vitest/no-standalone-expect': 'warn', + 'vitest/valid-describe-callback': 'error', + 'vitest/valid-expect': 'error', + 'vitest/valid-title': 'error', + 'vitest/no-commented-out-tests': 'error', + 'vitest/no-disabled-tests': 'warn', + }, + }, + ], +}) diff --git a/package.json b/package.json index e4e28cb5d55..c44fe6f6a52 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,9 @@ "scripts": { "clean": "pnpm --filter \"./packages/**\" run clean", "test": "pnpm run test:ci", - "test:pr": "nx affected --targets=test:sherif,test:knip,test:docs,test:eslint,test:lib,test:types,test:build,build", - "test:ci": "nx run-many --targets=test:sherif,test:knip,test:docs,test:eslint,test:lib,test:types,test:build,build", + "test:pr": "nx affected --targets=test:sherif,test:knip,test:docs,test:oxlint,test:eslint,test:lib,test:types,test:build,build", + "test:ci": "nx run-many --targets=test:sherif,test:knip,test:docs,test:oxlint,test:eslint,test:lib,test:types,test:build,build", + "test:oxlint": "oxlint -c oxlint.config.ts --quiet .", "test:eslint": "nx affected --target=test:eslint", "test:sherif": "sherif -i typescript -p \"./integrations/*\" -p \"./examples/*\"", "test:size": "size-limit", @@ -35,6 +36,7 @@ "includedScripts": [ "test:docs", "test:knip", + "test:oxlint", "test:sherif", "test:size" ] @@ -57,11 +59,14 @@ "@vitest/eslint-plugin": "^1.4.0", "esbuild-plugin-file-path-extensions": "^2.1.4", "eslint": "^9.36.0", + "eslint-plugin-oxlint": "^1.57.0", "eslint-plugin-react-hooks": "^6.1.1", + "jiti": "^2.6.1", "jsdom": "^27.0.0", "knip": "^6.0.2", "markdown-link-extractor": "^4.0.2", "nx": "22.1.3", + "oxlint": "^1.57.0", "premove": "^4.0.0", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.0", diff --git a/packages/react-query/src/__tests__/useQuery.promise.test.tsx b/packages/react-query/src/__tests__/useQuery.promise.test.tsx index 5e1d892df04..7db01b7c038 100644 --- a/packages/react-query/src/__tests__/useQuery.promise.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.promise.test.tsx @@ -17,6 +17,7 @@ import { } from '..' import { QueryCache } from '../index' +// eslint-disable-next-line vitest/valid-describe-callback -- vitest 3-arg describe with options describe('useQuery().promise', { timeout: 10_000 }, () => { const queryCache = new QueryCache() const queryClient = new QueryClient({ diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index f889bff8c90..e523e56dd33 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -170,10 +170,10 @@ describe('useMutation', () => { ) }) - expect( - (relevantMutation?.options.mutationKey as Array)[0] - ?.otherObject.name === 'someOtherObjectName', - ).toBe(true) + expect(relevantMutation).toBeDefined() + const key = relevantMutation!.options + .mutationKey as Array + expect(key[0]?.otherObject.name).toBe('someOtherObjectName') }) test('should allow for non-options object (mutationFn or mutationKey) passed as arg1 & arg2 to trigger reactive updates', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7117237cdb1..2121da02d64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,9 +78,15 @@ importers: eslint: specifier: ^9.36.0 version: 9.39.4(jiti@2.6.1) + eslint-plugin-oxlint: + specifier: ^1.57.0 + version: 1.57.0(oxlint@1.57.0) eslint-plugin-react-hooks: specifier: ^6.1.1 version: 6.1.1(eslint@9.39.4(jiti@2.6.1)) + jiti: + specifier: ^2.6.1 + version: 2.6.1 jsdom: specifier: ^27.0.0 version: 27.4.0 @@ -93,6 +99,9 @@ importers: nx: specifier: 22.1.3 version: 22.1.3 + oxlint: + specifier: ^1.57.0 + version: 1.57.0 premove: specifier: ^4.0.0 version: 4.0.0 @@ -6067,6 +6076,120 @@ packages: cpu: [x64] os: [win32] + '@oxlint/binding-android-arm-eabi@1.57.0': + resolution: {integrity: sha512-C7EiyfAJG4B70496eV543nKiq5cH0o/xIh/ufbjQz3SIvHhlDDsyn+mRFh+aW8KskTyUpyH2LGWL8p2oN6bl1A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.57.0': + resolution: {integrity: sha512-9i80AresjZ/FZf5xK8tKFbhQnijD4s1eOZw6/FHUwD59HEZbVLRc2C88ADYJfLZrF5XofWDiRX/Ja9KefCLy7w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.57.0': + resolution: {integrity: sha512-0eUfhRz5L2yKa9I8k3qpyl37XK3oBS5BvrgdVIx599WZK63P8sMbg+0s4IuxmIiZuBK68Ek+Z+gcKgeYf0otsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.57.0': + resolution: {integrity: sha512-UvrSuzBaYOue+QMAcuDITe0k/Vhj6KZGjfnI6x+NkxBTke/VoM7ZisaxgNY0LWuBkTnd1OmeQfEQdQ48fRjkQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.57.0': + resolution: {integrity: sha512-wtQq0dCoiw4bUwlsNVDJJ3pxJA218fOezpgtLKrbQqUtQJcM9yP8z+I9fu14aHg0uyAxIY+99toL6uBa2r7nxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + resolution: {integrity: sha512-qxFWl2BBBFcT4djKa+OtMdnLgoHEJXpqjyGwz8OhW35ImoCwR5qtAGqApNYce5260FQqoAHW8S8eZTjiX67Tsg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + resolution: {integrity: sha512-SQoIsBU7J0bDW15/f0/RvxHfY3Y0+eB/caKBQtNFbuerTiA6JCYx9P1MrrFTwY2dTm/lMgTSgskvCEYk2AtG/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + resolution: {integrity: sha512-jqxYd1W6WMeozsCmqe9Rzbu3SRrGTyGDAipRlRggetyYbUksJqJKvUNTQtZR/KFoJPb+grnSm5SHhdWrywv3RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.57.0': + resolution: {integrity: sha512-i66WyEPVEvq9bxRUCJ/MP5EBfnTDN3nhwEdFZFTO5MmLLvzngfWEG3NSdXQzTT3vk5B9i6C2XSIYBh+aG6uqyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + resolution: {integrity: sha512-oMZDCwz4NobclZU3pH+V1/upVlJZiZvne4jQP+zhJwt+lmio4XXr4qG47CehvrW1Lx2YZiIHuxM2D4YpkG3KVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + resolution: {integrity: sha512-uoBnjJ3MMEBbfnWC1jSFr7/nSCkcQYa72NYoNtLl1imshDnWSolYCjzb8LVCwYCCfLJXD+0gBLD7fyC14c0+0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + resolution: {integrity: sha512-BdrwD7haPZ8a9KrZhKJRSj6jwCor+Z8tHFZ3PT89Y3Jq5v3LfMfEePeAmD0LOTWpiTmzSzdmyw9ijneapiVHKQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + resolution: {integrity: sha512-BNs+7ZNsRstVg2tpNxAXfMX/Iv5oZh204dVyb8Z37+/gCh+yZqNTlg6YwCLIMPSk5wLWIGOaQjT0GUOahKYImw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.57.0': + resolution: {integrity: sha512-AghS18w+XcENcAX0+BQGLiqjpqpaxKJa4cWWP0OWNLacs27vHBxu7TYkv9LUSGe5w8lOJHeMxcYfZNOAPqw2bg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.57.0': + resolution: {integrity: sha512-E/FV3GB8phu/Rpkhz5T96hAiJlGzn91qX5yj5gU754P5cmVGXY1Jw/VSjDSlZBCY3VHjsVLdzgdkJaomEmcNOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.57.0': + resolution: {integrity: sha512-xvZ2yZt0nUVfU14iuGv3V25jpr9pov5N0Wr28RXnHFxHCRxNDMtYPHV61gGLhN9IlXM96gI4pyYpLSJC5ClLCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + resolution: {integrity: sha512-Z4D8Pd0AyHBKeazhdIXeUUy5sIS3Mo0veOlzlDECg6PhRRKgEsBJCCV1n+keUZtQ04OP+i7+itS3kOykUyNhDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + resolution: {integrity: sha512-StOZ9nFMVKvevicbQfql6Pouu9pgbeQnu60Fvhz2S6yfMaii+wnueLnqQ5I1JPgNF0Syew4voBlAaHD13wH6tw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.57.0': + resolution: {integrity: sha512-6PuxhYgth8TuW0+ABPOIkGdBYw+qYGxgIdXPHSVpiCDm+hqTTWCmC739St1Xni0DJBt8HnSHTG67i1y6gr8qrA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} @@ -7833,11 +7956,12 @@ packages: '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} - deprecated: this version is no longer supported, please update to at least 0.8.* + deprecated: this version has critical issues, please update to the latest version '@xmldom/xmldom@0.8.11': resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} + deprecated: this version has critical issues, please update to the latest version '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -9738,6 +9862,11 @@ packages: peerDependencies: eslint: '>=8.23.0' + eslint-plugin-oxlint@1.57.0: + resolution: {integrity: sha512-+c1ZqIKq6pJ/BzZkpFxkuk+40EFXSb57t8AytjEnCqeCW6WecHzeBOIukfq6nHOxIrzX+uJ0ulN70Fj8YaR50g==} + peerDependencies: + oxlint: ~1.57.0 + eslint-plugin-react-dom@2.12.2: resolution: {integrity: sha512-Tvz+YETB0MQiPHR3KYhkwCioGfXQ6aUXpNOFpgZ70wx5/QuU1lemTWdmXuxgAPifsl150OOZmM2MJ0ElkwBUOw==} engines: {node: '>=20.19.0'} @@ -12789,6 +12918,16 @@ packages: oxc-resolver@11.19.1: resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} + oxlint@1.57.0: + resolution: {integrity: sha512-DGFsuBX5MFZX9yiDdtKjTrYPq45CZ8Fft6qCltJITYZxfwYjVdGf/6wycGYTACloauwIPxUnYhBVeZbHvleGhw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.15.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-event@5.0.1: resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -19725,6 +19864,63 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.19.1': optional: true + '@oxlint/binding-android-arm-eabi@1.57.0': + optional: true + + '@oxlint/binding-android-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.57.0': + optional: true + + '@oxlint/binding-darwin-x64@1.57.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.57.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.57.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.57.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.57.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.57.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.57.0': + optional: true + '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -24297,6 +24493,11 @@ snapshots: transitivePeerDependencies: - typescript + eslint-plugin-oxlint@1.57.0(oxlint@1.57.0): + dependencies: + jsonc-parser: 3.3.1 + oxlint: 1.57.0 + eslint-plugin-react-dom@2.12.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): dependencies: '@eslint-react/ast': 2.12.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) @@ -28423,6 +28624,28 @@ snapshots: '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 + oxlint@1.57.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.57.0 + '@oxlint/binding-android-arm64': 1.57.0 + '@oxlint/binding-darwin-arm64': 1.57.0 + '@oxlint/binding-darwin-x64': 1.57.0 + '@oxlint/binding-freebsd-x64': 1.57.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.57.0 + '@oxlint/binding-linux-arm-musleabihf': 1.57.0 + '@oxlint/binding-linux-arm64-gnu': 1.57.0 + '@oxlint/binding-linux-arm64-musl': 1.57.0 + '@oxlint/binding-linux-ppc64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-gnu': 1.57.0 + '@oxlint/binding-linux-riscv64-musl': 1.57.0 + '@oxlint/binding-linux-s390x-gnu': 1.57.0 + '@oxlint/binding-linux-x64-gnu': 1.57.0 + '@oxlint/binding-linux-x64-musl': 1.57.0 + '@oxlint/binding-openharmony-arm64': 1.57.0 + '@oxlint/binding-win32-arm64-msvc': 1.57.0 + '@oxlint/binding-win32-ia32-msvc': 1.57.0 + '@oxlint/binding-win32-x64-msvc': 1.57.0 + p-event@5.0.1: dependencies: p-timeout: 5.1.0 From bddb0b87322e9e52a0aa10fcebe10cfdf53664a8 Mon Sep 17 00:00:00 2001 From: Ben Snyder Date: Sun, 29 Mar 2026 21:19:02 -0400 Subject: [PATCH 2/3] chore: update ESLint configurations and dependencies - Added `eslint-plugin-unused-imports` to manage unused imports. - Updated `@tanstack/eslint-config` to version 0.4.0 for improved linting rules. - Modified ESLint configurations across multiple packages to include type annotations and ensure consistent exports. - Adjusted rules in `oxlint.config.ts` to allow shadowing and refined other linting rules. - Updated package dependencies in `pnpm-lock.yaml` to reflect the changes. --- eslint.config.js | 12 ++- examples/react/algolia/eslint.config.js | 5 +- .../basic-graphql-request/eslint.config.js | 5 +- examples/react/basic/eslint.config.js | 5 +- .../react/eslint-plugin-demo/eslint.config.js | 5 +- examples/react/shadow-dom/eslint.config.js | 5 +- oxlint.config.ts | 2 +- package.json | 3 +- .../eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/eslint-plugin-query/eslint.config.js | 5 +- .../preact-query-devtools/eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/preact-query/eslint.config.js | 5 +- .../eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/query-codemods/eslint.config.js | 5 +- packages/query-core/eslint.config.js | 5 +- packages/query-devtools/eslint.config.js | 5 +- .../eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/query-test-utils/eslint.config.js | 5 +- .../react-query-devtools/eslint.config.js | 5 +- .../eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/react-query/eslint.config.js | 5 +- .../solid-query-devtools/eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/solid-query/eslint.config.js | 5 +- .../svelte-query-devtools/eslint.config.js | 5 +- .../eslint.config.js | 5 +- packages/svelte-query/eslint.config.js | 5 +- packages/vue-query-devtools/eslint.config.js | 5 +- packages/vue-query/eslint.config.js | 5 +- pnpm-lock.yaml | 93 +++++++++++++------ 35 files changed, 203 insertions(+), 62 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index be1d0f37635..4b1491ad0ce 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,8 +1,8 @@ // @ts-check -// @ts-ignore Needed due to moduleResolution Node vs Bundler import { tanstackConfig } from '@tanstack/eslint-config' import pluginCspell from '@cspell/eslint-plugin' +import unusedImports from 'eslint-plugin-unused-imports' import vitest from '@vitest/eslint-plugin' import oxlint from 'eslint-plugin-oxlint' import { createJiti } from 'jiti' @@ -12,12 +12,14 @@ const oxlintConfig = /** @type {*} */ ( await jiti.import('./oxlint.config.ts') ).default -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tanstackConfig, { name: 'tanstack/temp', plugins: { cspell: pluginCspell, + 'unused-imports': unusedImports, }, rules: { 'cspell/spellchecker': [ @@ -51,7 +53,11 @@ export default [ '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-unsafe-function-type': 'off', 'no-case-declarations': 'off', + 'no-shadow': 'off', + 'pnpm/enforce-catalog': 'off', + 'pnpm/json-enforce-catalog': 'off', 'prefer-const': 'off', + 'unused-imports/no-unused-imports': 'warn', }, }, { @@ -79,3 +85,5 @@ export default [ // Must be last — disables ESLint rules that oxlint already covers ...oxlint.buildFromOxlintConfig(oxlintConfig), ] + +export default config diff --git a/examples/react/algolia/eslint.config.js b/examples/react/algolia/eslint.config.js index 929bbbf2fce..f9de796447c 100644 --- a/examples/react/algolia/eslint.config.js +++ b/examples/react/algolia/eslint.config.js @@ -2,8 +2,11 @@ import { tanstackConfig } from '@tanstack/eslint-config' import pluginQuery from '@tanstack/eslint-plugin-query' import pluginReact from '@eslint-react/eslint-plugin' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tanstackConfig, ...pluginQuery.configs['flat/recommended'], pluginReact.configs.recommended, ] + +export default config diff --git a/examples/react/basic-graphql-request/eslint.config.js b/examples/react/basic-graphql-request/eslint.config.js index 929bbbf2fce..f9de796447c 100644 --- a/examples/react/basic-graphql-request/eslint.config.js +++ b/examples/react/basic-graphql-request/eslint.config.js @@ -2,8 +2,11 @@ import { tanstackConfig } from '@tanstack/eslint-config' import pluginQuery from '@tanstack/eslint-plugin-query' import pluginReact from '@eslint-react/eslint-plugin' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tanstackConfig, ...pluginQuery.configs['flat/recommended'], pluginReact.configs.recommended, ] + +export default config diff --git a/examples/react/basic/eslint.config.js b/examples/react/basic/eslint.config.js index 929bbbf2fce..f9de796447c 100644 --- a/examples/react/basic/eslint.config.js +++ b/examples/react/basic/eslint.config.js @@ -2,8 +2,11 @@ import { tanstackConfig } from '@tanstack/eslint-config' import pluginQuery from '@tanstack/eslint-plugin-query' import pluginReact from '@eslint-react/eslint-plugin' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tanstackConfig, ...pluginQuery.configs['flat/recommended'], pluginReact.configs.recommended, ] + +export default config diff --git a/examples/react/eslint-plugin-demo/eslint.config.js b/examples/react/eslint-plugin-demo/eslint.config.js index 1e9a5820b5d..ffd1bde4283 100644 --- a/examples/react/eslint-plugin-demo/eslint.config.js +++ b/examples/react/eslint-plugin-demo/eslint.config.js @@ -1,7 +1,8 @@ import pluginQuery from '@tanstack/eslint-plugin-query' import tseslint from 'typescript-eslint' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tseslint.configs.recommended, ...pluginQuery.configs['flat/recommended'], { @@ -19,3 +20,5 @@ export default [ }, }, ] + +export default config diff --git a/examples/react/shadow-dom/eslint.config.js b/examples/react/shadow-dom/eslint.config.js index 929bbbf2fce..f9de796447c 100644 --- a/examples/react/shadow-dom/eslint.config.js +++ b/examples/react/shadow-dom/eslint.config.js @@ -2,8 +2,11 @@ import { tanstackConfig } from '@tanstack/eslint-config' import pluginQuery from '@tanstack/eslint-plugin-query' import pluginReact from '@eslint-react/eslint-plugin' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...tanstackConfig, ...pluginQuery.configs['flat/recommended'], pluginReact.configs.recommended, ] + +export default config diff --git a/oxlint.config.ts b/oxlint.config.ts index 485103b7e56..7b386be81d2 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -60,7 +60,7 @@ export default defineConfig({ 'no-nonoctal-decimal-escape': 'error', 'no-regex-spaces': 'error', 'no-self-assign': 'error', - 'no-shadow': 'warn', + 'no-shadow': 'allow', 'no-shadow-restricted-names': 'error', 'no-sparse-arrays': 'error', 'no-unsafe-finally': 'error', diff --git a/package.json b/package.json index c44fe6f6a52..2186f14bb77 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@eslint-react/eslint-plugin": "^2.0.1", "@size-limit/preset-small-lib": "^12.0.0", "@svitejs/changesets-changelog-github-compact": "^1.2.0", - "@tanstack/eslint-config": "0.3.2", + "@tanstack/eslint-config": "0.4.0", "@tanstack/typedoc-config": "0.3.1", "@tanstack/vite-config": "0.4.3", "@testing-library/jest-dom": "^6.8.0", @@ -61,6 +61,7 @@ "eslint": "^9.36.0", "eslint-plugin-oxlint": "^1.57.0", "eslint-plugin-react-hooks": "^6.1.1", + "eslint-plugin-unused-imports": "^4.4.1", "jiti": "^2.6.1", "jsdom": "^27.0.0", "knip": "^6.0.2", diff --git a/packages/angular-query-experimental/eslint.config.js b/packages/angular-query-experimental/eslint.config.js index 196f1185560..678b741db2a 100644 --- a/packages/angular-query-experimental/eslint.config.js +++ b/packages/angular-query-experimental/eslint.config.js @@ -3,7 +3,8 @@ import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, { plugins: { vitest }, @@ -22,3 +23,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/angular-query-persist-client/eslint.config.js b/packages/angular-query-persist-client/eslint.config.js index 84b0029c8e7..8abb7de0f3e 100644 --- a/packages/angular-query-persist-client/eslint.config.js +++ b/packages/angular-query-persist-client/eslint.config.js @@ -3,7 +3,8 @@ import pluginJsdoc from 'eslint-plugin-jsdoc' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, pluginJsdoc.configs['flat/recommended-typescript'], { @@ -29,3 +30,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/eslint-plugin-query/eslint.config.js b/packages/eslint-plugin-query/eslint.config.js index b6464bd8c98..bb90a9ede1a 100644 --- a/packages/eslint-plugin-query/eslint.config.js +++ b/packages/eslint-plugin-query/eslint.config.js @@ -3,7 +3,8 @@ import vitest from '@vitest/eslint-plugin' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, { plugins: { vitest }, @@ -18,3 +19,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/preact-query-devtools/eslint.config.js b/packages/preact-query-devtools/eslint.config.js index 4e7c7b4c7bb..81514def189 100644 --- a/packages/preact-query-devtools/eslint.config.js +++ b/packages/preact-query-devtools/eslint.config.js @@ -6,7 +6,8 @@ import tseslint from 'typescript-eslint' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...preact, { @@ -36,3 +37,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/preact-query-persist-client/eslint.config.js b/packages/preact-query-persist-client/eslint.config.js index 4e7c7b4c7bb..81514def189 100644 --- a/packages/preact-query-persist-client/eslint.config.js +++ b/packages/preact-query-persist-client/eslint.config.js @@ -6,7 +6,8 @@ import tseslint from 'typescript-eslint' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...preact, { @@ -36,3 +37,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/preact-query/eslint.config.js b/packages/preact-query/eslint.config.js index 4e7c7b4c7bb..81514def189 100644 --- a/packages/preact-query/eslint.config.js +++ b/packages/preact-query/eslint.config.js @@ -6,7 +6,8 @@ import tseslint from 'typescript-eslint' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...preact, { @@ -36,3 +37,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/query-async-storage-persister/eslint.config.js b/packages/query-async-storage-persister/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-async-storage-persister/eslint.config.js +++ b/packages/query-async-storage-persister/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-broadcast-client-experimental/eslint.config.js b/packages/query-broadcast-client-experimental/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-broadcast-client-experimental/eslint.config.js +++ b/packages/query-broadcast-client-experimental/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-codemods/eslint.config.js b/packages/query-codemods/eslint.config.js index c3c009f41e8..9c28dbbc584 100644 --- a/packages/query-codemods/eslint.config.js +++ b/packages/query-codemods/eslint.config.js @@ -2,7 +2,8 @@ import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, { rules: { @@ -16,3 +17,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/query-core/eslint.config.js b/packages/query-core/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-core/eslint.config.js +++ b/packages/query-core/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-devtools/eslint.config.js b/packages/query-devtools/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-devtools/eslint.config.js +++ b/packages/query-devtools/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-persist-client-core/eslint.config.js b/packages/query-persist-client-core/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-persist-client-core/eslint.config.js +++ b/packages/query-persist-client-core/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-sync-storage-persister/eslint.config.js b/packages/query-sync-storage-persister/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-sync-storage-persister/eslint.config.js +++ b/packages/query-sync-storage-persister/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/query-test-utils/eslint.config.js b/packages/query-test-utils/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/query-test-utils/eslint.config.js +++ b/packages/query-test-utils/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/react-query-devtools/eslint.config.js b/packages/react-query-devtools/eslint.config.js index d75c6a72f73..b24f4997d08 100644 --- a/packages/react-query-devtools/eslint.config.js +++ b/packages/react-query-devtools/eslint.config.js @@ -4,7 +4,8 @@ import pluginReact from '@eslint-react/eslint-plugin' import reactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, // @ts-expect-error wtf ...reactHooks.configs['recommended-latest'], @@ -20,3 +21,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/react-query-next-experimental/eslint.config.js b/packages/react-query-next-experimental/eslint.config.js index d75c6a72f73..b24f4997d08 100644 --- a/packages/react-query-next-experimental/eslint.config.js +++ b/packages/react-query-next-experimental/eslint.config.js @@ -4,7 +4,8 @@ import pluginReact from '@eslint-react/eslint-plugin' import reactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, // @ts-expect-error wtf ...reactHooks.configs['recommended-latest'], @@ -20,3 +21,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/react-query-persist-client/eslint.config.js b/packages/react-query-persist-client/eslint.config.js index d75c6a72f73..b24f4997d08 100644 --- a/packages/react-query-persist-client/eslint.config.js +++ b/packages/react-query-persist-client/eslint.config.js @@ -4,7 +4,8 @@ import pluginReact from '@eslint-react/eslint-plugin' import reactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, // @ts-expect-error wtf ...reactHooks.configs['recommended-latest'], @@ -20,3 +21,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/react-query/eslint.config.js b/packages/react-query/eslint.config.js index edacda99388..3d80bec8886 100644 --- a/packages/react-query/eslint.config.js +++ b/packages/react-query/eslint.config.js @@ -4,7 +4,8 @@ import pluginReact from '@eslint-react/eslint-plugin' import reactHooks from 'eslint-plugin-react-hooks' import rootConfig from './root.eslint.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, // @ts-expect-error wtf ...reactHooks.configs['recommended-latest'], @@ -27,3 +28,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/solid-query-devtools/eslint.config.js b/packages/solid-query-devtools/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/solid-query-devtools/eslint.config.js +++ b/packages/solid-query-devtools/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/solid-query-persist-client/eslint.config.js b/packages/solid-query-persist-client/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/solid-query-persist-client/eslint.config.js +++ b/packages/solid-query-persist-client/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/solid-query/eslint.config.js b/packages/solid-query/eslint.config.js index df75435c7e1..2b4c399f8e8 100644 --- a/packages/solid-query/eslint.config.js +++ b/packages/solid-query/eslint.config.js @@ -2,4 +2,7 @@ import rootConfig from './root.eslint.config.js' -export default [...rootConfig] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig] + +export default config diff --git a/packages/svelte-query-devtools/eslint.config.js b/packages/svelte-query-devtools/eslint.config.js index e102c19ee9a..8a79858fcff 100644 --- a/packages/svelte-query-devtools/eslint.config.js +++ b/packages/svelte-query-devtools/eslint.config.js @@ -5,7 +5,8 @@ import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' import svelteConfig from './svelte.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...pluginSvelte.configs['recommended'], { @@ -26,3 +27,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/svelte-query-persist-client/eslint.config.js b/packages/svelte-query-persist-client/eslint.config.js index e102c19ee9a..8a79858fcff 100644 --- a/packages/svelte-query-persist-client/eslint.config.js +++ b/packages/svelte-query-persist-client/eslint.config.js @@ -5,7 +5,8 @@ import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' import svelteConfig from './svelte.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...pluginSvelte.configs['recommended'], { @@ -26,3 +27,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/svelte-query/eslint.config.js b/packages/svelte-query/eslint.config.js index e102c19ee9a..8a79858fcff 100644 --- a/packages/svelte-query/eslint.config.js +++ b/packages/svelte-query/eslint.config.js @@ -5,7 +5,8 @@ import pluginSvelte from 'eslint-plugin-svelte' import rootConfig from './root.eslint.config.js' import svelteConfig from './svelte.config.js' -export default [ +/** @type {import('eslint').Linter.Config[]} */ +const config = [ ...rootConfig, ...pluginSvelte.configs['recommended'], { @@ -26,3 +27,5 @@ export default [ }, }, ] + +export default config diff --git a/packages/vue-query-devtools/eslint.config.js b/packages/vue-query-devtools/eslint.config.js index 80912bf36a2..915fbb6bdcb 100644 --- a/packages/vue-query-devtools/eslint.config.js +++ b/packages/vue-query-devtools/eslint.config.js @@ -3,4 +3,7 @@ import pluginVue from 'eslint-plugin-vue' import rootConfig from './root.eslint.config.js' -export default [...rootConfig, ...pluginVue.configs['flat/base']] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig, ...pluginVue.configs['flat/base']] + +export default config diff --git a/packages/vue-query/eslint.config.js b/packages/vue-query/eslint.config.js index 80912bf36a2..915fbb6bdcb 100644 --- a/packages/vue-query/eslint.config.js +++ b/packages/vue-query/eslint.config.js @@ -3,4 +3,7 @@ import pluginVue from 'eslint-plugin-vue' import rootConfig from './root.eslint.config.js' -export default [...rootConfig, ...pluginVue.configs['flat/base']] +/** @type {import('eslint').Linter.Config[]} */ +const config = [...rootConfig, ...pluginVue.configs['flat/base']] + +export default config diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2121da02d64..aa283be1777 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,8 +46,8 @@ importers: specifier: ^1.2.0 version: 1.2.0(encoding@0.1.13) '@tanstack/eslint-config': - specifier: 0.3.2 - version: 0.3.2(@typescript-eslint/utils@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: 0.4.0 + version: 0.4.0(@typescript-eslint/utils@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@tanstack/typedoc-config': specifier: 0.3.1 version: 0.3.1(typescript@5.9.3) @@ -84,6 +84,9 @@ importers: eslint-plugin-react-hooks: specifier: ^6.1.1 version: 6.1.1(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-unused-imports: + specifier: ^4.4.1 + version: 4.4.1(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) jiti: specifier: ^2.6.1 version: 2.6.1 @@ -3024,7 +3027,7 @@ importers: version: 1.7.2(vue@3.5.28(typescript@5.9.3)) eslint-plugin-vue: specifier: ^10.5.0 - version: 10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1))) + version: 10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.6.1))) vue: specifier: ^3.4.27 version: 3.5.28(typescript@5.9.3) @@ -3049,7 +3052,7 @@ importers: version: 5.2.4(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.28(typescript@5.8.3)) eslint-plugin-vue: specifier: ^10.5.0 - version: 10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1))) + version: 10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.6.1))) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4775,6 +4778,15 @@ packages: resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/js@9.39.4': resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -7153,9 +7165,11 @@ packages: peerDependencies: vite: ^6.4.1 - '@tanstack/eslint-config@0.3.2': - resolution: {integrity: sha512-2g+PuGR3GuvvCiR3xZs+IMqAvnYU9bvH+jRml0BFBSxHBj22xFCTNvJWhvgj7uICFF9IchDkFUto91xDPMu5cg==} + '@tanstack/eslint-config@0.4.0': + resolution: {integrity: sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==} engines: {node: '>=18'} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 '@tanstack/match-sorter-utils@8.19.4': resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} @@ -9856,8 +9870,8 @@ packages: peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-n@17.23.2: - resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} + eslint-plugin-n@17.24.0: + resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -9937,6 +9951,15 @@ packages: svelte: optional: true + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': 8.56.1 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + eslint-plugin-vue@10.7.0: resolution: {integrity: sha512-r2XFCK4qlo1sxEoAMIoTTX0PZAdla0JJDt1fmYiworZUX67WeEGqm+JbyAg3M+pGiJ5U6Mp5WQbontXWtIW7TA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10592,6 +10615,10 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globals@17.4.0: + resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -15853,11 +15880,11 @@ packages: '@vue/composition-api': optional: true - vue-eslint-parser@10.2.0: - resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} + vue-eslint-parser@10.4.0: + resolution: {integrity: sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 vue-tsc@2.2.12: resolution: {integrity: sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==} @@ -18460,6 +18487,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@10.0.1(eslint@9.39.4(jiti@2.6.1))': + optionalDependencies: + eslint: 9.39.4(jiti@2.6.1) + '@eslint/js@9.39.4': {} '@eslint/object-schema@2.1.7': {} @@ -20965,18 +20996,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/eslint-config@0.3.2(@typescript-eslint/utils@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint/js': 9.39.4 + '@eslint/js': 10.0.1(eslint@9.39.4(jiti@2.6.1)) '@stylistic/eslint-plugin': 5.8.0(eslint@9.39.4(jiti@2.6.1)) + eslint: 9.39.4(jiti@2.6.1) eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)) - eslint-plugin-n: 17.23.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - globals: 16.5.0 + eslint-plugin-n: 17.24.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + globals: 17.4.0 typescript-eslint: 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.6.1)) + vue-eslint-parser: 10.4.0(eslint@9.39.4(jiti@2.6.1)) transitivePeerDependencies: - '@typescript-eslint/utils' - - eslint - eslint-import-resolver-node - supports-color - typescript @@ -21303,10 +21334,10 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.56.1 '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/utils': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) @@ -24478,7 +24509,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-n@17.23.2(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.24.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) enhanced-resolve: 5.19.0 @@ -24655,7 +24686,13 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1))): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)): + dependencies: + eslint: 9.39.4(jiti@2.6.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + + eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) eslint: 9.39.4(jiti@2.6.1) @@ -24663,13 +24700,13 @@ snapshots: nth-check: 2.1.1 postcss-selector-parser: 7.1.1 semver: 7.7.4 - vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.6.1)) + vue-eslint-parser: 10.4.0(eslint@9.39.4(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.8.0(eslint@9.39.4(jiti@2.6.1)) '@typescript-eslint/parser': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) - eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1))): + eslint-plugin-vue@10.7.0(@stylistic/eslint-plugin@5.8.0(eslint@9.39.4(jiti@2.6.1)))(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) eslint: 9.39.4(jiti@2.6.1) @@ -24677,7 +24714,7 @@ snapshots: nth-check: 2.1.1 postcss-selector-parser: 7.1.1 semver: 7.7.4 - vue-eslint-parser: 10.2.0(eslint@9.39.4(jiti@2.6.1)) + vue-eslint-parser: 10.4.0(eslint@9.39.4(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.8.0(eslint@9.39.4(jiti@2.6.1)) @@ -25463,6 +25500,8 @@ snapshots: globals@16.5.0: {} + globals@17.4.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -31300,7 +31339,7 @@ snapshots: typescript-eslint@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.8.3) '@typescript-eslint/utils': 8.56.1(eslint@9.39.4(jiti@2.6.1))(typescript@5.8.3) @@ -32028,12 +32067,12 @@ snapshots: optionalDependencies: '@vue/composition-api': 1.7.2(vue@3.5.28(typescript@5.9.3)) - vue-eslint-parser@10.2.0(eslint@9.39.4(jiti@2.6.1)): + vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.6.1)): dependencies: debug: 4.4.3 eslint: 9.39.4(jiti@2.6.1) eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 + eslint-visitor-keys: 5.0.1 espree: 10.4.0 esquery: 1.7.0 semver: 7.7.4 From db4c96ae0ab6fab2dcd8bf77a9fbd71e5af82be5 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:37:15 +0000 Subject: [PATCH 3/3] ci: apply automated fixes --- eslint.config.js | 5 ++--- packages/vue-query/src/__tests__/useMutation.test.ts | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 4b1491ad0ce..33cb7a5fe84 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,9 +8,8 @@ import oxlint from 'eslint-plugin-oxlint' import { createJiti } from 'jiti' const jiti = createJiti(import.meta.url) -const oxlintConfig = /** @type {*} */ ( - await jiti.import('./oxlint.config.ts') -).default +const oxlintConfig = /** @type {*} */ (await jiti.import('./oxlint.config.ts')) + .default /** @type {import('eslint').Linter.Config[]} */ const config = [ diff --git a/packages/vue-query/src/__tests__/useMutation.test.ts b/packages/vue-query/src/__tests__/useMutation.test.ts index e523e56dd33..2041765a9be 100644 --- a/packages/vue-query/src/__tests__/useMutation.test.ts +++ b/packages/vue-query/src/__tests__/useMutation.test.ts @@ -171,8 +171,7 @@ describe('useMutation', () => { }) expect(relevantMutation).toBeDefined() - const key = relevantMutation!.options - .mutationKey as Array + const key = relevantMutation!.options.mutationKey as Array expect(key[0]?.otherObject.name).toBe('someOtherObjectName') })