From 822374eca5776683add1978df3ac8cc9c0845ecd Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Sun, 4 Jan 2026 11:20:06 +0800 Subject: [PATCH] chore: integrate @tanstack/eslint-plugin-query and fix service layer lint errors (#30444) --- web/app/components/goto-anything/index.tsx | 2 +- web/eslint.config.mjs | 2 ++ web/package.json | 1 + web/pnpm-lock.yaml | 30 +++++++++++++++++----- web/service/access-control.ts | 2 +- web/service/knowledge/use-document.ts | 6 ++--- web/service/knowledge/use-segment.ts | 8 +++--- web/service/use-explore.ts | 2 +- web/service/use-models.ts | 2 +- web/service/use-pipeline.ts | 3 +-- web/service/use-plugins.ts | 11 ++++---- 11 files changed, 44 insertions(+), 25 deletions(-) diff --git a/web/app/components/goto-anything/index.tsx b/web/app/components/goto-anything/index.tsx index 30add3480d..d34176e4c7 100644 --- a/web/app/components/goto-anything/index.tsx +++ b/web/app/components/goto-anything/index.tsx @@ -110,7 +110,7 @@ const GotoAnything: FC = ({ isWorkflowPage, isRagPipelinePage, defaultLocale, - Object.keys(Actions).sort().join(','), + Actions, ], queryFn: async () => { const query = searchQueryDebouncedValue.toLowerCase() diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs index 574dbb091e..3cdd3efedb 100644 --- a/web/eslint.config.mjs +++ b/web/eslint.config.mjs @@ -1,5 +1,6 @@ // @ts-check import antfu from '@antfu/eslint-config' +import pluginQuery from '@tanstack/eslint-plugin-query' import sonar from 'eslint-plugin-sonarjs' import storybook from 'eslint-plugin-storybook' import tailwind from 'eslint-plugin-tailwindcss' @@ -79,6 +80,7 @@ export default antfu( }, }, storybook.configs['flat/recommended'], + ...pluginQuery.configs['flat/recommended'], // sonar { rules: { diff --git a/web/package.json b/web/package.json index 7ee2325dbc..b595d433f9 100644 --- a/web/package.json +++ b/web/package.json @@ -165,6 +165,7 @@ "@storybook/addon-themes": "9.1.13", "@storybook/nextjs": "9.1.13", "@storybook/react": "9.1.13", + "@tanstack/eslint-plugin-query": "^5.91.2", "@tanstack/react-devtools": "^0.9.0", "@tanstack/react-form-devtools": "^0.2.9", "@tanstack/react-query-devtools": "^5.90.2", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index cdd194da37..9ffb092c6e 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -406,6 +406,9 @@ importers: '@storybook/react': specifier: 9.1.13 version: 9.1.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(typescript@5.9.3) + '@tanstack/eslint-plugin-query': + specifier: ^5.91.2 + version: 5.91.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@tanstack/react-devtools': specifier: ^0.9.0 version: 0.9.0(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.10) @@ -3387,6 +3390,11 @@ packages: peerDependencies: solid-js: '>=1.9.7' + '@tanstack/eslint-plugin-query@5.91.2': + resolution: {integrity: sha512-UPeWKl/Acu1IuuHJlsN+eITUHqAaa9/04geHHPedY8siVarSaWprY0SVMKrkpKfk5ehRT7+/MZ5QwWuEtkWrFw==} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@tanstack/form-core@1.27.1': resolution: {integrity: sha512-hPM+0tUnZ2C2zb2TE1lar1JJ0S0cbnQHlUwFcCnVBpMV3rjtUzkoM766gUpWrlmTGCzNad0GbJ0aTxVsjT6J8g==} @@ -10130,7 +10138,7 @@ snapshots: '@es-joy/jsdoccomment@0.76.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/types': 8.50.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 6.10.0 @@ -10138,7 +10146,7 @@ snapshots: '@es-joy/jsdoccomment@0.78.0': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/types': 8.50.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 7.0.0 @@ -11957,7 +11965,7 @@ snapshots: '@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@1.21.7))': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/types': 8.50.1 eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -12039,6 +12047,14 @@ snapshots: - csstype - utf-8-validate + '@tanstack/eslint-plugin-query@5.91.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + transitivePeerDependencies: + - supports-color + - typescript + '@tanstack/form-core@1.27.1': dependencies: '@tanstack/devtools-event-client': 0.3.5 @@ -12512,8 +12528,8 @@ snapshots: '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) - '@typescript-eslint/types': 8.50.0 + '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) + '@typescript-eslint/types': 8.50.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -12742,7 +12758,7 @@ snapshots: '@vitest/eslint-plugin@1.6.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/scope-manager': 8.50.1 '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) optionalDependencies: @@ -14240,7 +14256,7 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/types': 8.50.1 '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) natural-orderby: 5.0.0 diff --git a/web/service/access-control.ts b/web/service/access-control.ts index ad0c14fd0a..c87e01f482 100644 --- a/web/service/access-control.ts +++ b/web/service/access-control.ts @@ -73,7 +73,7 @@ export const useUpdateAccessMode = () => { export const useGetUserCanAccessApp = ({ appId, isInstalledApp = true, enabled }: { appId?: string, isInstalledApp?: boolean, enabled?: boolean }) => { const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) return useQuery({ - queryKey: [NAME_SPACE, 'user-can-access-app', appId], + queryKey: [NAME_SPACE, 'user-can-access-app', appId, systemFeatures.webapp_auth.enabled, isInstalledApp], queryFn: () => { if (systemFeatures.webapp_auth.enabled) return getUserCanAccess(appId!, isInstalledApp) diff --git a/web/service/knowledge/use-document.ts b/web/service/knowledge/use-document.ts index 63713130d9..1776ed1f4c 100644 --- a/web/service/knowledge/use-document.ts +++ b/web/service/knowledge/use-document.ts @@ -38,7 +38,7 @@ export const useDocumentList = (payload: { if (normalizedStatus && normalizedStatus !== 'all') params.status = normalizedStatus return useQuery({ - queryKey: [...useDocumentListKey, datasetId, keyword, page, limit, sort, normalizedStatus], + queryKey: [...useDocumentListKey, datasetId, params], queryFn: () => get(`/datasets/${datasetId}/documents`, { params, }), @@ -123,7 +123,7 @@ export const useDocumentDetail = (payload: { }) => { const { datasetId, documentId, params } = payload return useQuery({ - queryKey: [...useDocumentDetailKey, 'withoutMetaData', datasetId, documentId], + queryKey: [...useDocumentDetailKey, 'withoutMetaData', datasetId, documentId, params], queryFn: () => get(`/datasets/${datasetId}/documents/${documentId}`, { params }), }) } @@ -135,7 +135,7 @@ export const useDocumentMetadata = (payload: { }) => { const { datasetId, documentId, params } = payload return useQuery({ - queryKey: [...useDocumentDetailKey, 'onlyMetaData', datasetId, documentId], + queryKey: [...useDocumentDetailKey, 'onlyMetaData', datasetId, documentId, params], queryFn: () => get(`/datasets/${datasetId}/documents/${documentId}`, { params }), }) } diff --git a/web/service/knowledge/use-segment.ts b/web/service/knowledge/use-segment.ts index 1d0ce4b774..c42324ce6c 100644 --- a/web/service/knowledge/use-segment.ts +++ b/web/service/knowledge/use-segment.ts @@ -32,9 +32,9 @@ export const useSegmentList = ( disable?: boolean, ) => { const { datasetId, documentId, params } = payload - const { page, limit, keyword, enabled } = params + return useQuery({ - queryKey: [...useSegmentListKey, { datasetId, documentId, page, limit, keyword, enabled }], + queryKey: [...useSegmentListKey, datasetId, documentId, params], queryFn: () => { return get(`/datasets/${datasetId}/documents/${documentId}/segments`, { params }) }, @@ -111,9 +111,9 @@ export const useChildSegmentList = ( disable?: boolean, ) => { const { datasetId, documentId, segmentId, params } = payload - const { page, limit, keyword } = params + return useQuery({ - queryKey: [...useChildSegmentListKey, { datasetId, documentId, segmentId, page, limit, keyword }], + queryKey: [...useChildSegmentListKey, datasetId, documentId, segmentId, params], queryFn: () => { return get(`/datasets/${datasetId}/documents/${documentId}/segments/${segmentId}/child_chunks`, { params }) }, diff --git a/web/service/use-explore.ts b/web/service/use-explore.ts index 68ddf966ab..a15b926306 100644 --- a/web/service/use-explore.ts +++ b/web/service/use-explore.ts @@ -59,7 +59,7 @@ export const useUpdateAppPinStatus = () => { export const useGetInstalledAppAccessModeByAppId = (appId: string | null) => { const systemFeatures = useGlobalPublicStore(s => s.systemFeatures) return useQuery({ - queryKey: [NAME_SPACE, 'appAccessMode', appId], + queryKey: [NAME_SPACE, 'appAccessMode', appId, systemFeatures.webapp_auth.enabled], queryFn: () => { if (systemFeatures.webapp_auth.enabled === false) { return { diff --git a/web/service/use-models.ts b/web/service/use-models.ts index d960bda33f..05582b4105 100644 --- a/web/service/use-models.ts +++ b/web/service/use-models.ts @@ -82,7 +82,7 @@ export const useGetModelCredential = ( ) => { return useQuery({ enabled, - queryKey: [NAME_SPACE, 'model-list', provider, model, modelType, credentialId], + queryKey: [NAME_SPACE, 'model-list', provider, model, modelType, credentialId, configFrom], queryFn: () => get(`/workspaces/current/model-providers/${provider}/models/credentials?model=${model}&model_type=${modelType}&config_from=${configFrom}${credentialId ? `&credential_id=${credentialId}` : ''}`), staleTime: 0, gcTime: 0, diff --git a/web/service/use-pipeline.ts b/web/service/use-pipeline.ts index c1abbb1984..34c7332f4c 100644 --- a/web/service/use-pipeline.ts +++ b/web/service/use-pipeline.ts @@ -40,9 +40,8 @@ const NAME_SPACE = 'pipeline' export const PipelineTemplateListQueryKeyPrefix = [NAME_SPACE, 'template-list'] export const usePipelineTemplateList = (params: PipelineTemplateListParams, enabled = true) => { - const { type, language } = params return useQuery({ - queryKey: [...PipelineTemplateListQueryKeyPrefix, type, language], + queryKey: [...PipelineTemplateListQueryKeyPrefix, params], queryFn: () => { return get('/rag/pipeline/templates', { params }) }, diff --git a/web/service/use-plugins.ts b/web/service/use-plugins.ts index 5c10bac5d2..4e9776df97 100644 --- a/web/service/use-plugins.ts +++ b/web/service/use-plugins.ts @@ -677,20 +677,21 @@ export const useMutationCheckDependencies = () => { } export const useModelInList = (currentProvider?: ModelProvider, modelId?: string) => { + const provider = currentProvider?.provider return useQuery({ - queryKey: ['modelInList', currentProvider?.provider, modelId], + queryKey: ['modelInList', provider, modelId], queryFn: async () => { - if (!modelId || !currentProvider) + if (!modelId || !provider) return false try { - const modelsData = await fetchModelProviderModelList(`/workspaces/current/model-providers/${currentProvider?.provider}/models`) + const modelsData = await fetchModelProviderModelList(`/workspaces/current/model-providers/${provider}/models`) return !!modelId && !!modelsData.data.find(item => item.model === modelId) } catch { return false } }, - enabled: !!modelId && !!currentProvider, + enabled: !!modelId && !!provider, }) } @@ -742,7 +743,7 @@ export const usePluginReadme = ({ plugin_unique_identifier, language }: { plugin export const usePluginReadmeAsset = ({ file_name, plugin_unique_identifier }: { file_name?: string, plugin_unique_identifier?: string }) => { const normalizedFileName = file_name?.replace(/(^\.\/_assets\/|^_assets\/)/, '') return useQuery({ - queryKey: ['pluginReadmeAsset', plugin_unique_identifier, file_name], + queryKey: ['pluginReadmeAsset', plugin_unique_identifier, normalizedFileName], queryFn: () => get('/workspaces/current/plugin/asset', { params: { plugin_unique_identifier, file_name: normalizedFileName } }, { silent: true }), enabled: !!plugin_unique_identifier && !!file_name && /(^\.\/_assets|^_assets)/.test(file_name), })