@ccpc/core 0.1.0

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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/document/document.d.ts +21 -0
  4. package/dist/document/document.d.ts.map +1 -0
  5. package/dist/document/document.js +53 -0
  6. package/dist/document/element_mgr.d.ts +11 -0
  7. package/dist/document/element_mgr.d.ts.map +1 -0
  8. package/dist/document/element_mgr.js +27 -0
  9. package/dist/document/i_document.d.ts +19 -0
  10. package/dist/document/i_document.d.ts.map +1 -0
  11. package/dist/document/i_document.js +1 -0
  12. package/dist/document/id_pool.d.ts +20 -0
  13. package/dist/document/id_pool.d.ts.map +1 -0
  14. package/dist/document/id_pool.js +67 -0
  15. package/dist/element/c_element.d.ts +6 -0
  16. package/dist/element/c_element.d.ts.map +1 -0
  17. package/dist/element/c_element.js +6 -0
  18. package/dist/element/element.d.ts +42 -0
  19. package/dist/element/element.d.ts.map +1 -0
  20. package/dist/element/element.js +72 -0
  21. package/dist/element/element_decorator.d.ts +3 -0
  22. package/dist/element/element_decorator.d.ts.map +1 -0
  23. package/dist/element/element_decorator.js +40 -0
  24. package/dist/element/element_id.d.ts +14 -0
  25. package/dist/element/element_id.d.ts.map +1 -0
  26. package/dist/element/element_id.js +30 -0
  27. package/dist/element/i_element.d.ts +30 -0
  28. package/dist/element/i_element.d.ts.map +1 -0
  29. package/dist/element/i_element.js +1 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +8 -0
  33. package/dist/request/i_request.d.ts +8 -0
  34. package/dist/request/i_request.d.ts.map +1 -0
  35. package/dist/request/i_request.js +1 -0
  36. package/dist/request/request.d.ts +12 -0
  37. package/dist/request/request.d.ts.map +1 -0
  38. package/dist/request/request.js +11 -0
  39. package/dist/request/request_decorator.d.ts +8 -0
  40. package/dist/request/request_decorator.d.ts.map +1 -0
  41. package/dist/request/request_decorator.js +10 -0
  42. package/dist/request/request_mgr.d.ts +42 -0
  43. package/dist/request/request_mgr.d.ts.map +1 -0
  44. package/dist/request/request_mgr.js +77 -0
  45. package/dist/toolkit/class_manager.d.ts +30 -0
  46. package/dist/toolkit/class_manager.d.ts.map +1 -0
  47. package/dist/toolkit/class_manager.js +54 -0
  48. package/dist/toolkit/debug_util.d.ts +5 -0
  49. package/dist/toolkit/debug_util.d.ts.map +1 -0
  50. package/dist/toolkit/debug_util.js +15 -0
  51. package/dist/transaction/i_transaction.d.ts +21 -0
  52. package/dist/transaction/i_transaction.d.ts.map +1 -0
  53. package/dist/transaction/i_transaction.js +1 -0
  54. package/dist/transaction/i_transaction_base.d.ts +44 -0
  55. package/dist/transaction/i_transaction_base.d.ts.map +1 -0
  56. package/dist/transaction/i_transaction_base.js +11 -0
  57. package/dist/transaction/i_transaction_group.d.ts +41 -0
  58. package/dist/transaction/i_transaction_group.d.ts.map +1 -0
  59. package/dist/transaction/i_transaction_group.js +1 -0
  60. package/dist/transaction/transaction.d.ts +18 -0
  61. package/dist/transaction/transaction.d.ts.map +1 -0
  62. package/dist/transaction/transaction.js +41 -0
  63. package/dist/transaction/transaction_base.d.ts +17 -0
  64. package/dist/transaction/transaction_base.d.ts.map +1 -0
  65. package/dist/transaction/transaction_base.js +32 -0
  66. package/dist/transaction/transaction_group.d.ts +51 -0
  67. package/dist/transaction/transaction_group.d.ts.map +1 -0
  68. package/dist/transaction/transaction_group.js +242 -0
  69. package/dist/transaction/transaction_mgr.d.ts +54 -0
  70. package/dist/transaction/transaction_mgr.d.ts.map +1 -0
  71. package/dist/transaction/transaction_mgr.js +84 -0
  72. package/dist/transaction/undo_redo_entity.d.ts +71 -0
  73. package/dist/transaction/undo_redo_entity.d.ts.map +1 -0
  74. package/dist/transaction/undo_redo_entity.js +261 -0
  75. package/dist/types/dump_type.d.ts +4 -0
  76. package/dist/types/dump_type.d.ts.map +1 -0
  77. package/dist/types/dump_type.js +1 -0
  78. package/dist/types/type_guard.d.ts +5 -0
  79. package/dist/types/type_guard.d.ts.map +1 -0
  80. package/dist/types/type_guard.js +1 -0
  81. package/package.json +30 -0
