From 72e53ed7d1926ca56e5cea3d8ccda7fe128e6624 Mon Sep 17 00:00:00 2001 From: Huelsenfrucht Date: Fri, 6 Mar 2026 13:41:51 +0500 Subject: [PATCH 1/4] allow custom schema for supabase --- src/plugins/replication-supabase/index.ts | 10 +++++----- src/plugins/replication-supabase/types.ts | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/plugins/replication-supabase/index.ts b/src/plugins/replication-supabase/index.ts index 95fed8d5513..0845d8187fd 100644 --- a/src/plugins/replication-supabase/index.ts +++ b/src/plugins/replication-supabase/index.ts @@ -86,7 +86,7 @@ export function replicateSupabase( return doc; } async function fetchById(id: string): Promise> { - const { data, error } = await options.client + const { data, error } = await options.client.schema(options.schemaName) .from(options.tableName) .select() .eq(primaryPath, id) @@ -103,7 +103,7 @@ export function replicateSupabase( lastPulledCheckpoint: SupabaseCheckpoint | undefined, batchSize: number ) { - let query = options.client + let query = options.client.schema(options.schemaName) .from(options.tableName) .select('*'); @@ -169,7 +169,7 @@ export function replicateSupabase( ) { async function insertOrReturnConflict(doc: WithDeleted): Promise | undefined> { const id = (doc as any)[primaryPath]; - const { error } = await options.client.from(options.tableName).insert(doc) + const { error } = await options.client.schema(options.schemaName).from(options.tableName).insert(doc) if (!error) { return; } else if (error.code == POSTGRES_INSERT_CONFLICT_CODE) { @@ -197,7 +197,7 @@ export function replicateSupabase( // modified field will be set server-side delete toRow[modifiedField]; - let query = options.client + let query = options.client.schema(options.schemaName) .from(options.tableName) .update(toRow); @@ -262,7 +262,7 @@ export function replicateSupabase( .channel('realtime:' + options.tableName) .on( 'postgres_changes', - { event: '*', schema: 'public', table: options.tableName }, + { event: '*', schema: options.schemaName, table: options.tableName }, (payload) => { /** * We assume soft-deletes in supabase diff --git a/src/plugins/replication-supabase/types.ts b/src/plugins/replication-supabase/types.ts index c1c9a5c859f..9c056a06673 100644 --- a/src/plugins/replication-supabase/types.ts +++ b/src/plugins/replication-supabase/types.ts @@ -25,6 +25,7 @@ export type SyncOptionsSupabase = Omit< > & { client: SupabaseClient; tableName: string; + schemaName: string; /** * Modified field, default "_modified" From eaa5050182567488192d0da2a4c883ca364acd00 Mon Sep 17 00:00:00 2001 From: Huelsenfrucht Date: Fri, 6 Mar 2026 13:45:32 +0500 Subject: [PATCH 2/4] make schema name optional --- src/plugins/replication-supabase/index.ts | 1 + src/plugins/replication-supabase/types.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/replication-supabase/index.ts b/src/plugins/replication-supabase/index.ts index 0845d8187fd..c36c936be23 100644 --- a/src/plugins/replication-supabase/index.ts +++ b/src/plugins/replication-supabase/index.ts @@ -58,6 +58,7 @@ export function replicateSupabase( // set defaults options.waitForLeadership = typeof options.waitForLeadership === 'undefined' ? true : options.waitForLeadership; options.live = typeof options.live === 'undefined' ? true : options.live; + options.schemaName = options.schemaName ? options.schemaName : 'public'; const modifiedField = options.modifiedField ? options.modifiedField : DEFAULT_MODIFIED_FIELD; const deletedField = options.deletedField ? options.deletedField : DEFAULT_DELETED_FIELD; diff --git a/src/plugins/replication-supabase/types.ts b/src/plugins/replication-supabase/types.ts index 9c056a06673..c36c93ebb0b 100644 --- a/src/plugins/replication-supabase/types.ts +++ b/src/plugins/replication-supabase/types.ts @@ -25,7 +25,7 @@ export type SyncOptionsSupabase = Omit< > & { client: SupabaseClient; tableName: string; - schemaName: string; + schemaName?: string; /** * Modified field, default "_modified" From 4395605bebc184108958e34e536d97f7c92c5b7d Mon Sep 17 00:00:00 2001 From: Huelsenfrucht Date: Fri, 6 Mar 2026 14:11:17 +0500 Subject: [PATCH 3/4] fix omitted parameter handling --- src/plugins/replication-supabase/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/replication-supabase/index.ts b/src/plugins/replication-supabase/index.ts index c36c936be23..290a2eabe98 100644 --- a/src/plugins/replication-supabase/index.ts +++ b/src/plugins/replication-supabase/index.ts @@ -58,7 +58,7 @@ export function replicateSupabase( // set defaults options.waitForLeadership = typeof options.waitForLeadership === 'undefined' ? true : options.waitForLeadership; options.live = typeof options.live === 'undefined' ? true : options.live; - options.schemaName = options.schemaName ? options.schemaName : 'public'; + options.schemaName = typeof options.schemaName === 'undefined' ? 'public' : options.schemaName; const modifiedField = options.modifiedField ? options.modifiedField : DEFAULT_MODIFIED_FIELD; const deletedField = options.deletedField ? options.deletedField : DEFAULT_DELETED_FIELD; From 2b6b7fa77417bea452f23dab0ef5ea74ad2be84c Mon Sep 17 00:00:00 2001 From: Huelsenfrucht Date: Fri, 6 Mar 2026 14:23:16 +0500 Subject: [PATCH 4/4] local const for typescript --- src/plugins/replication-supabase/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/replication-supabase/index.ts b/src/plugins/replication-supabase/index.ts index 290a2eabe98..9784a049ac7 100644 --- a/src/plugins/replication-supabase/index.ts +++ b/src/plugins/replication-supabase/index.ts @@ -58,7 +58,7 @@ export function replicateSupabase( // set defaults options.waitForLeadership = typeof options.waitForLeadership === 'undefined' ? true : options.waitForLeadership; options.live = typeof options.live === 'undefined' ? true : options.live; - options.schemaName = typeof options.schemaName === 'undefined' ? 'public' : options.schemaName; + const schemaName = typeof options.schemaName === 'undefined' ? 'public' : options.schemaName; const modifiedField = options.modifiedField ? options.modifiedField : DEFAULT_MODIFIED_FIELD; const deletedField = options.deletedField ? options.deletedField : DEFAULT_DELETED_FIELD; @@ -87,7 +87,7 @@ export function replicateSupabase( return doc; } async function fetchById(id: string): Promise> { - const { data, error } = await options.client.schema(options.schemaName) + const { data, error } = await options.client.schema(schemaName) .from(options.tableName) .select() .eq(primaryPath, id) @@ -104,7 +104,7 @@ export function replicateSupabase( lastPulledCheckpoint: SupabaseCheckpoint | undefined, batchSize: number ) { - let query = options.client.schema(options.schemaName) + let query = options.client.schema(schemaName) .from(options.tableName) .select('*'); @@ -170,7 +170,7 @@ export function replicateSupabase( ) { async function insertOrReturnConflict(doc: WithDeleted): Promise | undefined> { const id = (doc as any)[primaryPath]; - const { error } = await options.client.schema(options.schemaName).from(options.tableName).insert(doc) + const { error } = await options.client.schema(schemaName).from(options.tableName).insert(doc) if (!error) { return; } else if (error.code == POSTGRES_INSERT_CONFLICT_CODE) { @@ -198,7 +198,7 @@ export function replicateSupabase( // modified field will be set server-side delete toRow[modifiedField]; - let query = options.client.schema(options.schemaName) + let query = options.client.schema(schemaName) .from(options.tableName) .update(toRow); @@ -263,7 +263,7 @@ export function replicateSupabase( .channel('realtime:' + options.tableName) .on( 'postgres_changes', - { event: '*', schema: options.schemaName, table: options.tableName }, + { event: '*', schema: schemaName, table: options.tableName }, (payload) => { /** * We assume soft-deletes in supabase