supabase-jsにカウントメソッドを追加する

この記事を書くに至った経緯

3月上旬にPlanescaleの無料プランが廃止することが発表され、Planescaleで開発していたプロジェクトのDBをSupabaseに以降することにしました。 その際、ORM(Object Relational Mapping)にPrismaを採用していたおかげでDBの以降はスムーズに行えたのですが、せっかくならSupabase公式のsupabase-jsを使おうと思った時、supabase-jsにデータの数を取得するメソッドが無いことに気がついたので拡張メソッドとして実装することにしました。

実装

めちゃくちゃシンプルです。 今のところ、SupabaseClientの拡張メソッドとして実装しているため、select()などとメソッドチェーンで繋げられないです。 時間があれば加筆したい...

import { PostgrestResponse, SupabaseClient } from '@supabase/supabase-js';

async function count(this: SupabaseClient, tableName: string): Promise<number | null> {
    try {
        const { data, error, count }: PostgrestResponse<any> = await this.from(tableName)
            .select('*', { count: 'exact', head: true });

        if (error) {
            throw error;
        }

        return count;
    } catch (error) {
        console.error('Error occurred while counting rows:', error);
        throw error;
    }
}

declare module '@supabase/supabase-js' {
    interface SupabaseClient {
        count: (tableName: string) => Promise<number | null>;
    }
}

SupabaseClient.prototype.count = count;

短いですが以上です。 参考になれば!