@@ -0,0 +1,261 @@
1
+ import { DebugUtil } from '../toolkit/debug_util';
2
+ /**
3
+ * 记录一次undo/redo的Element变化
4
+ */
5
+ export class UndoRedoEntity {
6
+ constructor(doc) {
7
+ /**增加的元素*/
8
+ this._added = new Set();
9
+ /**删除的元素*/
10
+ this._deleted = new Set();
11
+ /**修改的元素*/
12
+ this._modified = new Set();
13
+ /**修改的元素-属性集合映射*/
14
+ this._modifiedProperties = new Map();
15
+ this._doc = doc;
16
+ }
17
+ /**监听元素增加*/
18
+ onElementsAdded(eles) {
19
+ eles.forEach(ele => this._added.add(ele));
20
+ }
21
+ /**监听元素更新*/
22
+ onElementsUpdated(eles) {
23
+ eles.forEach(ele => this._modified.add(ele));
24
+ }
25
+ /**监听元素删除*/
26
+ onElementsDeleted(eles) {
27
+ eles.forEach(ele => this._deleted.add(ele));
28
+ }
29
+ clear() {
30
+ this._added.clear();
31
+ this._modified.clear();
32
+ this._modifiedProperties.clear();
33
+ this._deleted.clear();
34
+ }
35
+ /**
36
+ * 真正去改变db
37
+ */
38
+ commit() {
39
+ // 1.压缩事务
40
+ this._compress();
41
+ if (this._isEmpty())
42
+ return false;
43
+ // 2.记录属性的修改
44
+ this._modifiedProperties.clear();
45
+ this._modified.forEach(ele => {
46
+ const modify = ele.getModified();
47
+ if (!ele.isTemporary() && modify.length) {
48
+ this._modifiedProperties.set(ele.id.asInt(), modify);
49
+ }
50
+ ele.commit();
51
+ });
52
+ this._added.forEach(ele => ele.commit());
53
+ // TODO 事件分发和 关联更新 更新视图等 暂时注释
54
+ // this._updateViewCache();
55
+ return true;
56
+ }
57
+ /**
58
+ * 数据回滚
59
+ */
60
+ rollBack() {
61
+ // 增加和删除的回滚
62
+ this._handleElementsFromDB(true, ...this._added);
63
+ this._handleElementsFromDB(false, ...this._deleted);
64
+ // 修改的回滚
65
+ this._modified.forEach(ele => {
66
+ ele.rollBack();
67
+ });
68
+ return true;
69
+ }
70
+ /**
71
+ * undo变redo,redo变undo
72
+ */
73
+ reverseAndExecute() {
74
+ this._reverse();
75
+ this._execute();
76
+ }
77
+ /**
78
+ * 合并其它提交
79
+ */
80
+ merge(other) {
81
+ const otherAdded = new Set([...other._added]);
82
+ const otherDeleted = new Set([...other._deleted]);
83
+ const otherModifiedProps = new Map();
84
+ other._modifiedProperties.forEach((v, k) => otherModifiedProps.set(k, v));
85
+ // 新增
86
+ for (const ele of [...this._added]) {
87
+ DebugUtil.assert(!otherAdded.has(ele), '不可能发生', 'wg', '2026-03-05');
88
+ if (otherDeleted.has(ele)) {
89
+ // add + delete = null
90
+ this._added.delete(ele);
91
+ otherDeleted.delete(ele);
92
+ }
93
+ else {
94
+ // add + modify = add
95
+ otherModifiedProps.delete(ele.id.asInt());
96
+ }
97
+ }
98
+ // 删除
99
+ for (const ele of [...this._deleted]) {
100
+ DebugUtil.assert(!otherAdded.has(ele) &&
101
+ !otherDeleted.has(ele) &&
102
+ !otherModifiedProps.has(ele.id.asInt()), '不可能发生', 'wg', '2026-03-05');
103
+ }
104
+ // 修改
105
+ for (const [thisId, thisPvs] of this._modifiedProperties) {
106
+ if ([...otherAdded].find(_ => _.id.asInt() === thisId)) {
107
+ DebugUtil.assert(false, '不可能发生', 'wg', '2026-03-05');
108
+ }
109
+ else if (otherModifiedProps.has(thisId)) {
110
+ const otherPvs = otherModifiedProps.get(thisId);
111
+ otherPvs?.forEach(otherPv => {
112
+ const thisPv = thisPvs.find(_ => _.propertyName === otherPv.propertyName);
113
+ if (thisPv) {
114
+ thisPv.newValue = otherPv.newValue;
115
+ }
116
+ else {
117
+ thisPvs.push(otherPv);
118
+ }
119
+ });
120
+ // 合并完需要删除
121
+ otherModifiedProps.delete(thisId);
122
+ }
123
+ else if ([...otherDeleted].find(_ => _.id.asInt() === thisId)) {
124
+ // modify + delete = delete
125
+ this._modifiedProperties.delete(thisId);
126
+ // 需要把更新回滚
127
+ const otherDelElement = [...otherDeleted].find(_ => _.id.asInt() === thisId);
128
+ thisPvs.forEach(({ propertyName, oldValue }) => {
129
+ const tKey = propertyName;
130
+ const tVal = oldValue;
131
+ if (otherDelElement) {
132
+ otherDelElement.db[tKey] = tVal;
133
+ }
134
+ });
135
+ }
136
+ }
137
+ otherAdded.forEach(ele => this._added.add(ele));
138
+ otherDeleted.forEach(ele => this._deleted.add(ele));
139
+ otherModifiedProps.forEach((v, k) => {
140
+ this._modifiedProperties.set(k, v);
141
+ });
142
+ this._modified.clear();
143
+ this._modifiedProperties.forEach((_v, k) => {
144
+ const ele = this._doc.getElementByIdEnsure(k);
145
+ this._modified.add(ele);
146
+ });
147
+ }
148
+ /**
149
+ * 将操作reverse
150
+ */
151
+ _reverse() {
152
+ // 新增变删除
153
+ const oldAdded = [...this._added];
154
+ const oldDeleted = [...this._deleted];
155
+ this._added.clear();
156
+ this._deleted.clear();
157
+ oldAdded.forEach(ele => this._deleted.add(ele));
158
+ oldDeleted.forEach(ele => this._added.add(ele));
159
+ // 修改
160
+ for (const [, values] of this._modifiedProperties) {
161
+ for (const v of values) {
162
+ [v.oldValue, v.newValue] = [v.newValue, v.oldValue];
163
+ }
164
+ }
165
+ }
166
+ /**
167
+ * 正向执行
168
+ */
169
+ _execute() {
170
+ this._handleElementsFromDB(false, ...this._added);
171
+ // 修改
172
+ for (const [id, values] of this._modifiedProperties) {
173
+ const element = this._doc.getElementByIdEnsure(id);
174
+ for (const v of values) {
175
+ const tKey = v.propertyName;
176
+ const tVal = v.newValue;
177
+ element.db[tKey] = tVal;
178
+ }
179
+ }
180
+ this._handleElementsFromDB(true, ...this._deleted);
181
+ this._updateViewCache();
182
+ // TODO 事件分发
183
+ }
184
+ /**
185
+ * 压缩事务
186
+ * 主要处理例如,新增一个Element,然后更改这个Element的属性,事务管理器会记录每一个操作,这时只需要记录增加的操作即可
187
+ */
188
+ _compress() {
189
+ // add + modified = add
190
+ for (const ele of this._added) {
191
+ if (this._modified.has(ele)) {
192
+ ele.commit();
193
+ this._modified.delete(ele);
194
+ }
195
+ }
196
+ // modified + delete = (rollback modified) + delete
197
+ for (const ele of this._deleted) {
198
+ if (this._modified.has(ele)) {
199
+ ele.rollBack();
200
+ this._modified.delete(ele);
201
+ }
202
+ }
203
+ // add + delete = null
204
+ for (const ele of this._deleted) {
205
+ if (this._added.has(ele)) {
206
+ this._deleted.delete(ele);
207
+ this._added.delete(ele);
208
+ }
209
+ }
210
+ }
211
+ /**是否为空*/
212
+ _isEmpty() {
213
+ return !this._added.size && !this._deleted.size && !this._modified.size;
214
+ }
215
+ /**
216
+ * 从容器中增删对象
217
+ * @param del 是否删除
218
+ * @param eles 对象数组
219
+ */
220
+ _handleElementsFromDB(del, ...eles) {
221
+ const eleMgr = this._doc.elementMgr;
222
+ eles.forEach(ele => {
223
+ if (del)
224
+ eleMgr.delete(ele.id.asInt());
225
+ else
226
+ eleMgr.add(ele);
227
+ });
228
+ }
229
+ /**
230
+ * 收集使用过的id
231
+ */
232
+ collectUsedIds(set) {
233
+ [...this._added, ...this._deleted].forEach(e => set.add(e.id.asInt()));
234
+ [...this._modifiedProperties.keys()].forEach(id => set.add(id));
235
+ }
236
+ /**
237
+ * 获取所有修改的ElementId集合
238
+ */
239
+ getModifiedElementIds() {
240
+ const result = new Set();
241
+ this._added.forEach(ele => result.add(ele.id.asInt()));
242
+ this._modified.forEach(ele => result.add(ele.id.asInt()));
243
+ return result;
244
+ }
245
+ // TODO 暂时注释
246
+ _updateViewCache() {
247
+ // const changedElements: Set<Element> = new Set();
248
+ // for (const [id, values] of this._modifiedProperties) {
249
+ // const element = this._doc.getElementByIdEnsure(id);
250
+ // if (values.find(({ propertyName }) => {
251
+ // return element?.propNameChangeShouldCacheToView(propertyName);
252
+ // })) {
253
+ // changedElements.add(element);
254
+ // }
255
+ // }
256
+ // // 刷新视图
257
+ // this._doc.cacheElementChanged(EN_ModelViewChanged.ELEMENT_CREATE, [...this._added]);
258
+ // this._doc.cacheElementChanged(EN_ModelViewChanged.ELEMENT_UPDATE, [...changedElements]);
259
+ // this._doc.cacheElementChanged(EN_ModelViewChanged.ELEMENT_DELETE, [...this._deleted]);
260
+ }
261
+ }
@@ -0,0 +1,4 @@
1
+ export type IDBEleId = {
2
+ id: number;
3
+ };
4
+ //# sourceMappingURL=dump_type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump_type.d.ts","sourceRoot":"","sources":["../../src/types/dump_type.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;CACb,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export type IConstructor<T> = {
2
+ new (...args: any[]): T;
3
+ prototype: T;
4
+ };
5
+ //# sourceMappingURL=type_guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type_guard.d.ts","sourceRoot":"","sources":["../../src/types/type_guard.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAE1B,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACtB,SAAS,EAAE,CAAC,CAAA;CACf,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@ccpc/core",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Core data model layer for editor",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "scripts": {
25
+ "dev": "tsc -p tsconfig.json --watch --preserveWatchOutput",
26
+ "build": "tsc -p tsconfig.json",
27
+ "lint": "eslint . --ext .ts",
28
+ "lint:fix": "eslint . --ext .ts --fix"
29
+ }
30
+ }