Pular para o conteúdo
📦 SDK JS

@superdb/client e @superdb/auth-js

Dois SDKs: o drop-in compatível com Supabase e o cliente nativo com mais recursos brasileiros.

Instalação

terminal
# Drop-in do Supabase (recomendado pra migrar)
npm install @superdb/client

# Cliente nativo (mais recursos BR)
npm install @superdb/auth-js

@superdb/client

Drop-in do @supabase/supabase-js. Os módulos .auth, .from() e .storage funcionam — o Accept-Profile do projeto é setado automaticamente. Apenas .channel() (Realtime) ainda é stub; veja a seção Realtime abaixo.

💡

.from() funciona. Com o SDK, o Accept-Profile do projeto vai sozinho — não precisa mandar header manual. Se quiser bater no REST cru (sem SDK), o host é https://api.superdb.com.br/<tabela> (sem /rest/v1/), com Accept-Profile: proj_<slug>.

createClient

lib/db.ts
import { createClient } from '@superdb/client'

const db = createClient(
  process.env.NEXT_PUBLIC_SUPERDB_URL!,   // https://auth.superdb.com.br
  process.env.NEXT_PUBLIC_SUPERDB_ANON_KEY!,
  { project: 'meu-projeto' }              // obrigatório — vira o Accept-Profile
)

Auth (funciona)

auth.ts
// Signup
await db.auth.signUp({ email, password })

// Login email/senha
await db.auth.signInWithPassword({ email, password })

// OAuth
await db.auth.signInWithOAuth({ provider: 'google' })

// Logout
await db.auth.signOut()

// Usuário atual
const { data: { user } } = await db.auth.getUser()

// Escutar mudanças de auth
db.auth.onAuthStateChange((event, session) => {
  console.log(event, session)
})

Database (PostgREST)

Com o SDK, use db.from() exatamente como no supabase-js — o Accept-Profile do projeto vai sozinho:

tasks.ts — com o SDK (recomendado)
const { data } = await db.from('tasks').select('*').eq('done', false)
await db.from('tasks').insert({ title: 'Comprar pão' })
await db.from('tasks').update({ done: true }).eq('id', taskId)
await db.from('tasks').delete().eq('id', taskId)

Sem o SDK, bata no REST cru. O host é https://api.superdb.com.br/<tabela> (path raiz, sem /rest/v1/); o tenant vai por header — Accept-Profile na leitura, Content-Profile na escrita:

tasks.ts — fetch cru (sem SDK)
const ANON_KEY = process.env.NEXT_PUBLIC_SUPERDB_ANON_KEY!
const DATA_URL = 'https://api.superdb.com.br'

// Select (leitura → Accept-Profile)
const res = await fetch(`${DATA_URL}/tasks?done=eq.false`, {
  headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY,
             'Accept-Profile': 'proj_meuapp' }
})
const data = await res.json()

// Insert (escrita → Content-Profile)
await fetch(`${DATA_URL}/tasks`, {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY,
             'Content-Type': 'application/json', 'Content-Profile': 'proj_meuapp',
             'Prefer': 'return=minimal' },
  body: JSON.stringify({ title: 'Comprar pão' })
})

Storage

Com o SDK, use db.storage.from('bucket') — o token de storage é mintado automaticamente:

upload.ts — com o SDK
// Upload
await db.storage.from('avatares').upload('user1.png', file)

// Download
const { data } = await db.storage.from('avatares').download('user1.png')

// URL assinada (bucket privado)
const { data: signed } = await db.storage
  .from('avatares').createSignedUrl('user1.png', 3600)
⚠️

Não aponte @supabase/storage-js com a anon key direto no storage.superdb.com.br — o storage-api valida HS256 e a anon key é ES256 (retorna 401). Fluxo cru: POST https://auth.superdb.com.br/st/v1/token (Bearer anon) devolve { token, url }; use esse token no storage-api.

Realtime

db.channel() ainda é stub. Para Realtime, minte um token em POST https://auth.superdb.com.br/rt/v1/token (Bearer anon) e conecte o @supabase/realtime-js com ele:

realtime.ts
import { RealtimeClient } from '@supabase/realtime-js'

// 1) Minta o token de realtime
const res = await fetch('https://auth.superdb.com.br/rt/v1/token', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${ANON_KEY}`, 'apikey': ANON_KEY }
})
const { token, url } = await res.json()   // url = wss://realtime.superdb.com.br/socket

// 2) Conecta com o token mintado
const rt = new RealtimeClient(url, { params: { apikey: token } })
const channel = rt.channel('tasks-changes')
  .on('postgres_changes',
    { event: 'INSERT', schema: 'proj_meuapp', table: 'tasks' },
    (payload) => console.log(payload.new)
  )
  .subscribe()

@superdb/auth-js

Cliente Auth nativo com features brasileiras: CPF, WhatsApp OTP, MFA TOTP, audit hash chain.

auth-br.ts
import { SuperDBAuth } from '@superdb/auth-js'

const auth = new SuperDBAuth({
  url: process.env.SUPERDB_AUTH_URL!,
  anonKey: process.env.SUPERDB_ANON_KEY!,
  project: 'meu-projeto'
})

// Signup com CPF
await auth.signUp({
  email: 'user@exemplo.com.br',
  password: 'senha-segura',
  data: { cpf: '123.456.789-09' }
})

// WhatsApp OTP
await auth.sendOTP({ phone: '+5511999998888', channel: 'whatsapp' })

// Verificar OTP
await auth.verifyOTP({ phone: '+5511999998888', token: '123456' })

// Enroll MFA TOTP
const { qrCode, secret } = await auth.mfa.enroll({ type: 'totp' })

Preview no Studio

Tudo que você faz pelo SDK aparece em tempo real no Studio. Veja seus dados, queries e logs em superdb.com.br/dash/<projeto>:

superdb.com.br/dash/meu-app/editor
v0.4.2
tasks.sql ×
1-- query gerada pelo SDK
2select * from proj_meuapp.tasks
3 where done = false;

TypeScript

Ambos os SDKs são totalmente tipados:

types.ts
import type { User, Session } from '@superdb/client'
import type { SuperDBUser, MFAFactor } from '@superdb/auth-js'
💡

Dica: Use @superdb/client se você já tem código Supabase. Use @superdb/auth-js se quer aproveitar features 100% BR (CPF, WhatsApp, audit).

Essa página ajudou?