/** * Error format * * Returned by every PostgREST request that fails. When something fails, the * single most useful field is usually `hint` — Postgres often returns the * actionable fix there, not in `message`. Always log the full object (e.g. * `console.error(error)`); logging only `error.message` hides the hint. * * Read the fields in roughly this order of usefulness: * * - `hint` — actionable guidance from the database when available. For * permission-denied errors (`42501`), this is the literal SQL to fix the * problem, e.g. * `"Grant the required privileges to the current role with: GRANT SELECT ON public.users TO anon;"`. * Missing column? `hint` suggests the column you probably meant. Whenever * Postgres knows the fix, it puts it in `hint`. * - `code` — stable error code from PostgREST (e.g. `PGRST301`) or Postgres * (e.g. `42501`). Branch on this rather than on `message` text. * - `details` — extra context, often the offending value, key, or row. * - `message` — human-readable summary. Useful in UI strings; less useful * for debugging. * * {@link https://postgrest.org/en/stable/api.html?highlight=options#errors-and-http-status-codes} */ export default class PostgrestError extends Error { details: string hint: string code: string /** * @example * ```ts * import PostgrestError from '@supabase/postgrest-js' * * throw new PostgrestError({ * message: 'Row level security prevented the request', * details: 'RLS denied the insert', * hint: 'Check your policies', * code: 'PGRST301', * }) * ``` */ constructor(context: { message: string; details: string; hint: string; code: string }) { super(context.message) this.name = 'PostgrestError' this.details = context.details this.hint = context.hint this.code = context.code } toJSON(): { name: string; message: string; details: string; hint: string; code: string } { return { name: this.name, message: this.message, details: this.details, hint: this.hint, code: this.code, } } }