From 298adf16ecd409f0a7373b870fa76c68a5ced42f Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Tue, 30 Sep 2025 10:29:48 +0200 Subject: [PATCH 1/6] Update SupabaseClient#from function signatures to match PostgrestClient#from --- .../core/supabase-js/src/SupabaseClient.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/core/supabase-js/src/SupabaseClient.ts b/packages/core/supabase-js/src/SupabaseClient.ts index 511d999c..e1ec4355 100644 --- a/packages/core/supabase-js/src/SupabaseClient.ts +++ b/packages/core/supabase-js/src/SupabaseClient.ts @@ -4,6 +4,7 @@ import { PostgrestClient, type PostgrestFilterBuilder, type PostgrestQueryBuilder, + type PostgrestQueryBuilderOptions, } from '@supabase/postgrest-js' import { type RealtimeChannel, @@ -187,18 +188,25 @@ export default class SupabaseClient< // NOTE: signatures must be kept in sync with PostgrestClient.from from< TableName extends string & keyof Schema['Tables'], - Table extends Schema['Tables'][TableName], - >(relation: TableName): PostgrestQueryBuilder + Table extends Schema['Tables'][TableName] + >( + relation: TableName, + options?: PostgrestQueryBuilderOptions + ): PostgrestQueryBuilder from( - relation: ViewName + relation: ViewName, + options?: PostgrestQueryBuilderOptions ): PostgrestQueryBuilder /** * Perform a query on a table or a view. * * @param relation - The table or view name to query */ - from(relation: string): PostgrestQueryBuilder { - return this.rest.from(relation) + from( + relation: string, + options?: PostgrestQueryBuilderOptions + ): PostgrestQueryBuilder { + return this.rest.from(relation, options) } // NOTE: signatures must be kept in sync with PostgrestClient.schema From b288b6c9db261ec77ea19747a9c04f691744774a Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Tue, 30 Sep 2025 10:41:25 +0200 Subject: [PATCH 2/6] Fix types --- packages/core/supabase-js/src/SupabaseClient.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/supabase-js/src/SupabaseClient.ts b/packages/core/supabase-js/src/SupabaseClient.ts index e1ec4355..73d903bd 100644 --- a/packages/core/supabase-js/src/SupabaseClient.ts +++ b/packages/core/supabase-js/src/SupabaseClient.ts @@ -2,9 +2,9 @@ import type { AuthChangeEvent } from '@supabase/auth-js' import { FunctionsClient } from '@supabase/functions-js' import { PostgrestClient, - type PostgrestFilterBuilder, - type PostgrestQueryBuilder, - type PostgrestQueryBuilderOptions, + PostgrestFilterBuilder, + PostgrestQueryBuilder, + PostgrestQueryBuilderOptions, } from '@supabase/postgrest-js' import { type RealtimeChannel, From 24865c5dd185117ec683309a4b01aa9d8357eb6d Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Tue, 30 Sep 2025 12:09:46 +0200 Subject: [PATCH 3/6] Add credentials to custom fetch implementation --- packages/core/supabase-js/src/SupabaseClient.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/core/supabase-js/src/SupabaseClient.ts b/packages/core/supabase-js/src/SupabaseClient.ts index 73d903bd..7a7fe7bd 100644 --- a/packages/core/supabase-js/src/SupabaseClient.ts +++ b/packages/core/supabase-js/src/SupabaseClient.ts @@ -151,7 +151,7 @@ export default class SupabaseClient< }) } - this.fetch = fetchWithAuth(supabaseKey, this._getAccessToken.bind(this), settings.global.fetch) + this.fetch = this._createFetchWithAuth(settings.global.fetch) this.realtime = this._initRealtimeClient({ headers: this.headers, accessToken: this._getAccessToken.bind(this), @@ -206,6 +206,10 @@ export default class SupabaseClient< relation: string, options?: PostgrestQueryBuilderOptions ): PostgrestQueryBuilder { + if (options?.fetch) { + options.fetch = this._createFetchWithAuth(options.fetch) + } + return this.rest.from(relation, options) } @@ -408,4 +412,8 @@ export default class SupabaseClient< this.changedAccessToken = undefined } } + + private _createFetchWithAuth(_fetch?: typeof global.fetch) { + return fetchWithAuth(this.supabaseKey, this._getAccessToken.bind(this), _fetch) + } } From 59a58998be530fefdf097954379c45aafb4a6175 Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Mon, 13 Oct 2025 12:51:47 +0200 Subject: [PATCH 4/6] refactor(postgrest): integrate postgrest-js changes into new monorepo --- .../core/postgrest-js/src/PostgrestClient.ts | 41 +++++++++++-------- .../postgrest-js/src/PostgrestQueryBuilder.ts | 7 +--- packages/core/postgrest-js/src/index.ts | 2 + packages/core/postgrest-js/src/types/types.ts | 11 ++++- packages/core/postgrest-js/src/utils.ts | 23 +++++++++++ 5 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 packages/core/postgrest-js/src/utils.ts diff --git a/packages/core/postgrest-js/src/PostgrestClient.ts b/packages/core/postgrest-js/src/PostgrestClient.ts index a743c65e..9a8e05c9 100644 --- a/packages/core/postgrest-js/src/PostgrestClient.ts +++ b/packages/core/postgrest-js/src/PostgrestClient.ts @@ -2,6 +2,8 @@ import PostgrestQueryBuilder from './PostgrestQueryBuilder' import PostgrestFilterBuilder from './PostgrestFilterBuilder' import { Fetch, GenericSchema, ClientServerOptions } from './types/common/common' import { GetRpcFunctionFilterBuilderByArgs } from './types/common/rpc' +import { PostgrestQueryBuilderOptions, PostgrestQueryBuilderOptionsWithSchema } from './types/types' +import { mergeHeaders } from './utils' /** * PostgREST client. @@ -18,21 +20,21 @@ export default class PostgrestClient< ClientOptions extends ClientServerOptions = Database extends { __InternalSupabase: infer I extends ClientServerOptions } - ? I - : {}, + ? I + : {}, SchemaName extends string & - keyof Omit = 'public' extends keyof Omit< + keyof Omit = 'public' extends keyof Omit< Database, '__InternalSupabase' > - ? 'public' - : string & keyof Omit, + ? 'public' + : string & keyof Omit, Schema extends GenericSchema = Omit< Database, '__InternalSupabase' >[SchemaName] extends GenericSchema - ? Omit[SchemaName] - : any, + ? Omit[SchemaName] + : any, > { url: string headers: Headers @@ -55,11 +57,7 @@ export default class PostgrestClient< headers = {}, schema, fetch, - }: { - headers?: HeadersInit - schema?: SchemaName - fetch?: Fetch - } = {} + }: PostgrestQueryBuilderOptionsWithSchema = {} ) { this.url = url this.headers = new Headers(headers) @@ -69,21 +67,28 @@ export default class PostgrestClient< from< TableName extends string & keyof Schema['Tables'], Table extends Schema['Tables'][TableName], - >(relation: TableName): PostgrestQueryBuilder + >( + relation: TableName, + options?: PostgrestQueryBuilderOptions + ): PostgrestQueryBuilder; from( - relation: ViewName - ): PostgrestQueryBuilder + relation: ViewName, + options?: PostgrestQueryBuilderOptions + ): PostgrestQueryBuilder; /** * Perform a query on a table or a view. * * @param relation - The table or view name to query */ - from(relation: string): PostgrestQueryBuilder { + from( + relation: string, + options?: PostgrestQueryBuilderOptions + ): PostgrestQueryBuilder { 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, }) } diff --git a/packages/core/postgrest-js/src/PostgrestQueryBuilder.ts b/packages/core/postgrest-js/src/PostgrestQueryBuilder.ts index a8231007..604c280b 100644 --- a/packages/core/postgrest-js/src/PostgrestQueryBuilder.ts +++ b/packages/core/postgrest-js/src/PostgrestQueryBuilder.ts @@ -7,6 +7,7 @@ import { GenericTable, GenericView, } from './types/common/common' +import { PostgrestQueryBuilderOptionsWithSchema } from './types/types' export default class PostgrestQueryBuilder< ClientOptions extends ClientServerOptions, @@ -27,11 +28,7 @@ export default class PostgrestQueryBuilder< headers = {}, schema, fetch, - }: { - headers?: HeadersInit - schema?: string - fetch?: Fetch - } + }: PostgrestQueryBuilderOptionsWithSchema ) { this.url = url this.headers = new Headers(headers) diff --git a/packages/core/postgrest-js/src/index.ts b/packages/core/postgrest-js/src/index.ts index 83772cd5..9f962c23 100644 --- a/packages/core/postgrest-js/src/index.ts +++ b/packages/core/postgrest-js/src/index.ts @@ -28,6 +28,8 @@ export type { PostgrestResponseSuccess, PostgrestSingleResponse, PostgrestMaybeSingleResponse, + PostgrestQueryBuilderOptions, + PostgrestQueryBuilderOptionsWithSchema } from './types/types' export type { ClientServerOptions as PostgrestClientOptions } from './types/common/common' // https://github.com/supabase/postgrest-js/issues/551 diff --git a/packages/core/postgrest-js/src/types/types.ts b/packages/core/postgrest-js/src/types/types.ts index 842810ec..e84c58ba 100644 --- a/packages/core/postgrest-js/src/types/types.ts +++ b/packages/core/postgrest-js/src/types/types.ts @@ -1,7 +1,7 @@ import PostgrestError from '../PostgrestError' import { ContainsNull } from '../select-query-parser/types' import { SelectQueryError } from '../select-query-parser/utils' -import { ClientServerOptions } from './common/common' +import { ClientServerOptions, Fetch } from './common/common' /** * Response format @@ -30,6 +30,15 @@ export type PostgrestSingleResponse = PostgrestResponseSuccess | Postgrest export type PostgrestMaybeSingleResponse = PostgrestSingleResponse export type PostgrestResponse = PostgrestSingleResponse +export type PostgrestQueryBuilderOptions = { + headers?: HeadersInit + fetch?: Fetch +} + +export type PostgrestQueryBuilderOptionsWithSchema = PostgrestQueryBuilderOptions & { + schema?: TSchema +} + export type DatabaseWithOptions = { db: Database options: Options diff --git a/packages/core/postgrest-js/src/utils.ts b/packages/core/postgrest-js/src/utils.ts new file mode 100644 index 00000000..be652238 --- /dev/null +++ b/packages/core/postgrest-js/src/utils.ts @@ -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 new Headers(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 +} \ No newline at end of file From f2a5cc669e87d0779af5820298834c1e9e971b92 Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Mon, 13 Oct 2025 13:00:13 +0200 Subject: [PATCH 5/6] Build --- package-lock.json | 4 ++-- packages/core/supabase-js/package.json | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 003a0bc8..b48b4a1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36412,9 +36412,9 @@ "@supabase/auth-js": "*", "@supabase/functions-js": "*", "@supabase/node-fetch": "2.6.15", - "@supabase/postgrest-js": "*", + "@supabase/postgrest-js": "file:../postgrest-js", "@supabase/realtime-js": "*", - "@supabase/storage-js": "*" + "@supabase/storage-js": "^0.0.0" }, "devDependencies": { "@sebbo2002/semantic-release-jsr": "^1.0.0", diff --git a/packages/core/supabase-js/package.json b/packages/core/supabase-js/package.json index 1727c69f..d4cba7d8 100644 --- a/packages/core/supabase-js/package.json +++ b/packages/core/supabase-js/package.json @@ -54,13 +54,14 @@ "dependencies": { "@supabase/auth-js": "*", "@supabase/functions-js": "*", - "@supabase/postgrest-js": "*", + "@supabase/node-fetch": "2.6.15", + "@supabase/postgrest-js": "file:../postgrest-js", "@supabase/realtime-js": "*", - "@supabase/storage-js": "*", - "@supabase/node-fetch": "2.6.15" + "@supabase/storage-js": "*" }, "devDependencies": { "@sebbo2002/semantic-release-jsr": "^1.0.0", + "eslint-formatter-pretty": "^4.1.0", "jsr": "^0.13.5", "pretty-quick": "^3.1.3", "puppeteer": "^24.9.0", @@ -68,7 +69,6 @@ "ts-jest": "^29.0.5", "ts-loader": "^9.5.4", "tsd": "^0.30.4", - "eslint-formatter-pretty": "^4.1.0", "webpack": "^5.69.1", "webpack-cli": "^4.9.2" }, From 935aace752126edd394e58c2e9d033968b94df2f Mon Sep 17 00:00:00 2001 From: ph0t0shop Date: Mon, 13 Oct 2025 13:02:25 +0200 Subject: [PATCH 6/6] Change package.json back to non-local version --- package-lock.json | 2 +- packages/core/supabase-js/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b48b4a1c..ea9dcaff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36414,7 +36414,7 @@ "@supabase/node-fetch": "2.6.15", "@supabase/postgrest-js": "file:../postgrest-js", "@supabase/realtime-js": "*", - "@supabase/storage-js": "^0.0.0" + "@supabase/storage-js": "*" }, "devDependencies": { "@sebbo2002/semantic-release-jsr": "^1.0.0", diff --git a/packages/core/supabase-js/package.json b/packages/core/supabase-js/package.json index d4cba7d8..81210744 100644 --- a/packages/core/supabase-js/package.json +++ b/packages/core/supabase-js/package.json @@ -55,7 +55,7 @@ "@supabase/auth-js": "*", "@supabase/functions-js": "*", "@supabase/node-fetch": "2.6.15", - "@supabase/postgrest-js": "file:../postgrest-js", + "@supabase/postgrest-js": "*", "@supabase/realtime-js": "*", "@supabase/storage-js": "*" },