用途:在创建或修改 */external/ 目录下的 API 函数或数据获取 hook 时启用,约束 Supabase 访问模式、类型映射与 N+1 问题。
主要能力 边界隔离:所有原始 Supabase 访问与生成的 schema 类型只能存在于某个 feature 的 external/(或 shared/external/)目录,由 lint 强制。getSupabaseClient 只允许在 /external/* 中导入;hooks、组件与 utils 必须调用 external/ 的 fetch*/read* 函数并返回领域类型,禁止直接接触原始 client。@/shared/external/database.types 也仅限 external/ 内导入。 类型推断:client 使用 createClient<Database> 类型化,查询结果由 schema 推断,应在边界处解析映射而非类型断言。
使用方式 查询函数:在 external/ 中调用 getSupabaseClient(),用 .from().select(FEED_*_SELECT).eq().order().limit(),出错即 throw,结果用 mapRowToX 映射为领域对象。列表查询应使用显式的列允许清单字符串(如 FEED_POST_SELECT),避免宽泛的 *。 映射约定:Supabase 行保持 snake_case,领域模型使用 camelCase,例如 mapRowToComment 将 user_id 映射为 userId、createdAt 用 createTimestamp(new Date(...))。 写入与错误处理:使用 executeTrackedWrite('createComment', () => ...) 与 throwOnError(...),统一从共享位置暴露 SupabaseWriteError 和 SupabaseNetworkError。 N+1 防护:列表上下文的数据获取应暴露为接收 ids: string[] 的单个批量 hook,返回 Set<id> 或 Map<id, T>;不要创建仅用单元素数组委托批量 hook 的 singular 包装。
适用场景:使用 Supabase 的 TypeScript 前端/全栈项目,尤其是 apps/web/src 下采用 feature 目录(如 post/external/post.ts、comment/external/comment.ts、shared/external/supabaseClient.ts)的代码库。
限制:资料未提供安装方式、运行命令、收费或平台支持信息。具体规则依赖项目既有 lint 配置与目录结构。