mcpField
S
supabase-js

supabase-js

github.com/fcakyon開発1.2k49 回インストール今日更新
リポジトリ

supabase-js について

`@supabase/supabase-js`でアプリを開発するためのガイドです。認証、データベース、ストレージ、リアルタイム機能、Edge Functionsを扱い、型安全なクエリなどの例を示します。

主な機能

  1. 01認証とセッション管理
  2. 02PostgRESTのデータ検索と更新
  3. 03ファイルストレージ操作
  4. 04リアルタイムチャンネルとプレゼンス
  5. 05Edge Functionsの呼び出し

活用シーン

  1. 01アプリにユーザー登録とログインを追加
  2. 02Supabaseのデータを検索・更新
  3. 03ファイルをアップロードし変更を監視

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/fcakyon/claude-codex-settings --skill supabase-js

インストール後、Claude Code で/supabase-jsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
overview.md
references/auth-js/
README.md
references/functions-js/
README.md
references/postgrest-js/
README.md
references/realtime-js/
README.md
references/storage-js/
README.md
references/supabase-js/
README.md

詳細

Supabase JavaScript SDK スキル

@supabase/supabase-js SDK を使用してアプリケーションを構築するためのスキルです。Auth、Database(PostgREST)、Storage、Realtime、Edge Functions を扱います。

SDK のドキュメント(https://supabase.com/docs/reference/javascript)が信頼できる情報源です。このスキルに付属するリファレンスファイルには、すぐに参照できるよう、モノレポから抽出したソースコードと README が含まれています。

セットアップ

npm install @supabase/supabase-js
import { createClient } from '@supabase/supabase-js'

const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key')

型安全なクエリを使用するには、データベーススキーマから型を生成します。

supabase gen types typescript --project-id your-project-id > database.types.ts
import { createClient } from '@supabase/supabase-js'
import type { Database } from './database.types'

const supabase = createClient<Database>(SUPABASE_URL, SUPABASE_ANON_KEY)

すぐに使える判断ツリー

「データをクエリしたい」
Database query?
├─ Select rows → supabase.from('table').select('*')
├─ Filter rows → .select().eq('col', val) / .gt() / .lt() / .in() / .like()
├─ Join tables → .select('*, other_table(*)') or .select('*, other_table!fk(*)')
├─ Insert → supabase.from('table').insert({ col: val })
├─ Upsert → supabase.from('table').upsert({ id: 1, col: val })
├─ Update → supabase.from('table').update({ col: val }).eq('id', 1)
├─ Delete → supabase.from('table').delete().eq('id', 1)
├─ Call RPC function → supabase.rpc('function_name', { arg: val })
├─ Count rows → .select('*', { count: 'exact', head: true })
├─ Pagination → .range(0, 9) or .limit(10).offset(20)
└─ Order → .order('created_at', { ascending: false })
「認証が必要」
Auth?
├─ Email/password sign up → supabase.auth.signUp({ email, password })
├─ Email/password sign in → supabase.auth.signInWithPassword({ email, password })
├─ OAuth (Google, GitHub, etc.) → supabase.auth.signInWithOAuth({ provider: 'google' })
├─ Magic link → supabase.auth.signInWithOtp({ email })
├─ Phone OTP → supabase.auth.signInWithOtp({ phone })
├─ Sign out → supabase.auth.signOut()
├─ Get current user → supabase.auth.getUser()
├─ Get session → supabase.auth.getSession()
├─ Listen to auth changes → supabase.auth.onAuthStateChange((event, session) => {})
├─ Reset password → supabase.auth.resetPasswordForEmail(email)
├─ Update user → supabase.auth.updateUser({ data: { name: 'New' } })
└─ Admin operations → supabase.auth.admin.listUsers() / .deleteUser(id)
「ファイルストレージが必要」
Storage?
├─ Upload file → supabase.storage.from('bucket').upload('path/file.png', file)
├─ Download file → supabase.storage.from('bucket').download('path/file.png')
├─ Get public URL → supabase.storage.from('bucket').getPublicUrl('path/file.png')
├─ Create signed URL → supabase.storage.from('bucket').createSignedUrl('path', 3600)
├─ List files → supabase.storage.from('bucket').list('folder')
├─ Move file → supabase.storage.from('bucket').move('old/path', 'new/path')
├─ Remove file → supabase.storage.from('bucket').remove(['path/file.png'])
├─ Create bucket → supabase.storage.createBucket('name', { public: false })
└─ List buckets → supabase.storage.listBuckets()
「リアルタイム機能が必要」
Realtime?
├─ Listen to DB changes → supabase.channel('name')
│    .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, handler)
│    .subscribe()
├─ Broadcast messages → channel.send({ type: 'broadcast', event: 'cursor', payload: { x, y } })
├─ Listen to broadcasts → .on('broadcast', { event: 'cursor' }, handler)
├─ Presence (who's online) → channel.track({ user_id, online_at })
│    .on('presence', { event: 'sync' }, () => channel.presenceState())
├─ Unsubscribe → supabase.removeChannel(channel)
└─ Unsubscribe all → supabase.removeAllChannels()
「エッジ関数が必要」
Edge Functions?
├─ Invoke function → supabase.functions.invoke('function-name', { body: { key: 'val' } })
├─ With custom headers → .invoke('fn', { headers: { 'x-custom': 'val' }, body })
└─ Set region → .invoke('fn', { body, region: 'us-east-1' })

よく使われるパターン

サーバー側でのサービスロールキーの使用
// Server-side only - bypasses RLS
const supabase = createClient(SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY, {
  auth: { persistSession: false }
})
React/Next.js の認証
import { createClient } from '@supabase/supabase-js'
import { useEffect, useState } from 'react'

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY)

function useUser() {
  const [user, setUser] = useState(null)
  useEffect(() => {
    supabase.auth.getUser().then(({ data }) => setUser(data.user))
    const { data: { subscription } } = supabase.auth.onAuthStateChange(
      (_, session) => setUser(session?.user ?? null)
    )
    return () => subscription.unsubscribe()
  }, [])
  return user
}
型付きデータベースクエリ
// Generated types give autocomplete for table names, column names, and return types
const { data, error } = await supabase
  .from('profiles')        // autocompleted table name
  .select('id, username')  // autocompleted columns
  .eq('id', userId)        // type-safe filter
  .single()                // returns single row or error
// data is typed as { id: string; username: string } | null

パッケージ一覧

パッケージサブクライアントリファレンス
@supabase/supabase-jscreateClient()references/supabase-js/
@supabase/auth-js.authreferences/auth-js/
@supabase/postgrest-js.from(), .rpc()references/postgrest-js/
@supabase/realtime-js.channel(), .realtimereferences/realtime-js/
@supabase/storage-js.storagereferences/storage-js/
@supabase/functions-js.functionsreferences/functions-js/

コメント