UNPKG

@supabase-cache-helpers/postgrest-react-query

Version:

A collection of React Query utilities for working with Supabase.

1 lines 49.2 kB
{"version":3,"sources":["../src/cache/use-delete-item.ts","../src/lib/use-postgrest-filter-cache.ts","../src/lib/key.ts","../src/lib/use-queries-for-table-loader.ts","../src/cache/use-mutate-item.ts","../src/cache/use-upsert-item.ts","../src/mutate/use-delete-many-mutation.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/build-query-opts.ts","../src/query/fetch.ts","../src/query/prefetch.ts","../src/query/use-query.ts","../src/subscribe/use-subscription-query.ts","../src/subscribe/use-subscription.ts"],"sourcesContent":["import {\n deleteItem,\n DeleteItemOperation,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport flatten from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to delete an item from the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useDeleteItem<Type extends Record<string, unknown>>(\n opts: Omit<DeleteItemOperation<Type>, 'input'>,\n) {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Type) =>\n await deleteItem(\n {\n input: flatten(input) as Type,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import {\n encodeObject,\n PostgrestFilter,\n PostgrestQueryParserOptions,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\n\nexport const POSTGREST_FILTER_KEY_PREFIX = 'postgrest-filter';\n\nexport const usePostgrestFilterCache = <\n R extends Record<string, unknown>,\n>() => {\n const queryClient = useQueryClient();\n\n return (query: string, opts?: PostgrestQueryParserOptions) => {\n const key = [\n POSTGREST_FILTER_KEY_PREFIX,\n query,\n opts ? encodeObject(opts) : null,\n ];\n const cacheData = queryClient.getQueryData(key);\n if (cacheData instanceof PostgrestFilter) {\n return cacheData;\n }\n const filter = PostgrestFilter.fromQuery(query, opts);\n queryClient.setQueryData(key, filter);\n return filter as PostgrestFilter<R>;\n };\n};\n","import {\n PostgrestParser,\n DecodedKey,\n isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\n\nexport const KEY_PREFIX = 'postgrest';\nexport const INFINITE_KEY_PREFIX = 'page';\n\nexport type DecodedReactQueryKey = DecodedKey & {\n isInfinite: boolean;\n key: string[];\n};\n\nexport const encode = <Result>(key: unknown, isInfinite: boolean): string[] => {\n if (!isPostgrestBuilder<Result>(key)) {\n throw new Error('Key is not a PostgrestBuilder');\n }\n\n const parser = new PostgrestParser<Result>(key);\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 ];\n};\n\nexport const decode = (key: unknown): DecodedReactQueryKey | null => {\n if (!Array.isArray(key)) return null;\n\n const [\n prefix,\n infinitePrefix,\n schema,\n table,\n queryKey,\n bodyKey,\n count,\n head,\n orderByKey,\n ] = key;\n\n // Exit early if not a postgrest key\n if (prefix !== KEY_PREFIX) return null;\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: infinitePrefix === INFINITE_KEY_PREFIX,\n key,\n queryKey,\n schema,\n table,\n orderByKey,\n };\n};\n","import { BuildNormalizedQueryOps } from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\n\nimport { decode } from './key';\nimport { usePostgrestFilterCache } from './use-postgrest-filter-cache';\n\nexport const useQueriesForTableLoader = (table: string) => {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return () =>\n queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey)\n .reduce<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 );\n};\n","import {\n mutateItem,\n MutateItemOperation,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport flatten from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to mutate an item within the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useMutateItem<Type extends Record<string, unknown>>(\n opts: Omit<MutateItemOperation<Type>, 'input' | 'mutate'>,\n): (input: Partial<Type>, mutateFn: (current: Type) => Type) => Promise<void> {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Partial<Type>, mutateFn: (current: Type) => Type) =>\n await mutateItem(\n {\n input: flatten(input) as Partial<Type>,\n mutate: mutateFn,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import {\n upsertItem,\n UpsertItemOperation,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useQueryClient } from '@tanstack/react-query';\nimport flatten from 'flat';\n\nimport { decode, usePostgrestFilterCache } from '../lib';\n\n/**\n * Convenience hook to upsert an item into the react query cache. Does not make any http requests, and is supposed to be used for custom cache updates.\n * @param opts The mutation options\n * @returns void\n */\nexport function useUpsertItem<Type extends Record<string, unknown>>(\n opts: Omit<UpsertItemOperation<Type>, 'input'>,\n) {\n const queryClient = useQueryClient();\n const getPostgrestFilter = usePostgrestFilterCache();\n\n return async (input: Type) =>\n await upsertItem(\n {\n input: flatten(input) as Type,\n ...opts,\n },\n {\n cacheKeys: queryClient\n .getQueryCache()\n .getAll()\n .map((c) => c.queryKey),\n getPostgrestFilter,\n revalidate: (key) => queryClient.invalidateQueries({ queryKey: key }),\n mutate: (key, fn) => {\n queryClient.setQueriesData({ queryKey: key }, fn);\n },\n decode,\n },\n );\n}\n","import { PostgrestQueryBuilder } from '@supabase/postgrest-js';\nimport { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n buildDeleteFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { UsePostgrestMutationOpts } from './types';\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Hook to execute a DELETE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the DELETE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'DeleteOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useDeleteManyMutation<\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>(\n qb: PostgrestQueryBuilder<S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<S, T, RelationName, Re, 'DeleteMany', Q, R>,\n 'mutationFn'\n >,\n) {\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({\n mutationFn: async (input) => {\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 )(input);\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 { PostgrestQueryBuilder } from '@supabase/postgrest-js';\nimport { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n buildDeleteFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { UsePostgrestMutationOpts } from './types';\nimport { useDeleteItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Hook to execute a DELETE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the DELETE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'DeleteOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useDeleteMutation<\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>(\n qb: PostgrestQueryBuilder<S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<S, T, RelationName, Re, 'DeleteOne', Q, R>,\n 'mutationFn'\n >,\n) {\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({\n mutationFn: async (input) => {\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 )([input]);\n\n if (!r) return null;\n\n const result = r[0];\n\n if (result) {\n await deleteItem(result.normalizedData as T['Row']);\n }\n return result?.userQueryData ?? null;\n },\n ...opts,\n });\n}\n\nexport { useDeleteMutation };\n","import { PostgrestQueryBuilder } from '@supabase/postgrest-js';\nimport { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n buildInsertFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { getUserResponse } from './get-user-response';\nimport { UsePostgrestMutationOpts } from './types';\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Hook to execute a INSERT mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the INSERT mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'Insert', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useInsertMutation<\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>(\n qb: PostgrestQueryBuilder<S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<S, T, RelationName, Re, 'Insert', Q, R>,\n 'mutationFn'\n >,\n) {\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({\n mutationFn: async (input) => {\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 )(input);\n\n if (result) {\n await Promise.all(\n result.map(\n async (d) => await upsertItem(d.normalizedData as T['Row']),\n ),\n );\n }\n return getUserResponse(result) ?? null;\n },\n ...opts,\n });\n}\n\nexport { useInsertMutation };\n","import { 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>(\n d: MutationFetcherResponse<R>[] | null | undefined,\n) => {\n if (!d) return d;\n return d.map((r) => r.userQueryData).filter(truthy);\n};\n","import { PostgrestQueryBuilder } from '@supabase/postgrest-js';\nimport { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n buildUpdateFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { UsePostgrestMutationOpts } from './types';\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Hook to execute a UPDATE mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the UPDATE mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'UpdateOne', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useUpdateMutation<\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>(\n qb: PostgrestQueryBuilder<S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<S, T, RelationName, Re, 'UpdateOne', Q, R>,\n 'mutationFn'\n >,\n) {\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({\n mutationFn: async (input) => {\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 )(input);\n if (result) {\n await upsertItem(result.normalizedData as T['Row']);\n }\n return result?.userQueryData ?? null;\n },\n ...opts,\n });\n}\n\nexport { useUpdateMutation };\n","import { PostgrestQueryBuilder } from '@supabase/postgrest-js';\nimport { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n buildUpsertFetcher,\n getTable,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { getUserResponse } from './get-user-response';\nimport { UsePostgrestMutationOpts } from './types';\nimport { useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Hook to execute a UPSERT mutation\n *\n * @param {PostgrestQueryBuilder<S, T>} qb PostgrestQueryBuilder instance for the table\n * @param {Array<keyof T['Row']>} primaryKeys Array of primary keys of the table\n * @param {string | null} query Optional PostgREST query string for the UPSERT mutation\n * @param {Omit<UsePostgrestMutationOpts<S, T, 'Upsert', Q, R>, 'mutationFn'>} [opts] Options to configure the hook\n */\nfunction useUpsertMutation<\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>(\n qb: PostgrestQueryBuilder<S, T, Re>,\n primaryKeys: (keyof T['Row'])[],\n query?: Q | null,\n opts?: Omit<\n UsePostgrestMutationOpts<S, T, RelationName, Re, 'Upsert', Q, R>,\n 'mutationFn'\n >,\n) {\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({\n mutationFn: async (input: T['Insert'][]) => {\n const data = await buildUpsertFetcher<S, T, RelationName, Re, Q, R>(qb, {\n query: query ?? undefined,\n queriesForTable,\n disabled: opts?.disableAutoQuery,\n ...opts,\n })(input);\n if (data) {\n await Promise.all(\n data.map(async (d) => await upsertItem(d.normalizedData as T['Row'])),\n );\n }\n return getUserResponse(data) ?? null;\n },\n ...opts,\n });\n}\n\nexport { useUpsertMutation };\n","import { PostgrestError } from '@supabase/postgrest-js';\nimport {\n AnyPostgrestResponse,\n isPostgrestBuilder,\n isPostgrestTransformBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { UseQueryOptions as UseReactQueryOptions } from '@tanstack/react-query';\n\nimport { encode } from '../lib/key';\n\nexport function buildQueryOpts<Result>(\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError> {\n return {\n queryKey: encode<Result>(query, false),\n queryFn: async ({ signal }) => {\n if (isPostgrestTransformBuilder(query)) {\n query = query.abortSignal(signal);\n }\n if (isPostgrestBuilder(query)) {\n query = query.throwOnError();\n }\n return await query;\n },\n ...config,\n };\n}\n","import {\n PostgrestError,\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';\nimport { FetchQueryOptions, QueryClient } from '@tanstack/react-query';\n\nimport { buildQueryOpts } from './build-query-opts';\n\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestSingleResponse<Result>>;\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestMaybeSingleResponse<Result>>;\nfunction fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<PostgrestResponse<Result>>;\n\nasync function fetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<AnyPostgrestResponse<Result>> {\n return await queryClient.fetchQuery<\n AnyPostgrestResponse<Result>,\n PostgrestError\n >(buildQueryOpts(query, config));\n}\n\nexport { fetchQuery };\n","import {\n PostgrestError,\n PostgrestMaybeSingleResponse,\n PostgrestResponse,\n PostgrestSingleResponse,\n} from '@supabase/postgrest-js';\nimport {\n AnyPostgrestResponse,\n isPostgrestBuilder,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { FetchQueryOptions, QueryClient } from '@tanstack/react-query';\n\nimport { buildQueryOpts } from './build-query-opts';\nimport { encode } from '../lib';\n\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\nfunction prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): Promise<void>;\n\nasync function prefetchQuery<Result>(\n queryClient: QueryClient,\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n FetchQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n) {\n await queryClient.prefetchQuery<AnyPostgrestResponse<Result>, PostgrestError>(\n buildQueryOpts(query, config),\n );\n}\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n): Promise<[string[], PostgrestSingleResponse<Result>]>;\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n): Promise<[string[], PostgrestMaybeSingleResponse<Result>]>;\n\nfunction fetchQueryInitialData<Result>(\n query: PromiseLike<PostgrestResponse<Result>>,\n): Promise<[string[], PostgrestResponse<Result>]>;\n\nasync function fetchQueryInitialData<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 [encode(query, false), await query.throwOnError()];\n}\n\nexport { prefetchQuery, fetchQueryInitialData };\n","import {\n PostgrestError,\n PostgrestResponse,\n PostgrestSingleResponse,\n PostgrestMaybeSingleResponse,\n} from '@supabase/postgrest-js';\nimport { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';\nimport {\n useQuery as useReactQuery,\n UseQueryResult as UseReactQueryResult,\n UseQueryOptions as UseReactQueryOptions,\n} from '@tanstack/react-query';\n\nimport { buildQueryOpts } from './build-query-opts';\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * a single row.\n */\nexport type UseQuerySingleReturn<Result> = Omit<\n UseReactQueryResult<PostgrestSingleResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestSingleResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestSingleResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * either a single row or an empty response.\n */\nexport type UseQueryMaybeSingleReturn<Result> = Omit<\n UseReactQueryResult<\n PostgrestMaybeSingleResponse<Result>['data'],\n PostgrestError\n >,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestMaybeSingleResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when `query` is expected to return\n * one or more rows.\n */\nexport type UseQueryReturn<Result> = Omit<\n UseReactQueryResult<PostgrestResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<PostgrestResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<PostgrestResponse<Result>, 'count'>;\n\n/**\n * Represents the return value of the `useQuery` hook when the type of the query response\n * is not known.\n */\nexport type UseQueryAnyReturn<Result> = Omit<\n UseReactQueryResult<AnyPostgrestResponse<Result>['data'], PostgrestError>,\n 'refetch'\n> &\n Pick<\n UseReactQueryResult<AnyPostgrestResponse<Result>, PostgrestError>,\n 'refetch'\n > &\n Pick<AnyPostgrestResponse<Result>, 'count'>;\n\n/**\n * React hook to execute a PostgREST query and return a single item response.\n *\n * @param {PromiseLike<PostgrestSingleResponse<Result>>} query A promise that resolves to a PostgREST single item response.\n * @param {Omit<UseReactQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQuerySingleReturn<Result>} The hook result containing the single item response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestSingleResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQuerySingleReturn<Result>;\n/**\n * React hook to execute a PostgREST query and return a maybe single item response.\n *\n * @param {PromiseLike<PostgrestMaybeSingleResponse<Result>>} query A promise that resolves to a PostgREST maybe single item response.\n * @param {Omit<UseReactQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryMaybeSingleReturn<Result>} The hook result containing the maybe single item response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryMaybeSingleReturn<Result>;\n/**\n * React hook to execute a PostgREST query.\n *\n * @template Result The expected response data type.\n * @param {PromiseLike<PostgrestResponse<Result>>} query A promise that resolves to a PostgREST response.\n * @param {Omit<UseReactQueryOptions<PostgrestResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryReturn<Result>} The hook result containing the response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<PostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<PostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryReturn<Result>;\n\n/**\n * React hook to execute a PostgREST query.\n *\n * @template Result The expected response data type.\n * @param {PromiseLike<AnyPostgrestResponse<Result>>} query A promise that resolves to a PostgREST response of any kind.\n * @param {Omit<UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>, 'queryKey' | 'queryFn'>} [config] The React Query options.\n * @returns {UseQueryAnyReturn<Result>} The hook result containing the response data.\n */\nfunction useQuery<Result>(\n query: PromiseLike<AnyPostgrestResponse<Result>>,\n config?: Omit<\n UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,\n 'queryKey' | 'queryFn'\n >,\n): UseQueryAnyReturn<Result> {\n const { data, ...rest } = useReactQuery<\n AnyPostgrestResponse<Result>,\n PostgrestError\n >(buildQueryOpts<Result>(query, config));\n\n return { data: data?.data, count: data?.count ?? null, ...rest };\n}\n\nexport { useQuery };\n","import { GetResult } from '@supabase/postgrest-js/dist/module/select-query-parser';\nimport {\n GenericSchema,\n GenericTable,\n} from '@supabase/postgrest-js/dist/module/types';\nimport {\n RealtimeChannel,\n RealtimePostgresChangesFilter,\n RealtimePostgresChangesPayload,\n REALTIME_LISTEN_TYPES,\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n SupabaseClient,\n} from '@supabase/supabase-js';\nimport {\n buildNormalizedQuery,\n normalizeResponse,\n RevalidateOpts,\n} from '@supabase-cache-helpers/postgrest-core';\nimport { MutationOptions as ReactQueryMutatorOptions } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\nimport { useQueriesForTableLoader } from '../lib';\n\n/**\n * Options for `useSubscriptionQuery` hook\n */\nexport type UseSubscriptionQueryOpts<\n S extends GenericSchema,\n T extends GenericTable,\n RelationName,\n Relatsonships,\n Q extends string = '*',\n R = GetResult<\n S,\n T['Row'],\n RelationName,\n Relatsonships,\n Q extends '*' ? '*' : Q\n >,\n> = RevalidateOpts<T['Row']> &\n ReactQueryMutatorOptions & {\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,\n Relationships,\n Q extends string = '*',\n R = GetResult<\n S,\n T['Row'],\n RelationName,\n Relationships,\n Q extends '*' ? '*' : Q\n >,\n>(\n client: SupabaseClient | null,\n channelName: string,\n filter: Omit<\n RealtimePostgresChangesFilter<`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`>,\n 'table'\n > & { table: string },\n primaryKeys: (keyof T['Row'])[],\n query?: Q extends '*' ? \"'*' is not allowed\" : Q | null,\n opts?: UseSubscriptionQueryOpts<S, T, RelationName, Relationships, 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 { GenericTable } from '@supabase/postgrest-js/dist/module/types';\nimport {\n RealtimePostgresChangesFilter,\n RealtimePostgresChangesPayload,\n REALTIME_LISTEN_TYPES,\n REALTIME_POSTGRES_CHANGES_LISTEN_EVENT,\n SupabaseClient,\n} from '@supabase/supabase-js';\nimport { RevalidateOpts } from '@supabase-cache-helpers/postgrest-core';\nimport { MutationOptions as ReactQueryMutatorOptions } from '@tanstack/react-query';\nimport { useEffect, useState } from 'react';\n\nimport { useDeleteItem, useUpsertItem } from '../cache';\n\n/**\n * Options for the `useSubscription` hook.\n */\nexport type UseSubscriptionOpts<T extends GenericTable> = RevalidateOpts<\n T['Row']\n> &\n ReactQueryMutatorOptions & {\n callback?: (\n event: RealtimePostgresChangesPayload<T['Row']>,\n ) => void | Promise<void>;\n };\n\n/**\n * Hook that sets up a real-time subscription to a Postgres database table.\n *\n * @param channel - The real-time channel to subscribe to.\n * @param filter - A filter that specifies the table and conditions for the subscription.\n * @param primaryKeys - An array of primary key column names for the table.\n * @param opts - Options for the mutation function used to upsert or delete rows in the cache.\n *\n * @returns An object containing the current status of the subscription.\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 > & { table: string },\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":["useQueryClient","useQueryClient","useQueryClient","useQueryClient","useQueryClient","flatten","useQueryClient","flatten","useQueryClient","flatten","useQueryClient","flatten","deleteItem","buildDeleteFetcher","getTable","useMutation","getTable","deleteItem","useMutation","buildDeleteFetcher","getTable","useMutation","getTable","upsertItem","useMutation","getTable","useMutation","getTable","upsertItem","useMutation","getTable","useMutation","getTable","upsertItem","useMutation","isPostgrestBuilder","isPostgrestBuilder","isPostgrestBuilder","isPostgrestBuilder","deleteItem","upsertItem","status","REALTIME_LISTEN_TYPES","REALTIME_POSTGRES_CHANGES_LISTEN_EVENT","useEffect","useState","useState","deleteItem","upsertItem","useEffect","REALTIME_LISTEN_TYPES","REALTIME_POSTGRES_CHANGES_LISTEN_EVENT","status"]}