refinedev/refine · error · Error

Operator ${operator} is not supported

Error message

Operator ${operator} is not supported

What it means

The Supabase mapOperator utility rejects the "between" and "nbetween" operators — PostgREST/Supabase has no single operator token for range filtering, so the provider throws instead of silently mis-filtering. All other operators map to PostgREST tokens (cs, not.cs, etc.) or pass through.

Source

Thrown at packages/supabase/src/utils/mapOperator.ts:27

    case "contains":
      return "ilike";
    case "ncontains":
      return "not.ilike";
    case "containss":
      return "like";
    case "ncontainss":
      return "not.like";
    case "null":
      return "is";
    case "nnull":
      return "not.is";
    case "ina":
      return "cs";
    case "nina":
      return "not.cs";
    case "between":
    case "nbetween":
      throw Error(`Operator ${operator} is not supported`);
    default:
      return operator;
  }
};

View on GitHub (pinned to 779d52a20e)

Solutions

  1. Replace 'between' with two explicit boundary filters: gte/lte (or gt/lt)
  2. Build the range filter directly via supabaseClient.query.gte(field, start).lte(field, end) if using the query builder
  3. Upgrade the package in case a later version adds between support, but verify release notes

Example fix

// before
filters: [{ field: "created_at", operator: "between", value: [start, end] }]

// after
filters: [
  { field: "created_at", operator: "gte", value: start },
  { field: "created_at", operator: "lte", value: end },
]
Defensive patterns

Strategy: validation

Validate before calling

const BAD = new Set(["between", "nbetween"]);
const hasRangeFilter = (filters: any[]) => filters.some((f) => BAD.has(f.operator));
if (hasRangeFilter(filters)) { /* rewrite to gte/lte pair */ }

Type guard

const isSupabaseSupportedOperator = (op: string): boolean => op !== "between" && op !== "nbetween";

Try / catch

try { await dataProvider.getList({ resource, filters }); } catch (e) { if (String(e).includes("is not supported")) { /* replace between with gte/lte and retry */ } else throw e; }

Prevention

When it happens

Trigger: Using a filter like { field: "created_at", operator: "between", value: [start, end] } in useTable/useList filters with the Supabase data provider.

Common situations: Porting date-range filters from Strapi/other providers that support between; adding a date range picker that emits between filters.

Related errors


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