UNPKG

@supabase-cache-helpers/postgrest-swr

Version:

A collection of SWR utilities for working with Supabase.

1 lines 93.5 kB
{"version":3,"sources":["../src/index.ts","../src/cache/use-delete-item.ts","../src/lib/constants.ts","../src/lib/create-key-getter.ts","../src/lib/parse-order-by.ts","../src/lib/decode.ts","../src/lib/encode.ts","../src/lib/middleware.ts","../src/lib/use-postgrest-filter-cache.ts","../src/lib/use-queries-for-table-loader.ts","../src/lib/mutable-keys.ts","../src/cache/use-mutate-item.ts","../src/cache/use-revalidate-tables.ts","../src/cache/use-upsert-item.ts","../src/mutate/use-delete-many-mutation.ts","../src/mutate/use-random-key.ts","../src/mutate/use-delete-mutation.ts","../src/mutate/use-insert-mutation.ts","../src/mutate/get-user-response.ts","../src/mutate/use-update-mutation.ts","../src/mutate/use-upsert-mutation.ts","../src/query/prefetch.ts","../src/query/use-cursor-infinite-scroll-query.ts","../src/query/use-offset-infinite-query.ts","../src/query/use-offset-infinite-scroll-query.ts","../src/query/use-infinite-offset-pagination-query.ts","../src/query/use-query.ts","../src/subscribe/use-subscription-query.ts","../src/subscribe/use-subscription.ts"],"sourcesContent":["export type {\n  PostgrestHasMorePaginationCacheData,\n  PostgrestPaginationCacheData,\n} from '@supabase-cache-helpers/postgrest-core';\n\nexport * from './cache';\nexport * from './lib';\nexport * from './mutate';\nexport * from './query';\nexport * from './subscribe';\n","import {\n  type DeleteItemOperation,\n  deleteItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { flatten } from 'flat';\nimport { type MutatorOptions, useSWRConfig } from 'swr';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\nimport { getMutableKeys } from '../lib/mutable-keys';\n\n/**\n * Returns a function that can be used to delete an item into the SWR cache.\n * This hook does not make any HTTP requests and is intended to be used for custom cache updates.\n *\n * @param opts - Options for the delete operation, excluding the input record.\n *\n * @returns A function that takes a record of type `Type` and returns a promise that resolves once the record has been deleted from the cache.\n * **/\nexport function useDeleteItem<Type extends Record<string, unknown>>(\n  opts: Omit<DeleteItemOperation<Type>, 'input'> & MutatorOptions<Type>,\n): (input: Type) => Promise<void> {\n  const { mutate, cache } = useSWRConfig();\n  const getPostgrestFilter = usePostgrestFilterCache();\n\n  return async (input: Type) =>\n    await deleteItem<string, Type>(\n      {\n        input: flatten(input) as Type,\n        ...opts,\n      },\n      {\n        cacheKeys: getMutableKeys(Array.from(cache.keys())),\n        getPostgrestFilter,\n        revalidate: (key) => {\n          mutate(key);\n        },\n        mutate: (key, data) => {\n          mutate(key, data, { ...opts, revalidate: opts?.revalidate ?? false });\n        },\n        decode,\n      },\n    );\n}\n","export const KEY_PREFIX = 'postgrest';\nexport const POSTGREST_FILTER_KEY_PREFIX = 'postgrest-filter';\nexport const KEY_SEPARATOR = '$';\nexport const INFINITE_PREFIX = '$inf$';\nexport const INFINITE_KEY_PREFIX = 'page';\n","import {\n  type PostgrestHasMorePaginationResponse,\n  type PostgrestPaginationResponse,\n  get,\n  isPlainObject,\n  isPostgrestHasMorePaginationResponse,\n  isPostgrestPaginationResponse,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type { PostgrestTransformBuilder } from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\nimport { parseOrderBy } from './parse-order-by';\n\nexport const createOffsetKeyGetter = <\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result,\n>(\n  queryFactory: (() => PostgrestTransformBuilder<Schema, Table, Result>) | null,\n  {\n    pageSize,\n    rpcArgs,\n  }: {\n    pageSize: number;\n    rpcArgs?: { limit: string; offset: string };\n  },\n) => {\n  if (!queryFactory) return () => null;\n  return (\n    pageIndex: number,\n    previousPageData: (\n      | PostgrestHasMorePaginationResponse<Result>\n      | PostgrestPaginationResponse<Result>\n    )[],\n  ) => {\n    if (\n      previousPageData &&\n      ((isPostgrestHasMorePaginationResponse(previousPageData) &&\n        !previousPageData.data.length) ||\n        (isPostgrestPaginationResponse(previousPageData) &&\n          !previousPageData.length))\n    ) {\n      return null;\n    }\n    const cursor = pageIndex * pageSize;\n\n    const query = queryFactory();\n\n    if (rpcArgs) {\n      if (query['method'] === 'GET') {\n        query['url'].searchParams.set(rpcArgs.limit, String(pageSize));\n        query['url'].searchParams.set(rpcArgs.offset, String(cursor));\n      } else {\n        query['body'] = {\n          ...(isPlainObject(query['body']) ? query['body'] : {}),\n          [rpcArgs.limit]: pageSize,\n          [rpcArgs.offset]: cursor,\n        };\n      }\n\n      return query;\n    }\n\n    return query.range(cursor, cursor + pageSize - 1);\n  };\n};\n\nexport const createCursorKeyGetter = <\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result,\n>(\n  queryFactory: (() => PostgrestTransformBuilder<Schema, Table, Result>) | null,\n  {\n    orderBy,\n    uqOrderBy: uqColumn,\n    rpcArgs,\n  }: {\n    orderBy: string;\n    uqOrderBy?: string;\n    rpcArgs?: { orderBy: string; uqOrderBy?: string };\n  },\n) => {\n  if (!queryFactory) return () => null;\n\n  return (\n    _pageIndex: number,\n    previousPageData: (\n      | PostgrestHasMorePaginationResponse<Result>\n      | PostgrestPaginationResponse<Result>\n    )[],\n  ) => {\n    // Return null if we've reached the end of the data\n    if (previousPageData && isEmptyPreviousPage(previousPageData)) {\n      return null;\n    }\n\n    const query = queryFactory();\n\n    // If this is the first page, return the original query\n    if (!previousPageData) return query;\n\n    // Extract the last values for cursor-based pagination\n    const lastItem = getLastItem(previousPageData);\n\n    if (!lastItem) return query;\n\n    const lastValueOrderBy = get(lastItem, orderBy);\n    if (!lastValueOrderBy) return query;\n\n    const lastValueUqColumn = uqColumn ? get(lastItem, uqColumn) : null;\n\n    if (rpcArgs) {\n      if (query['method'] === 'GET') {\n        if (lastValueOrderBy) {\n          query['url'].searchParams.set(rpcArgs.orderBy, lastValueOrderBy);\n        }\n        if (lastValueUqColumn && rpcArgs.uqOrderBy) {\n          query['url'].searchParams.set(rpcArgs.uqOrderBy, lastValueUqColumn);\n        }\n      } else {\n        query['body'] = {\n          ...(isPlainObject(query['body']) ? query['body'] : {}),\n          [rpcArgs.orderBy]: lastValueOrderBy,\n          ...(lastValueUqColumn && rpcArgs.uqOrderBy\n            ? { [rpcArgs.uqOrderBy]: lastValueUqColumn }\n            : {}),\n        };\n      }\n\n      return query;\n    }\n\n    const { orderBy: mainOrderBy, uqOrderBy } = parseOrderBy(\n      query['url'].searchParams,\n      { orderByPath: orderBy, uqOrderByPath: uqColumn },\n    );\n\n    // Apply cursor filters\n    if (uqColumn && uqOrderBy && lastValueOrderBy && lastValueUqColumn) {\n      const operator = mainOrderBy.ascending ? 'gt' : 'lt';\n      const uqOperator = uqOrderBy.ascending ? 'gt' : 'lt';\n\n      query['url'].searchParams.append(\n        'or',\n        `(${orderBy}.${operator}.${lastValueOrderBy},and(${orderBy}.eq.${lastValueOrderBy},${uqColumn}.${uqOperator}.${lastValueUqColumn}))`,\n      );\n    } else if (lastValueOrderBy) {\n      const operator = mainOrderBy.ascending ? 'gt' : 'lt';\n      query['url'].searchParams.append(\n        orderBy,\n        `${operator}.${lastValueOrderBy}`,\n      );\n    }\n\n    return query;\n  };\n};\n\n// Helper functions\nfunction isEmptyPreviousPage<Result>(\n  previousPageData: (\n    | PostgrestHasMorePaginationResponse<Result>\n    | PostgrestPaginationResponse<Result>\n  )[],\n): boolean {\n  return (\n    (isPostgrestHasMorePaginationResponse(previousPageData) &&\n      !previousPageData.data.length) ||\n    (isPostgrestPaginationResponse(previousPageData) &&\n      !previousPageData.length)\n  );\n}\n\nfunction getLastItem<Result>(\n  data: (\n    | PostgrestHasMorePaginationResponse<Result>\n    | PostgrestPaginationResponse<Result>\n  )[],\n): Result | null {\n  if (isPostgrestHasMorePaginationResponse(data)) {\n    return data.data.length\n      ? (data.data[data.data.length - 1] as Result)\n      : null;\n  } else if (isPostgrestPaginationResponse(data)) {\n    return data.length ? (data[data.length - 1] as Result) : null;\n  }\n  return null;\n}\n","import { parseOrderBy as core } from '@supabase-cache-helpers/postgrest-core';\n\nexport function parseOrderBy(\n  searchParams: URLSearchParams,\n  {\n    orderByPath,\n    uqOrderByPath,\n  }: { orderByPath: string; uqOrderByPath?: string },\n) {\n  const orderByDef = core(searchParams);\n  const orderBy = orderByDef.find((o) => o.column === orderByPath);\n\n  if (!orderBy) {\n    throw new Error(`No ordering key found for path ${orderByPath}`);\n  }\n\n  const uqOrderBy = uqOrderByPath\n    ? orderByDef.find((o) => o.column === uqOrderByPath)\n    : null;\n\n  return {\n    orderBy,\n    uqOrderBy,\n  };\n}\n","import type { Key } from 'swr';\n\nimport {\n  INFINITE_KEY_PREFIX,\n  INFINITE_PREFIX,\n  KEY_PREFIX,\n  KEY_SEPARATOR,\n} from './constants';\nimport type { DecodedSWRKey } from './types';\n\nexport const decode = (key: Key): DecodedSWRKey | null => {\n  if (typeof key !== 'string') return null;\n\n  const isInfinite = key.startsWith(INFINITE_PREFIX);\n  let parsedKey = key.replace(INFINITE_PREFIX, '');\n\n  // Exit early if not a postgrest key\n  const isPostgrestKey = parsedKey.startsWith(`${KEY_PREFIX}${KEY_SEPARATOR}`);\n  if (!isPostgrestKey) {\n    return null;\n  }\n  parsedKey = parsedKey.replace(`${KEY_PREFIX}${KEY_SEPARATOR}`, '');\n\n  const [\n    pagePrefix,\n    schema,\n    table,\n    queryKey,\n    bodyKey,\n    count,\n    head,\n    orderByKey,\n  ] = parsedKey.split(KEY_SEPARATOR);\n\n  const params = new URLSearchParams(queryKey);\n  const limit = params.get('limit');\n  const offset = params.get('offset');\n\n  const countValue = count.replace('count=', '');\n\n  return {\n    limit: limit ? Number(limit) : undefined,\n    offset: offset ? Number(offset) : undefined,\n    bodyKey,\n    count: countValue === 'null' ? null : countValue,\n    isHead: head === 'head=true',\n    isInfinite,\n    key,\n    isInfiniteKey: pagePrefix === INFINITE_KEY_PREFIX,\n    queryKey,\n    schema,\n    table,\n    orderByKey,\n  };\n};\n","import type { PostgrestParser } from '@supabase-cache-helpers/postgrest-core';\n\nimport { INFINITE_KEY_PREFIX, KEY_PREFIX, KEY_SEPARATOR } from './constants';\n\nexport const encode = <Result>(\n  parser: PostgrestParser<Result>,\n  isInfinite: boolean,\n) => {\n  return [\n    KEY_PREFIX,\n    isInfinite ? INFINITE_KEY_PREFIX : 'null',\n    parser.schema,\n    parser.table,\n    parser.queryKey,\n    parser.bodyKey ?? 'null',\n    `count=${parser.count}`,\n    `head=${parser.isHead}`,\n    parser.orderByKey,\n  ].join(KEY_SEPARATOR);\n};\n","import {\n  PostgrestParser,\n  isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  SWRInfiniteConfiguration,\n  SWRInfiniteFetcher,\n  SWRInfiniteHook,\n  SWRInfiniteKeyLoader,\n} from 'swr/infinite';\n\nimport { encode } from './encode';\n\nexport const infiniteMiddleware = <Result>(\n  useSWRInfiniteNext: SWRInfiniteHook,\n) => {\n  return (\n    keyFn: SWRInfiniteKeyLoader,\n    fetcher: SWRInfiniteFetcher,\n    config: SWRInfiniteConfiguration,\n  ) => {\n    return useSWRInfiniteNext(\n      (index, previousPageData) => {\n        // todo use type guard\n        const query = keyFn(index, previousPageData);\n        if (!query) return null;\n        if (!isPostgrestBuilder<Result>(query)) {\n          throw new Error('Key is not a PostgrestBuilder');\n        }\n\n        return encode(new PostgrestParser<Result>(query), true);\n      },\n      typeof fetcher === 'function' ? (query) => fetcher(query) : fetcher,\n      config,\n    );\n  };\n};\n","import {\n  PostgrestFilter,\n  type PostgrestQueryParserOptions,\n  encodeObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useSWRConfig } from 'swr';\n\nimport { KEY_SEPARATOR, POSTGREST_FILTER_KEY_PREFIX } from './constants';\n\nexport const usePostgrestFilterCache = <\n  R extends Record<string, unknown>,\n>() => {\n  const { cache } = useSWRConfig();\n\n  return (query: string, opts?: PostgrestQueryParserOptions) => {\n    const key = [\n      POSTGREST_FILTER_KEY_PREFIX,\n      query,\n      opts ? encodeObject(opts) : null,\n    ]\n      .filter(Boolean)\n      .join(KEY_SEPARATOR);\n    const cacheData = cache.get(key);\n    if (cacheData && cacheData.data instanceof PostgrestFilter) {\n      return cacheData.data;\n    }\n    const filter = PostgrestFilter.fromQuery(query, opts);\n    cache.set(key, { data: filter });\n    return filter as PostgrestFilter<R>;\n  };\n};\n","import type { BuildNormalizedQueryOps } from '@supabase-cache-helpers/postgrest-core';\nimport { useSWRConfig } from 'swr';\n\nimport { decode } from './decode';\nimport { usePostgrestFilterCache } from './use-postgrest-filter-cache';\n\nexport const useQueriesForTableLoader = (table: string) => {\n  const { cache } = useSWRConfig();\n  const getPostgrestFilter = usePostgrestFilterCache();\n\n  return () =>\n    Array.from(cache.keys()).reduce<\n      ReturnType<BuildNormalizedQueryOps['queriesForTable']>\n    >((prev, curr) => {\n      const decodedKey = decode(curr);\n      if (decodedKey?.table === table) {\n        prev.push(getPostgrestFilter(decodedKey.queryKey).params);\n      }\n      return prev;\n    }, []);\n};\n","import { decode } from './decode';\n\nexport const getMutableKeys = (keys: string[]) => {\n  return keys.filter((k) => {\n    const decoded = decode(k);\n    return decoded && (decoded.isInfinite || !decoded.isInfiniteKey);\n  });\n};\n","import {\n  type MutateItemOperation,\n  mutateItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { flatten } from 'flat';\nimport { type MutatorOptions, useSWRConfig } from 'swr';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\nimport { getMutableKeys } from '../lib/mutable-keys';\n\n/**\n * Returns a function that can be used to mutate an item by primary key(s) in the SWR cache.\n * This hook does not make any HTTP requests and is intended to be used for custom cache updates.\n *\n * @param opts - Options for the mutate operation, excluding the input and the mutate function.\n *\n * @returns A function that takes a record that should contain a value for all primary keys of `Type` as well as a mutate function  and returns a promise that resolves once the record has been upserted into the cache.\n * **/\nexport function useMutateItem<Type extends Record<string, unknown>>(\n  opts: Omit<MutateItemOperation<Type>, 'input' | 'mutate'> &\n    MutatorOptions<Type>,\n): (input: Partial<Type>, mutateFn: (current: Type) => Type) => Promise<void> {\n  const { mutate, cache } = useSWRConfig();\n  const getPostgrestFilter = usePostgrestFilterCache();\n\n  return async (input: Partial<Type>, mutateFn: (current: Type) => Type) =>\n    await mutateItem<string, Type>(\n      {\n        input: flatten(input) as Partial<Type>,\n        mutate: mutateFn,\n        ...opts,\n      },\n      {\n        cacheKeys: getMutableKeys(Array.from(cache.keys())),\n        getPostgrestFilter,\n        revalidate: (key) => {\n          mutate(key);\n        },\n        mutate: (key, data) => {\n          mutate(key, data, {\n            ...opts,\n            revalidate: opts?.revalidate ?? false,\n          });\n        },\n        decode,\n      },\n    );\n}\n","import {\n  type RevalidateTablesOperation,\n  revalidateTables,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useSWRConfig } from 'swr';\n\nimport { decode } from '../lib';\nimport { getMutableKeys } from '../lib/mutable-keys';\n\n/**\n * Returns a function that can be used to revalidate all queries in the cache that match the tables provided in the `RevalidateTablesOperation`\n * This hook does not make any HTTP requests and is intended to be used for custom cache revalidations.\n *\n * @param tables - The tables to revalidate\n *\n * @returns A function that will revalidate all defined tables when called.\n * **/\nexport function useRevalidateTables(\n  tables: RevalidateTablesOperation,\n): () => Promise<void> {\n  const { mutate, cache } = useSWRConfig();\n\n  return async () =>\n    await revalidateTables<string>(tables, {\n      cacheKeys: getMutableKeys(Array.from(cache.keys())),\n      revalidate: (key) => {\n        mutate(key);\n      },\n      decode,\n    });\n}\n","import {\n  type UpsertItemOperation,\n  upsertItem,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { flatten } from 'flat';\nimport { type MutatorOptions, useSWRConfig } from 'swr';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\nimport { getMutableKeys } from '../lib/mutable-keys';\n\n/**\n * Returns a function that can be used to upsert an item into the SWR cache.\n * This hook does not make any HTTP requests and is intended to be used for custom cache updates.\n *\n * @param opts - Options for the upsert operation, excluding the input record.\n *\n * @returns A function that takes a record of type `Type` and returns a promise that resolves once the record has been upserted into the cache.\n * **/\nexport function useUpsertItem<Type extends Record<string, unknown>>(\n  opts: Omit<UpsertItemOperation<Type>, 'input'> & MutatorOptions<Type>,\n): (input: Type) => Promise<void> {\n  const { mutate, cache } = useSWRConfig();\n  const getPostgrestFilter = usePostgrestFilterCache();\n\n  return async (input: Type) =>\n    await upsertItem<string, Type>(\n      {\n        input: flatten(input) as Type,\n        ...opts,\n      },\n      {\n        cacheKeys: getMutableKeys(Array.from(cache.keys())),\n        getPostgrestFilter,\n        revalidate: (key) => {\n          mutate(key);\n        },\n        mutate: (key, data) => {\n          mutate(key, data, {\n            ...opts,\n            revalidate: opts?.revalidate ?? false,\n          });\n        },\n        decode,\n      },\n    );\n}\n","import {\n  buildDeleteFetcher,\n  getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport useMutation, { type SWRMutationResponse } from 'swr/mutation';\n\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestSWRMutationOpts } from './types';\nimport { useRandomKey } from './use-random-key';\n\n/**\n * Hook for performing a DELETE mutation on a PostgREST resource.\n *\n * @param qb - The PostgrestQueryBuilder instance for the resource.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param query - An optional query string.\n * @param opts - An optional object of options to configure the mutation.\n * @returns A SWRMutationResponse object containing the mutation response data, error, and mutation function.\n */\nfunction useDeleteManyMutation<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  qb: PostgrestQueryBuilder<S, T, RelationName, Re>,\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UsePostgrestSWRMutationOpts<\n    'DeleteMany',\n    S,\n    T,\n    RelationName,\n    Re,\n    Q,\n    R\n  >,\n): SWRMutationResponse<\n  R[] | null,\n  PostgrestError,\n  string,\n  Partial<T['Row']>[]\n> {\n  const key = useRandomKey();\n  const queriesForTable = useQueriesForTableLoader(getTable(qb));\n  const deleteItem = useDeleteItem({\n    ...opts,\n    primaryKeys,\n    table: getTable(qb),\n    schema: qb.schema as string,\n  });\n\n  return useMutation<R[] | null, PostgrestError, string, Partial<T['Row']>[]>(\n    key,\n    async (_, { arg }) => {\n      const result = await buildDeleteFetcher<S, T, RelationName, Re, Q, R>(\n        qb,\n        primaryKeys,\n        {\n          query: query ?? undefined,\n          queriesForTable,\n          disabled: opts?.disableAutoQuery,\n          ...opts,\n        },\n      )(arg);\n\n      if (result) {\n        for (const r of result) {\n          deleteItem(r.normalizedData as T['Row']);\n        }\n      }\n\n      if (!result || result.every((r) => !r.userQueryData)) return null;\n\n      return result.map((r) => r.userQueryData as R);\n    },\n    opts,\n  );\n}\n\nexport { useDeleteManyMutation };\n","import { useId } from 'react';\n\nimport { KEY_SEPARATOR } from '../lib';\n\nconst PREFIX = 'random-mutation-key';\n\nexport const useRandomKey = () => {\n  const key = useId();\n\n  return [PREFIX, key].join(KEY_SEPARATOR);\n};\n","import {\n  buildDeleteFetcher,\n  getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport useMutation, { type SWRMutationResponse } from 'swr/mutation';\n\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestSWRMutationOpts } from './types';\nimport { useRandomKey } from './use-random-key';\n\n/**\n * Hook for performing a DELETE mutation on a PostgREST resource.\n *\n * @param qb - The PostgrestQueryBuilder instance for the resource.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param query - An optional query string.\n * @param opts - An optional object of options to configure the mutation.\n * @returns A SWRMutationResponse object containing the mutation response data, error, and mutation function.\n */\nfunction useDeleteMutation<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  qb: PostgrestQueryBuilder<S, T, RelationName, Re>,\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UsePostgrestSWRMutationOpts<'DeleteOne', S, T, RelationName, Re, Q, R>,\n): SWRMutationResponse<R | null, PostgrestError, string, Partial<T['Row']>> {\n  const key = useRandomKey();\n  const queriesForTable = useQueriesForTableLoader(getTable(qb));\n  const deleteItem = useDeleteItem({\n    ...opts,\n    primaryKeys,\n    table: getTable(qb),\n    schema: qb.schema as string,\n  });\n\n  return useMutation<R | null, PostgrestError, string, Partial<T['Row']>>(\n    key,\n    async (_, { arg }) => {\n      const r = await buildDeleteFetcher<S, T, RelationName, Re, Q, R>(\n        qb,\n        primaryKeys,\n        {\n          query: query ?? undefined,\n          queriesForTable,\n          disabled: opts?.disableAutoQuery,\n          ...opts,\n        },\n      )([arg]);\n\n      if (!r || r.length === 0) return null;\n\n      const result = r[0];\n\n      if (result) {\n        deleteItem(result.normalizedData as Partial<T['Row']>);\n      }\n\n      return result.userQueryData as R;\n    },\n    opts,\n  );\n}\n\nexport { useDeleteMutation };\n","import {\n  buildInsertFetcher,\n  getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport useMutation, { type SWRMutationResponse } from 'swr/mutation';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport { getUserResponse } from './get-user-response';\nimport type { UsePostgrestSWRMutationOpts } from './types';\nimport { useRandomKey } from './use-random-key';\n\n/**\n * Hook for performing an INSERT mutation on a PostgREST resource.\n *\n * @param qb - The PostgrestQueryBuilder instance for the resource.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param query - An optional query string.\n * @param opts - An optional object of options to configure the mutation.\n * @returns A SWRMutationResponse object containing the mutation response data, error, and mutation function.\n */\nfunction useInsertMutation<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  qb: PostgrestQueryBuilder<S, T, RelationName, Re>,\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UsePostgrestSWRMutationOpts<'Insert', S, T, RelationName, Re, Q, R>,\n): SWRMutationResponse<R[] | null, PostgrestError, string, T['Insert'][]> {\n  const key = useRandomKey();\n  const queriesForTable = useQueriesForTableLoader(getTable(qb));\n  const upsertItem = useUpsertItem({\n    ...opts,\n    primaryKeys,\n    table: getTable(qb),\n    schema: qb.schema as string,\n  });\n\n  return useMutation<R[] | null, PostgrestError, string, T['Insert'][]>(\n    key,\n    async (_, { arg }) => {\n      const result = await buildInsertFetcher<S, T, RelationName, Re, Q, R>(\n        qb,\n        {\n          query: query ?? undefined,\n          queriesForTable,\n          disabled: opts?.disableAutoQuery,\n          ...opts,\n        },\n      )(arg);\n\n      if (result) {\n        Promise.all(\n          (result ?? []).map(\n            async (d) => await upsertItem(d.normalizedData as T['Row']),\n          ),\n        );\n      }\n\n      return getUserResponse(result);\n    },\n    opts,\n  );\n}\n\nexport { useInsertMutation };\n","import type { MutationFetcherResponse } from '@supabase-cache-helpers/postgrest-core';\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T; // from lodash\n\nexport function truthy<T>(value: T): value is Truthy<T> {\n  return !!value;\n}\n\nexport const getUserResponse = <R>(d: MutationFetcherResponse<R>[] | null) => {\n  if (!d) return d;\n  return d.map((r) => r.userQueryData).filter(truthy);\n};\n","import {\n  buildUpdateFetcher,\n  getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport useSWRMutation, { type SWRMutationResponse } from 'swr/mutation';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport type { UsePostgrestSWRMutationOpts } from './types';\nimport { useRandomKey } from './use-random-key';\n\n/**\n * Hook for performing an UPDATE mutation on a PostgREST resource.\n *\n * @param qb - The PostgrestQueryBuilder instance for the resource.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param query - An optional query string.\n * @param opts - An optional object of options to configure the mutation.\n * @returns A SWRMutationResponse object containing the mutation response data, error, and mutation function.\n */\nfunction useUpdateMutation<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  qb: PostgrestQueryBuilder<S, T, RelationName, Re>,\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UsePostgrestSWRMutationOpts<'UpdateOne', S, T, RelationName, Re, Q, R>,\n): SWRMutationResponse<R | null, PostgrestError, string, T['Update']> {\n  const key = useRandomKey();\n  const queriesForTable = useQueriesForTableLoader(getTable(qb));\n  const upsertItem = useUpsertItem({\n    ...opts,\n    primaryKeys,\n    table: getTable(qb),\n    schema: qb.schema as string,\n  });\n\n  return useSWRMutation<R | null, PostgrestError, string, T['Update']>(\n    key,\n    async (_, { arg }) => {\n      const result = await buildUpdateFetcher<S, T, RelationName, Re, Q, R>(\n        qb,\n        primaryKeys,\n        {\n          query: query ?? undefined,\n          queriesForTable,\n          disabled: opts?.disableAutoQuery,\n          ...opts,\n        },\n      )(arg);\n\n      if (result?.normalizedData) {\n        upsertItem(result?.normalizedData as T['Row']);\n      }\n      return result?.userQueryData ?? null;\n    },\n    opts,\n  );\n}\n\nexport { useUpdateMutation };\n","import {\n  buildUpsertFetcher,\n  getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestQueryBuilder,\n} from '@supabase/postgrest-js';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport useMutation, { type SWRMutationResponse } from 'swr/mutation';\n\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\nimport { getUserResponse } from './get-user-response';\nimport type { UsePostgrestSWRMutationOpts } from './types';\nimport { useRandomKey } from './use-random-key';\n\n/**\n * Hook for performing an UPSERT mutation on a PostgREST resource.\n *\n * @param qb - The PostgrestQueryBuilder instance for the resource.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param query - An optional query string.\n * @param opts - An optional object of options to configure the mutation.\n * @returns A SWRMutationResponse object containing the mutation response data, error, and mutation function.\n */\nfunction useUpsertMutation<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  qb: PostgrestQueryBuilder<S, T, RelationName, Re>,\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UsePostgrestSWRMutationOpts<'Upsert', S, T, RelationName, Re, Q, R>,\n): SWRMutationResponse<R[] | null, PostgrestError, string, T['Insert'][]> {\n  const key = useRandomKey();\n  const queriesForTable = useQueriesForTableLoader(getTable(qb));\n  const upsertItem = useUpsertItem({\n    ...opts,\n    primaryKeys,\n    table: getTable(qb),\n    schema: qb.schema as string,\n  });\n\n  return useMutation<R[] | null, PostgrestError, string, T['Insert'][]>(\n    key,\n    async (_, { arg }) => {\n      const result = await buildUpsertFetcher<S, T, RelationName, Re, Q, R>(\n        qb,\n        {\n          query: query ?? undefined,\n          queriesForTable,\n          disabled: opts?.disableAutoQuery,\n          ...opts,\n        },\n      )(arg);\n      if (result) {\n        Promise.all(\n          result.map(\n            async (d) => await upsertItem(d.normalizedData as T['Row']),\n          ),\n        );\n      }\n      return getUserResponse(result);\n    },\n    opts,\n  );\n}\n\nexport { useUpsertMutation };\n","import {\n  type AnyPostgrestResponse,\n  PostgrestParser,\n  isPostgrestBuilder,\n  offsetPaginationFetcher,\n  offsetPaginationHasMoreFetcher,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestMaybeSingleResponse,\n  PostgrestResponse,\n  PostgrestSingleResponse,\n  PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\n\nimport { encode } from '../lib';\n\nfunction fetchQueryFallbackData<Result>(\n  query: PromiseLike<PostgrestSingleResponse<Result>>,\n): Promise<[string, PostgrestSingleResponse<Result>]>;\n\nfunction fetchQueryFallbackData<Result>(\n  query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n): Promise<[string, PostgrestMaybeSingleResponse<Result>]>;\n\nfunction fetchQueryFallbackData<Result>(\n  query: PromiseLike<PostgrestResponse<Result>>,\n): Promise<[string, PostgrestResponse<Result>]>;\n\nasync function fetchQueryFallbackData<Result>(\n  query: PromiseLike<AnyPostgrestResponse<Result>>,\n): Promise<[string, AnyPostgrestResponse<Result>]> {\n  if (!isPostgrestBuilder<Result>(query)) {\n    throw new Error('Query is not a PostgrestBuilder');\n  }\n\n  return [\n    encode(new PostgrestParser<Result>(query), false),\n    await query.throwOnError(),\n  ];\n}\n\nasync function fetchOffsetPaginationHasMoreFallbackData<\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  RelationName = unknown,\n  Relationships = unknown,\n>(\n  query: PostgrestTransformBuilder<\n    Schema,\n    Table,\n    Result[],\n    RelationName,\n    Relationships\n  >,\n  pageSize: number,\n): Promise<\n  [\n    string,\n    [\n      {\n        data: Result[];\n        hasMore: boolean;\n      },\n    ],\n  ]\n> {\n  return [\n    encode(new PostgrestParser<Result[]>(query.range(0, pageSize)), true),\n    [\n      await offsetPaginationHasMoreFetcher(query, {\n        offset: 0,\n        limit: pageSize,\n        pageSize,\n      }),\n    ],\n  ];\n}\n\nconst fetchOffsetPaginationFallbackData = async <\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  RelationName = unknown,\n  Relationships = unknown,\n>(\n  query: PostgrestTransformBuilder<\n    Schema,\n    Table,\n    Result[],\n    RelationName,\n    Relationships\n  >,\n  pageSize: number,\n): Promise<[string, [Result[]]]> => {\n  return [\n    encode(new PostgrestParser<Result[]>(query.range(0, pageSize)), true),\n    [\n      await offsetPaginationFetcher(query, {\n        offset: 0,\n        limit: pageSize,\n      }),\n    ],\n  ];\n};\n\nexport {\n  fetchQueryFallbackData,\n  fetchOffsetPaginationHasMoreFallbackData,\n  fetchOffsetPaginationFallbackData,\n};\n","import {\n  type PostgrestPaginationCacheData,\n  type PostgrestPaginationResponse,\n  createCursorPaginationFetcher,\n  decodeObject,\n  isPlainObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\nimport { useCallback, useMemo } from 'react';\nimport type { Middleware } from 'swr';\nimport useSWRInfinite, {\n  type SWRInfiniteConfiguration,\n  type SWRInfiniteResponse,\n} from 'swr/infinite';\n\nimport { createCursorKeyGetter, decode, infiniteMiddleware } from '../lib';\nimport { parseOrderBy } from '../lib/parse-order-by';\n\nexport type SWRCursorInfiniteScrollPostgrestResponse<Result> = Omit<\n  SWRInfiniteResponse<PostgrestPaginationCacheData<Result>, PostgrestError>,\n  'data'\n> & {\n  loadMore: null | (() => void);\n  data: Result[] | undefined;\n};\n\n/**\n * The return value of useInfiniteScrollQuery hook.\n */\nexport type UseCursorInfiniteScrollQueryReturn<\n  Result extends Record<string, unknown>,\n> = Omit<\n  SWRInfiniteResponse<PostgrestPaginationResponse<Result>, PostgrestError>,\n  'data'\n> & {\n  loadMore: null | (() => void);\n  data: Result[] | undefined;\n};\n\nexport type CursorConfig<\n  Table extends Record<string, unknown>,\n  ColumnName extends string & keyof Table,\n> = {\n  // The column to order by\n  orderBy: ColumnName;\n  // If the `orderBy` column is not unique, you need to provide a second, unique column. This can be the primary key.\n  uqOrderBy?: ColumnName;\n  // if set, will *not* apply filters to the query but pass them cursor values to the body of the rpc function. Requires the query to be a `.rpc()` call.\n  rpcArgs?: { limit: string; orderBy: string; uqOrderBy?: string };\n};\n\n/**\n * A hook that provides infinite scroll capabilities to PostgREST queries using SWR.\n *\n * @param {PostgrestTransformBuilder<Schema, Table, Result[]> | null} query - The PostgREST query.\n * @param {SWRInfiniteConfiguration & { pageSize?: number }} [config] - The SWRInfinite configuration.\n * @returns {UseInfiniteScrollQueryReturn<Result>} - The infinite scroll query result.\n */\nfunction useCursorInfiniteScrollQuery<\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  ColumnName extends string & keyof Table,\n  RelationName,\n  Relationships = unknown,\n>(\n  queryFactory:\n    | (() => PostgrestTransformBuilder<\n        Schema,\n        Table,\n        Result[],\n        RelationName,\n        Relationships\n      >)\n    | null,\n  config: SWRInfiniteConfiguration<\n    PostgrestPaginationResponse<Result>,\n    PostgrestError\n  > &\n    CursorConfig<Table, ColumnName>,\n): UseCursorInfiniteScrollQueryReturn<Result> {\n  const { data, setSize, size, isValidating, ...rest } = useSWRInfinite<\n    PostgrestPaginationResponse<Result>,\n    PostgrestError\n  >(\n    createCursorKeyGetter(queryFactory, config),\n    createCursorPaginationFetcher<Schema, Table, Result, string>(queryFactory, {\n      decode: (key: string) => {\n        if (!queryFactory) {\n          throw new Error('No query provided');\n        }\n        const decodedKey = decode(key);\n        if (!decodedKey) {\n          throw new Error('Not a SWRPostgrest key');\n        }\n\n        // extract last value from body key instead\n        if (config.rpcArgs) {\n          if (decodedKey.bodyKey && decodedKey.bodyKey !== 'null') {\n            const body = decodeObject(decodedKey.bodyKey);\n\n            const orderBy = body[config.rpcArgs.orderBy];\n            const uqOrderBy = config.rpcArgs.uqOrderBy\n              ? body[config.rpcArgs.uqOrderBy]\n              : undefined;\n\n            return {\n              orderBy: typeof orderBy === 'string' ? orderBy : undefined,\n              uqOrderBy: typeof uqOrderBy === 'string' ? uqOrderBy : undefined,\n            };\n          } else {\n            const sp = new URLSearchParams(decodedKey.queryKey);\n            const orderByValue = sp.get(config.rpcArgs.orderBy);\n            const uqOrderByValue = config.rpcArgs.uqOrderBy\n              ? sp.get(config.rpcArgs.uqOrderBy)\n              : undefined;\n            return {\n              orderBy: orderByValue || undefined,\n              uqOrderBy: uqOrderByValue || undefined,\n            };\n          }\n        }\n\n        const query = queryFactory();\n\n        const { orderBy: mainOrderBy } = parseOrderBy(\n          query['url'].searchParams,\n          { orderByPath: config.orderBy, uqOrderByPath: config.uqOrderBy },\n        );\n\n        const searchParams = new URLSearchParams(decodedKey.queryKey);\n\n        if (config.uqOrderBy) {\n          // the filter is an \"or\" operator\n          const possibleFilters = searchParams.getAll('or');\n          // find \"ours\"\n          const filter = possibleFilters.find(\n            (f) =>\n              f.includes(`${config.orderBy}.`) &&\n              f.includes(`${config.uqOrderBy}.`),\n          );\n          if (!filter) {\n            return {};\n          }\n\n          // extract values\n          // we know the format so this is safe\n          const bracketsPart = filter\n            .split('and')\n            .pop()!\n            .match(/\\((.*)\\)\\)/)![1]!\n            .replace(/\\s+/g, '');\n          const filterParts = bracketsPart.split(',');\n          const cursorValue = filterParts[0].split('.').pop()!;\n          const uqCursorValue = filterParts[1].split('.').pop()!;\n\n          return {\n            orderBy: cursorValue,\n            uqOrderBy: uqCursorValue,\n          };\n        } else {\n          const filters = searchParams.getAll(config.orderBy);\n          // find \"ours\"\n          const filter = filters.find((f) =>\n            f.startsWith(\n              `${config.orderBy}.${mainOrderBy.ascending ? 'gt' : 'lt'}`,\n            ),\n          );\n\n          if (!filter) {\n            return {};\n          }\n\n          // extract values\n          // we know the format so this is safe\n          const cursorValue = filter.split('.').pop()!;\n\n          return {\n            orderBy: cursorValue,\n          };\n        }\n      },\n      orderBy: config.orderBy,\n      uqOrderBy: config.uqOrderBy,\n      rpcArgs: config.rpcArgs,\n    }),\n    {\n      ...config,\n      use: [\n        ...(config?.use ?? []),\n        infiniteMiddleware as unknown as Middleware,\n      ],\n    },\n  );\n\n  const { flatData, hasLoadMore } = useMemo(() => {\n    if (!queryFactory) {\n      return { flatData: undefined, hasLoadMore: false };\n    }\n\n    const query = queryFactory();\n\n    const flatData = (data ?? []).flat();\n\n    let pageSize;\n    if (config.rpcArgs) {\n      if (query['method'] === 'GET') {\n        pageSize = query['url'].searchParams.get(config.rpcArgs.limit);\n      } else {\n        pageSize = isPlainObject(query['body'])\n          ? query['body'][config.rpcArgs.limit]\n          : null;\n      }\n    } else {\n      pageSize = query ? query['url'].searchParams.get('limit') : null;\n    }\n\n    if (!pageSize) {\n      return { flatData: undefined, hasLoadMore: false };\n    }\n\n    let hasLoadMore =\n      !data ||\n      (pageSize ? data[data.length - 1].length === Number(pageSize) : true);\n\n    return {\n      flatData,\n      hasLoadMore,\n    };\n  }, [data, config]);\n\n  const loadMoreFn = useCallback(() => setSize(size + 1), [size, setSize]);\n\n  return {\n    data: flatData,\n    size,\n    setSize,\n    loadMore: hasLoadMore && !isValidating ? loadMoreFn : null,\n    isValidating,\n    ...rest,\n  };\n}\n\nexport { useCursorInfiniteScrollQuery };\n","import {\n  createOffsetPaginationFetcher,\n  decodeObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestResponse,\n  PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\nimport type { Middleware } from 'swr';\nimport useSWRInfinite, {\n  type SWRInfiniteConfiguration,\n  type SWRInfiniteResponse,\n} from 'swr/infinite';\n\nimport { createOffsetKeyGetter, decode, infiniteMiddleware } from '../lib';\n\n/**\n * The return type of the `useInfiniteQuery` hook\n */\nexport type UseOffsetInfiniteQueryReturn<\n  Result extends Record<string, unknown>,\n> = SWRInfiniteResponse<\n  Exclude<PostgrestResponse<Result>['data'], null>,\n  PostgrestError\n>;\n\n/**\n * @deprecated Use UseOffsetInfiniteQueryReturn instead.\n */\nexport type UseInfiniteQueryReturn<Result extends Record<string, unknown>> =\n  UseOffsetInfiniteQueryReturn<Result>;\n\n/**\n * A hook to perform an infinite postgrest query\n * @param query The postgrest query builder\n * @param config Optional SWRInfiniteConfiguration options to configure the hook\n * @returns An object containing the query results and other SWR-related properties\n */\nfunction useOffsetInfiniteQuery<\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  RelationName = unknown,\n  Relationships = unknown,\n>(\n  queryFactory:\n    | (() => PostgrestTransformBuilder<\n        Schema,\n        Table,\n        Result[],\n        RelationName,\n        Relationships\n      >)\n    | null,\n  config?: SWRInfiniteConfiguration<\n    Exclude<PostgrestResponse<Result>['data'], null>,\n    PostgrestError\n  > & {\n    pageSize?: number;\n    rpcArgs?: { limit: string; offset: string };\n  },\n): UseOffsetInfiniteQueryReturn<Result> {\n  return useSWRInfinite<\n    Exclude<PostgrestResponse<Result>['data'], null>,\n    PostgrestError\n  >(\n    createOffsetKeyGetter(queryFactory, {\n      pageSize: config?.pageSize ?? 20,\n      rpcArgs: config?.rpcArgs,\n    }),\n    createOffsetPaginationFetcher(queryFactory, {\n      decode: (key: string) => {\n        const decodedKey = decode(key);\n        if (!decodedKey) {\n          throw new Error('Not a SWRPostgrest key');\n        }\n\n        // extract last value from body key instead\n        if (config?.rpcArgs) {\n          if (decodedKey.bodyKey && decodedKey.bodyKey !== 'null') {\n            const body = decodeObject(decodedKey.bodyKey);\n\n            const limit = body[config.rpcArgs.limit];\n            const offset = body[config.rpcArgs.offset];\n\n            return {\n              limit: typeof limit === 'number' ? limit : undefined,\n              offset: typeof offset === 'number' ? offset : undefined,\n            };\n          } else {\n            const sp = new URLSearchParams(decodedKey.queryKey);\n            const limitValue = sp.get(config.rpcArgs.limit);\n            const offsetValue = sp.get(config.rpcArgs.offset);\n            return {\n              limit: limitValue ? parseInt(limitValue, 10) : undefined,\n              offset: offsetValue ? parseInt(offsetValue, 10) : undefined,\n            };\n          }\n        }\n\n        return {\n          limit: decodedKey.limit,\n          offset: decodedKey.offset,\n        };\n      },\n      pageSize: config?.pageSize ?? 20,\n      rpcArgs: config?.rpcArgs,\n    }),\n    {\n      ...config,\n      use: [\n        ...(config?.use ?? []),\n        infiniteMiddleware as unknown as Middleware,\n      ],\n    },\n  );\n}\n\nexport { useOffsetInfiniteQuery };\n","import {\n  type PostgrestHasMorePaginationCacheData,\n  type PostgrestHasMorePaginationResponse,\n  createOffsetPaginationHasMoreFetcher,\n  decodeObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\nimport { useCallback } from 'react';\nimport type { Middleware } from 'swr';\nimport useSWRInfinite, {\n  type SWRInfiniteConfiguration,\n  type SWRInfiniteResponse,\n} from 'swr/infinite';\n\nimport { createOffsetKeyGetter, decode, infiniteMiddleware } from '../lib';\n\nexport type SWROffsetInfiniteScrollPostgrestResponse<Result> = Omit<\n  SWRInfiniteResponse<\n    PostgrestHasMorePaginationCacheData<Result>,\n    PostgrestError\n  >,\n  'data'\n> & {\n  loadMore: null | (() => void);\n  data: Result[] | undefined;\n};\n\n/**\n * @deprecated Use SWROffsetInfiniteScrollPostgrestResponse instead.\n */\nexport type SWRInfinityScrollPostgrestResponse<Result> =\n  SWROffsetInfiniteScrollPostgrestResponse<Result>;\n\n/**\n * The return value of useInfiniteScrollQuery hook.\n */\nexport type UseOffsetInfiniteScrollQueryReturn<\n  Result extends Record<string, unknown>,\n> = Omit<\n  SWRInfiniteResponse<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  >,\n  'data'\n> & {\n  loadMore: null | (() => void);\n  data: Result[] | undefined;\n};\n\n/**\n * @deprecated Use UseOffsetInfiniteScrollQueryReturn instead.\n */\nexport type UseInfiniteScrollQueryReturn<\n  Result extends Record<string, unknown>,\n> = UseOffsetInfiniteScrollQueryReturn<Result>;\n\n/**\n * A hook that provides infinite scroll capabilities to PostgREST queries using SWR.\n *\n * @param {PostgrestTransformBuilder<Schema, Table, Result[]> | null} queryFactory - The PostgREST query.\n * @param {SWRInfiniteConfiguration & { pageSize?: number }} [config] - The SWRInfinite configuration.\n * @returns {UseInfiniteScrollQueryReturn<Result>} - The infinite scroll query result.\n */\nfunction useOffsetInfiniteScrollQuery<\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  RelationName = unknown,\n  Relationships = unknown,\n>(\n  queryFactory:\n    | (() => PostgrestTransformBuilder<\n        Schema,\n        Table,\n        Result[],\n        RelationName,\n        Relationships\n      >)\n    | null,\n  config?: SWRInfiniteConfiguration<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  > & {\n    pageSize?: number;\n    rpcArgs?: { limit: string; offset: string };\n  },\n): UseOffsetInfiniteScrollQueryReturn<Result> {\n  const { data, setSize, size, isValidating, ...rest } = useSWRInfinite<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  >(\n    createOffsetKeyGetter(queryFactory, {\n      pageSize: config?.pageSize ?? 20,\n      rpcArgs: config?.rpcArgs,\n    }),\n    createOffsetPaginationHasMoreFetcher<Schema, Table, Result, string>(\n      queryFactory,\n      {\n        decode: (key: string) => {\n          const decodedKey = decode(key);\n          if (!decodedKey) {\n            throw new Error('Not a SWRPostgrest key');\n          }\n\n          // extract last value from body key instead\n          if (config?.rpcArgs) {\n            if (decodedKey.bodyKey && decodedKey.bodyKey !== 'null') {\n              const body = decodeObject(decodedKey.bodyKey);\n\n              const limit = body[config.rpcArgs.limit];\n              const offset = body[config.rpcArgs.offset];\n\n              return {\n                limit: typeof limit === 'number' ? limit : undefined,\n                offset: typeof offset === 'number' ? offset : undefined,\n              };\n            } else {\n              const sp = new URLSearchParams(decodedKey.queryKey);\n              const limitValue = sp.get(config.rpcArgs.limit);\n              const offsetValue = sp.get(config.rpcArgs.offset);\n              return {\n                limit: limitValue ? parseInt(limitValue, 10) : undefined,\n                offset: offsetValue ? parseInt(offsetValue, 10) : undefined,\n              };\n            }\n          }\n\n          return {\n            limit: decodedKey.limit,\n            offset: decodedKey.offset,\n          };\n        },\n        pageSize: config?.pageSize ?? 20,\n        rpcArgs: config?.rpcArgs,\n      },\n    ),\n    {\n      ...config,\n      use: [\n        ...(config?.use ?? []),\n        infiniteMiddleware as unknown as Middleware,\n      ],\n    },\n  );\n\n  const hasMore =\n    Array.isArray(data) && data.length > 0 && data[data.length - 1].hasMore;\n\n  const loadMoreFn = useCallback(() => setSize(size + 1), [size, setSize]);\n\n  return {\n    data: (Array.isArray(data) ? data : []).flatMap((p) => p.data),\n    size,\n    setSize,\n    loadMore: hasMore ? loadMoreFn : null,\n    isValidating,\n    ...rest,\n  };\n}\n\nexport { useOffsetInfiniteScrollQuery };\n","import {\n  type PostgrestHasMorePaginationResponse,\n  createOffsetPaginationHasMoreFetcher,\n  decodeObject,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestTransformBuilder,\n} from '@supabase/postgrest-js';\nimport { GenericSchema } from '@supabase/postgrest-js/dist/cjs/types';\nimport { useCallback, useState } from 'react';\nimport type { Middleware } from 'swr';\nimport useSWRInfinite, {\n  type SWRInfiniteConfiguration,\n  type SWRInfiniteResponse,\n} from 'swr/infinite';\n\nimport { createOffsetKeyGetter, decode, infiniteMiddleware } from '../lib';\n\nexport type SWRInfiniteOffsetPaginationPostgrestResponse<Result> = Omit<\n  SWRInfiniteResponse<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  >,\n  'data' | 'size' | 'setSize'\n> & {\n  pages: SWRInfiniteResponse<Result[], PostgrestError>['data'];\n  currentPage: null | Result[];\n  pageIndex: number;\n  setPage: (idx: number) => void;\n  nextPage: null | (() => void);\n  previousPage: null | (() => void);\n};\n\n/**\n * @deprecated Use SWROffsetInfinitePaginationPostgrestResponse instead.\n */\nexport type SWRInfinitePaginationPostgrestResponse<Result> =\n  SWRInfiniteOffsetPaginationPostgrestResponse<Result>;\n\n/**\n * The return value of the `usePaginationQuery` hook.\n */\nexport type UseInfiniteOffsetPaginationQueryReturn<\n  Result extends Record<string, unknown>,\n> = SWRInfiniteOffsetPaginationPostgrestResponse<Result>;\n\n/**\n * @deprecated Use SWROffsetInfinitePaginationPostgrestResponse instead.\n */\nexport type UsePaginationQueryReturn<Result extends Record<string, unknown>> =\n  UseInfiniteOffsetPaginationQueryReturn<Result>;\n\n/**\n * A hook for paginating through a PostgREST response.\n *\n * @param query - A PostgREST query builder.\n * @param config - A SWR configuration object.\n * @param config.pageSize - The number of items per page.\n * @returns An object containing the paginated data and various functions to manipulate the pagination state.\n */\nfunction useInfiniteOffsetPaginationQuery<\n  Schema extends GenericSchema,\n  Table extends Record<string, unknown>,\n  Result extends Record<string, unknown>,\n  RelationName = unknown,\n  Relationships = unknown,\n>(\n  queryFactory:\n    | (() => PostgrestTransformBuilder<\n        Schema,\n        Table,\n        Result[],\n        RelationName,\n        Relationships\n      >)\n    | null,\n  config?: SWRInfiniteConfiguration<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  > & {\n    pageSize?: number;\n    rpcArgs?: { limit: string; offset: string };\n  },\n): UseInfiniteOffsetPaginationQueryReturn<Result> {\n  const { data, setSize, size, isValidating, ...rest } = useSWRInfinite<\n    PostgrestHasMorePaginationResponse<Result>,\n    PostgrestError\n  >(\n    createOffsetKeyGetter(queryFactory, {\n      pageSize: config?.pageSize ?? 20,\n      rpcArgs: config?.rpcArgs,\n    }),\n    createOffsetPaginationHasMoreFetcher<Schema, Table, Result, string>(\n      queryFactory,\n      {\n        decode: (key: string) => {\n          const decodedKey = decode(key);\n          if (!decodedKey) {\n            throw new Error('Not a SWRPostgrest key');\n          }\n\n          if (config?.rpcArgs) {\n            if (decodedKey.bodyKey && decodedKey.bodyKey !== 'null') {\n              const body = decodeObject(decodedKey.bodyKey);\n\n              const limit = body[config.rpcArgs.limit];\n              const offset = body[config.rpcArgs.offset];\n\n              return {\n                limit: typeof limit === 'number' ? limit : undefined,\n                offset: typeof offset === 'number' ? offset : undefined,\n              };\n            } else {\n              const sp = new URLSearchParams(decodedKey.queryKey);\n              const limitValue = sp.get(config.rpcArgs.limit);\n              const offsetValue = sp.get(config.rpcArgs.offset);\n              return {\n                limit: limitValue ? parseInt(limitValue, 10) : undefined,\n                offset: offsetValue ? parseInt(offsetValue, 10) : undefined,\n              };\n            }\n          }\n\n          return {\n            limit: decodedKey.limit,\n            offset: decodedKey.offset,\n          };\n        },\n        pageSize: config?.pageSize ?? 20,\n        rpcArgs: config?.rpcArgs,\n      },\n    ),\n    {\n      ...config,\n      use: [\n        ...(config?.use ?? []),\n        infiniteMiddleware as unknown as Middleware,\n      ],\n    },\n  );\n\n  const [currentPageIndex, setCurrentPageIndex] = useState(0);\n\n  const parsedData = (data ?? []).map((p) => p.data);\n  const hasMore =\n    Array.isArray(data) && data.length > 0 && data[data.length - 1].hasMore;\n\n  const setPage = useCallback(\n    (idx: number) => {\n      if (idx > size - 1) {\n        setSize(idx + 1);\n      }\n      setCurrentPageIndex(idx);\n    },\n    [size, setSize, setCurrentPageIndex],\n  );\n\n  const nextPageFn = useCallback(() => {\n    if (currentPageIndex === size - 1) {\n      setSize((size) => size + 1);\n    }\n    setCurrentPageIndex((page) => page + 1);\n  }, [currentPageIndex, size, setSize, setCurrentPageIndex]);\n\n  const previousPageFn = useCallback(\n    () => setCurrentPageIndex((current) => current - 1),\n    [setCurrentPageIndex],\n  );\n\n  return {\n    pages: parsedData,\n    currentPage: parsedData ? (parsedData[currentPageIndex] ?? []) : [],\n    pageIndex: currentPageIndex,\n    setPage,\n    nextPage:\n      !isValidating && (hasMore || currentPageIndex < size - 1)\n        ? nextPageFn\n        : null,\n    previousPage: !isValidating && currentPageIndex > 0 ? previousPageFn : null,\n    isValidating,\n    ...rest,\n  };\n}\n\nexport { useInfiniteOffsetPaginationQuery };\n","import {\n  type AnyPostgrestResponse,\n  PostgrestParser,\n  isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport type {\n  PostgrestError,\n  PostgrestMaybeSingleResponse,\n  PostgrestResponse,\n  PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport useSWR, { type SWRConfiguration, type SWRResponse } from 'swr';\n\nimport { encode } from '../lib';\n\n/**\n * The return type of `useQuery` for `.single()` record results\n */\nexport type UseQuerySingleReturn<Result> = Omit<\n  SWRResponse<PostgrestSingleResponse<Result>['data'], PostgrestError>,\n  'mutate'\n> &\n  Pick<SWRResponse<PostgrestSingleResponse<Result>, PostgrestError>, 'mutate'> &\n  Pick<PostgrestSingleResponse<Result>, 'count'>;\n\n/**\n * The return type of `useQuery` for `.maybeSingle()` queries\n */\nexport type UseQueryMaybeSingleReturn<Result> = Omit<\n  SWRResponse<PostgrestMaybeSingleResponse<Result>['data'], PostgrestError>,\n  'mutate'\n> &\n  Pick<\n    SWRResponse<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n    'mutate'\n  > &\n  Pick<PostgrestMaybeSingleResponse<Result>, 'count'>;\n\n/**\n * The default return type of `useQuery` queries\n */\nexport type UseQueryReturn<Result> = Omit<\n  SWRResponse<PostgrestResponse<Result>['data'], PostgrestError>,\n  'mutate'\n> &\n  Pick<SWRResponse<PostgrestResponse<Result>, PostgrestError>, 'mutate'> &\n  Pick<PostgrestResponse<Result>, 'count'>;\n\n/**\n * The return type of `useQuery` for any type of result\n */\nexport type UseQueryAnyReturn<Result> = Omit<\n  SWRResponse<AnyPostgrestResponse<Result>['data'], PostgrestError>,\n  'mutate'\n> &\n  Pick<SWRResponse<AnyPostgrestResponse<Result>, PostgrestError>, 'mutate'> &\n  Pick<AnyPostgrestResponse<Result>, 'count'>;\n\n/**\n * Perform a postgrest query using `useSWR`.\n *\n * @param {PromiseLike<PostgrestSingleResponse<Result>> | null} query - The query to perform\n * @param {SWRConfiguration} [config] - The configuration for `useSWR`\n * @returns {UseQuerySingleReturn<Result>} - The query result\n */\nfunction useQuery<Result>(\n  query: PromiseLike<PostgrestSingleResponse<Result>> | null,\n  config?: SWRConfiguration<PostgrestSingleResponse<Result>, PostgrestError>,\n): UseQuerySingleReturn<Result>;\n/**\n * Perform a postgrest query using `useSWR`.\n *\n * @param {PromiseLike<PostgrestMaybeSingleResponse<Result>> | null} query - The query to perform\n * @param {SWRConfiguration} [config] - The configuration for `useSWR`\n * @returns {UseQueryMaybeSingleReturn<Result>} - The query result\n */\nfunction useQuery<Result>(\n  query: PromiseLike<PostgrestMaybeSingleResponse<Result>> | null,\n  config?: SWRConfiguration<\n    PostgrestMaybeSingleResponse<Result>,\n    PostgrestError\n  >,\n): UseQueryMaybeSingleReturn<Result>;\n/**\n * Perform a postgrest query using `useSWR`.\n *\n * @param {PromiseLike<PostgrestResponse<Result>> | null} query - The query to perform\n * @param {SWRConfiguration} [config] - The configuration for `useSWR`\n * @returns {UseQueryReturn<Result>} - The query result\n */\nfunction useQuery<Result>(\n  query: PromiseLike<PostgrestResponse<Result>> | null,\n  config?: SWRConfiguration<PostgrestResponse<Result>, PostgrestError>,\n): UseQueryReturn<Result>;\n/**\n * Perform a postgrest query using `useSWR`.\n *\n * @param {PromiseLike<AnyPostgrestResponse<Result>> | null} query - The query to perform\n * @param {SWRConfiguration} [config] - The configuration for `useSWR`\n * @returns {UseQueryAnyReturn<Result>} - The query result\n */\nfunction useQuery<Result>(\n  query: PromiseLike<AnyPostgrestResponse<Result>> | null,\n  config?: SWRConfiguration<AnyPostgrestResponse<Result>, PostgrestError>,\n): UseQueryAnyReturn<Result> {\n  const { data, ...rest } = useSWR<\n    AnyPostgrestResponse<Result>,\n    PostgrestError\n  >(\n    query,\n    async (q) => {\n      if (isPostgrestBuilder(q)) {\n        q = q.throwOnError();\n      }\n      return await q;\n    },\n    {\n      ...config,\n      use: [\n        ...(config?.use ?? []),\n        (useSWRNext) => {\n          return (key, fetcher, config) => {\n            if (!fetcher) throw new Error('No fetcher provided');\n\n            if (key !== null && !isPostgrestBuilder<Result>(key)) {\n              throw new Error('Key is not a PostgrestBuilder');\n            }\n\n            // eslint-disable-next-line react-hooks/rules-of-hooks\n            return useSWRNext(\n              key ? encode(new PostgrestParser<Result>(key), false) : null,\n              () => fetcher(key),\n              config,\n            );\n          };\n        },\n      ],\n    },\n  );\n\n  return { data: data?.data, count: data?.count ?? null, ...rest };\n}\n\nexport { useQuery };\n","import {\n  type RevalidateOpts,\n  buildNormalizedQuery,\n  normalizeResponse,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { UnstableGetResult as GetResult } from '@supabase/postgrest-js';\nimport {\n  GenericSchema,\n  GenericTable,\n} from '@supabase/postgrest-js/dist/cjs/types';\nimport {\n  REALTIME_LISTEN_TYPES,\n  REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n  type RealtimeChannel,\n  type RealtimePostgresChangesFilter,\n  type RealtimePostgresChangesPayload,\n  type SupabaseClient,\n} from '@supabase/supabase-js';\nimport { useEffect, useState } from 'react';\nimport type { MutatorOptions as SWRMutatorOptions } from 'swr';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Options for the useSubscriptionQuery hook.\n */\nexport type UseSubscriptionQueryOpts<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n> = RevalidateOpts<T['Row']> &\n  SWRMutatorOptions & {\n    /**\n     * A callback that will be called whenever a realtime event occurs for the given channel.\n     * The callback will receive the event payload with an additional \"data\" property, which will be\n     * the affected row of the event (or a modified version of it, if a select query is provided).\n     */\n    callback?: (\n      event: RealtimePostgresChangesPayload<T['Row']> & { data: T['Row'] | R },\n    ) => void | Promise<void>;\n  };\n\n/**\n * A hook for subscribing to realtime Postgres events on a given channel.\n *\n * The subscription will automatically update the cache for the specified table in response\n * to incoming Postgres events, and optionally run a user-provided callback function with the\n * event and the updated data.\n *\n * This hook works by creating a Supabase Realtime channel for the specified table and\n * subscribing to Postgres changes on that channel. When an event is received, the hook\n * fetches the updated data from the database (using a `select` query generated from the cache\n * configuration), and then updates the cache accordingly.\n *\n * @param client - The Supabase client instance.\n * @param channelName - The name of the channel to subscribe to.\n * @param filter - The filter object to use when listening for changes.\n * @param primaryKeys - An array of the primary keys for the table being listened to.\n * @param query - An optional PostgREST query to use when selecting data for an event.\n * @param opts - Additional options to pass to the hook.\n * @returns An object containing the RealtimeChannel and the current status of the subscription.\n */\nfunction useSubscriptionQuery<\n  S extends GenericSchema,\n  T extends GenericTable,\n  RelationName extends string,\n  Re = T extends { Relationships: infer R } ? R : unknown,\n  Q extends string = '*',\n  R = GetResult<S, T['Row'], RelationName, Re, Q extends '*' ? '*' : Q>,\n>(\n  client: SupabaseClient | null,\n  channelName: string,\n  filter: Omit<\n    RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>,\n    'table'\n  > & {\n    table: RelationName;\n  },\n  primaryKeys: (keyof T['Row'])[],\n  query?: Q | null,\n  opts?: UseSubscriptionQueryOpts<S, T, RelationName, Re, Q, R>,\n) {\n  const [status, setStatus] = useState<string>();\n  const [channel, setChannel] = useState<RealtimeChannel>();\n  const queriesForTable = useQueriesForTableLoader(filter.table);\n  const deleteItem = useDeleteItem({\n    ...opts,\n    primaryKeys,\n    table: filter.table,\n    schema: filter.schema,\n  });\n  const upsertItem = useUpsertItem({\n    ...opts,\n    primaryKeys,\n    table: filter.table,\n    schema: filter.schema,\n  });\n\n  useEffect(() => {\n    if (!client) return;\n\n    const c = client\n      .channel(channelName)\n      .on<T['Row']>(\n        REALTIME_LISTEN_TYPES.POSTGRES_CHANGES,\n        filter,\n        async (payload) => {\n          let data: T['Row'] | R = payload.new ?? payload.old;\n          const selectQuery = buildNormalizedQuery({ queriesForTable, query });\n          if (\n            payload.eventType !==\n              REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE &&\n            selectQuery\n          ) {\n            const qb = client\n              .from(payload.table)\n              .select(selectQuery.selectQuery);\n            for (const pk of primaryKeys) {\n              qb.eq(pk.toString(), data[pk]);\n            }\n            const res = await qb.single();\n            if (res.data) {\n              data = normalizeResponse(selectQuery.groupedPaths, res.data) as R;\n            }\n          }\n\n          if (\n            payload.eventType ===\n              REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT ||\n            payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE\n          ) {\n            await upsertItem(data as Record<string, unknown>);\n          } else if (\n            payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n          ) {\n            await deleteItem(payload.old);\n          }\n          if (opts?.callback) {\n            opts.callback({\n              ...payload,\n              data,\n            });\n          }\n        },\n      )\n      .subscribe((status: string) => setStatus(status));\n\n    setChannel(c);\n\n    return () => {\n      if (c) c.unsubscribe();\n    };\n  }, []);\n\n  return { channel, status };\n}\n\nexport { useSubscriptionQuery };\n","import type { RevalidateOpts } from '@supabase-cache-helpers/postgrest-core';\nimport { GenericTable } from '@supabase/postgrest-js/dist/cjs/types';\nimport {\n  REALTIME_LISTEN_TYPES,\n  REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n  type RealtimePostgresChangesFilter,\n  type RealtimePostgresChangesPayload,\n  type SupabaseClient,\n} from '@supabase/supabase-js';\nimport { useEffect, useState } from 'react';\nimport type { MutatorOptions as SWRMutatorOptions } from 'swr';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\n\n/**\n * Options for `useSubscription` hook.\n */\nexport type UseSubscriptionOpts<T extends GenericTable> = RevalidateOpts<\n  T['Row']\n> &\n  SWRMutatorOptions & {\n    /**\n     * A callback that will be invoked whenever a new change event is received.\n     *\n     * @param event - The change event payload.\n     * @returns Optionally returns a Promise.\n     */\n    callback?: (\n      event: RealtimePostgresChangesPayload<T['Row']>,\n    ) => void | Promise<void>;\n  };\n\n/**\n * A custom React hook for subscribing to a Supabase Realtime subscription.\n *\n * @param channel - The Realtime subscription channel to listen to.\n * @param filter - The filter to apply on the table. Must include the table name.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param opts - Additional options for the hook.\n * @returns An object containing the subscription status.\n */\nfunction useSubscription<T extends GenericTable>(\n  client: SupabaseClient | null,\n  channelName: string,\n  filter: Omit<\n    RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>,\n    'table'\n  > & {\n    table: string;\n  },\n  primaryKeys: (keyof T['Row'])[],\n  opts?: UseSubscriptionOpts<T>,\n) {\n  const [status, setStatus] = useState<string>();\n  const deleteItem = useDeleteItem({\n    ...opts,\n    primaryKeys,\n    table: filter.table,\n    schema: filter.schema,\n  });\n  const upsertItem = useUpsertItem({\n    ...opts,\n    primaryKeys,\n    table: filter.table,\n    schema: filter.schema,\n  });\n\n  useEffect(() => {\n    if (!client) return;\n\n    const c = client\n      .channel(channelName)\n      .on<T['Row']>(\n        REALTIME_LISTEN_TYPES.POSTGRES_CHANGES,\n        filter,\n        async (payload) => {\n          if (\n            payload.eventType ===\n              REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT ||\n            payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE\n          ) {\n            await upsertItem(payload.new);\n          } else if (\n            payload.eventType === REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n          ) {\n            await deleteItem(payload.old);\n          }\n          if (opts?.callback) {\n            opts.callback({\n              ...payload,\n            });\n          }\n        },\n      )\n      .subscribe((status: string) => setStatus(status));\n\n    return () => {\n      if (c) c.unsubscribe();\n    };\n  }, []);\n\n  return { status };\n}\n\nexport { useSubscription };\n"],"mappings":"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","names":["import_postgrest_core","import_swr","import_postgrest_core","core","import_postgrest_core","import_postgrest_core","import_swr","import_postgrest_core","import_flat","import_swr","import_postgrest_core","import_swr","import_postgrest_core","import_flat","import_swr","import_postgrest_core","deleteItem","useMutation","import_postgrest_core","import_mutation","deleteItem","useMutation","import_postgrest_core","import_mutation","upsertItem","useMutation","import_postgrest_core","import_mutation","upsertItem","useSWRMutation","import_postgrest_core","import_mutation","upsertItem","useMutation","import_postgrest_core","import_postgrest_core","import_react","useSWRInfinite","flatData","hasLoadMore","import_postgrest_core","import_infinite","useSWRInfinite","import_postgrest_core","import_react","import_infinite","useSWRInfinite","import_postgrest_core","import_react","import_infinite","useSWRInfinite","size","import_postgrest_core","import_swr","useSWR","config","import_postgrest_core","import_react","deleteItem","upsertItem","status","import_supabase_js","import_react","deleteItem","upsertItem","status"]}