更新历史
3.1
3.1 围绕可撤销删除、节点复制与多形态树,新增回收站(逻辑删除)、copyNode、跨树操作与多根树。
新特性
- 回收站(逻辑删除):通过
recyclebin配置启用。deleteNode(node, { recycle: true })将子树连同内部结构移入回收站(复用移动算法,事务原子),clearRecycleBin()一键清空;所有读取与写方法支持includeRecyclebin视角参数——默认视角下站内节点逻辑不存在,true时可作为普通节点操作(恢复 = 站内视角读出 +moveNode移出)。 - 节点复制
copyNode:整个操作在事务内以固定条数的集合 SQL 完成,数据库访问次数与后代数量无关;支持仅复制自身(includeDescendants: false)、字段过滤(fields)与跨树复制(options.treeId)。 - 跨树移动:
moveNode支持options.treeId跨树移动子树;toNode缺省时迁出为该 treeId 新树的根;canMoveTo同步支持跨树判定。 - 多根树
MultiRootFlexTreeManager:以隐藏根实现用户视角的多顶层节点树,level 自动归一化,单树操作原样可用。 countField后代数量:所有查询方法与导出方法(toJson/toList)支持countField参数,由数据库端按(rightValue - leftValue - 1) / 2直接计算,不受level截断影响;回收站场景下为可见口径。- 新增 sql.js 适配器(
flextree-sqljs-adapter):基于 sql.js,在浏览器(wasm)中运行完整树结构。
3.0
3.0 是一次围绕数据安全、数据库兼容性与开发体验的重大升级。
新特性
- 事务化写入与并发脏读修复:
write内部的所有操作现由数据库事务包裹,任一失败整体回滚;并通过写事务上下文隔离与读守卫,避免写操作过程中并发读取到中间态(脏读)。 - 单例模式:
FlexTreeManager.getInstance基于表名返回同一个实例,避免重复创建。 - 节点事件:新增
node:added、node:deleted、node:cleared、node:updated、node:moved等节点级事件。 - 树遍历
forEach:支持 DFS / BFS 两种模式,可中断、可限制层级、可指定起点。 - 树修复
repair:基于level重建被破坏的左右值结构,并自动校验完整性。 - 嵌套批量添加:
addNodes支持通过children字段一次性添加整棵子树。 FlexTree懒加载:新增lazy选项,节点可按需加载。- 树导出:
FlexTreeManager新增getTree/toJson/toList便捷方法。 - 细粒度校验:
verify基于纯 SQL 校验,覆盖节点总数、值完整性、基本关系、唯一性、层级关系。 - 新增 Bun SQLite 适配器(
flextree-bun-sqlite-adapter)。 - 类型增强:
treeId支持string;新增FlexTreeNodeInput嵌套输入类型。
改进
- 工具链从 pnpm 迁移至 Bun,测试迁移至 Bun Test。
- 升级 TypeScript 至 6、oxlint 至 1.76。
- 测试用例内联至各包
__tests__/,并新增一整套共享测试工具。
破坏性变更
- 适配器接口:
ready→connected,新增必需方法transaction与可选字段type。 FlexTreeManager:ready()→connected(),assertDriverReady()→assertConnected()。- 移除
sqlstring依赖,改用内置 SQL 转义器。 - 要求 TypeScript 6 及以上。
2.x 及更早版本
详见 GitHub Releases。