@ biltme/ 后端
微细地闪过 @supabase/supabase-js
比尔特项目。 公用表面 = supabase-js 的表面; 此包添加
存储适配器帮助器,用于代理即时模板的稳定导入,以及
再导出清除的函数错误类别 catch 块.
安装
bun add @biltme/backend
# Expo only — also install AsyncStorage as the session store
bun add @react-native-async-storage/async-storage
快速启动( Expo)
import { createClient, asyncStorage } from '@biltme/backend'
import AsyncStorage from '@react-native-async-storage/async-storage'
const url = process.env.EXPO_PUBLIC_BILT_URL! // https://<pid>.cloud.bilt.me
const key = process.env.EXPO_PUBLIC_BILT_ANON_KEY!
export const bilt = createClient(url, key, {
auth: {
storage: asyncStorage(AsyncStorage),
persistSession: true,
autoRefreshToken: true,
detectSessionInUrl: false,
},
})
每个supabase-js方法都有效:
const { data, error } = await bilt.auth.signInWithPassword({ email, password })
const { data: rows } = await bilt.from('notes').select('*')
输入的查询
createClient 读取一个空的图案 Database 接口此软件包
出口。 增强它,并输入文件中每个表格的列 :
declare module '@biltme/backend' {
interface Database {
public: {
Tables: {
notes: {
Row: { id: string; title: string; tags: string[] | null }
Insert: { id?: string; title: string; tags?: string[] | null }
Update: { id?: string; title?: string; tags?: string[] | null }
Relationships: []
}
}
Views: Record<never, never>
Functions: Record<never, never>
Enums: Record<never, never>
CompositeTypes: Record<never, never>
}
}
}
你不能用手写 Bilt-cloud从现场计划再生出来
每个 bilt_apply_sql,而代理将其丢入项目。 因为它是一个
模块增强而不是 createClient<Database>,没有通用
线程通过,在呼叫站点没有保持同步.
每把密钥都关了 不在的表格、视图或列
文件无法编译,所以 rpc() 调用函数文件
没有列出,也没有提出它没有的论点。 因此,一个陈旧的文件
屏蔽一个构件,直到下一个方案改变它.
离开 Database 毫无戒备,排队回来 any这是0.5.x所做的.
正在命名一行
四个帮手决定了同样的增加 Database,这样一行可以交叉
不重报组件边界:
import type { Tables, TablesInsert, TablesUpdate, Enums } from '@biltme/backend'
function MessageCard({ message }: { message: Tables<'messages'> }) { … }
function draft(): TablesInsert<'messages'> { … }
function patch(): TablesUpdate<'messages'> { … }
function badge(status: Enums<'order_status'>) { … }
Tables 横跨表格和视图,并给出相同类型 select() 返回数
键. TablesInsert 财务报告和审定财务报表 TablesUpdate 仅取餐桌,如在苏帕巴克js,
因此一个可写视图有一个行名,但没有有效载荷名. Enums 决定:
联合bilt-cloud makes under Database['public']['Enums'],所以一个 switch 结束
检查是否详尽无遗.
在第一次更改计划之前,没有名字,通过一个是编译
错误而不是 any。 。 。 .
调用函数
const { data, error } = await bilt.functions.invoke('send-email', {
body: { to: '[email protected]', subject: 'Welcome' },
})
Auth 头自动设定: 如果签名, 活动会话的访问符
里面,否则就是肛门 职能 verify_jwt: true 需求
签名会话或肛门密钥; verify_jwt: false 接受未签名
请求.
抓取已键入错误类 :
import { FunctionsHttpError, FunctionsRelayError, FunctionsFetchError } from '@biltme/backend'
const { data, error } = await bilt.functions.invoke('send-email', { body: {...} })
if (error instanceof FunctionsHttpError) {
// user function returned 4xx/5xx — inspect error.context (Response)
} else if (error instanceof FunctionsRelayError) {
// bilt-cloud / pool relay failed (function not found, cold start error)
} else if (error instanceof FunctionsFetchError) {
// transport-level (DNS, TCP, TLS)
}
region 选项 invoke() 被接受,但被默默地忽略——bit-cloud is
单区域.
存储
// Admin (server-side, service key) — bucket lifecycle
await bilt.storage.createBucket('avatars', { public: false, fileSizeLimit: 5 * 1024 * 1024 })
await bilt.storage.createBucket('public-assets', { public: true })
// Upload (RLS-gated for anon-key / user-token; bypassed for service key)
const { data, error } = await bilt.storage
.from('avatars')
.upload(`${user.id}/photo.jpg`, file, { contentType: 'image/jpeg', upsert: true })
// Public bucket → URL is unauthenticated
const { data: { publicUrl } } = bilt.storage
.from('public-assets')
.getPublicUrl('logo.png')
// Private bucket → time-limited signed URL (up to 7 days)
const { data, error } = await bilt.storage
.from('avatars')
.createSignedUrl(`${user.id}/photo.jpg`, 3600)
// Catch storage errors:
import { StorageApiError } from '@biltme/backend'
if (error instanceof StorageApiError) { /* … */ }
Bucket 管理员 (createBucket, (中文(简体) ), updateBucket, (中文(简体) ), deleteBucket, (中文(简体) ), emptyBucket, (中文(简体) ),
listBuckets)是只服务Key. 对象操作由 Postgres RLS 打开
投资政策 storage.objects - 写他们与 bilt_storage_apply
代理工具或 SQL 编辑器 .
原生反应, a Blob 转至 upload, (中文(简体) ), update 或者说 uploadToSignedUrl
以标记的字节发送 contentType这样 fetch(uri).blob() 从a
选中的文件通过一个桶的 MIME 许可列表 。 过 contentType 联合国
文件: React Introduct Blob 没有自己的类型, 没有上传
标签 application/octet-stream。 。 。 .
网页
import { createClient, webStorage } from '@biltme/backend'
const bilt = createClient(url, key, {
auth: { storage: webStorage(), persistSession: true, autoRefreshToken: true },
})
服务器( 无会话持续)
import { createClient, memoryStorage } from '@biltme/backend'
const bilt = createClient(url, key, {
auth: { storage: memoryStorage(), persistSession: false, autoRefreshToken: false },
})
此软件包添加的 vs @supabase/supabase-js
createClient实值 苏帕贝斯的createClient,重新打出,这样一个没有类型的呼叫 参数默认其计划到可增强Database上方接口代替any。 。 。 .Database,一个工程扩充的空接口可以输入其方案.- 在本地反应时, 存储上传
Blob作为字节contentType到达水桶(见存储). - 无法提供实时 :
bilt.channel()掷出REALTIME_NOT_SUPPORTED缩写bilt.from(...)在间隔或屏幕焦点上. asyncStorage(impl)工厂包装@react-native-async-storage/async-storage-js的存储形状.webStorage()财务报告和审定财务报表memoryStorage()为完整起见.FunctionsHttpError, (中文(简体) ),FunctionsRelayError, (中文(简体) ),FunctionsFetchError, (中文(简体) ),FunctionRegion清洁再出口catch并输入选项.StorageApiError再出口储存catch块.- Bilt 代理快速模板的稳定导入路径 .
文档
对于其他一切(自动流、RLS、OAuth、函数参考), 使用情况 Supabase的文档。 。 。 . 比尔特的后端会说同样的电线协议.