@knotx/data 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +807 -0
- package/dist/index.d.cts +314 -0
- package/dist/index.d.mts +314 -0
- package/dist/index.d.ts +314 -0
- package/dist/index.mjs +803 -0
- package/package.json +45 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { Subject, OperatorFunction, BehaviorSubject, Observable } from 'rxjs';
|
|
2
|
+
|
|
3
|
+
interface IData {
|
|
4
|
+
id: string;
|
|
5
|
+
}
|
|
6
|
+
interface DataOperationPipe<T extends IData = IData> {
|
|
7
|
+
/**
|
|
8
|
+
* 用于转换操作,最先执行
|
|
9
|
+
*/
|
|
10
|
+
transform?: (operations$: Subject<DataOperation<T>>) => OperatorFunction<DataOperation<T>, DataOperation<T>>;
|
|
11
|
+
/**
|
|
12
|
+
* 操作执行前处理,操作在此阶段不应该被转换
|
|
13
|
+
*/
|
|
14
|
+
preOperation?: (operations$: Subject<DataOperation<T>>) => OperatorFunction<DataOperation<T>, DataOperation<T>>;
|
|
15
|
+
/**
|
|
16
|
+
* 操作执行后处理,操作在此阶段不应该被转换
|
|
17
|
+
*/
|
|
18
|
+
postOperation?: (operations$: Subject<DataOperation<T>>) => OperatorFunction<{
|
|
19
|
+
dataMap: Map<string, T>;
|
|
20
|
+
operations: DataOperation<T>[];
|
|
21
|
+
}, {
|
|
22
|
+
dataMap: Map<string, T>;
|
|
23
|
+
operations: DataOperation<T>[];
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
interface DataAddOperation<T extends IData = IData> {
|
|
27
|
+
type: 'add';
|
|
28
|
+
data: T;
|
|
29
|
+
}
|
|
30
|
+
interface DataRemoveOperation<_T extends IData = IData> {
|
|
31
|
+
type: 'remove';
|
|
32
|
+
id: string;
|
|
33
|
+
}
|
|
34
|
+
interface DataUpdateOperation<T extends IData = IData> {
|
|
35
|
+
type: 'update';
|
|
36
|
+
id: string;
|
|
37
|
+
data: Partial<T>;
|
|
38
|
+
}
|
|
39
|
+
interface DataBatchOperation<T extends IData = IData> {
|
|
40
|
+
type: 'batch';
|
|
41
|
+
operations: DataOperation<T>[];
|
|
42
|
+
isInit?: boolean;
|
|
43
|
+
}
|
|
44
|
+
interface DataStartDraftOperation<_T extends IData = IData> {
|
|
45
|
+
type: 'startDraft';
|
|
46
|
+
draftId: string;
|
|
47
|
+
}
|
|
48
|
+
interface DataCommitDraftOperation<_T extends IData = IData> {
|
|
49
|
+
type: 'commitDraft';
|
|
50
|
+
draftId: string;
|
|
51
|
+
}
|
|
52
|
+
interface DataDiscardDraftOperation<_T extends IData = IData> {
|
|
53
|
+
type: 'discardDraft';
|
|
54
|
+
draftId: string;
|
|
55
|
+
}
|
|
56
|
+
interface DataDraftOperation<T extends IData = IData> {
|
|
57
|
+
type: 'draftOperation';
|
|
58
|
+
draftId: string;
|
|
59
|
+
operation: Exclude<DataOperation<T>, {
|
|
60
|
+
draftId: string;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
63
|
+
type DataOperation<T extends IData = IData> = DataAddOperation<T> | DataRemoveOperation<T> | DataUpdateOperation<T> | DataBatchOperation<T> | DataStartDraftOperation<T> | DataCommitDraftOperation<T> | DataDiscardDraftOperation<T> | DataDraftOperation<T>;
|
|
64
|
+
declare class DataManager<TData extends IData = IData, TTag extends string = any> {
|
|
65
|
+
readonly tag: TTag;
|
|
66
|
+
private operations$;
|
|
67
|
+
private operationPipes$;
|
|
68
|
+
private drafts$;
|
|
69
|
+
readonly dataMap$: BehaviorSubject<Map<string, TData>>;
|
|
70
|
+
readonly currentDraftDataMap$: BehaviorSubject<Map<string, false | TData> | undefined>;
|
|
71
|
+
/**
|
|
72
|
+
* 数据版本号,用于标识数据的变化,数据更新时,patchVersion 会递增
|
|
73
|
+
*/
|
|
74
|
+
readonly patchVersion$: BehaviorSubject<number>;
|
|
75
|
+
/**
|
|
76
|
+
* 数据版本号,用于标识数据的变化,数据增删时,mapVersion 会递增
|
|
77
|
+
*/
|
|
78
|
+
readonly mapVersion$: BehaviorSubject<number>;
|
|
79
|
+
get version(): number;
|
|
80
|
+
private _patchVersionUpdating;
|
|
81
|
+
private _mapVersionUpdating;
|
|
82
|
+
constructor(tag: TTag);
|
|
83
|
+
getDataList$(): Observable<TData[]>;
|
|
84
|
+
getDataList(): TData[];
|
|
85
|
+
getData$(id: string, equal?: (a?: TData, b?: TData) => boolean): Observable<TData | undefined>;
|
|
86
|
+
getData(id: string): TData | undefined;
|
|
87
|
+
addDataOperationPipe(pipe: DataOperationPipe<TData>): void;
|
|
88
|
+
init(initialDataList?: TData[]): void;
|
|
89
|
+
getOperations$(): Observable<DataOperation<TData>>;
|
|
90
|
+
dispatch(operation: DataOperation<TData>): void;
|
|
91
|
+
getDraftDataList(draftId: string): TData[] | undefined;
|
|
92
|
+
getDraftData(draftId: string, dataId: string): TData | undefined;
|
|
93
|
+
getCurrentDraftData(dataId: string): TData | undefined;
|
|
94
|
+
private applyOperation;
|
|
95
|
+
private updateVersion;
|
|
96
|
+
private isPatchOperation;
|
|
97
|
+
private isMapOperation;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 变更类型枚举
|
|
102
|
+
*/
|
|
103
|
+
declare enum ChangeType {
|
|
104
|
+
ADD = "add",
|
|
105
|
+
REMOVE = "remove"
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 变更记录接口
|
|
109
|
+
*/
|
|
110
|
+
interface ChangeRecord<P, C> {
|
|
111
|
+
parent: P;
|
|
112
|
+
children: C[];
|
|
113
|
+
type: ChangeType;
|
|
114
|
+
timestamp: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* DualRelation配置接口
|
|
118
|
+
*/
|
|
119
|
+
interface DualRelationOptions {
|
|
120
|
+
/**
|
|
121
|
+
* 是否允许父节点没有子节点
|
|
122
|
+
*/
|
|
123
|
+
allowEmptyParent?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* 历史变更记录的最大数量
|
|
126
|
+
*/
|
|
127
|
+
historyDepth?: number;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* DualRelation 类用于管理父子节点之间的双向关系
|
|
131
|
+
* @template P 父节点类型
|
|
132
|
+
* @template C 子节点类型
|
|
133
|
+
*/
|
|
134
|
+
declare class DualRelation<P, C> {
|
|
135
|
+
private parentToChildren;
|
|
136
|
+
private childToParent;
|
|
137
|
+
private _version;
|
|
138
|
+
private _versionSubject;
|
|
139
|
+
private _batchUpdateMode;
|
|
140
|
+
private _hasPendingChanges;
|
|
141
|
+
private _changeHistory;
|
|
142
|
+
private _options;
|
|
143
|
+
private _pendingChanges;
|
|
144
|
+
private _nodeLevels;
|
|
145
|
+
private _needsLevelRecalculation;
|
|
146
|
+
/**
|
|
147
|
+
* 获取版本变更的Observable
|
|
148
|
+
*/
|
|
149
|
+
get version(): BehaviorSubject<number>;
|
|
150
|
+
/**
|
|
151
|
+
* 获取变更历史记录
|
|
152
|
+
*/
|
|
153
|
+
get changeHistory(): ReadonlyArray<ChangeRecord<P, C>>;
|
|
154
|
+
constructor(options?: DualRelationOptions);
|
|
155
|
+
/**
|
|
156
|
+
* 更新配置选项
|
|
157
|
+
* @param options 新的配置选项
|
|
158
|
+
*/
|
|
159
|
+
updateOptions(options: Partial<DualRelationOptions>): void;
|
|
160
|
+
/**
|
|
161
|
+
* 获取节点的层级
|
|
162
|
+
* 层级定义:
|
|
163
|
+
* 0: 不在关系中的节点
|
|
164
|
+
* 1: 顶层父节点(没有父节点的节点)
|
|
165
|
+
* n > 1: 子节点的层级是其父节点的层级 + 1
|
|
166
|
+
* @param node 要查询的节点
|
|
167
|
+
* @returns 节点的层级
|
|
168
|
+
*/
|
|
169
|
+
getNodeLevel(node: P | C): number;
|
|
170
|
+
/**
|
|
171
|
+
* 重新计算所有节点的层级
|
|
172
|
+
* @private
|
|
173
|
+
*/
|
|
174
|
+
private recalculateAllLevels;
|
|
175
|
+
/**
|
|
176
|
+
* 更新节点层级
|
|
177
|
+
* @param node 要更新的节点
|
|
178
|
+
* @param parent 节点的父节点
|
|
179
|
+
* @private
|
|
180
|
+
*/
|
|
181
|
+
private updateNodeLevel;
|
|
182
|
+
/**
|
|
183
|
+
* 递归更新所有子节点的层级
|
|
184
|
+
* @param parent 父节点
|
|
185
|
+
* @param parentLevel 父节点的层级
|
|
186
|
+
* @private
|
|
187
|
+
*/
|
|
188
|
+
private updateChildrenLevels;
|
|
189
|
+
/**
|
|
190
|
+
* 记录变更
|
|
191
|
+
* @param parent 父节点
|
|
192
|
+
* @param children 子节点数组
|
|
193
|
+
* @param type 变更类型
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
private recordChange;
|
|
197
|
+
/**
|
|
198
|
+
* 更新版本号,用于通知外部关系发生了变化
|
|
199
|
+
* @private
|
|
200
|
+
*/
|
|
201
|
+
private updateVersion;
|
|
202
|
+
/**
|
|
203
|
+
* 开始批量更新操作
|
|
204
|
+
* 在此模式下,所有导致版本变更的操作将被延迟,直到调用commitBatch
|
|
205
|
+
*/
|
|
206
|
+
beginBatch(): void;
|
|
207
|
+
/**
|
|
208
|
+
* 提交批量更新,如果有变更则更新版本
|
|
209
|
+
* @returns 是否有变更被提交
|
|
210
|
+
*/
|
|
211
|
+
commitBatch(): boolean;
|
|
212
|
+
/**
|
|
213
|
+
* 回滚批量更新,取消所有未提交的变更
|
|
214
|
+
* 注意:此方法不会撤销已执行的关系变更,只会阻止版本更新
|
|
215
|
+
*/
|
|
216
|
+
rollbackBatch(): void;
|
|
217
|
+
/**
|
|
218
|
+
* 在批量模式中执行多个操作并自动提交
|
|
219
|
+
* @param operations 要执行的函数
|
|
220
|
+
* @returns 批量操作是否导致了版本变更
|
|
221
|
+
*/
|
|
222
|
+
batch(operations: () => void): boolean;
|
|
223
|
+
/**
|
|
224
|
+
* 添加父子关系
|
|
225
|
+
* @param parent 父节点
|
|
226
|
+
* @param child 子节点
|
|
227
|
+
*/
|
|
228
|
+
add(parent: P, child: C): void;
|
|
229
|
+
/**
|
|
230
|
+
* 移除子节点及其父关系
|
|
231
|
+
* @param child 子节点
|
|
232
|
+
* @returns 是否成功移除
|
|
233
|
+
*/
|
|
234
|
+
removeChild(child: C): boolean;
|
|
235
|
+
/**
|
|
236
|
+
* 移除父节点及其所有子节点的关系
|
|
237
|
+
* @param parent 父节点
|
|
238
|
+
* @returns 是否成功移除
|
|
239
|
+
*/
|
|
240
|
+
removeParent(parent: P): boolean;
|
|
241
|
+
/**
|
|
242
|
+
* 清空所有关系并清除历史记录
|
|
243
|
+
* @param clearHistory 是否清除历史记录,默认为true
|
|
244
|
+
*/
|
|
245
|
+
clear(clearHistory?: boolean): void;
|
|
246
|
+
/**
|
|
247
|
+
* 获取所有子节点
|
|
248
|
+
* @param parent 父节点
|
|
249
|
+
* @returns 子节点集合
|
|
250
|
+
*/
|
|
251
|
+
getChildren(parent: P): Set<C>;
|
|
252
|
+
/**
|
|
253
|
+
* 获取父节点
|
|
254
|
+
* @param child 子节点
|
|
255
|
+
* @returns 父节点,如果不存在则返回undefined
|
|
256
|
+
*/
|
|
257
|
+
getParent(child: C): P | undefined;
|
|
258
|
+
/**
|
|
259
|
+
* 获取根节点
|
|
260
|
+
* @param node 子节点
|
|
261
|
+
* @returns 根节点,如果节点无父节点则返回该节点本身,如果检测到循环引用则返回null
|
|
262
|
+
*/
|
|
263
|
+
getRootParent(node: C): P | C | null;
|
|
264
|
+
/**
|
|
265
|
+
* 检查是否存在循环引用
|
|
266
|
+
* @returns 是否存在循环引用
|
|
267
|
+
*/
|
|
268
|
+
hasCircularReference(): boolean;
|
|
269
|
+
/**
|
|
270
|
+
* 添加父子关系,但会检查是否会形成循环引用
|
|
271
|
+
* @param parent 父节点
|
|
272
|
+
* @param child 子节点
|
|
273
|
+
* @returns 是否成功添加关系(如果会形成循环引用则返回false)
|
|
274
|
+
*/
|
|
275
|
+
addSafe(parent: P, child: C): boolean;
|
|
276
|
+
/**
|
|
277
|
+
* 检查节点A是否是节点B的祖先节点
|
|
278
|
+
* @param nodeA 可能的祖先节点
|
|
279
|
+
* @param nodeB 待检查节点
|
|
280
|
+
* @returns 是否是祖先关系
|
|
281
|
+
*/
|
|
282
|
+
private isAncestorOf;
|
|
283
|
+
/**
|
|
284
|
+
* 获取所有父节点
|
|
285
|
+
* @returns 父节点集合
|
|
286
|
+
*/
|
|
287
|
+
getAllParents(): Set<P>;
|
|
288
|
+
/**
|
|
289
|
+
* 获取所有子节点
|
|
290
|
+
* @returns 子节点集合
|
|
291
|
+
*/
|
|
292
|
+
getAllChildren(): Set<C>;
|
|
293
|
+
/**
|
|
294
|
+
* 检查父子关系是否存在
|
|
295
|
+
* @param parent 父节点
|
|
296
|
+
* @param child 子节点
|
|
297
|
+
* @returns 是否存在关系
|
|
298
|
+
*/
|
|
299
|
+
hasRelation(parent: P, child: C): boolean;
|
|
300
|
+
/**
|
|
301
|
+
* 获取关系数量
|
|
302
|
+
* @returns 关系数量
|
|
303
|
+
*/
|
|
304
|
+
size(): number;
|
|
305
|
+
/**
|
|
306
|
+
* 获取指定节点的所有后代节点(包括子节点、孙节点等)
|
|
307
|
+
* @param parent 父节点
|
|
308
|
+
* @param includeSelf 是否包含自身,默认为false
|
|
309
|
+
* @returns 所有后代节点的集合
|
|
310
|
+
*/
|
|
311
|
+
getDescendants(parent: P, includeSelf?: boolean): Set<C>;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export { type ChangeRecord, ChangeType, type DataAddOperation, type DataBatchOperation, type DataCommitDraftOperation, type DataDiscardDraftOperation, type DataDraftOperation, DataManager, type DataOperation, type DataOperationPipe, type DataRemoveOperation, type DataStartDraftOperation, type DataUpdateOperation, DualRelation, type DualRelationOptions, type IData };
|