数据库可选方言类型隔离
用户已确认方案 B:默认声明中性化,外部方言选择精确子入口;保留 root 自动注册、同步 Registry.create 与连接时才加载客户端。设计稿原始 SHA256 为 33039b967b8407004472ccdbaab9360e48de658cb6f447b15872ebae496b2b5d,本文件记录实际实现与验收,不改写该设计证据。
公开合同
@zhin.js/database保留中性数据库、模型、事务、迁移、结构化表工具与 Memory/SQLite。Core/Zhin 继续转出这层,不再携带未选驱动的声明。- MySQL、PG、MongoDB、Redis 类及完整原厂 Config 从
@zhin.js/database/dialects/mysql|pg|mongodb|redis导入。其配置仍继承原厂类型,没有替换成宽 Record 或删减原厂字段。 - 使用远程
Registry.create()的 TS 作者显式引入对应类型入口;CLI 的 YAML/JSON 配置不变。 - 第三方只在
@zhin.js/database/registry增补真实Databases<S>与 Registry.Config。该子口 types 指唯一 registry.d.ts,runtime 指 root,避免先注册后加载 root 时覆盖用户 factory。 @types/pg保持原有 devDependency,不增加 optional type peer。选 PG 类型的 TS 消费者显式安装匹配的声明,JavaScript-only PG 用户仍只需 pg。驱动版本范围、连接池参数和重试没有改变。- 新入口最低
@zhin.js/database >=1.1.6,当前为待发布 patch;本次只写 changeset,不 bump/publish。同步更新相关 Core/Agent/Zhin patch 的依赖链,不能让新插件依赖仍未提供子入口的旧数据库包。
声明与运行边界
registry.d.ts 只保留 Memory/SQLite 映射。所有 builtin 注册从各类模块末尾集中到 root 的内部命名 bootstrap,保持原顺序和同一 Map;bootstrap 不进入 root 声明,也不提前导入原厂客户端。没有增加异步工厂、第二份注册表、自动安装或重试。
根 tsconfig 新子路径只供源码作者的同一模块身份检查;正式隔离验收在真实 tgz 的独立 NodeNext strict 消费者中执行,不用这些源码路径。现有 Database root 条件顺序不变,不能把 --conditions=development 命中旧 lib 的结果当源码测试。
验收入口
先按仓库正式构建,再运行 pnpm check:database-types。该显式本地检查复用现 workspace 打包闭包,正常 pack 实际库,并在临时目录安装当前已锁版本;不添加 CI required job 或修改 check:all 清单。
矩阵覆盖:无四库的 Database/Core/Agent/Zhin 宽入口、真实 Factory/DefinitionObj/第三方增补、每种单驱动完整原厂选项和具体类/表结构正负类型、只有所选 leaf 的声明清单、ESM/CJS 同一 Registry、六种同步 factory、四个缺客户端的启动错误,以及真实 Memory/SQLite 的 start/CRUD/stop。没有真实外部数据库或 Provider 调用。
证据记录
- 基线的实际 26 包 Agent 归档 strict 检查报四个 TS2307(mongodb/mysql2/pg/redis)。只替换独立 consumer 内的 Database 正常 tgz 后,原三作者入口 strict 与四 runtime import 通过;旧 consumer 及其证据未被覆盖。
- 新公共入口测试在原实现 2 失败/7 通过,修复后 9 通过;Database 原回归全部保留。
- 正常打包 29 个真实包的独立归档矩阵通过:默认宽入口、四个单驱动、缺 PG 声明以及只有 PG 声明的消费者分别执行 NodeNext strict;声明文件清单确认未选方言不进入默认请求。实际 ESM/CJS、六同步 factory、缺 SDK 错误及 Memory/SQLite CRUD 均通过,外部数据库连接和 Provider 请求均为零。固定证据目录:
zhin-database-types-VqYNSE。 - Database 回归 158 通过/7 个既有实机用例跳过;CLI Host 与 AI memory 24 通过/1 个实机用例跳过,六个真实方言构造保留同步创建与原配置。根 type-check、局部 TS lint、架构、文档及发布计划检查通过;脚本遵循现有 ESLint 忽略策略,不把它计作 lint 覆盖。
- 这些是本地源码与发布归档证据,不代表 CI、发布、真实外部数据库或 Provider 验收;合并其他已批准修复后的全仓门禁仍由最终候选单独执行。