Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 22 additions & 15 deletions src/PostgrestClient.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import PostgrestQueryBuilder from './PostgrestQueryBuilder'
import PostgrestFilterBuilder from './PostgrestFilterBuilder'
import { Fetch, GenericSchema, ClientServerOptions } from './types'
import {
Fetch,
GenericSchema,
ClientServerOptions,
PostgrestQueryBuilderOptions,
PostgrestQueryBuilderOptionsWithSchema,
} from './types'
import { mergeHeaders } from './utils'

/**
* PostgREST client.
Expand Down Expand Up @@ -50,15 +57,7 @@ export default class PostgrestClient<
*/
constructor(
url: string,
{
headers = {},
schema,
fetch,
}: {
headers?: HeadersInit
schema?: SchemaName
fetch?: Fetch
} = {}
{ headers = {}, schema, fetch }: PostgrestQueryBuilderOptionsWithSchema<SchemaName> = {}
) {
this.url = url
this.headers = new Headers(headers)
Expand All @@ -68,21 +67,29 @@ export default class PostgrestClient<
from<
TableName extends string & keyof Schema['Tables'],
Table extends Schema['Tables'][TableName]
>(relation: TableName): PostgrestQueryBuilder<ClientOptions, Schema, Table, TableName>
>(
relation: TableName,
options?: PostgrestQueryBuilderOptions
): PostgrestQueryBuilder<ClientOptions, Schema, Table, TableName>
from<ViewName extends string & keyof Schema['Views'], View extends Schema['Views'][ViewName]>(
relation: ViewName
relation: ViewName,
options?: PostgrestQueryBuilderOptions
): PostgrestQueryBuilder<ClientOptions, Schema, View, ViewName>
/**
* Perform a query on a table or a view.
*
* @param relation - The table or view name to query
*/
from(relation: string): PostgrestQueryBuilder<ClientOptions, Schema, any, any> {
from(
relation: string,
options?: PostgrestQueryBuilderOptions
): PostgrestQueryBuilder<ClientOptions, Schema, any, any> {
const url = new URL(`${this.url}/${relation}`)

return new PostgrestQueryBuilder(url, {
headers: new Headers(this.headers),
headers: mergeHeaders(this.headers, options?.headers),
schema: this.schemaName,
fetch: this.fetch,
fetch: options?.fetch ?? this.fetch,
})
}

Expand Down
19 changes: 9 additions & 10 deletions src/PostgrestQueryBuilder.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import PostgrestFilterBuilder from './PostgrestFilterBuilder'
import { GetResult } from './select-query-parser/result'
import { ClientServerOptions, Fetch, GenericSchema, GenericTable, GenericView } from './types'
import {
ClientServerOptions,
Fetch,
GenericSchema,
GenericTable,
GenericView,
PostgrestQueryBuilderOptionsWithSchema,
} from './types'

export default class PostgrestQueryBuilder<
ClientOptions extends ClientServerOptions,
Expand All @@ -17,15 +24,7 @@ export default class PostgrestQueryBuilder<

constructor(
url: URL,
{
headers = {},
schema,
fetch,
}: {
headers?: HeadersInit
schema?: string
fetch?: Fetch
}
{ headers = {}, schema, fetch }: PostgrestQueryBuilderOptionsWithSchema<string>
) {
this.url = url
this.headers = new Headers(headers)
Expand Down
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ export type {
PostgrestSingleResponse,
PostgrestMaybeSingleResponse,
ClientServerOptions as PostgrestClientOptions,
PostgrestQueryBuilderOptions,
PostgrestQueryBuilderOptionsWithSchema,
} from './types'
// https://github.com/supabase/postgrest-js/issues/551
// To be replaced with a helper type that only uses public types
Expand Down
10 changes: 10 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ export type PostgrestSingleResponse<T> = PostgrestResponseSuccess<T> | Postgrest
export type PostgrestMaybeSingleResponse<T> = PostgrestSingleResponse<T | null>
export type PostgrestResponse<T> = PostgrestSingleResponse<T[]>

export type PostgrestQueryBuilderOptions = {
headers?: HeadersInit
fetch?: Fetch
}

export type PostgrestQueryBuilderOptionsWithSchema<TSchema extends string> =
PostgrestQueryBuilderOptions & {
schema?: TSchema
}

export type GenericRelationship = {
foreignKeyName: string
columns: string[]
Expand Down
23 changes: 23 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* Non-destructively merges an optional {@link HeadersInit} into a {@link Headers} object, where {@link right} takes precedence over {@link left} if it exists.
* @param {Headers} left Base {@link Headers} object
* @param {HeadersInit?} right Optional {@link HeadersInit} to merge into {@link left}
* @returns The resulting merged {@link HeadersInit} object.
*/

export function mergeHeaders(left: Headers, right?: HeadersInit): HeadersInit {
if (!right) return left

const merged = new Headers(left)
const rightEntries =
right instanceof Headers
? right.entries()
: Array.isArray(right)
? right
: Object.entries(right)
for (const [key, value] of rightEntries) {
merged.set(key, value)
}

return merged
}