{"record":{"id":"88337533a5e87d2e","repo":"refinedev/refine","slug":"invalid-action-type","errorCode":null,"errorMessage":"Invalid action type","messagePattern":"Invalid action type","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/definitions/helpers/keys/index.ts","lineNumber":125,"sourceCode":"  action(actionType: ParametrizedDataActions): ParamsKeyBuilder;\n  action(actionType: IdRequiredDataActions): DataIdRequiringKeyBuilder;\n  action(actionType: IdsRequiredDataActions): DataIdsRequiringKeyBuilder;\n  action(\n    actionType:\n      | ParametrizedDataActions\n      | IdRequiredDataActions\n      | IdsRequiredDataActions,\n  ): ParamsKeyBuilder | DataIdRequiringKeyBuilder | DataIdsRequiringKeyBuilder {\n    if (actionType === \"one\") {\n      return new DataIdRequiringKeyBuilder([...this.segments, actionType]);\n    }\n    if (actionType === \"many\") {\n      return new DataIdsRequiringKeyBuilder([...this.segments, actionType]);\n    }\n    if ([\"list\", \"infinite\"].includes(actionType)) {\n      return new ParamsKeyBuilder([...this.segments, actionType]);\n    }\n    throw new Error(\"Invalid action type\");\n  }\n}\n\nclass DataKeyBuilder extends BaseKeyBuilder {\n  resource(resourceName?: string) {\n    return new DataResourceKeyBuilder([...this.segments, resourceName]);\n  }\n\n  mutation(mutationName: DataMutationActions) {\n    return new ParamsKeyBuilder([\n      ...(mutationName === \"custom\" ? this.segments : [this.segments[0]]),\n      mutationName,\n    ]);\n  }\n}\n\nclass AuthKeyBuilder extends BaseKeyBuilder {\n  action(actionType: AuthActionType) {","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/refinedev/refine/blob/779d52a20e29b0307ac0df04d135beba434370dc/packages/core/src/definitions/helpers/keys/index.ts#L107-L143","documentation":"Refine's TanStack Query key builders (p(resource).action(actionType)) only accept 'many' (DataIds), 'list' and 'infinite' (Params). Any other string passed to action() hits this guard.","triggerScenarios":"Calling keys().data(resource).action('one') or action('edit') — i.e. an action type outside ['many','list','infinite'] — typically when composing custom query keys or invalidating queries.","commonSituations":"Writing custom invalidation code that guesses at action names; refactor from older key formats; passing a resource action like 'create' instead of a query action.","solutions":["Use 'many', 'list', or 'infinite' as the actionType","For single-record queries use the appropriate detail key builder instead of action()","Type the actionType as the builder's expected union to catch mistakes at compile time"],"exampleFix":"// before\nqueryClient.invalidateQueries(keyBuilder.data('posts').action('detail'));\n// after\nqueryClient.invalidateQueries(keyBuilder.data('posts').action('list'));","handlingStrategy":"type-guard","validationCode":"const VALID_ACTIONS = ['many','list','infinite'] as const;\nif (!VALID_ACTIONS.includes(actionType)) throw new Error('invalid action');","typeGuard":"const isValidAction = (a: string): a is 'many' | 'list' | 'infinite' => ['many','list','infinite'].includes(a as any);","tryCatchPattern":null,"preventionTips":["Type key-builder inputs with the literal union","Use exported key builder APIs rather than hand-built strings"],"tags":["refine","query-keys","tanstack-query","validation"],"backgroundTag":"invalid-query-key","analyzedSha":"779d52a20e29b0307ac0df04d135beba434370dc","analyzedAt":"2026-08-27T11:15:25.854Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}