Skip to content

Commit

Permalink
Merge pull request #383 from psteinroe/feat/build-query-opts
Browse files Browse the repository at this point in the history
feat: export buildQueryOptions and fetchQuery wrapper
  • Loading branch information
psteinroe authored Feb 14, 2024
2 parents 099eff9 + cf94e04 commit d5f999f
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 26 deletions.
5 changes: 5 additions & 0 deletions .changeset/stupid-grapes-exist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@supabase-cache-helpers/postgrest-react-query": minor
---

feat: export buildQueryOptions and fetchQuery wrapper
27 changes: 27 additions & 0 deletions packages/postgrest-react-query/src/query/build-query-opts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { PostgrestError } from '@supabase/postgrest-js';
import {
AnyPostgrestResponse,
isPostgrestBuilder,
} from '@supabase-cache-helpers/postgrest-core';
import { UseQueryOptions as UseReactQueryOptions } from '@tanstack/react-query';

import { encode } from '../lib/key';

export function buildQueryOpts<Result>(
query: PromiseLike<AnyPostgrestResponse<Result>>,
config?: Omit<
UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,
'queryKey' | 'queryFn'
>,
): UseReactQueryOptions<AnyPostgrestResponse<Result>, PostgrestError> {
return {
queryKey: encode<Result>(query, false),
queryFn: async () => {
if (isPostgrestBuilder(query)) {
query = query.throwOnError();
}
return await query;
},
...config,
};
}
50 changes: 50 additions & 0 deletions packages/postgrest-react-query/src/query/fetch.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import {
PostgrestError,
PostgrestMaybeSingleResponse,
PostgrestResponse,
PostgrestSingleResponse,
} from '@supabase/postgrest-js';
import { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';
import { FetchQueryOptions, QueryClient } from '@tanstack/react-query';

import { buildQueryOpts } from './build-query-opts';

function fetchQuery<Result>(
queryClient: QueryClient,
query: PromiseLike<PostgrestSingleResponse<Result>>,
config?: Omit<
FetchQueryOptions<PostgrestSingleResponse<Result>, PostgrestError>,
'queryKey' | 'queryFn'
>,
): Promise<void>;
function fetchQuery<Result>(
queryClient: QueryClient,
query: PromiseLike<PostgrestMaybeSingleResponse<Result>>,
config?: Omit<
FetchQueryOptions<PostgrestMaybeSingleResponse<Result>, PostgrestError>,
'queryKey' | 'queryFn'
>,
): Promise<void>;
function fetchQuery<Result>(
queryClient: QueryClient,
query: PromiseLike<PostgrestResponse<Result>>,
config?: Omit<
FetchQueryOptions<PostgrestResponse<Result>, PostgrestError>,
'queryKey' | 'queryFn'
>,
): Promise<void>;

async function fetchQuery<Result>(
queryClient: QueryClient,
query: PromiseLike<AnyPostgrestResponse<Result>>,
config?: Omit<
FetchQueryOptions<AnyPostgrestResponse<Result>, PostgrestError>,
'queryKey' | 'queryFn'
>,
) {
await queryClient.fetchQuery<AnyPostgrestResponse<Result>, PostgrestError>(
buildQueryOpts(query, config),
);
}

export { fetchQuery };
2 changes: 2 additions & 0 deletions packages/postgrest-react-query/src/query/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export * from './build-query-opts';
export * from './fetch';
export * from './prefetch';
export * from './use-query';
13 changes: 2 additions & 11 deletions packages/postgrest-react-query/src/query/prefetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
} from '@supabase-cache-helpers/postgrest-core';
import { FetchQueryOptions, QueryClient } from '@tanstack/react-query';

import { buildQueryOpts } from './build-query-opts';
import { encode } from '../lib';

function prefetchQuery<Result>(
Expand Down Expand Up @@ -46,17 +47,7 @@ async function prefetchQuery<Result>(
>,
) {
await queryClient.prefetchQuery<AnyPostgrestResponse<Result>, PostgrestError>(
{
queryKey: encode<Result>(query, false),
queryFn: async () => {
if (!isPostgrestBuilder<Result>(query)) {
throw new Error('Query is not a PostgrestBuilder');
}

return await query.throwOnError();
},
...config,
},
buildQueryOpts(query, config),
);
}

Expand Down
19 changes: 4 additions & 15 deletions packages/postgrest-react-query/src/query/use-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,14 @@ import {
PostgrestSingleResponse,
PostgrestMaybeSingleResponse,
} from '@supabase/postgrest-js';
import {
AnyPostgrestResponse,
isPostgrestBuilder,
} from '@supabase-cache-helpers/postgrest-core';
import { AnyPostgrestResponse } from '@supabase-cache-helpers/postgrest-core';
import {
useQuery as useReactQuery,
UseQueryResult as UseReactQueryResult,
UseQueryOptions as UseReactQueryOptions,
} from '@tanstack/react-query';

import { encode } from '../lib/key';
import { buildQueryOpts } from './build-query-opts';

/**
* Represents the return value of the `useQuery` hook when `query` is expected to return
Expand Down Expand Up @@ -118,6 +115,7 @@ function useQuery<Result>(
'queryKey' | 'queryFn'
>,
): UseQueryReturn<Result>;

/**
* React hook to execute a PostgREST query.
*
Expand All @@ -136,16 +134,7 @@ function useQuery<Result>(
const { data, ...rest } = useReactQuery<
AnyPostgrestResponse<Result>,
PostgrestError
>({
queryKey: encode<Result>(query, false),
queryFn: async () => {
if (isPostgrestBuilder(query)) {
query = query.throwOnError();
}
return await query;
},
...config,
});
>(buildQueryOpts<Result>(query, config));

return { data: data?.data, count: data?.count ?? null, ...rest };
}
Expand Down

0 comments on commit d5f999f

Please sign in to comment.