refinedev/refine · error · Error

Operator ${filter.operator} is not supported

Error message

Operator ${filter.operator} is not supported

What it means

generateFilter in refine's Appwrite provider only supports a fixed set of CrudFilter operators (eq, ne, lt, lte, gt, gte, in, nin, contains, between, null, contains, and/or). Hitting the default branch means the filter.operator is not in that switch.

Source

Thrown at packages/appwrite/src/utils/generateFilter.ts:67

    case "endswith":
      return Query.endsWith(filter.field, filter.value);

    // Conditional operators
    case "or":
      if (filter.value.length === 1 && filter.value[0]) {
        //? "OR" queries require at least two queries in Appwrite
        return generateFilter(filter.value[0], nextDeep);
      }
      return Query.or(filter.value.map((f) => generateFilter(f, nextDeep)));
    case "and":
      if (filter.value.length === 1 && filter.value[0]) {
        //? "AND" queries require at least two queries in Appwrite
        return generateFilter(filter.value[0], nextDeep);
      }
      return Query.and(filter.value.map((f) => generateFilter(f, nextDeep)));

    default:
      throw new Error(`Operator ${filter.operator} is not supported`);
  }
};

View on GitHub (pinned to 779d52a20e)

Solutions

  1. Replace the unsupported operator with a supported equivalent ('nnull' → use 'null' semantics or restructure; 'startswith' → 'contains' or server-side logic)
  2. Check the refine CrudFilter operator union type for the Appwrite-supported set
  3. Move exotic filtering to meta/custom query parameters handled server-side

Example fix

// before
filters: [{ field: 'title', operator: 'startswith', value: 'Hello' }]
// after
filters: [{ field: 'title', operator: 'contains', value: 'Hello' }]
Defensive patterns

Strategy: type-guard

Validate before calling

const SUPPORTED = new Set(['eq','ne','lt','lte','gt','gte','in','nin','contains','between','null','and','or']);
if (!SUPPORTED.has(filter.operator)) { /* map or drop filter */ }

Type guard

const isAppwriteOperator = (op: string) => new Set(['eq','ne','lt','lte','gt','gte','in','nin','contains','between','null','and','or']).has(op);

Prevention

When it happens

Trigger: Passing an unsupported operator such as 'nnull', 'startswith', 'endswith', 'containss', or a typo like 'contians' in filters to an Appwrite-backed resource.

Common situations: Migrating from another data provider (e.g. Strapi/Simple REST) whose filter grammar supports more operators; upgrading refine versions where operator names changed; typos in operator strings.

Related errors


AI-assisted analysis of refinedev/refine@779d52a20e (2026-08-27). Data as JSON: /api/errors/f6ee785d2cde3d85. Report an issue: GitHub.