@ bimetal/ kanban- data (中文(简体) )
Kanban- domain 事件包 @bimetal/event-sourcing。 。 。 .
板入为相. 全板——柱子,牌子,和他们的订购
是一个总数。 它的活性很硬,在聚合物中执行
handle,而不是软规则:
- 列顺序 这是
columns数组顺序. - 每栏WIP限值 (单位:千美元)
column.wipLimit拒绝创建/交叉栏目 外溢的动作——以DataValidationError从不 发射事件.
T = Board,所以通用词 AggregateState<Board> 将棋盘作为
单个实体按下其 boardId 键; 每件事 entityId 是板子吗,
且卡/列身份身份在有效载荷中。 因此,汇兑是
板-角(WIP invariant要求的一致分界线).
全板撤销. 棋盘为单通根-一次所创造,由:
牌/列的事实,从未删除。 每个突变都推前一个整板
向倒数堆栈快照; undo(boardId) 通过一个
BoardReverted 事实上 没有 previous 字段,没有 LWW,没有冲突解决器
(建筑测试).
import { createKanbanStore, createBoard, createCard, moveCard } from '@bimetal/kanban-data';
const store = createKanbanStore();
await store.dispatch(createBoard({
id: 'b1',
columns: [
{ id: 'todo', title: 'Todo', wipLimit: null, cardIds: [] },
{ id: 'doing', title: 'Doing', wipLimit: 2, cardIds: [] },
{ id: 'done', title: 'Done', wipLimit: null, cardIds: [] },
],
cards: {},
}));
await store.dispatch(createCard('b1', 'todo', { id: 'c1', title: 'Write spec' }));
await store.dispatch(moveCard('b1', 'c1', 'doing', 0));
await store.undo('b1'); // card back in 'todo'
发送回路、一能、快照、货币检查和直播 交叉订阅全部由通用先令继承 不变——此包只添加了棋盘折叠,不变量和查询.