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
- Replace the unsupported operator with a supported equivalent ('nnull' → use 'null' semantics or restructure; 'startswith' → 'contains' or server-side logic)
- Check the refine CrudFilter operator union type for the Appwrite-supported set
- 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
- Centralize operator mapping when migrating providers
- Type filters as CrudFilter from @refinedev/core
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
- Max deep reached
- Value array must contain exactly two elements for "between"
- 'getApiUrl' method is not implemented on refine-appwrite dat
- 'custom' method is not implemented on refine-appwrite data p
- Operator ${operator} is not supported for the Medusa data pr
AI-assisted analysis of refinedev/refine@779d52a20e (2026-08-27).
Data as JSON: /api/errors/f6ee785d2cde3d85.
Report an issue: GitHub.